Class: Rack::TranslatingProxy

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

Instance Method Summary collapse

Instance Method Details

#_request_mapppingObject



84
85
86
# File 'lib/rack/translating_proxy.rb', line 84

def _request_mappping
  @_request_mappping ||= request_mappping
end

#_response_mappingObject



88
89
90
# File 'lib/rack/translating_proxy.rb', line 88

def _response_mapping
  @_response_mapping ||= request_mapping.invert
end

#_target_hostObject



92
93
94
# File 'lib/rack/translating_proxy.rb', line 92

def _target_host
  @_target_host ||= URI(target_host)
end

#io(stringy_thing) ⇒ Object



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

def io(stringy_thing)
  if stringy_thing.respond_to?(:read)
    stringy_thing
  else
    StringIO.new(stringy_thing)
  end
end

#remove_interfering_response_headers(headers) ⇒ Object



74
75
76
77
78
# File 'lib/rack/translating_proxy.rb', line 74

def remove_interfering_response_headers(headers)
  headers.reject! do |key, _|
    %w[status connection transfer-encoding].include?(key)
  end
end

#request_mappingObject



80
81
82
# File 'lib/rack/translating_proxy.rb', line 80

def request_mapping
  fail 'Not implemented'
end

#rewrite_env(env) ⇒ Object



5
6
7
8
9
10
11
12
# File 'lib/rack/translating_proxy.rb', line 5

def rewrite_env(env)
  rewrite_request_url          env
  rewrite_request_body         env
  rewrite_request_query_string env
  rewrite_request_path         env

  env
end

#rewrite_request_body(env) ⇒ Object



20
21
22
23
24
25
# File 'lib/rack/translating_proxy.rb', line 20

def rewrite_request_body(env)
  rewritten_input = rewrite_request_string(io(env['rack.input']).read)

  env['rack.input']     = io(rewritten_input)
  env['CONTENT_LENGTH'] = rewritten_input.size
end

#rewrite_request_path(env) ⇒ Object



35
36
37
# File 'lib/rack/translating_proxy.rb', line 35

def rewrite_request_path(env)
  env['REQUEST_URI']  = rewrite_request_string(env['REQUEST_URI'])
end

#rewrite_request_query_string(env) ⇒ Object



31
32
33
# File 'lib/rack/translating_proxy.rb', line 31

def rewrite_request_query_string(env)
  env['QUERY_STRING'] = rewrite_request_string(env['QUERY_STRING'])
end

#rewrite_request_string(str) ⇒ Object



27
28
29
# File 'lib/rack/translating_proxy.rb', line 27

def rewrite_request_string(str)
  rewrite_string(str, request_mapping, URI.method(:encode_www_form_component))
end

#rewrite_request_url(env) ⇒ Object



14
15
16
17
18
# File 'lib/rack/translating_proxy.rb', line 14

def rewrite_request_url(env)
  env['HTTP_HOST']       = _target_host.host
  env['SERVER_PORT']     = _target_host.port
  env['rack.url_scheme'] = _target_host.scheme
end

#rewrite_response(triplet) ⇒ Object



59
60
61
62
63
64
# File 'lib/rack/translating_proxy.rb', line 59

def rewrite_response(triplet)
  status, headers, body = triplet
  rewrite_response_location headers
  remove_interfering_response_headers headers
  [status, headers, body]
end

#rewrite_response_location(headers) ⇒ Object



66
67
68
69
70
71
72
# File 'lib/rack/translating_proxy.rb', line 66

def rewrite_response_location(headers)
  if headers['location']
    headers['location'] = headers['location'].map do |location|
      rewrite_string(location, _response_mapping)
    end
  end
end

#rewrite_string(string, mapping, transform = proc { |x| x }) ⇒ Object



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

def rewrite_string(string, mapping, transform = proc { |x| x })
  mapping = mapping.map do |source, target|
    [transform[source], transform[target]]
  end

  mapping.each do |source, target|
    string = string.gsub(source, target)
  end

  string
end

#target_hostObject



96
97
98
# File 'lib/rack/translating_proxy.rb', line 96

def target_host
  fail 'Not implemented'
end