Class: MLS::Rack::Proxy
- Inherits:
-
Object
- Object
- MLS::Rack::Proxy
- Defined in:
- lib/mls/rack/proxy.rb
Class Method Summary collapse
Instance Method Summary collapse
Class Method Details
.new ⇒ Object
8 9 10 11 12 13 14 15 16 17 18 19 |
# File 'lib/mls/rack/proxy.rb', line 8 def self.new app = super ::Rack::Builder.new do use(ActionDispatch::Cookies) use(ActionDispatch::Session::CookieStore, { key: Rails.application.config.[:key], path: '/', secret: Rails.application.secrets[:secret_key_base] }) run app end.to_app end |
Instance Method Details
#call(env) ⇒ Object
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
# File 'lib/mls/rack/proxy.rb', line 38 def call(env) request = Net::HTTP.const_get(env['REQUEST_METHOD'].capitalize).new(env['PATH_INFO'] + '?' + env['QUERY_STRING']) request.initialize_http_header(extract_http_request_headers(env)) if request.request_body_permitted? if env['TRANSFER-ENCODING'] == 'chunked' request.body_stream = env['rack.input'] elsif env['CONTENT_LENGTH'] request.body = env['rack.input'].read end end request['Content-Type'] = env['CONTENT_TYPE'] response = MLS::Model.connection_pool.with_connection do |conn| (env) do request_uri = "http#{conn.instance_variable_get(:@connection).use_ssl ? 's' : ''}://#{conn.instance_variable_get(:@connection).host}#{conn.instance_variable_get(:@connection).port != 80 ? (conn.instance_variable_get(:@connection).port == 443 && conn.instance_variable_get(:@connection).use_ssl ? '' : ":#{conn.instance_variable_get(:@connection).port}") : ''}#{request.path}" request['Cookie'] = Thread.current[:sunstone_cookie_store].(request_uri) conn.instance_variable_get(:@connection).send(:request_headers).each { |k, v| request[k] = v if ['Api-Version', 'Api-Key'].include?(k) } conn.instance_variable_get(:@connection).instance_variable_get(:@connection).request(request) end end response_headers = {} response.each_header { |k, v| response_headers[k] = v unless k == 'transfer-encoding' } [response.code, response_headers, [response.body]] end |
#extract_http_request_headers(env) ⇒ Object
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
# File 'lib/mls/rack/proxy.rb', line 21 def extract_http_request_headers(env) headers = env.reject do |k, v| !(/^HTTP_[A-Z_]+$/ === k) || v.nil? end.map do |k, v| [k.sub(/^HTTP_/, "").gsub("_", "-"), v] end.inject({}) do |hash, k_v| k, v = k_v hash[k] = v hash end headers.delete_if {|key, value| ["HOST", "API-VERSION", "CONNECTION", "VERSION"].include?(key) } x_forwarded_for = (headers["X-Forwarded-For"].to_s.split(/, +/) << env["REMOTE_ADDR"]).join(", ") headers.merge!("X-Forwarded-For" => x_forwarded_for) end |
#with_cookie_store(env) ⇒ Object
66 67 68 69 70 71 72 73 74 |
# File 'lib/mls/rack/proxy.rb', line 66 def (env) store = CookieStore::HashStore.new store.add_from_json(env['rack.session']['cookie_store']) if env['rack.session']['cookie_store'] Thread.current[:sunstone_cookie_store] = store result = yield Thread.current[:sunstone_cookie_store] = nil env['rack.session']['cookie_store'] = store.to_json result end |