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.0"

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



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/rack/proxy.rb', line 42

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 = URI(opts[:backend]) if opts[:backend]
  @read_timeout = opts.fetch(:read_timeout, 60)
  @ssl_version = opts[:ssl_version] if opts[:ssl_version]

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

  @opts = opts
end

Class Method Details

.extract_http_request_headers(env) ⇒ Object



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/rack/proxy.rb', line 11

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



27
28
29
30
31
32
# File 'lib/rack/proxy.rb', line 27

def normalize_headers(headers)
  mapped = headers.map do |k, v|
    [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



62
63
64
# File 'lib/rack/proxy.rb', line 62

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

#rewrite_env(env) ⇒ Object

Return modified env



67
68
69
# File 'lib/rack/proxy.rb', line 67

def rewrite_env(env)
  env
end

#rewrite_response(triplet) ⇒ Object

Return a rack triplet [status, headers, body]



72
73
74
# File 'lib/rack/proxy.rb', line 72

def rewrite_response(triplet)
  triplet
end