hatetepe 0.4.1 → 0.5.0.pre
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/examples/parallel_requests.rb +32 -0
- data/hatetepe.gemspec +3 -4
- data/lib/hatetepe/builder.rb +1 -0
- data/lib/hatetepe/cli.rb +11 -20
- data/lib/hatetepe/client.rb +210 -181
- data/lib/hatetepe/connection.rb +31 -12
- data/lib/hatetepe/server/keep_alive.rb +15 -53
- data/lib/hatetepe/server/pipeline.rb +14 -18
- data/lib/hatetepe/server/rack_app.rb +39 -0
- data/lib/hatetepe/server.rb +60 -108
- data/lib/hatetepe/version.rb +1 -1
- data/lib/rack/handler/hatetepe.rb +2 -0
- data/spec/integration/cli/start_spec.rb +84 -92
- data/spec/integration/client/keep_alive_spec.rb +5 -56
- data/spec/integration/client/timeout_spec.rb +93 -0
- data/spec/integration/server/keep_alive_spec.rb +8 -80
- data/spec/integration/server/timeout_spec.rb +45 -0
- data/spec/spec_helper.rb +7 -59
- data/spec/unit/client_spec.rb +68 -363
- data/spec/unit/connection_spec.rb +5 -7
- data/spec/unit/server_spec.rb +108 -338
- metadata +58 -43
- data/lib/hatetepe/client/keep_alive.rb +0 -32
- data/lib/hatetepe/client/pipeline.rb +0 -19
- data/lib/hatetepe/server/app.rb +0 -85
- data/lib/hatetepe/server/proxy.rb +0 -48
- data/spec/unit/app_spec.rb +0 -125
- data/spec/unit/client/pipeline_spec.rb +0 -40
- data/spec/unit/proxy_spec.rb +0 -145
data/spec/unit/server_spec.rb
CHANGED
@@ -1,355 +1,125 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
1
3
|
require "spec_helper"
|
2
4
|
require "hatetepe/server"
|
3
5
|
|
4
|
-
describe Hatetepe::Server do
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
s.post_init
|
10
|
-
s.requests << request
|
11
|
-
}
|
12
|
-
}
|
13
|
-
let(:request) { Hatetepe::Request.new :get, "/" }
|
14
|
-
let(:env) { request.to_h }
|
15
|
-
|
16
|
-
let(:app) { stub "app" }
|
17
|
-
let(:host) { "127.0.4.1" }
|
18
|
-
let(:port) { 8081 }
|
19
|
-
let(:errors) { stub "errors", :<< => nil, :flush => nil }
|
20
|
-
let(:config) {
|
21
|
-
{
|
22
|
-
:app => app,
|
23
|
-
:host => host,
|
24
|
-
:port => port,
|
25
|
-
:errors => errors,
|
26
|
-
:timeout => 0.0123
|
27
|
-
}
|
28
|
-
}
|
29
|
-
|
30
|
-
before do
|
31
|
-
server.stub :sockaddr => [42424, "127.0.42.1"]
|
32
|
-
@old_env, ENV["RACK_ENV"] = ENV["RACK_ENV"], "testing"
|
33
|
-
end
|
34
|
-
|
35
|
-
after do
|
36
|
-
ENV["RACK_ENV"] = @old_env
|
6
|
+
describe Hatetepe::Server, "(public API)" do
|
7
|
+
describe ".start(config, &app)" do
|
8
|
+
it "starts a server that listens on the supplied interface and port"
|
9
|
+
it "passes the config to incoming connections"
|
10
|
+
it "uses the passed block as app if any was passed"
|
37
11
|
end
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
context ".start(config)" do
|
44
|
-
it "starts an EventMachine server" do
|
45
|
-
args = [host, port, Hatetepe::Server, config]
|
46
|
-
EM.should_receive(:start_server).with(*args) { server }
|
47
|
-
|
48
|
-
Hatetepe::Server.start(config).should equal(server)
|
49
|
-
end
|
12
|
+
|
13
|
+
describe ".stop" do
|
14
|
+
it "waits for all requests to finish"
|
15
|
+
it "stops the server"
|
50
16
|
end
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
it "sets up the error stream" do
|
56
|
-
server.send :initialize, config
|
57
|
-
server.errors.should equal(errors)
|
58
|
-
server.config[:errors].should be_nil
|
59
|
-
end
|
60
|
-
|
61
|
-
it "uses stderr as default error stream" do
|
62
|
-
config.delete :errors
|
63
|
-
server.send :initialize, config
|
64
|
-
server.errors.should equal($stderr)
|
65
|
-
end
|
66
|
-
|
67
|
-
it "assumes a default connection inactivity timeout of 1 seconds" do
|
68
|
-
server.send :initialize, {}
|
69
|
-
server.config[:timeout].should equal(1)
|
70
|
-
end
|
17
|
+
|
18
|
+
describe ".stop!" do
|
19
|
+
it "immediately stops the server"
|
71
20
|
end
|
72
|
-
|
73
|
-
|
74
|
-
let :
|
75
|
-
|
76
|
-
s.
|
77
|
-
s.stub
|
21
|
+
|
22
|
+
describe "config[:app].call(env)" do
|
23
|
+
let :subject do
|
24
|
+
Object.new.tap do |s|
|
25
|
+
s.extend Hatetepe::Server
|
26
|
+
s.stub({
|
27
|
+
:config => {
|
28
|
+
:host => "127.0.5.1",
|
29
|
+
:port => 3000,
|
30
|
+
:app => stub("app")
|
31
|
+
},
|
32
|
+
:send_data => nil
|
33
|
+
})
|
34
|
+
s.stub(:comm_inactivity_timeout=)
|
35
|
+
s.post_init
|
78
36
|
end
|
79
37
|
end
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
server.requests.should be_an(Array)
|
84
|
-
server.requests.should be_empty
|
85
|
-
end
|
86
|
-
|
87
|
-
it "sets up the parser" do
|
88
|
-
server.post_init
|
89
|
-
server.parser.should respond_to(:<<)
|
90
|
-
server.parser.on_request[0].should == server.requests.method(:<<)
|
91
|
-
end
|
92
|
-
|
93
|
-
it "sets up the builder" do
|
94
|
-
server.post_init
|
95
|
-
server.builder.on_write[0].should == server.method(:send_data)
|
96
|
-
end
|
97
|
-
|
98
|
-
it "builds the app" do
|
99
|
-
server.post_init
|
100
|
-
server.app.should be_a(Hatetepe::Server::Pipeline)
|
101
|
-
server.app.app.should be_a(Hatetepe::Server::App)
|
102
|
-
server.app.app.app.should be_a(Hatetepe::Server::KeepAlive)
|
103
|
-
server.app.app.app.app.should be_a(Hatetepe::Server::Proxy)
|
104
|
-
server.app.app.app.app.app.should equal(app)
|
105
|
-
end
|
106
|
-
|
107
|
-
it "starts the connection inactivity tracking" do
|
108
|
-
server.should_receive(:comm_inactivity_timeout=).with 0.0123
|
109
|
-
server.post_init
|
110
|
-
end
|
111
|
-
|
112
|
-
it "enables request processing" do
|
113
|
-
server.post_init
|
114
|
-
server.processing_enabled.should be_true
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
context "#receive_data(data)" do
|
119
|
-
before do
|
120
|
-
ENV.delete "RACK_ENV"
|
121
|
-
server.stub :close_connection
|
122
|
-
end
|
123
|
-
|
124
|
-
it "feeds data into the parser" do
|
125
|
-
data = stub("data")
|
126
|
-
server.parser.should_receive(:<<).with data
|
127
|
-
server.receive_data data
|
128
|
-
end
|
129
|
-
|
130
|
-
it "closes the connection if parsing fails" do
|
131
|
-
server.parser.should_receive(:<<).and_raise(Hatetepe::ParserError)
|
132
|
-
server.should_receive :close_connection
|
133
|
-
|
134
|
-
server.receive_data "irrelevant data"
|
135
|
-
end
|
136
|
-
|
137
|
-
it "re-raises parsing errors if RACK_ENV is testing" do
|
138
|
-
ENV["RACK_ENV"] = "testing"
|
139
|
-
server.parser.should_receive(:<<).and_raise Hatetepe::ParserError
|
140
|
-
|
141
|
-
expect {
|
142
|
-
server.receive_data "irrelevant data"
|
143
|
-
}.to raise_error(Hatetepe::ParserError)
|
144
|
-
end
|
145
|
-
|
146
|
-
it "closes the connection when catching an exception" do
|
147
|
-
server.parser.should_receive(:<<).and_raise Exception
|
148
|
-
server.should_receive :close_connection_after_writing
|
149
|
-
|
150
|
-
server.receive_data ""
|
151
|
-
end
|
152
|
-
|
153
|
-
it "re-raises caught exceptions" do
|
154
|
-
ENV["RACK_ENV"] = "testing"
|
155
|
-
server.parser.should_receive(:<<).and_raise Exception
|
156
|
-
|
157
|
-
expect { server.receive_data "" }.to raise_error(Exception)
|
158
|
-
end
|
159
|
-
|
160
|
-
it "logs caught exceptions" do
|
161
|
-
server.parser.should_receive(:<<).and_raise "error message"
|
162
|
-
errors.should_receive(:<<) {|str|
|
163
|
-
str.should include("error message")
|
164
|
-
}
|
165
|
-
errors.should_receive :flush
|
166
|
-
|
167
|
-
server.receive_data ""
|
168
|
-
end
|
169
|
-
end
|
170
|
-
|
171
|
-
context "#process" do
|
172
|
-
before do
|
173
|
-
request.stub :to_h => env
|
174
|
-
app.stub :call => [-1]
|
175
|
-
end
|
176
|
-
|
177
|
-
it "puts useful stuff into env[]" do
|
178
|
-
app.should_receive(:call) {|e|
|
179
|
-
e.should equal(env)
|
180
|
-
e["rack.url_scheme"].should == "http"
|
181
|
-
e["hatetepe.connection"].should equal(server)
|
182
|
-
e["rack.input"].source.should equal(server)
|
183
|
-
e["rack.errors"].should equal(server.errors)
|
184
|
-
e["rack.multithread"].should be_false
|
185
|
-
e["rack.multiprocess"].should be_false
|
186
|
-
e["rack.run_once"].should be_false
|
187
|
-
|
188
|
-
e["SERVER_NAME"].should == host
|
189
|
-
e["SERVER_NAME"].should_not equal(host)
|
190
|
-
e["SERVER_PORT"].should == String(port)
|
191
|
-
e["REMOTE_ADDR"].should == server.remote_address
|
192
|
-
e["REMOTE_ADDR"].should_not equal(server.remote_address)
|
193
|
-
e["REMOTE_PORT"].should == String(server.remote_port)
|
194
|
-
e["HTTP_HOST"].should == "#{host}:#{port}"
|
195
|
-
|
196
|
-
[-1]
|
197
|
-
}
|
198
|
-
server.process
|
199
|
-
end
|
200
|
-
|
201
|
-
it "calls the app within a new Fiber" do
|
202
|
-
outer_fiber = Fiber.current
|
203
|
-
app.should_receive(:call) {
|
204
|
-
Fiber.current.should_not equal(outer_fiber)
|
205
|
-
[-1]
|
206
|
-
}
|
207
|
-
server.process
|
208
|
-
end
|
209
|
-
|
210
|
-
it "is a no-op if processing is disabled" do
|
211
|
-
server.processing_enabled = false
|
212
|
-
app.should_not_receive :call
|
213
|
-
server.process
|
214
|
-
end
|
215
|
-
|
216
|
-
let(:another_request) { Hatetepe::Request.new :get, "/asdf" }
|
217
|
-
|
218
|
-
it "disables the connection timeout until the last request is finished" do
|
219
|
-
server.requests << another_request
|
220
|
-
|
221
|
-
server.should_receive(:comm_inactivity_timeout=).with 0
|
222
|
-
server.process
|
223
|
-
|
224
|
-
server.should_not_receive(:comm_inactivity_timeout=).with config[:timeout]
|
225
|
-
server.requests.delete request
|
226
|
-
request.succeed
|
227
|
-
|
228
|
-
server.rspec_verify
|
229
|
-
server.rspec_reset
|
230
|
-
|
231
|
-
server.should_receive(:comm_inactivity_timeout=).with config[:timeout]
|
232
|
-
server.requests.delete another_request
|
233
|
-
another_request.succeed
|
234
|
-
end
|
235
|
-
end
|
236
|
-
|
237
|
-
context "env[stream.start].call(response)" do
|
238
|
-
let(:previous) { EM::DefaultDeferrable.new }
|
239
|
-
let(:response) {
|
240
|
-
[200, {"Key" => "value"}, Rack::STREAMING]
|
241
|
-
}
|
242
|
-
|
243
|
-
before {
|
244
|
-
server.requests.unshift previous
|
245
|
-
app.stub(:call) {|e| response }
|
246
|
-
request.stub :succeed
|
247
|
-
server.builder.stub :response_line
|
248
|
-
server.builder.stub :headers
|
249
|
-
}
|
250
|
-
|
251
|
-
it "deletes itself from env[] to prevent multiple calls" do
|
252
|
-
app.stub(:call) {|e|
|
253
|
-
e["stream.start"].call response
|
254
|
-
e.key?("stream.start").should be_false
|
255
|
-
[-1]
|
256
|
-
}
|
257
|
-
previous.succeed
|
258
|
-
server.process
|
259
|
-
end
|
260
|
-
|
261
|
-
# TODO this should be moved to a Server::Pipeline spec
|
262
|
-
it "waits for the previous request's response to finish" do
|
263
|
-
server.builder.should_not_receive :response
|
264
|
-
server.process
|
265
|
-
end
|
266
|
-
end
|
267
|
-
|
268
|
-
context "env[stream.send].call(chunk)" do
|
269
|
-
it "passes data to the builder" do
|
270
|
-
app.stub(:call) {|e|
|
271
|
-
e["stream.send"].should == server.builder.method(:body_chunk)
|
272
|
-
[-1]
|
273
|
-
}
|
274
|
-
server.process
|
275
|
-
end
|
276
|
-
end
|
277
|
-
|
278
|
-
context "env[stream.close].call" do
|
279
|
-
before {
|
280
|
-
server.builder.stub :complete
|
281
|
-
request.stub :succeed
|
282
|
-
}
|
283
|
-
|
284
|
-
it "leaves the connection open" do
|
285
|
-
server.should_not_receive :close_connection
|
286
|
-
app.stub(:call) {|e|
|
287
|
-
server.requests << stub("another request")
|
288
|
-
e["stream.close"].call
|
289
|
-
[-1]
|
290
|
-
}
|
291
|
-
server.process
|
38
|
+
|
39
|
+
let :app do
|
40
|
+
subject.config[:app]
|
292
41
|
end
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
42
|
+
|
43
|
+
let :http_request do
|
44
|
+
[
|
45
|
+
"POST /foo/bar?key=value HTTP/1.1",
|
46
|
+
"Host: themachine.local",
|
47
|
+
"Content-Length: 13",
|
48
|
+
"",
|
49
|
+
"Hello, world!"
|
50
|
+
].join("\r\n")
|
302
51
|
end
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
it "initiates the response" do
|
318
|
-
server.builder.should_receive(:response_line) {|code|
|
319
|
-
code.should equal(response[0])
|
320
|
-
}
|
321
|
-
server.builder.should_receive(:headers) {|headers|
|
322
|
-
headers["Key"].should equal(response[1]["Key"])
|
323
|
-
headers["Server"].should == "hatetepe/#{Hatetepe::VERSION}"
|
324
|
-
}
|
325
|
-
previous.succeed
|
326
|
-
server.process
|
52
|
+
|
53
|
+
let :http_response do
|
54
|
+
[
|
55
|
+
"HTTP/1.1 403 Forbidden",
|
56
|
+
"Content-Type: text/plain",
|
57
|
+
"Transfer-Encoding: chunked",
|
58
|
+
"",
|
59
|
+
"b",
|
60
|
+
"Mmh, nöö.",
|
61
|
+
"0",
|
62
|
+
"",
|
63
|
+
""
|
64
|
+
].join("\r\n")
|
327
65
|
end
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
[
|
66
|
+
|
67
|
+
it "receives the Rack Env hash as parameter" do
|
68
|
+
app.should_receive :call do |env|
|
69
|
+
Rack::Lint.new(app).check_env(env)
|
70
|
+
env["REQUEST_METHOD"].should == "POST"
|
71
|
+
env["REQUEST_URI"].should == "/foo/bar?key=value"
|
72
|
+
env["HTTP_HOST"].should == "themachine.local"
|
73
|
+
env["rack.input"].read.should == "Hello, world!"
|
74
|
+
[ 200, {}, [] ]
|
337
75
|
end
|
76
|
+
|
77
|
+
subject.receive_data(http_request)
|
338
78
|
end
|
339
|
-
|
340
|
-
it "
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
79
|
+
|
80
|
+
it "returns a response array that will be sent to the client" do
|
81
|
+
app.should_receive :call do |env|
|
82
|
+
[ 403, { "Content-Type" => "text/plain" }, [ "Mmh, nöö." ] ]
|
83
|
+
end
|
84
|
+
|
85
|
+
sent = ""
|
86
|
+
subject.stub(:send_data) {|data| sent << data }
|
87
|
+
|
88
|
+
subject.receive_data(http_request)
|
89
|
+
sent.should == http_response
|
348
90
|
end
|
349
|
-
|
350
|
-
it "
|
351
|
-
|
352
|
-
|
91
|
+
|
92
|
+
it "returns asynchronously" do
|
93
|
+
app.should_receive :call do |env|
|
94
|
+
EM::Synchrony.add_timer 0.5 do
|
95
|
+
response = [ 403, { "Content-Type" => "text/plain" }, [ "Mmh, nöö." ] ]
|
96
|
+
env["async.callback"].call(response)
|
97
|
+
end
|
98
|
+
[ -1, {}, [] ]
|
99
|
+
end
|
100
|
+
|
101
|
+
sent = ""
|
102
|
+
subject.stub(:send_data) {|data| sent << data }
|
103
|
+
|
104
|
+
subject.receive_data(http_request)
|
105
|
+
EM::Synchrony.sleep(0.55)
|
106
|
+
sent.should == http_response
|
353
107
|
end
|
354
108
|
end
|
355
109
|
end
|
110
|
+
|
111
|
+
describe Hatetepe::Server, "(EventMachine/sermipublic API)" do
|
112
|
+
describe "#initialize(config)"
|
113
|
+
|
114
|
+
describe "#post_init"
|
115
|
+
|
116
|
+
describe "#receive_data(data)"
|
117
|
+
|
118
|
+
describe "#unbind(reason)"
|
119
|
+
end
|
120
|
+
|
121
|
+
describe Hatetepe::Server, "(private API)" do
|
122
|
+
describe "#process_request(request)"
|
123
|
+
|
124
|
+
describe "#send_response(response)"
|
125
|
+
end
|
metadata
CHANGED
@@ -1,19 +1,19 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hatetepe
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.5.0.pre
|
5
|
+
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Lars Gierth
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-04-23 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: http_parser.rb
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,21 +21,31 @@ dependencies:
|
|
21
21
|
version: 0.5.3
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 0.5.3
|
25
30
|
- !ruby/object:Gem::Dependency
|
26
31
|
name: eventmachine
|
27
|
-
requirement:
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
28
33
|
none: false
|
29
34
|
requirements:
|
30
|
-
- -
|
35
|
+
- - ~>
|
31
36
|
- !ruby/object:Gem::Version
|
32
|
-
version:
|
37
|
+
version: 1.0.0.beta.4
|
33
38
|
type: :runtime
|
34
39
|
prerelease: false
|
35
|
-
version_requirements:
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 1.0.0.beta.4
|
36
46
|
- !ruby/object:Gem::Dependency
|
37
47
|
name: em-synchrony
|
38
|
-
requirement:
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
39
49
|
none: false
|
40
50
|
requirements:
|
41
51
|
- - ~>
|
@@ -43,10 +53,15 @@ dependencies:
|
|
43
53
|
version: '1.0'
|
44
54
|
type: :runtime
|
45
55
|
prerelease: false
|
46
|
-
version_requirements:
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.0'
|
47
62
|
- !ruby/object:Gem::Dependency
|
48
63
|
name: rack
|
49
|
-
requirement:
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
50
65
|
none: false
|
51
66
|
requirements:
|
52
67
|
- - ! '>='
|
@@ -54,21 +69,15 @@ dependencies:
|
|
54
69
|
version: '0'
|
55
70
|
type: :runtime
|
56
71
|
prerelease: false
|
57
|
-
version_requirements:
|
58
|
-
- !ruby/object:Gem::Dependency
|
59
|
-
name: async-rack
|
60
|
-
requirement: &69944610 !ruby/object:Gem::Requirement
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
61
73
|
none: false
|
62
74
|
requirements:
|
63
75
|
- - ! '>='
|
64
76
|
- !ruby/object:Gem::Version
|
65
77
|
version: '0'
|
66
|
-
type: :runtime
|
67
|
-
prerelease: false
|
68
|
-
version_requirements: *69944610
|
69
78
|
- !ruby/object:Gem::Dependency
|
70
79
|
name: thor
|
71
|
-
requirement:
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
72
81
|
none: false
|
73
82
|
requirements:
|
74
83
|
- - ! '>='
|
@@ -76,10 +85,15 @@ dependencies:
|
|
76
85
|
version: '0'
|
77
86
|
type: :runtime
|
78
87
|
prerelease: false
|
79
|
-
version_requirements:
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
80
94
|
- !ruby/object:Gem::Dependency
|
81
95
|
name: rspec
|
82
|
-
requirement:
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
83
97
|
none: false
|
84
98
|
requirements:
|
85
99
|
- - ! '>='
|
@@ -87,21 +101,15 @@ dependencies:
|
|
87
101
|
version: '0'
|
88
102
|
type: :development
|
89
103
|
prerelease: false
|
90
|
-
version_requirements:
|
91
|
-
- !ruby/object:Gem::Dependency
|
92
|
-
name: fakefs
|
93
|
-
requirement: &69883520 !ruby/object:Gem::Requirement
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
94
105
|
none: false
|
95
106
|
requirements:
|
96
107
|
- - ! '>='
|
97
108
|
- !ruby/object:Gem::Version
|
98
109
|
version: '0'
|
99
|
-
type: :development
|
100
|
-
prerelease: false
|
101
|
-
version_requirements: *69883520
|
102
110
|
- !ruby/object:Gem::Dependency
|
103
111
|
name: yard
|
104
|
-
requirement:
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
105
113
|
none: false
|
106
114
|
requirements:
|
107
115
|
- - ! '>='
|
@@ -109,10 +117,15 @@ dependencies:
|
|
109
117
|
version: '0'
|
110
118
|
type: :development
|
111
119
|
prerelease: false
|
112
|
-
version_requirements:
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ! '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
113
126
|
- !ruby/object:Gem::Dependency
|
114
127
|
name: rdiscount
|
115
|
-
requirement:
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
116
129
|
none: false
|
117
130
|
requirements:
|
118
131
|
- - ! '>='
|
@@ -120,7 +133,12 @@ dependencies:
|
|
120
133
|
version: '0'
|
121
134
|
type: :development
|
122
135
|
prerelease: false
|
123
|
-
version_requirements:
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
138
|
+
requirements:
|
139
|
+
- - ! '>='
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: '0'
|
124
142
|
description:
|
125
143
|
email:
|
126
144
|
- lars.gierth@gmail.com
|
@@ -134,14 +152,13 @@ files:
|
|
134
152
|
- README.md
|
135
153
|
- Rakefile
|
136
154
|
- bin/hatetepe
|
155
|
+
- examples/parallel_requests.rb
|
137
156
|
- hatetepe.gemspec
|
138
157
|
- lib/hatetepe.rb
|
139
158
|
- lib/hatetepe/body.rb
|
140
159
|
- lib/hatetepe/builder.rb
|
141
160
|
- lib/hatetepe/cli.rb
|
142
161
|
- lib/hatetepe/client.rb
|
143
|
-
- lib/hatetepe/client/keep_alive.rb
|
144
|
-
- lib/hatetepe/client/pipeline.rb
|
145
162
|
- lib/hatetepe/connection.rb
|
146
163
|
- lib/hatetepe/deferred_status_fix.rb
|
147
164
|
- lib/hatetepe/events.rb
|
@@ -150,25 +167,23 @@ files:
|
|
150
167
|
- lib/hatetepe/request.rb
|
151
168
|
- lib/hatetepe/response.rb
|
152
169
|
- lib/hatetepe/server.rb
|
153
|
-
- lib/hatetepe/server/app.rb
|
154
170
|
- lib/hatetepe/server/keep_alive.rb
|
155
171
|
- lib/hatetepe/server/pipeline.rb
|
156
|
-
- lib/hatetepe/server/
|
172
|
+
- lib/hatetepe/server/rack_app.rb
|
157
173
|
- lib/hatetepe/version.rb
|
158
174
|
- lib/rack/handler/hatetepe.rb
|
159
175
|
- spec/integration/cli/start_spec.rb
|
160
176
|
- spec/integration/client/keep_alive_spec.rb
|
177
|
+
- spec/integration/client/timeout_spec.rb
|
161
178
|
- spec/integration/server/keep_alive_spec.rb
|
179
|
+
- spec/integration/server/timeout_spec.rb
|
162
180
|
- spec/spec_helper.rb
|
163
|
-
- spec/unit/app_spec.rb
|
164
181
|
- spec/unit/body_spec.rb
|
165
182
|
- spec/unit/builder_spec.rb
|
166
|
-
- spec/unit/client/pipeline_spec.rb
|
167
183
|
- spec/unit/client_spec.rb
|
168
184
|
- spec/unit/connection_spec.rb
|
169
185
|
- spec/unit/events_spec.rb
|
170
186
|
- spec/unit/parser_spec.rb
|
171
|
-
- spec/unit/proxy_spec.rb
|
172
187
|
- spec/unit/rack_handler_spec.rb
|
173
188
|
- spec/unit/server_spec.rb
|
174
189
|
homepage: https://github.com/lgierth/hatetepe
|
@@ -186,12 +201,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
186
201
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
187
202
|
none: false
|
188
203
|
requirements:
|
189
|
-
- - ! '
|
204
|
+
- - ! '>'
|
190
205
|
- !ruby/object:Gem::Version
|
191
|
-
version:
|
206
|
+
version: 1.3.1
|
192
207
|
requirements: []
|
193
208
|
rubyforge_project:
|
194
|
-
rubygems_version: 1.8.
|
209
|
+
rubygems_version: 1.8.21
|
195
210
|
signing_key:
|
196
211
|
specification_version: 3
|
197
212
|
summary: The HTTP toolkit
|