Class: MLS::Rack::Proxy

Inherits:
Object
  • Object
show all
Defined in:
lib/mls/rack/proxy.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.newObject



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.session_options[: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|
    with_cookie_store(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].cookie_header_for(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


66
67
68
69
70
71
72
73
74
# File 'lib/mls/rack/proxy.rb', line 66

def with_cookie_store(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