Class: ProxES::Forwarder

Inherits:
Object
  • Object
show all
Includes:
Services::ES, Singleton
Defined in:
lib/proxes/forwarder.rb

Overview

A lot of code in this comes from Rack::Proxy

Instance Method Summary collapse

Methods included from Services::ES

#client, #conn, #ssl_store

Instance Method Details

#body_from(request) ⇒ Object



59
60
61
62
63
# File 'lib/proxes/forwarder.rb', line 59

def body_from(request)
  return if request.body.nil? || request.body.respond_to?(:read) == false

  request.body.read.tap { |_r| request.body.rewind }
end

#call(env) ⇒ Object



15
16
17
18
19
20
21
22
23
# File 'lib/proxes/forwarder.rb', line 15

def call(env)
  rewrite_response(
    perform_request(
      Rack::Request.new(
        rewrite_env(env)
      )
    )
  )
end

#header_listObject



51
52
53
54
55
56
57
# File 'lib/proxes/forwarder.rb', line 51

def header_list
  [
    'date',
    'content-type',
    'cache-control',
  ]
end

#normalize_headers(headers) ⇒ Object



65
66
67
68
69
70
71
# File 'lib/proxes/forwarder.rb', line 65

def normalize_headers(headers)
  Rack::Utils::HeaderHash.new(
    headers.map do |k, v|
      [k, v.is_a?(Array) ? v.join("\n") : v]
    end.to_h
  )
end

#perform_request(request) ⇒ Object

TODO: Consider moving these methods to the ProxES ES Service to enable reuse



30
31
32
33
34
35
36
# File 'lib/proxes/forwarder.rb', line 30

def perform_request(request)
  conn.send(request.request_method.downcase) do |req|
    body = body_from(request)
    req.body = body if body
    req.url request.fullpath == '' ? URI.parse(env['REQUEST_URI']).request_uri : request.fullpath
  end
end

#rewrite_env(env) ⇒ Object



25
26
27
# File 'lib/proxes/forwarder.rb', line 25

def rewrite_env(env)
  env
end

#rewrite_response(response) ⇒ Object



38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/proxes/forwarder.rb', line 38

def rewrite_response(response)
  headers = (response.respond_to?(:headers) && response.headers) || normalize_headers(response.to_hash)
  body    = response.body || ['']
  body    = [body] unless body.respond_to?(:each)

  # Only keep certain headers.
  # See point 1 on https://www.mnot.net/blog/2011/07/11/what_proxies_must_do
  # TODO: Extend on the above
  headers.delete_if { |k, _v| !header_list.include? k.downcase }

  [response.status, headers, body]
end