Class: Rack::Proxy

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

Overview

Subclass and bring your own #rewrite_request and #rewrite_response

Constant Summary collapse

VERSION =
"0.7.4".freeze
HOP_BY_HOP_HEADERS =
{
  'connection' => true,
  'keep-alive' => true,
  'proxy-authenticate' => true,
  'proxy-authorization' => true,
  'te' => true,
  'trailer' => true,
  'transfer-encoding' => true,
  'upgrade' => true
}.freeze

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(app = nil, opts = {}) ⇒ Proxy

Returns a new instance of Proxy.

Parameters:

  • opts (Hash) (defaults to: {})

    a customizable set of options

Options Hash (opts):

  • :backend (String, URI::HTTP)

    Backend host to proxy requests to



57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/rack/proxy.rb', line 57

def initialize(app = nil, opts= {})
  if app.is_a?(Hash)
    opts = app
    @app = nil
  else
    @app = app
  end

  @streaming = opts.fetch(:streaming, true)
  @ssl_verify_none = opts.fetch(:ssl_verify_none, false)
  @backend = opts[:backend] ? URI(opts[:backend]) : nil
  @read_timeout = opts.fetch(:read_timeout, 60)
  @ssl_version = opts[:ssl_version]

  @username = opts[:username]
  @password = opts[:password]

  @opts = opts
end

Class Method Details

.extract_http_request_headers(env) ⇒ Object



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/rack/proxy.rb', line 22

def extract_http_request_headers(env)
  headers = env.reject do |k, v|
    !(/^HTTP_[A-Z0-9_\.]+$/ === k) || v.nil?
  end.map do |k, v|
    [reconstruct_header_name(k), v]
  end.inject(Utils::HeaderHash.new) do |hash, k_v|
    k, v = k_v
    hash[k] = v
    hash
  end

  x_forwarded_for = (headers['X-Forwarded-For'].to_s.split(/, +/) << env['REMOTE_ADDR']).join(', ')

  headers.merge!('X-Forwarded-For' => x_forwarded_for)
end

.normalize_headers(headers) ⇒ Object



38
39
40
41
42
43
# File 'lib/rack/proxy.rb', line 38

def normalize_headers(headers)
  mapped = headers.map do |k, v|
    [titleize(k), if v.is_a? Array then v.join("\n") else v end]
  end
  Utils::HeaderHash.new Hash[mapped]
end

Instance Method Details

#call(env) ⇒ Object



77
78
79
# File 'lib/rack/proxy.rb', line 77

def call(env)
  rewrite_response(perform_request(rewrite_env(env)))
end

#rewrite_env(env) ⇒ Object

Return modified env



82
83
84
# File 'lib/rack/proxy.rb', line 82

def rewrite_env(env)
  env
end

#rewrite_response(triplet) ⇒ Object

Return a rack triplet [status, headers, body]



87
88
89
# File 'lib/rack/proxy.rb', line 87

def rewrite_response(triplet)
  triplet
end