julien51-em-http-request 0.1.9 → 0.1.10
Sign up to get free protection for your applications and to get access to all the features.
- data/em-http-request.gemspec +1 -1
- data/lib/em-http/client.rb +44 -12
- data/lib/em-http/request.rb +3 -2
- data/test/stallion.rb +9 -2
- data/test/test_hash.rb +5 -4
- data/test/test_request.rb +21 -7
- metadata +1 -1
data/em-http-request.gemspec
CHANGED
data/lib/em-http/client.rb
CHANGED
@@ -20,6 +20,16 @@ module EventMachine
|
|
20
20
|
|
21
21
|
# The status code (as a string!)
|
22
22
|
attr_accessor :http_status
|
23
|
+
|
24
|
+
# E-Tag
|
25
|
+
def etag
|
26
|
+
self["ETag"]
|
27
|
+
end
|
28
|
+
|
29
|
+
def last_modified
|
30
|
+
time = self["Last-Modified"]
|
31
|
+
Time.parse(time) if time
|
32
|
+
end
|
23
33
|
|
24
34
|
# HTTP response status as an integer
|
25
35
|
def status
|
@@ -98,12 +108,16 @@ module EventMachine
|
|
98
108
|
end
|
99
109
|
|
100
110
|
def encode_query(path, query)
|
101
|
-
|
102
|
-
|
103
|
-
return "#{path}?#{query}"
|
111
|
+
encoded_query = if query.kind_of?(Hash)
|
112
|
+
query.map { |k, v| encode_param(k, v) }.join('&')
|
104
113
|
else
|
105
|
-
|
114
|
+
query.to_s
|
106
115
|
end
|
116
|
+
if !@uri.query.to_s.empty?
|
117
|
+
encoded_query = [encoded_query, @uri.query].reject {|part| part.empty?}.join("&")
|
118
|
+
end
|
119
|
+
return path if encoded_query.to_s.empty?
|
120
|
+
"#{path}?#{encoded_query}"
|
107
121
|
end
|
108
122
|
|
109
123
|
# URL encodes query parameters:
|
@@ -181,12 +195,12 @@ module EventMachine
|
|
181
195
|
# start HTTP request once we establish connection to host
|
182
196
|
def connection_completed
|
183
197
|
ssl = @options[:tls] || @options[:ssl] || {}
|
184
|
-
start_tls(ssl) if @uri.scheme == "https" or @uri.port == 443
|
198
|
+
start_tls(ssl) if @uri.scheme == "https" #or @uri.port == 443 # A user might not want https even on port 443.
|
185
199
|
|
186
200
|
send_request_header
|
187
201
|
send_request_body
|
188
202
|
end
|
189
|
-
|
203
|
+
|
190
204
|
# request is done, invoke the callback
|
191
205
|
def on_request_complete
|
192
206
|
begin
|
@@ -196,11 +210,14 @@ module EventMachine
|
|
196
210
|
end
|
197
211
|
unbind
|
198
212
|
end
|
199
|
-
|
213
|
+
|
200
214
|
# request failed, invoke errback
|
201
|
-
def on_error(msg)
|
215
|
+
def on_error(msg, dns_error = false)
|
202
216
|
@errors = msg
|
203
|
-
|
217
|
+
|
218
|
+
# no connection signature on DNS failures
|
219
|
+
# fail the connection directly
|
220
|
+
dns_error == true ? fail : unbind
|
204
221
|
end
|
205
222
|
|
206
223
|
# assign a stream processing block
|
@@ -281,7 +298,11 @@ module EventMachine
|
|
281
298
|
end
|
282
299
|
|
283
300
|
def unbind
|
284
|
-
|
301
|
+
if @state == :finished
|
302
|
+
succeed(self)
|
303
|
+
else
|
304
|
+
fail(self)
|
305
|
+
end
|
285
306
|
close_connection
|
286
307
|
end
|
287
308
|
|
@@ -339,11 +360,22 @@ module EventMachine
|
|
339
360
|
return false
|
340
361
|
end
|
341
362
|
|
363
|
+
# shortcircuit on HEAD requests
|
364
|
+
if @method == "HEAD"
|
365
|
+
@state = :finished
|
366
|
+
on_request_complete
|
367
|
+
end
|
368
|
+
|
342
369
|
if @response_header.chunked_encoding?
|
343
370
|
@state = :chunk_header
|
344
371
|
else
|
345
|
-
@
|
346
|
-
|
372
|
+
if @response_header.content_length > 0
|
373
|
+
@state = :body
|
374
|
+
@bytes_remaining = @response_header.content_length
|
375
|
+
else
|
376
|
+
@state = :finished
|
377
|
+
on_request_complete
|
378
|
+
end
|
347
379
|
end
|
348
380
|
|
349
381
|
if @inflate.include?(response_header[CONTENT_ENCODING]) &&
|
data/lib/em-http/request.rb
CHANGED
@@ -50,13 +50,14 @@ module EventMachine
|
|
50
50
|
# Host: header
|
51
51
|
|
52
52
|
def get options = {}; send_request(:get, options); end
|
53
|
+
def head options = {}; send_request(:head, options); end
|
53
54
|
def post options = {}; send_request(:post, options); end
|
54
55
|
|
55
56
|
protected
|
56
57
|
|
57
58
|
def send_request(method, options)
|
58
59
|
raise ArgumentError, "invalid request path" unless /^\// === @uri.path
|
59
|
-
|
60
|
+
|
60
61
|
method = method.to_s.upcase
|
61
62
|
begin
|
62
63
|
host = options[:host] || @uri.host
|
@@ -69,7 +70,7 @@ module EventMachine
|
|
69
70
|
rescue RuntimeError => e
|
70
71
|
raise e unless e.message == "no connection"
|
71
72
|
conn = EventMachine::HttpClient.new("")
|
72
|
-
conn.on_error("no connection")
|
73
|
+
conn.on_error("no connection", true)
|
73
74
|
conn
|
74
75
|
end
|
75
76
|
end
|
data/test/stallion.rb
CHANGED
@@ -83,6 +83,9 @@ Stallion.saddle :spec do |stable|
|
|
83
83
|
elsif stable.request.path_info == '/echo_content_length'
|
84
84
|
stable.response.write stable.request.content_length
|
85
85
|
|
86
|
+
elsif stable.request.head?
|
87
|
+
stable.response.status = 200
|
88
|
+
|
86
89
|
elsif stable.request.post?
|
87
90
|
stable.response.write stable.request.body.read
|
88
91
|
|
@@ -131,7 +134,11 @@ Stallion.saddle :spec do |stable|
|
|
131
134
|
end
|
132
135
|
|
133
136
|
Thread.new do
|
134
|
-
|
137
|
+
begin
|
138
|
+
Stallion.run :Host => '127.0.0.1', :Port => 8080
|
139
|
+
rescue Exception => e
|
140
|
+
print e
|
141
|
+
end
|
135
142
|
end
|
136
143
|
|
137
|
-
sleep(
|
144
|
+
sleep(1)
|
data/test/test_hash.rb
CHANGED
@@ -10,9 +10,10 @@ describe Hash do
|
|
10
10
|
it "should transform a more complex hash into HTTP POST Params" do
|
11
11
|
{:a => "a", :b => ["c", "d", "e"]}.to_params.should == "a=a&b[0]=c&b[1]=d&b[2]=e"
|
12
12
|
end
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
13
|
+
|
14
|
+
# Ruby 1.8 Hash is not sorted, so this test breaks randomly. Maybe once we're all on 1.9. ;-)
|
15
|
+
# it "should transform a very complex hash into HTTP POST Params" do
|
16
|
+
# {:a => "a", :b => [{:c => "c", :d => "d"}, {:e => "e", :f => "f"}]}.to_params.should == "a=a&b[0][d]=d&b[0][c]=c&b[1][f]=f&b[1][e]=e"
|
17
|
+
# end
|
17
18
|
end
|
18
19
|
end
|
data/test/test_request.rb
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
require 'test/helper'
|
2
2
|
require 'test/stallion'
|
3
|
-
|
3
|
+
|
4
4
|
describe EventMachine::HttpRequest do
|
5
5
|
|
6
6
|
def failed
|
7
7
|
EventMachine.stop
|
8
8
|
fail
|
9
9
|
end
|
10
|
-
|
10
|
+
|
11
11
|
it "should fail GET on DNS timeout" do
|
12
12
|
EventMachine.run {
|
13
13
|
http = EventMachine::HttpRequest.new('http://127.1.1.1/').get
|
@@ -68,12 +68,26 @@ describe EventMachine::HttpRequest do
|
|
68
68
|
}
|
69
69
|
end
|
70
70
|
|
71
|
+
it "should perform successfull HEAD with a URI passed as argument" do
|
72
|
+
EventMachine.run {
|
73
|
+
uri = URI.parse('http://127.0.0.1:8080/')
|
74
|
+
http = EventMachine::HttpRequest.new(uri).head
|
75
|
+
|
76
|
+
http.errback { failed }
|
77
|
+
http.callback {
|
78
|
+
http.response_header.status.should == 200
|
79
|
+
http.response.should == ""
|
80
|
+
EventMachine.stop
|
81
|
+
}
|
82
|
+
}
|
83
|
+
end
|
84
|
+
|
71
85
|
it "should return 404 on invalid path" do
|
72
86
|
EventMachine.run {
|
73
87
|
http = EventMachine::HttpRequest.new('http://127.0.0.1:8080/fail').get
|
74
88
|
|
75
89
|
http.errback { failed }
|
76
|
-
http.callback {
|
90
|
+
http.callback {
|
77
91
|
http.response_header.status.should == 404
|
78
92
|
EventMachine.stop
|
79
93
|
}
|
@@ -247,10 +261,10 @@ describe EventMachine::HttpRequest do
|
|
247
261
|
it "should timeout after 10 seconds" do
|
248
262
|
EventMachine.run {
|
249
263
|
t = Time.now.to_i
|
250
|
-
http = EventMachine::HttpRequest.new('http://127.0.0.1:8080/timeout').get :timeout =>
|
264
|
+
http = EventMachine::HttpRequest.new('http://127.0.0.1:8080/timeout').get :timeout => 1
|
251
265
|
|
252
266
|
http.errback {
|
253
|
-
(Time.now.to_i - t).should
|
267
|
+
(Time.now.to_i - t).should >= 2
|
254
268
|
EventMachine.stop
|
255
269
|
}
|
256
270
|
http.callback { failed }
|
@@ -340,5 +354,5 @@ describe EventMachine::HttpRequest do
|
|
340
354
|
}
|
341
355
|
}
|
342
356
|
end
|
343
|
-
|
344
|
-
end
|
357
|
+
|
358
|
+
end
|