hatetepe 0.5.0.pre.1 → 0.5.0.pre.2
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/hatetepe/body.rb +11 -0
- data/lib/hatetepe/client.rb +23 -3
- data/lib/hatetepe/parser.rb +1 -1
- data/lib/hatetepe/version.rb +1 -1
- data/spec/unit/body_spec.rb +4 -5
- data/spec/unit/client_spec.rb +133 -42
- data/spec/unit/parser_spec.rb +1 -1
- data/spec/unit/server_spec.rb +1 -0
- metadata +3 -3
data/lib/hatetepe/body.rb
CHANGED
@@ -71,6 +71,17 @@ module Hatetepe
|
|
71
71
|
#
|
72
72
|
# @return [undefined]
|
73
73
|
def rewind
|
74
|
+
sync
|
75
|
+
rewind!
|
76
|
+
end
|
77
|
+
|
78
|
+
# Rewinds underlying IO without blocking
|
79
|
+
#
|
80
|
+
# TODO this is a hack. the whole blocking/rewinding stuff needs to be
|
81
|
+
# more though out.
|
82
|
+
#
|
83
|
+
# @api protected
|
84
|
+
def rewind!
|
74
85
|
io.rewind
|
75
86
|
end
|
76
87
|
|
data/lib/hatetepe/client.rb
CHANGED
@@ -56,7 +56,7 @@ module Hatetepe::Client
|
|
56
56
|
|
57
57
|
@queue = []
|
58
58
|
|
59
|
-
@app =
|
59
|
+
@app = proc {|request| send_request(request) }
|
60
60
|
|
61
61
|
self.comm_inactivity_timeout = config[:timeout]
|
62
62
|
self.pending_connect_timeout = config[:connect_timeout]
|
@@ -104,7 +104,9 @@ module Hatetepe::Client
|
|
104
104
|
response.body.close_write
|
105
105
|
end
|
106
106
|
|
107
|
-
if !response
|
107
|
+
if !response
|
108
|
+
request.fail(nil, self)
|
109
|
+
elsif response.failure?
|
108
110
|
request.fail(response)
|
109
111
|
else
|
110
112
|
request.succeed(response)
|
@@ -128,7 +130,7 @@ module Hatetepe::Client
|
|
128
130
|
#
|
129
131
|
# @api public
|
130
132
|
def request(verb, uri, headers = {}, body = [])
|
131
|
-
request = Hatetepe::Request.new(verb, uri, headers, body)
|
133
|
+
request = Hatetepe::Request.new(verb, URI(uri), headers, body)
|
132
134
|
self << request
|
133
135
|
EM::Synchrony.sync(request)
|
134
136
|
end
|
@@ -182,6 +184,11 @@ module Hatetepe::Client
|
|
182
184
|
|
183
185
|
# @api public
|
184
186
|
def self.request(verb, uri, headers = {}, body = [])
|
187
|
+
uri = URI(uri)
|
188
|
+
client = start(host: uri.host, port: uri.port)
|
189
|
+
client.request(verb, uri, headers, body)
|
190
|
+
ensure
|
191
|
+
client.stop
|
185
192
|
end
|
186
193
|
|
187
194
|
# Feeds the request into the builder and blocks while waiting for the
|
@@ -248,4 +255,17 @@ module Hatetepe::Client
|
|
248
255
|
raise "Received response but didn't expect one: #{response.status}"
|
249
256
|
end
|
250
257
|
end
|
258
|
+
|
259
|
+
module VerbMethods
|
260
|
+
[
|
261
|
+
:get, :head, :options, :put, :post, :delete, :patch, :connect
|
262
|
+
].each do |verb|
|
263
|
+
define_method(verb) do |uri, headers = {}, body = []|
|
264
|
+
request(verb, uri, headers, body)
|
265
|
+
end
|
266
|
+
end
|
267
|
+
end
|
268
|
+
|
269
|
+
include VerbMethods
|
270
|
+
extend VerbMethods
|
251
271
|
end
|
data/lib/hatetepe/parser.rb
CHANGED
data/lib/hatetepe/version.rb
CHANGED
data/spec/unit/body_spec.rb
CHANGED
@@ -88,11 +88,10 @@ describe Hatetepe::Body do
|
|
88
88
|
end
|
89
89
|
|
90
90
|
context "#rewind" do
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
body.
|
95
|
-
body.rewind.should equal(rewind)
|
91
|
+
it "blocks and forwards to io#rewind" do
|
92
|
+
body.should_receive(:sync).ordered
|
93
|
+
body.io.should_receive(:rewind).ordered
|
94
|
+
body.rewind
|
96
95
|
end
|
97
96
|
end
|
98
97
|
|
data/spec/unit/client_spec.rb
CHANGED
@@ -1,74 +1,165 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
require "hatetepe/client"
|
3
3
|
|
4
|
-
describe Hatetepe::Client
|
5
|
-
|
4
|
+
describe Hatetepe::Client do
|
5
|
+
let :config do
|
6
|
+
{
|
7
|
+
:host => "127.0.0.1",
|
8
|
+
:port => 4242
|
9
|
+
}
|
10
|
+
end
|
6
11
|
|
7
|
-
|
12
|
+
let :client do
|
13
|
+
Object.new.tap do |client|
|
14
|
+
client.extend(Hatetepe::Client)
|
15
|
+
client.stub(:send_data)
|
16
|
+
client.stub(:comm_inactivity_timeout=)
|
17
|
+
client.stub(:pending_connect_timeout=)
|
18
|
+
client.stub(:send_request) { response }
|
8
19
|
|
9
|
-
|
20
|
+
client.send(:initialize, config)
|
21
|
+
client.post_init
|
22
|
+
end
|
23
|
+
end
|
10
24
|
|
11
|
-
describe "
|
25
|
+
describe ".start" do
|
26
|
+
it "starts a new client" do
|
27
|
+
EM.should_receive(:connect).
|
28
|
+
with(config[:host], config[:port], Hatetepe::Client, config).
|
29
|
+
and_return(client)
|
30
|
+
Hatetepe::Client.start(config).should equal(client)
|
31
|
+
end
|
32
|
+
end
|
12
33
|
|
13
|
-
describe "
|
34
|
+
describe "#stop" do
|
35
|
+
it "waits for all requests to finish and closes the connection" do
|
36
|
+
client.should_receive(:wait).ordered
|
37
|
+
client.should_receive(:stop!).ordered
|
38
|
+
client.stop
|
39
|
+
end
|
40
|
+
end
|
14
41
|
|
15
|
-
describe "#
|
42
|
+
describe "#stop!" do
|
43
|
+
it "closes the connection" do
|
44
|
+
client.should_receive(:close_connection)
|
45
|
+
client.stop!
|
46
|
+
end
|
47
|
+
end
|
16
48
|
|
17
|
-
describe "
|
18
|
-
let :
|
19
|
-
|
20
|
-
:host => "127.0.0.1",
|
21
|
-
:port => 4242
|
22
|
-
}
|
49
|
+
describe "#wait" do
|
50
|
+
let :requests do
|
51
|
+
[ Hatetepe::Request.new(:get, "/"), Hatetepe::Request.new(:post, "/") ]
|
23
52
|
end
|
24
53
|
|
25
|
-
|
26
|
-
client
|
27
|
-
client
|
28
|
-
client
|
29
|
-
client.stub(:pending_connect_timeout=)
|
30
|
-
client.send(:initialize, config)
|
31
|
-
client.post_init
|
32
|
-
client
|
54
|
+
before do
|
55
|
+
client.unstub(:send_request)
|
56
|
+
client << requests[0]
|
57
|
+
client << requests[1]
|
33
58
|
end
|
34
59
|
|
35
|
-
|
36
|
-
|
60
|
+
it "waits for all requests to finish" do
|
61
|
+
returned = false
|
62
|
+
Fiber.new do
|
63
|
+
client.wait
|
64
|
+
returned = true
|
65
|
+
end.resume
|
66
|
+
|
67
|
+
returned.should be_false
|
68
|
+
|
69
|
+
requests.each(&:succeed)
|
70
|
+
returned.should be_true
|
37
71
|
end
|
72
|
+
end
|
73
|
+
|
74
|
+
describe ".request" do
|
75
|
+
let(:client) { stub("client", request: res, stop: nil) }
|
76
|
+
let(:headers) { stub("headers") }
|
77
|
+
let(:body) { stub("body") }
|
78
|
+
let(:res) { stub("response") }
|
79
|
+
let(:response) { Hatetepe::Client.request(:put, "/test", headers, body) }
|
80
|
+
|
81
|
+
before { Hatetepe::Client.stub(start: client) }
|
82
|
+
|
83
|
+
it "it returns the response" do
|
84
|
+
client.should_receive(:request).with(:put, URI("/test"), headers, body)
|
85
|
+
response.should equal(res)
|
86
|
+
end
|
87
|
+
|
88
|
+
it "stops the client afterwards" do
|
89
|
+
client.should_receive(:stop)
|
90
|
+
response
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
describe "#request" do
|
95
|
+
let(:body) { [ "Hello,", " world!" ] }
|
96
|
+
let(:headers) { { "Content-Type" => "text/plain" } }
|
97
|
+
let(:request) { stub("request") }
|
98
|
+
let(:response) { stub("response") }
|
99
|
+
|
100
|
+
before do
|
101
|
+
client.stub(:<<)
|
102
|
+
Hatetepe::Request.stub(:new => request)
|
103
|
+
end
|
104
|
+
|
105
|
+
it "sends the request" do
|
106
|
+
Hatetepe::Request.should_receive(:new) do |verb, uri, headers, body|
|
107
|
+
verb.should eq(:head)
|
108
|
+
uri.path.should eq("/test")
|
109
|
+
uri.query.should eq("key=value")
|
110
|
+
headers["Content-Type"].should eq("text/plain")
|
111
|
+
Enumerator.new(body).to_a.join.should eq("Hello, world!")
|
38
112
|
|
39
|
-
|
40
|
-
fiber = Fiber.current
|
41
|
-
subject.app.should_receive :call do
|
42
|
-
Fiber.current.should_not equal(fiber)
|
113
|
+
request
|
43
114
|
end
|
44
115
|
|
45
|
-
|
116
|
+
client.should_receive(:<<).with(request)
|
117
|
+
EM::Synchrony.should_receive(:sync).with(request)
|
118
|
+
|
119
|
+
client.request(:head, "/test?key=value", headers, body)
|
120
|
+
end
|
121
|
+
|
122
|
+
it "returns the response" do
|
123
|
+
EM::Synchrony.stub(:sync => response)
|
124
|
+
client.request(:get, "/").should equal(response)
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
describe "#<<" do
|
129
|
+
let :request do
|
130
|
+
Hatetepe::Request.new :head, "/test"
|
46
131
|
end
|
47
132
|
|
48
|
-
|
49
|
-
|
50
|
-
request.should_receive(:fail).with(subject.app.call)
|
133
|
+
describe "if the response is a success" do
|
134
|
+
let(:response) { Hatetepe::Response.new(307) }
|
51
135
|
|
52
|
-
|
136
|
+
it "succeeds the request" do
|
137
|
+
request.should_receive(:succeed).with(response)
|
138
|
+
client << request
|
139
|
+
end
|
53
140
|
end
|
54
141
|
|
55
|
-
|
56
|
-
|
57
|
-
request.should_receive(:fail).with(nil)
|
142
|
+
describe "if the response is a failure" do
|
143
|
+
let(:response) { Hatetepe::Response.new(502) }
|
58
144
|
|
59
|
-
|
145
|
+
it "fails the request" do
|
146
|
+
request.should_receive(:fail).with(response)
|
147
|
+
client << request
|
148
|
+
end
|
60
149
|
end
|
61
150
|
|
62
|
-
|
63
|
-
|
64
|
-
request.should_receive(:succeed).with(subject.app.call)
|
151
|
+
describe "if there is no response" do
|
152
|
+
let(:response) { nil }
|
65
153
|
|
66
|
-
|
154
|
+
it "fails the request" do
|
155
|
+
request.should_receive(:fail).with(nil, client)
|
156
|
+
client << request
|
157
|
+
end
|
67
158
|
end
|
68
159
|
end
|
69
160
|
end
|
70
161
|
|
71
|
-
describe Hatetepe::Client, "EventMachine API" do
|
162
|
+
describe Hatetepe::Client, "(EventMachine API)" do
|
72
163
|
describe "#initialize"
|
73
164
|
|
74
165
|
describe "#post_init"
|
@@ -78,7 +169,7 @@ describe Hatetepe::Client, "EventMachine API" do
|
|
78
169
|
describe "#unbind"
|
79
170
|
end
|
80
171
|
|
81
|
-
describe Hatetepe::Client, "private API" do
|
172
|
+
describe Hatetepe::Client, "(private API)" do
|
82
173
|
describe "#send_request"
|
83
174
|
|
84
175
|
describe "#receive_response"
|
data/spec/unit/parser_spec.rb
CHANGED
data/spec/unit/server_spec.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hatetepe
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.0.pre.
|
4
|
+
version: 0.5.0.pre.2
|
5
5
|
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-06-02 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: http_parser.rb
|
@@ -206,7 +206,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
206
206
|
version: 1.3.1
|
207
207
|
requirements: []
|
208
208
|
rubyforge_project:
|
209
|
-
rubygems_version: 1.8.
|
209
|
+
rubygems_version: 1.8.24
|
210
210
|
signing_key:
|
211
211
|
specification_version: 3
|
212
212
|
summary: The HTTP toolkit
|