experella-proxy 0.0.10 → 0.0.11
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/bin/experella-proxy +5 -5
- data/config/default/config.rb +15 -16
- data/dev/experella-proxy +3 -4
- data/experella-proxy.gemspec +2 -2
- data/lib/experella-proxy/backend.rb +3 -5
- data/lib/experella-proxy/backend_server.rb +20 -22
- data/lib/experella-proxy/configuration.rb +19 -23
- data/lib/experella-proxy/connection.rb +29 -37
- data/lib/experella-proxy/connection_manager.rb +16 -21
- data/lib/experella-proxy/globals.rb +5 -7
- data/lib/experella-proxy/http_status_codes.rb +37 -38
- data/lib/experella-proxy/proxy.rb +8 -9
- data/lib/experella-proxy/request.rb +12 -13
- data/lib/experella-proxy/response.rb +28 -34
- data/lib/experella-proxy/server.rb +1 -6
- data/lib/experella-proxy/version.rb +5 -1
- data/lib/experella-proxy.rb +9 -10
- data/spec/echo-server/echo_server.rb +4 -6
- data/spec/experella-proxy/backend_server_spec.rb +16 -18
- data/spec/experella-proxy/configuration_spec.rb +4 -4
- data/spec/experella-proxy/connection_manager_spec.rb +15 -16
- data/spec/experella-proxy/experella-proxy_spec.rb +73 -76
- data/spec/experella-proxy/request_spec.rb +7 -7
- data/spec/experella-proxy/response_spec.rb +6 -6
- data/spec/fixtures/spec.log +187 -187
- data/spec/fixtures/test_config.rb +8 -10
- data/spec/spec_helper.rb +4 -5
- data/test/sinatra/hello_world_server.rb +0 -3
- data/test/sinatra/server_one.rb +1 -4
- data/test/sinatra/server_two.rb +2 -4
- metadata +3 -3
@@ -2,18 +2,18 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe ExperellaProxy::BackendServer do
|
4
4
|
|
5
|
-
let(:backend)
|
6
|
-
ExperellaProxy::BackendServer.new("host", "port",
|
7
|
-
:accepts => {"Host" => "experella", :path => "ella"},
|
8
|
-
:mangle => {"Connection" => "close"}
|
9
|
-
|
10
|
-
|
11
|
-
let(:min_backend)
|
5
|
+
let(:backend) do
|
6
|
+
ExperellaProxy::BackendServer.new("host", "port", :concurrency => "2", :name => "name",
|
7
|
+
:accepts => { "Host" => "experella", :path => "ella" },
|
8
|
+
:mangle => { "Connection" => "close" }
|
9
|
+
)
|
10
|
+
end
|
11
|
+
let(:min_backend) do
|
12
12
|
ExperellaProxy::BackendServer.new("host", "port")
|
13
|
-
|
14
|
-
let(:matcher)
|
13
|
+
end
|
14
|
+
let(:matcher) do
|
15
15
|
backend.message_matcher
|
16
|
-
|
16
|
+
end
|
17
17
|
|
18
18
|
describe "#new" do
|
19
19
|
|
@@ -45,7 +45,7 @@ describe ExperellaProxy::BackendServer do
|
|
45
45
|
end
|
46
46
|
|
47
47
|
it "mangle should be nil" do
|
48
|
-
backend.mangle.should == {:Connection => "close"}
|
48
|
+
backend.mangle.should == { :Connection => "close" }
|
49
49
|
min_backend.mangle.should be_nil
|
50
50
|
end
|
51
51
|
|
@@ -64,14 +64,12 @@ describe ExperellaProxy::BackendServer do
|
|
64
64
|
|
65
65
|
describe "#accept?" do
|
66
66
|
|
67
|
-
|
68
67
|
it "returns false if desired request header missing" do
|
69
68
|
request = ExperellaProxy::Request.new("")
|
70
69
|
request.update_header(:request_url => "/docs")
|
71
70
|
backend.accept?(request).should be_false
|
72
71
|
end
|
73
72
|
|
74
|
-
|
75
73
|
it "returns false if request headers doesn't match the message_matcher" do
|
76
74
|
request = ExperellaProxy::Request.new("")
|
77
75
|
request.update_header(:Host => "experella.com", :request_url => "/docs")
|
@@ -81,15 +79,15 @@ describe ExperellaProxy::BackendServer do
|
|
81
79
|
end
|
82
80
|
|
83
81
|
it "accepts a block as message matcher" do
|
84
|
-
lambdaBackend = ExperellaProxy::BackendServer.new("host", "port",
|
85
|
-
:accepts => lambda
|
82
|
+
lambdaBackend = ExperellaProxy::BackendServer.new("host", "port", :concurrency => "2", :name => "name",
|
83
|
+
:accepts => lambda do |req|
|
86
84
|
if req.header[:Host] == "google.com"
|
87
85
|
true
|
88
86
|
else
|
89
87
|
false
|
90
88
|
end
|
91
|
-
|
92
|
-
|
89
|
+
end
|
90
|
+
)
|
93
91
|
request = ExperellaProxy::Request.new("")
|
94
92
|
request.update_header(:Host => "google.com", :request_url => "/docs")
|
95
93
|
lambdaBackend.accept?(request).should be_true
|
@@ -106,4 +104,4 @@ describe ExperellaProxy::BackendServer do
|
|
106
104
|
|
107
105
|
end
|
108
106
|
|
109
|
-
end
|
107
|
+
end
|
@@ -1,9 +1,9 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe ExperellaProxy::Configuration do
|
4
|
-
let(:config)
|
4
|
+
let(:config) do
|
5
5
|
ExperellaProxy.config
|
6
|
-
|
6
|
+
end
|
7
7
|
|
8
8
|
it "should load a config file" do
|
9
9
|
config.backends.size.should == 4
|
@@ -17,7 +17,7 @@ describe ExperellaProxy::Configuration do
|
|
17
17
|
end
|
18
18
|
|
19
19
|
it "should raise NoConfigError if config filepath doesn't exist" do
|
20
|
-
lambda
|
21
|
-
|
20
|
+
lambda do config.read_config_file("/a/non/existing/filepath")
|
21
|
+
end.should raise_error(ExperellaProxy::Configuration::NoConfigError)
|
22
22
|
end
|
23
23
|
end
|
@@ -2,13 +2,12 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe ExperellaProxy::ConnectionManager do
|
4
4
|
|
5
|
-
let(:manager)
|
5
|
+
let(:manager) do
|
6
6
|
ExperellaProxy::ConnectionManager.new
|
7
|
-
|
7
|
+
end
|
8
8
|
|
9
9
|
class Testconnection
|
10
|
-
|
11
|
-
def initialize()
|
10
|
+
def initialize
|
12
11
|
@request = ExperellaProxy::Request.new(self)
|
13
12
|
end
|
14
13
|
|
@@ -41,8 +40,8 @@ describe ExperellaProxy::ConnectionManager do
|
|
41
40
|
manager.add_backend(ExperellaProxy::BackendServer.new("host", "port"))
|
42
41
|
manager.backend_count.should == 1
|
43
42
|
manager.backend_queue_count.should == 1
|
44
|
-
manager.backend_available?(Testconnection.new
|
45
|
-
manager.backend_available?(Testconnection.new
|
43
|
+
manager.backend_available?(Testconnection.new.get_request)
|
44
|
+
manager.backend_available?(Testconnection.new.get_request)
|
46
45
|
manager.backend_count.should == 1
|
47
46
|
manager.backend_queue_count.should == 0
|
48
47
|
manager.connection_count.should == 1
|
@@ -76,8 +75,8 @@ describe ExperellaProxy::ConnectionManager do
|
|
76
75
|
it "should return a connection if any queued conn matches" do
|
77
76
|
backend = ExperellaProxy::BackendServer.new("host", "port")
|
78
77
|
manager.add_backend(backend)
|
79
|
-
manager.backend_available?(Testconnection.new
|
80
|
-
manager.backend_available?(Testconnection.new
|
78
|
+
manager.backend_available?(Testconnection.new.get_request)
|
79
|
+
manager.backend_available?(Testconnection.new.get_request)
|
81
80
|
ret = manager.free_backend(backend)
|
82
81
|
ret.should be_an_instance_of Testconnection
|
83
82
|
end
|
@@ -85,11 +84,11 @@ describe ExperellaProxy::ConnectionManager do
|
|
85
84
|
it "should return nil and requeue backend if no conn matches" do
|
86
85
|
backend = ExperellaProxy::BackendServer.new("host", "port")
|
87
86
|
manager.add_backend(backend)
|
88
|
-
manager.backend_available?(Testconnection.new
|
87
|
+
manager.backend_available?(Testconnection.new.get_request)
|
89
88
|
backend_queue = manager.backend_queue_count
|
90
89
|
workload = backend.workload
|
91
90
|
ret = manager.free_backend(backend)
|
92
|
-
ret.should
|
91
|
+
ret.should.nil?
|
93
92
|
manager.backend_queue_count.should == (backend_queue + 1)
|
94
93
|
backend.workload.should == (workload - 1)
|
95
94
|
end
|
@@ -101,8 +100,8 @@ describe ExperellaProxy::ConnectionManager do
|
|
101
100
|
backend = ExperellaProxy::BackendServer.new("host", "port")
|
102
101
|
manager.add_backend(backend)
|
103
102
|
connections = []
|
104
|
-
connections[1] = Testconnection.new
|
105
|
-
connections[2] = Testconnection.new
|
103
|
+
connections[1] = Testconnection.new
|
104
|
+
connections[2] = Testconnection.new
|
106
105
|
manager.backend_available?(connections[1].get_request)
|
107
106
|
manager.backend_available?(connections[2].get_request)
|
108
107
|
count_before = manager.connection_count
|
@@ -113,9 +112,9 @@ describe ExperellaProxy::ConnectionManager do
|
|
113
112
|
|
114
113
|
describe "#backend_available?" do
|
115
114
|
before(:each) do
|
116
|
-
manager.add_backend(ExperellaProxy::BackendServer.new("host", "port",
|
117
|
-
manager.add_backend(ExperellaProxy::BackendServer.new("host2", "port",
|
118
|
-
manager.add_backend(ExperellaProxy::BackendServer.new("host3", "port",
|
115
|
+
manager.add_backend(ExperellaProxy::BackendServer.new("host", "port", :concurrency => 3, :accepts => { "Host" => "test" }))
|
116
|
+
manager.add_backend(ExperellaProxy::BackendServer.new("host2", "port", :accepts => { "Host" => "bla" }))
|
117
|
+
manager.add_backend(ExperellaProxy::BackendServer.new("host3", "port", :accepts => { "Host" => "blax" }))
|
119
118
|
end
|
120
119
|
it "returns first matching backend and removes it from queue" do
|
121
120
|
conn = Testconnection.new
|
@@ -156,4 +155,4 @@ describe ExperellaProxy::ConnectionManager do
|
|
156
155
|
|
157
156
|
end
|
158
157
|
|
159
|
-
end
|
158
|
+
end
|
@@ -22,23 +22,23 @@ describe ExperellaProxy do
|
|
22
22
|
|
23
23
|
# static testnames send to spawned experella for simplecov
|
24
24
|
ENV_TESTNAMES = {
|
25
|
-
"should get response from the echoserver via the proxy"
|
26
|
-
"should respond with 404"
|
27
|
-
"should respond with 400 on malformed request"
|
28
|
-
"should respond with 503"
|
29
|
-
"should reuse keep-alive connections"
|
25
|
+
"should get response from the echoserver via the proxy" => "response",
|
26
|
+
"should respond with 404" => "404",
|
27
|
+
"should respond with 400 on malformed request" => "400",
|
28
|
+
"should respond with 503" => "503",
|
29
|
+
"should reuse keep-alive connections" => "keep-alive",
|
30
30
|
"should handle chunked post requests and strip invalid Content-Length" => "chunked-request",
|
31
|
-
"should rechunk and stream Transfer-Encoding chunked responses"
|
32
|
-
"should timeout inactive connections after config.timeout"
|
33
|
-
"should handle pipelined requests correctly"
|
34
|
-
"should accept requests on all set proxy domains"
|
35
|
-
"should be able to handle post requests"
|
31
|
+
"should rechunk and stream Transfer-Encoding chunked responses" => "chunked-response",
|
32
|
+
"should timeout inactive connections after config.timeout" => "timeout",
|
33
|
+
"should handle pipelined requests correctly" => "pipelined",
|
34
|
+
"should accept requests on all set proxy domains" => "multiproxy",
|
35
|
+
"should be able to handle post requests" => "post"
|
36
36
|
}
|
37
37
|
|
38
38
|
describe "EchoServer" do
|
39
39
|
before :each do
|
40
40
|
@pid = spawn("ruby", "#{echo_server}", "127.0.0.10", "7654")
|
41
|
-
sleep(0.8) #let the server startup, specs may fail if this is set to low
|
41
|
+
sleep(0.8) # let the server startup, specs may fail if this is set to low
|
42
42
|
end
|
43
43
|
after :each do
|
44
44
|
Process.kill('QUIT', @pid)
|
@@ -46,9 +46,9 @@ describe ExperellaProxy do
|
|
46
46
|
end
|
47
47
|
|
48
48
|
it "should get response from the echoserver" do
|
49
|
-
lambda
|
49
|
+
lambda do
|
50
50
|
EM.run do
|
51
|
-
http = EventMachine::HttpRequest.new("http://127.0.0.10:7654").get(
|
51
|
+
http = EventMachine::HttpRequest.new("http://127.0.0.10:7654").get(:connect_timeout => 1)
|
52
52
|
http.errback {
|
53
53
|
EventMachine.stop
|
54
54
|
raise "http request failed"
|
@@ -58,7 +58,7 @@ describe ExperellaProxy do
|
|
58
58
|
EventMachine.stop
|
59
59
|
}
|
60
60
|
end
|
61
|
-
|
61
|
+
end.should_not raise_error
|
62
62
|
end
|
63
63
|
end
|
64
64
|
|
@@ -68,9 +68,9 @@ describe ExperellaProxy do
|
|
68
68
|
ENV["TESTNAME"] = ENV_TESTNAMES[test.example.description]
|
69
69
|
end
|
70
70
|
@pid = spawn("ruby", "#{echo_server}", "127.0.0.10", "7654")
|
71
|
-
@pid2 = spawn("#{experella_proxy}", "run", "--", "--config=#{File.join(File.dirname(__FILE__),"/../fixtures/test_config.rb")}")
|
72
|
-
sleep(0.8) #let the server startup, specs may fail if this is set to low
|
73
|
-
ExperellaProxy.init(:configfile => File.join(File.dirname(__FILE__),"/../fixtures/test_config.rb"))
|
71
|
+
@pid2 = spawn("#{experella_proxy}", "run", "--", "--config=#{File.join(File.dirname(__FILE__), "/../fixtures/test_config.rb")}")
|
72
|
+
sleep(0.8) # let the server startup, specs may fail if this is set to low
|
73
|
+
ExperellaProxy.init(:configfile => File.join(File.dirname(__FILE__), "/../fixtures/test_config.rb"))
|
74
74
|
config.backends.each do |backend|
|
75
75
|
connection_manager.add_backend(ExperellaProxy::BackendServer.new(backend[:host], backend[:port], backend))
|
76
76
|
end
|
@@ -86,10 +86,10 @@ describe ExperellaProxy do
|
|
86
86
|
log.info "should get response from the echoserver via the proxy"
|
87
87
|
EM.epoll
|
88
88
|
EM.run do
|
89
|
-
lambda
|
89
|
+
lambda do
|
90
90
|
EventMachine.add_timer(0.2) do
|
91
91
|
http = EventMachine::HttpRequest.new("http://#{config.proxy[0][:host]}:#{config.proxy[0][:port]}"
|
92
|
-
).get(
|
92
|
+
).get(:connect_timeout => 1, :head => { "Host" => "experella.com" })
|
93
93
|
http.errback {
|
94
94
|
EventMachine.stop
|
95
95
|
raise "http request failed"
|
@@ -99,7 +99,7 @@ describe ExperellaProxy do
|
|
99
99
|
EventMachine.stop
|
100
100
|
}
|
101
101
|
end
|
102
|
-
|
102
|
+
end.should_not raise_error
|
103
103
|
end
|
104
104
|
end
|
105
105
|
|
@@ -107,18 +107,18 @@ describe ExperellaProxy do
|
|
107
107
|
log.info "should respond with 404"
|
108
108
|
EM.epoll
|
109
109
|
EM.run do
|
110
|
-
lambda
|
110
|
+
lambda do
|
111
111
|
EventMachine.add_timer(0.2) do
|
112
112
|
|
113
113
|
multi = EventMachine::MultiRequest.new
|
114
114
|
multi_shuffle = []
|
115
|
-
multi_shuffle[0] =
|
115
|
+
multi_shuffle[0] = proc {
|
116
116
|
multi.add :head, EventMachine::HttpRequest.new("http://#{config.proxy[0][:host]}:#{config.proxy[0][:port]}"
|
117
|
-
).head(
|
117
|
+
).head(:connect_timeout => 1)
|
118
118
|
}
|
119
|
-
multi_shuffle[1] =
|
119
|
+
multi_shuffle[1] = proc {
|
120
120
|
multi.add :get, EventMachine::HttpRequest.new("http://#{config.proxy[0][:host]}:#{config.proxy[0][:port]}"
|
121
|
-
).get(
|
121
|
+
).get(:connect_timeout => 1)
|
122
122
|
}
|
123
123
|
multi_shuffle.shuffle!
|
124
124
|
multi_shuffle.each do |p|
|
@@ -137,9 +137,8 @@ describe ExperellaProxy do
|
|
137
137
|
EventMachine.stop
|
138
138
|
end
|
139
139
|
|
140
|
-
|
141
140
|
end
|
142
|
-
|
141
|
+
end.should_not raise_error
|
143
142
|
end
|
144
143
|
end
|
145
144
|
|
@@ -147,11 +146,11 @@ describe ExperellaProxy do
|
|
147
146
|
log.info "should respond with 400 on malformed request"
|
148
147
|
EM.epoll
|
149
148
|
EM.run do
|
150
|
-
lambda
|
149
|
+
lambda do
|
151
150
|
EventMachine.add_timer(0.2) do
|
152
151
|
http = EventMachine::HttpRequest.new("http://#{config.proxy[0][:host]}:#{config.proxy[0][:port]}"
|
153
|
-
).post(
|
154
|
-
:body => "9\r\nMalformed\r\na\r\nchunked da\r\n2\rta HERE\r\n0\r\n\r\n"
|
152
|
+
).post(:connect_timeout => 1, :head => { "Host" => "experella.com", "Transfer-Encoding" => "chunked" },
|
153
|
+
:body => "9\r\nMalformed\r\na\r\nchunked da\r\n2\rta HERE\r\n0\r\n\r\n")
|
155
154
|
http.errback {
|
156
155
|
EventMachine.stop
|
157
156
|
raise "http request failed"
|
@@ -161,7 +160,7 @@ describe ExperellaProxy do
|
|
161
160
|
EventMachine.stop
|
162
161
|
}
|
163
162
|
end
|
164
|
-
|
163
|
+
end.should_not raise_error
|
165
164
|
end
|
166
165
|
end
|
167
166
|
|
@@ -169,18 +168,18 @@ describe ExperellaProxy do
|
|
169
168
|
log.info "should respond with 503"
|
170
169
|
EM.epoll
|
171
170
|
EM.run do
|
172
|
-
lambda
|
171
|
+
lambda do
|
173
172
|
EventMachine.add_timer(0.2) do
|
174
173
|
|
175
174
|
multi = EventMachine::MultiRequest.new
|
176
175
|
multi_shuffle = []
|
177
|
-
multi_shuffle[0] =
|
176
|
+
multi_shuffle[0] = proc {
|
178
177
|
multi.add :head, EventMachine::HttpRequest.new("http://#{config.proxy[0][:host]}:#{config.proxy[0][:port]}/oneroute"
|
179
|
-
).head(
|
178
|
+
).head(:connect_timeout => 1, :head => { "Host" => "experella.com" })
|
180
179
|
}
|
181
|
-
multi_shuffle[1] =
|
180
|
+
multi_shuffle[1] = proc {
|
182
181
|
multi.add :get, EventMachine::HttpRequest.new("http://#{config.proxy[0][:host]}:#{config.proxy[0][:port]}/anotherpath"
|
183
|
-
).get(
|
182
|
+
).get(:connect_timeout => 1, :head => { "Host" => "experella.com" })
|
184
183
|
}
|
185
184
|
multi_shuffle.shuffle!
|
186
185
|
multi_shuffle.each do |p|
|
@@ -199,9 +198,8 @@ describe ExperellaProxy do
|
|
199
198
|
EventMachine.stop
|
200
199
|
end
|
201
200
|
|
202
|
-
|
203
201
|
end
|
204
|
-
|
202
|
+
end.should_not raise_error
|
205
203
|
end
|
206
204
|
end
|
207
205
|
|
@@ -209,10 +207,10 @@ describe ExperellaProxy do
|
|
209
207
|
log.info "should reuse keep-alive connections"
|
210
208
|
EM.epoll
|
211
209
|
EM.run do
|
212
|
-
lambda
|
210
|
+
lambda do
|
213
211
|
EventMachine.add_timer(0.2) do
|
214
212
|
conn = EventMachine::HttpRequest.new("http://#{config.proxy[0][:host]}:#{config.proxy[0][:port]}")
|
215
|
-
req1 = conn.get(
|
213
|
+
req1 = conn.get(:connect_timeout => 1, :keepalive => true, :head => { "Host" => "experella.com" })
|
216
214
|
|
217
215
|
req1.errback {
|
218
216
|
EventMachine.stop
|
@@ -220,14 +218,14 @@ describe ExperellaProxy do
|
|
220
218
|
}
|
221
219
|
req1.callback {
|
222
220
|
req1.response.should start_with "you sent: "
|
223
|
-
req2 = conn.get(
|
221
|
+
req2 = conn.get(:path => '/about/', :connect_timeout => 1, :keepalive => true, :head => { "Host" => "experella.com" })
|
224
222
|
req2.errback {
|
225
223
|
EventMachine.stop
|
226
224
|
raise "http request 2 failed"
|
227
225
|
}
|
228
226
|
req2.callback {
|
229
227
|
req2.response.should start_with "you sent: "
|
230
|
-
req3 = conn.get(
|
228
|
+
req3 = conn.get(:connect_timeout => 1, :head => { "Host" => "experella.com" })
|
231
229
|
req3.errback {
|
232
230
|
EventMachine.stop
|
233
231
|
raise "http request 3 failed"
|
@@ -239,7 +237,7 @@ describe ExperellaProxy do
|
|
239
237
|
}
|
240
238
|
}
|
241
239
|
end
|
242
|
-
|
240
|
+
end.should_not raise_error
|
243
241
|
end
|
244
242
|
end
|
245
243
|
|
@@ -247,7 +245,7 @@ describe ExperellaProxy do
|
|
247
245
|
log.info "should stream chunked post requests"
|
248
246
|
EM.epoll
|
249
247
|
EM.run do
|
250
|
-
lambda
|
248
|
+
lambda do
|
251
249
|
EventMachine.add_timer(0.2) do
|
252
250
|
# this will issue a Post Request with Content-Length AND Transfer-Encoding chunked, where the data is
|
253
251
|
# correctly encoded in chunks. The Proxy should therefor strip the Content-Length and forward the data
|
@@ -265,10 +263,10 @@ describe ExperellaProxy do
|
|
265
263
|
expected_body = String.new
|
266
264
|
chunks = 20 + rand(20)
|
267
265
|
# all alphanumeric characters
|
268
|
-
o = [('a'..'z'), ('A'..'Z'), ('0'..'9')].map
|
269
|
-
while chunks > 0
|
270
|
-
#chunksize 10 to 1510 characters
|
271
|
-
string = (0...(10 + rand(1500))).map
|
266
|
+
o = [('a'..'z'), ('A'..'Z'), ('0'..'9')].map{ |i| i.to_a }.flatten
|
267
|
+
while chunks > 0
|
268
|
+
# chunksize 10 to 1510 characters
|
269
|
+
string = (0...(10 + rand(1500))).map{ o[rand(o.length)] }.join
|
272
270
|
body << string.size.to_s(16)
|
273
271
|
body << "\r\n"
|
274
272
|
body << string
|
@@ -279,8 +277,8 @@ describe ExperellaProxy do
|
|
279
277
|
body << "0\r\n\r\n"
|
280
278
|
|
281
279
|
http = EventMachine::HttpRequest.new("http://#{config.proxy[0][:host]}:#{config.proxy[0][:port]}"
|
282
|
-
).post(
|
283
|
-
:body => body
|
280
|
+
).post(:connect_timeout => 1, :head => { "Host" => "experella.com", "Transfer-Encoding" => "chunked" },
|
281
|
+
:body => body)
|
284
282
|
http.errback {
|
285
283
|
EventMachine.stop
|
286
284
|
raise "http request failed"
|
@@ -309,7 +307,7 @@ describe ExperellaProxy do
|
|
309
307
|
EventMachine.stop
|
310
308
|
}
|
311
309
|
end
|
312
|
-
|
310
|
+
end.should_not raise_error
|
313
311
|
end
|
314
312
|
|
315
313
|
end
|
@@ -319,17 +317,17 @@ describe ExperellaProxy do
|
|
319
317
|
log.info "should rechunk and stream Transfer-Encoding chunked responses"
|
320
318
|
EM.epoll
|
321
319
|
EM.run do
|
322
|
-
lambda
|
320
|
+
lambda do
|
323
321
|
EventMachine.add_timer(0.2) do
|
324
322
|
http = EventMachine::HttpRequest.new("http://#{config.proxy[0][:host]}:#{config.proxy[0][:port]}/chunked"
|
325
|
-
).get(
|
323
|
+
).get(:connect_timeout => 1, :head => { "Host" => "experella.com" })
|
326
324
|
http.errback {
|
327
325
|
EventMachine.stop
|
328
326
|
raise "http request failed"
|
329
327
|
}
|
330
328
|
received_chunks = ""
|
331
329
|
http.stream { |chunk|
|
332
|
-
|
330
|
+
received_chunks << chunk
|
333
331
|
}
|
334
332
|
http.callback {
|
335
333
|
true.should be_true
|
@@ -338,7 +336,7 @@ describe ExperellaProxy do
|
|
338
336
|
EventMachine.stop
|
339
337
|
}
|
340
338
|
end
|
341
|
-
|
339
|
+
end.should_not raise_error
|
342
340
|
end
|
343
341
|
|
344
342
|
end
|
@@ -348,14 +346,14 @@ describe ExperellaProxy do
|
|
348
346
|
EM.epoll
|
349
347
|
EM.run do
|
350
348
|
|
351
|
-
lambda
|
349
|
+
lambda do
|
352
350
|
EventMachine.add_timer(0.2) do
|
353
351
|
time = Time.now
|
354
352
|
conn = EventMachine::HttpRequest.new("http://#{config.proxy[0][:host]}:#{config.proxy[0][:port]}")
|
355
|
-
req1 = conn.get(
|
356
|
-
:keepalive => true, :head => {"Host" => "experella.com"}
|
353
|
+
req1 = conn.get(:connect_timeout => 1, :inactivity_timeout => config.timeout + 5,
|
354
|
+
:keepalive => true, :head => { "Host" => "experella.com" })
|
357
355
|
req1.errback {
|
358
|
-
#this shouldnt happen, but when it does it should at least be because of a timeout
|
356
|
+
# this shouldnt happen, but when it does it should at least be because of a timeout
|
359
357
|
time = Time.now - time
|
360
358
|
time.should >= config.timeout
|
361
359
|
time.should < config.timeout + 5
|
@@ -365,7 +363,7 @@ describe ExperellaProxy do
|
|
365
363
|
req1.callback {
|
366
364
|
req1.response.should start_with "you sent: "
|
367
365
|
}
|
368
|
-
#check for inactivity timeout
|
366
|
+
# check for inactivity timeout
|
369
367
|
EventMachine.add_periodic_timer(1) do
|
370
368
|
if conn.conn.get_idle_time.nil?
|
371
369
|
time = Time.now - time
|
@@ -378,22 +376,21 @@ describe ExperellaProxy do
|
|
378
376
|
end
|
379
377
|
end
|
380
378
|
end
|
381
|
-
|
379
|
+
end.should_not raise_error
|
382
380
|
end
|
383
381
|
end
|
384
382
|
|
385
|
-
|
386
383
|
it "should handle pipelined requests correctly" do
|
387
384
|
log.info "should handle pipelined requests correctly"
|
388
385
|
EM.epoll
|
389
386
|
EM.run do
|
390
|
-
lambda
|
387
|
+
lambda do
|
391
388
|
EventMachine.add_timer(0.2) do
|
392
389
|
conn = EventMachine::HttpRequest.new("http://#{config.proxy[0][:host]}:#{config.proxy[0][:port]}")
|
393
390
|
|
394
|
-
pipe1 = conn.get(
|
395
|
-
pipe2 = conn.get(
|
396
|
-
pipe3 = conn.get(
|
391
|
+
pipe1 = conn.get(:connect_timeout => 1, :keepalive => true, :head => { "Host" => "experella.com" })
|
392
|
+
pipe2 = conn.get(:path => '/about/', :connect_timeout => 1, :keepalive => true, :head => { "Host" => "experella.com" })
|
393
|
+
pipe3 = conn.get(:connect_timeout => 1, :head => { "Host" => "experella.com" })
|
397
394
|
pipe1.errback {
|
398
395
|
EventMachine.stop
|
399
396
|
raise "http request 1 failed"
|
@@ -423,7 +420,7 @@ describe ExperellaProxy do
|
|
423
420
|
EventMachine.stop
|
424
421
|
}
|
425
422
|
end
|
426
|
-
|
423
|
+
end.should_not raise_error
|
427
424
|
end
|
428
425
|
end
|
429
426
|
|
@@ -431,16 +428,16 @@ describe ExperellaProxy do
|
|
431
428
|
log.info "should accept requests on all set proxy domains"
|
432
429
|
EM.epoll
|
433
430
|
EM.run do
|
434
|
-
lambda
|
431
|
+
lambda do
|
435
432
|
EventMachine.add_timer(0.2) do
|
436
433
|
|
437
434
|
multi = EventMachine::MultiRequest.new
|
438
435
|
multi_shuffle = []
|
439
436
|
i = 0
|
440
|
-
while config.proxy.length > i
|
441
|
-
multi_shuffle[i] =
|
437
|
+
while config.proxy.length > i
|
438
|
+
multi_shuffle[i] = proc { |i|
|
442
439
|
multi.add i, EventMachine::HttpRequest.new("http://#{config.proxy[i][:host]}:#{config.proxy[i][:port]}"
|
443
|
-
).get(
|
440
|
+
).get(:connect_timeout => 1, :head => { "Host" => "experella.com" })
|
444
441
|
}
|
445
442
|
i += 1
|
446
443
|
end
|
@@ -462,7 +459,7 @@ describe ExperellaProxy do
|
|
462
459
|
EventMachine.stop
|
463
460
|
end
|
464
461
|
end
|
465
|
-
|
462
|
+
end.should_not raise_error
|
466
463
|
end
|
467
464
|
end
|
468
465
|
|
@@ -470,10 +467,10 @@ describe ExperellaProxy do
|
|
470
467
|
log.info "should be able to handle post requests"
|
471
468
|
EM.epoll
|
472
469
|
EM.run do
|
473
|
-
lambda
|
470
|
+
lambda do
|
474
471
|
EventMachine.add_timer(0.2) do
|
475
472
|
http = EventMachine::HttpRequest.new("http://#{config.proxy[0][:host]}:#{config.proxy[0][:port]}"
|
476
|
-
).post(
|
473
|
+
).post(:connect_timeout => 1, :head => { "Host" => "experella.com" }, :body => "Message body")
|
477
474
|
http.errback {
|
478
475
|
EventMachine.stop
|
479
476
|
raise "http post failed"
|
@@ -484,9 +481,9 @@ describe ExperellaProxy do
|
|
484
481
|
EventMachine.stop
|
485
482
|
}
|
486
483
|
end
|
487
|
-
|
484
|
+
end.should_not raise_error
|
488
485
|
end
|
489
486
|
end
|
490
487
|
|
491
488
|
end
|
492
|
-
end
|
489
|
+
end
|
@@ -2,9 +2,9 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe ExperellaProxy::Request do
|
4
4
|
|
5
|
-
let(:request)
|
5
|
+
let(:request) do
|
6
6
|
ExperellaProxy::Request.new("conn")
|
7
|
-
|
7
|
+
end
|
8
8
|
|
9
9
|
describe "#new" do
|
10
10
|
|
@@ -51,7 +51,7 @@ describe ExperellaProxy::Request do
|
|
51
51
|
|
52
52
|
describe "#add_uri" do
|
53
53
|
it "adds a hash to the URI hash" do
|
54
|
-
request.add_uri(
|
54
|
+
request.add_uri(:path => "/hello")
|
55
55
|
request.uri[:path].should eql("/hello")
|
56
56
|
end
|
57
57
|
end
|
@@ -67,15 +67,15 @@ describe ExperellaProxy::Request do
|
|
67
67
|
it "overwrites values of existing keys" do
|
68
68
|
request.update_header("Host" => "xyz", :request_url => "abcd")
|
69
69
|
request.update_header("Host" => "abc")
|
70
|
-
request.header.should eql(
|
70
|
+
request.header.should eql(:Host => "abc", :request_url => "abcd")
|
71
71
|
end
|
72
72
|
end
|
73
73
|
|
74
74
|
describe "#reconstruct_header" do
|
75
75
|
it "writes a valid http header into send_buffer" do
|
76
76
|
request << "HeaderDummy\r\n\r\n"
|
77
|
-
request.update_header(
|
78
|
-
"Host" => "localhost", "Connection" => "keep-alive", :"Via-X" =>
|
77
|
+
request.update_header(:http_method => "GET", :request_url => "/index",
|
78
|
+
"Host" => "localhost", "Connection" => "keep-alive", :"Via-X" => %w(Lukas Amy George))
|
79
79
|
request.reconstruct_header
|
80
80
|
data = request.flush
|
81
81
|
data.start_with?("GET /index HTTP/1.1\r\n").should be_true
|
@@ -85,4 +85,4 @@ describe ExperellaProxy::Request do
|
|
85
85
|
end
|
86
86
|
end
|
87
87
|
|
88
|
-
end
|
88
|
+
end
|