goliath-reverse-proxy 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +4 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +67 -0
- data/README.md +28 -0
- data/goliath-reverse-proxy.gemspec +25 -0
- data/lib/goliath/rack/reverse_proxy.rb +36 -0
- data/spec/goliath/reverse_proxy_spec.rb +69 -0
- data/spec/spec_helper.rb +35 -0
- metadata +120 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
goliath-reverse-proxy (0.1.0)
|
5
|
+
em-http-request
|
6
|
+
em-synchrony
|
7
|
+
goliath
|
8
|
+
|
9
|
+
GEM
|
10
|
+
remote: http://rubygems.org/
|
11
|
+
specs:
|
12
|
+
addressable (2.2.8)
|
13
|
+
async-rack (0.5.1)
|
14
|
+
rack (~> 1.1)
|
15
|
+
cookiejar (0.3.0)
|
16
|
+
diff-lcs (1.1.3)
|
17
|
+
em-http-request (1.0.2)
|
18
|
+
addressable (>= 2.2.3)
|
19
|
+
cookiejar
|
20
|
+
em-socksify
|
21
|
+
eventmachine (>= 1.0.0.beta.4)
|
22
|
+
http_parser.rb (>= 0.5.3)
|
23
|
+
em-socksify (0.2.0)
|
24
|
+
eventmachine (>= 1.0.0.beta.4)
|
25
|
+
em-synchrony (1.0.1)
|
26
|
+
eventmachine (>= 1.0.0.beta.1)
|
27
|
+
eventmachine (1.0.0.beta.4)
|
28
|
+
goliath (0.9.4)
|
29
|
+
async-rack
|
30
|
+
em-synchrony (>= 1.0.0)
|
31
|
+
eventmachine (>= 1.0.0.beta.3)
|
32
|
+
http_parser.rb
|
33
|
+
http_router (~> 0.9.0)
|
34
|
+
log4r
|
35
|
+
multi_json
|
36
|
+
rack (>= 1.2.2)
|
37
|
+
rack-contrib
|
38
|
+
rack-respond_to
|
39
|
+
http_parser.rb (0.5.3)
|
40
|
+
http_router (0.9.7)
|
41
|
+
rack (>= 1.0.0)
|
42
|
+
url_mount (~> 0.2.1)
|
43
|
+
log4r (1.1.10)
|
44
|
+
multi_json (1.3.5)
|
45
|
+
rack (1.4.1)
|
46
|
+
rack-accept-media-types (0.9)
|
47
|
+
rack-contrib (1.1.0)
|
48
|
+
rack (>= 0.9.1)
|
49
|
+
rack-respond_to (0.9.8)
|
50
|
+
rack-accept-media-types (>= 0.6)
|
51
|
+
rspec (2.10.0)
|
52
|
+
rspec-core (~> 2.10.0)
|
53
|
+
rspec-expectations (~> 2.10.0)
|
54
|
+
rspec-mocks (~> 2.10.0)
|
55
|
+
rspec-core (2.10.1)
|
56
|
+
rspec-expectations (2.10.0)
|
57
|
+
diff-lcs (~> 1.1.3)
|
58
|
+
rspec-mocks (2.10.1)
|
59
|
+
url_mount (0.2.1)
|
60
|
+
rack
|
61
|
+
|
62
|
+
PLATFORMS
|
63
|
+
ruby
|
64
|
+
|
65
|
+
DEPENDENCIES
|
66
|
+
goliath-reverse-proxy!
|
67
|
+
rspec (~> 2.10)
|
data/README.md
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
goliath-reverse-proxy
|
2
|
+
=====================
|
3
|
+
|
4
|
+
Goliath reverse proxy middleware. Forwards all requests to another server.
|
5
|
+
|
6
|
+
Dependencies
|
7
|
+
============
|
8
|
+
All the work is done by em-http-request, em-syncrony, and goliath.
|
9
|
+
|
10
|
+
Example
|
11
|
+
=======
|
12
|
+
|
13
|
+
```ruby
|
14
|
+
require 'goliath'
|
15
|
+
require 'goliath/rack/reverse_proxy'
|
16
|
+
|
17
|
+
class Proxy < Goliath::API
|
18
|
+
# Include other middleware here before the proxy
|
19
|
+
# Params is required to pass along data
|
20
|
+
use Goliath::Rack::Params
|
21
|
+
use Goliath::Rack::ReverseProxy, base_url: 'http://127.0.0.1:8000'
|
22
|
+
|
23
|
+
def response(env)
|
24
|
+
[200, {}, []]
|
25
|
+
end
|
26
|
+
end
|
27
|
+
```
|
28
|
+
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
|
3
|
+
Gem::Specification.new do |gem|
|
4
|
+
gem.name = 'goliath-reverse-proxy'
|
5
|
+
gem.version = '0.1.0'
|
6
|
+
gem.authors = ["Daniel Farrell"]
|
7
|
+
gem.email = 'danielfarrell76@gmail.com'
|
8
|
+
gem.homepage = 'https://github.com/danielfarrell/goliath-reverse-proxy'
|
9
|
+
gem.summary = 'Reverse proxy middlware for Goliath'
|
10
|
+
gem.files = `git ls-files`.split("\n")
|
11
|
+
gem.test_files = `git ls-files -- spec/*`.split("\n")
|
12
|
+
|
13
|
+
gem.add_dependency "goliath"
|
14
|
+
gem.add_dependency "em-synchrony"
|
15
|
+
gem.add_dependency "em-http-request"
|
16
|
+
|
17
|
+
gem.add_development_dependency "rspec", "~> 2.10"
|
18
|
+
|
19
|
+
gem.extra_rdoc_files = ['README.md']
|
20
|
+
|
21
|
+
gem.description = <<-EOF
|
22
|
+
Turns Goliath into a reverse proxy server. Useful when paired with other
|
23
|
+
middleware, such as authentication.
|
24
|
+
EOF
|
25
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'em-synchrony/em-http'
|
2
|
+
|
3
|
+
module Goliath
|
4
|
+
module Rack
|
5
|
+
class ReverseProxy
|
6
|
+
include Goliath::Rack::AsyncMiddleware
|
7
|
+
|
8
|
+
def initialize(app, options)
|
9
|
+
@app = app
|
10
|
+
@options = options
|
11
|
+
end
|
12
|
+
|
13
|
+
def post_process(env, status, headers, body)
|
14
|
+
method = env['REQUEST_METHOD'].downcase.to_sym
|
15
|
+
|
16
|
+
url = "#{@options[:base_url]}#{env['REQUEST_URI']}"
|
17
|
+
|
18
|
+
env.each do |key, value|
|
19
|
+
headers[$1] = value if key =~ /HTTP_(.*)/
|
20
|
+
end
|
21
|
+
headers['CONTENT_TYPE'] = env['CONTENT_TYPE']
|
22
|
+
headers['HTTP_HOST'] = env['SERVER_NAME']
|
23
|
+
headers['X-Forwarded-Host'] = env['HTTP_HOST']
|
24
|
+
headers['REMOTE_USER'] = env['REMOTE_USER']
|
25
|
+
|
26
|
+
params = {:head => headers}
|
27
|
+
params[:body] = env['params'] if [:put, :post, :patch].include? method
|
28
|
+
|
29
|
+
http = EM::HttpRequest.new(url).send(method, params)
|
30
|
+
|
31
|
+
[http.response_header.status, http.response_header, [http.response]]
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'goliath/rack/reverse_proxy'
|
3
|
+
|
4
|
+
describe Goliath::Rack::ReverseProxy do
|
5
|
+
it 'should load without errors' do
|
6
|
+
lambda { Goliath::Rack::ReverseProxy.new('app', {:base_url => 'http://localhost'}) }.should_not raise_error
|
7
|
+
end
|
8
|
+
|
9
|
+
describe 'while used as middleware' do
|
10
|
+
before(:each) do
|
11
|
+
@app = double('app').as_null_object
|
12
|
+
@app.should_receive(:call).and_return(initial_response)
|
13
|
+
@env = Goliath::Env.new
|
14
|
+
@proxy = Goliath::Rack::ReverseProxy.new(@app, {:base_url => 'http://localhost'})
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'should create url to proxy to' do
|
18
|
+
@env['REQUEST_METHOD'] = 'GET'
|
19
|
+
@env['REQUEST_URI'] = '/a/test/file.html'
|
20
|
+
action = double('http action').as_null_object
|
21
|
+
action.should_receive(:get).and_return(response_object)
|
22
|
+
EM::HttpRequest.should_receive(:new).with('http://localhost/a/test/file.html').and_return(action)
|
23
|
+
@proxy.call(@env)
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'should build the needed headers' do
|
27
|
+
@env['REQUEST_METHOD'] = 'GET'
|
28
|
+
@env['REQUEST_URI'] = '/'
|
29
|
+
@env['SERVER_NAME'] = 'test.com'
|
30
|
+
@env['HTTP_HOST'] = 'testing.com'
|
31
|
+
@env['REMOTE_USER'] = 'bob'
|
32
|
+
action = double('http action').as_null_object
|
33
|
+
headers = {"HOST"=>"testing.com", "CONTENT_TYPE"=>nil, "HTTP_HOST"=>"test.com", "X-Forwarded-Host"=>"testing.com", "REMOTE_USER"=>"bob"}
|
34
|
+
action.should_receive(:get).with(:head => headers).and_return(response_object)
|
35
|
+
EM::HttpRequest.should_receive(:new).with('http://localhost/').and_return(action)
|
36
|
+
@proxy.call(@env)
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'should do a delete if a get was sent' do
|
40
|
+
@env['REQUEST_METHOD'] = 'DELETE'
|
41
|
+
@env['REQUEST_URI'] = '/some/item/23'
|
42
|
+
action = double('http action').as_null_object
|
43
|
+
action.should_receive(:delete).and_return(response_object)
|
44
|
+
EM::HttpRequest.should_receive(:new).with('http://localhost/some/item/23').and_return(action)
|
45
|
+
@proxy.call(@env)
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'should do a post with body if a post was sent' do
|
49
|
+
@env['REQUEST_METHOD'] = 'POST'
|
50
|
+
@env['REQUEST_URI'] = '/some/item'
|
51
|
+
action = double('http action').as_null_object
|
52
|
+
action.should_receive(:post).and_return(response_object)
|
53
|
+
EM::HttpRequest.should_receive(:new).with('http://localhost/some/item').and_return(action)
|
54
|
+
@proxy.call(@env)
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'should return the response from the proxied request' do
|
58
|
+
@env['REQUEST_METHOD'] = 'GET'
|
59
|
+
@env['REQUEST_URI'] = '/a/test/file.html'
|
60
|
+
results = response_object(401, {}, ['testing'])
|
61
|
+
action = double('http action').as_null_object
|
62
|
+
action.should_receive(:get).and_return(results)
|
63
|
+
EM::HttpRequest.should_receive(:new).with('http://localhost/a/test/file.html').and_return(action)
|
64
|
+
response = @proxy.call(@env)
|
65
|
+
response.should == [401, {}, [["testing"]]]
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
$:.unshift File.expand_path(File.dirname(__FILE__) + '/../lib')
|
2
|
+
$:.unshift File.expand_path(File.dirname(__FILE__))
|
3
|
+
|
4
|
+
require 'rspec'
|
5
|
+
require 'goliath'
|
6
|
+
require 'ostruct'
|
7
|
+
|
8
|
+
class ResponseHeader < Hash
|
9
|
+
def status
|
10
|
+
@status || 200
|
11
|
+
end
|
12
|
+
|
13
|
+
def status=(status)
|
14
|
+
@status = status
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class Response
|
19
|
+
attr_reader :response, :response_header
|
20
|
+
|
21
|
+
def initialize(code, headers, response)
|
22
|
+
@response = response
|
23
|
+
@response_header = ResponseHeader.new(headers)
|
24
|
+
@response_header.status = code
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
def response_object(code=200, headers={}, body=[])
|
30
|
+
Response.new(code, headers, body)
|
31
|
+
end
|
32
|
+
|
33
|
+
def initial_response
|
34
|
+
[200, {}, []]
|
35
|
+
end
|
metadata
ADDED
@@ -0,0 +1,120 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: goliath-reverse-proxy
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Daniel Farrell
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-05-28 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: goliath
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: em-synchrony
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: em-http-request
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: rspec
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ~>
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '2.10'
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '2.10'
|
78
|
+
description: ! " Turns Goliath into a reverse proxy server. Useful when paired
|
79
|
+
with other\n middleware, such as authentication.\n"
|
80
|
+
email: danielfarrell76@gmail.com
|
81
|
+
executables: []
|
82
|
+
extensions: []
|
83
|
+
extra_rdoc_files:
|
84
|
+
- README.md
|
85
|
+
files:
|
86
|
+
- .gitignore
|
87
|
+
- Gemfile
|
88
|
+
- Gemfile.lock
|
89
|
+
- README.md
|
90
|
+
- goliath-reverse-proxy.gemspec
|
91
|
+
- lib/goliath/rack/reverse_proxy.rb
|
92
|
+
- spec/goliath/reverse_proxy_spec.rb
|
93
|
+
- spec/spec_helper.rb
|
94
|
+
homepage: https://github.com/danielfarrell/goliath-reverse-proxy
|
95
|
+
licenses: []
|
96
|
+
post_install_message:
|
97
|
+
rdoc_options: []
|
98
|
+
require_paths:
|
99
|
+
- lib
|
100
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
101
|
+
none: false
|
102
|
+
requirements:
|
103
|
+
- - ! '>='
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
version: '0'
|
106
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
107
|
+
none: false
|
108
|
+
requirements:
|
109
|
+
- - ! '>='
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '0'
|
112
|
+
requirements: []
|
113
|
+
rubyforge_project:
|
114
|
+
rubygems_version: 1.8.23
|
115
|
+
signing_key:
|
116
|
+
specification_version: 3
|
117
|
+
summary: Reverse proxy middlware for Goliath
|
118
|
+
test_files:
|
119
|
+
- spec/goliath/reverse_proxy_spec.rb
|
120
|
+
- spec/spec_helper.rb
|