julien51-em-http-request 0.1.9

Sign up to get free protection for your applications and to get access to all the features.
data/test/test_hash.rb ADDED
@@ -0,0 +1,18 @@
1
+ require 'test/helper'
2
+
3
+ describe Hash do
4
+
5
+ describe ".to_params" do
6
+ it "should transform a basic hash into HTTP POST Params" do
7
+ {:a => "alpha", :b => "beta"}.to_params.should == "a=alpha&b=beta"
8
+ end
9
+
10
+ it "should transform a more complex hash into HTTP POST Params" do
11
+ {:a => "a", :b => ["c", "d", "e"]}.to_params.should == "a=a&b[0]=c&b[1]=d&b[2]=e"
12
+ end
13
+
14
+ it "should transform a very complex hash into HTTP POST Params" do
15
+ {: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"
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,29 @@
1
+ require 'test/helper'
2
+ require 'test/stallion'
3
+
4
+ describe EventMachine::MultiRequest do
5
+
6
+ it "should submit multiple requests in parallel and return once all of them are complete" do
7
+ EventMachine.run {
8
+
9
+ # create an instance of multi-request handler, and the requests themselves
10
+ multi = EventMachine::MultiRequest.new
11
+
12
+ # add multiple requests to the multi-handler
13
+ multi.add(EventMachine::HttpRequest.new('http://127.0.0.1:8080/').get(:query => {:q => 'test'}))
14
+ multi.add(EventMachine::HttpRequest.new('http://0.0.0.0/').get(:timeout => 1))
15
+
16
+ multi.callback {
17
+ # verify successfull request
18
+ multi.responses[:succeeded].size.should == 1
19
+ multi.responses[:succeeded].first.response.should match(/test/)
20
+
21
+ # verify invalid requests
22
+ multi.responses[:failed].size.should == 1
23
+ multi.responses[:failed].first.response_header.status.should == 0
24
+
25
+ EventMachine.stop
26
+ }
27
+ }
28
+ end
29
+ end
@@ -0,0 +1,344 @@
1
+ require 'test/helper'
2
+ require 'test/stallion'
3
+
4
+ describe EventMachine::HttpRequest do
5
+
6
+ def failed
7
+ EventMachine.stop
8
+ fail
9
+ end
10
+
11
+ it "should fail GET on DNS timeout" do
12
+ EventMachine.run {
13
+ http = EventMachine::HttpRequest.new('http://127.1.1.1/').get
14
+ http.callback { failed }
15
+ http.errback {
16
+ http.response_header.status.should == 0
17
+ EventMachine.stop
18
+ }
19
+ }
20
+ end
21
+
22
+ it "should fail GET on invalid host" do
23
+ EventMachine.run {
24
+ http = EventMachine::HttpRequest.new('http://google1.com/').get
25
+ http.callback { failed }
26
+ http.errback {
27
+ http.response_header.status.should == 0
28
+ http.errors.should match(/no connection/)
29
+ EventMachine.stop
30
+ }
31
+ }
32
+ end
33
+
34
+ it "should fail GET on missing path" do
35
+ EventMachine.run {
36
+ lambda {
37
+ EventMachine::HttpRequest.new('http://www.google.com').get
38
+ }.should raise_error(ArgumentError)
39
+
40
+ EventMachine.stop
41
+ }
42
+ end
43
+
44
+ it "should perform successfull GET" do
45
+ EventMachine.run {
46
+ http = EventMachine::HttpRequest.new('http://127.0.0.1:8080/').get
47
+
48
+ http.errback { failed }
49
+ http.callback {
50
+ http.response_header.status.should == 200
51
+ http.response.should match(/Hello/)
52
+ EventMachine.stop
53
+ }
54
+ }
55
+ end
56
+
57
+ it "should perform successfull GET with a URI passed as argument" do
58
+ EventMachine.run {
59
+ uri = URI.parse('http://127.0.0.1:8080/')
60
+ http = EventMachine::HttpRequest.new(uri).get
61
+
62
+ http.errback { failed }
63
+ http.callback {
64
+ http.response_header.status.should == 200
65
+ http.response.should match(/Hello/)
66
+ EventMachine.stop
67
+ }
68
+ }
69
+ end
70
+
71
+ it "should return 404 on invalid path" do
72
+ EventMachine.run {
73
+ http = EventMachine::HttpRequest.new('http://127.0.0.1:8080/fail').get
74
+
75
+ http.errback { failed }
76
+ http.callback {
77
+ http.response_header.status.should == 404
78
+ EventMachine.stop
79
+ }
80
+ }
81
+ end
82
+
83
+ it "should build query parameters from Hash" do
84
+ EventMachine.run {
85
+ http = EventMachine::HttpRequest.new('http://127.0.0.1:8080/').get :query => {:q => 'test'}
86
+
87
+ http.errback { failed }
88
+ http.callback {
89
+ http.response_header.status.should == 200
90
+ http.response.should match(/test/)
91
+ EventMachine.stop
92
+ }
93
+ }
94
+ end
95
+
96
+ it "should pass query parameters string" do
97
+ EventMachine.run {
98
+ http = EventMachine::HttpRequest.new('http://127.0.0.1:8080/').get :query => "q=test"
99
+
100
+ http.errback { failed }
101
+ http.callback {
102
+ http.response_header.status.should == 200
103
+ http.response.should match(/test/)
104
+ EventMachine.stop
105
+ }
106
+ }
107
+ end
108
+
109
+ it "should encode an array of query parameters" do
110
+ EventMachine.run {
111
+ http = EventMachine::HttpRequest.new('http://127.0.0.1:8080/echo_query').get :query => {:hash => ['value1', 'value2']}
112
+
113
+ http.errback { failed }
114
+ http.callback {
115
+ http.response_header.status.should == 200
116
+ http.response.should match(/hash\[\]=value1&hash\[\]=value2/)
117
+ EventMachine.stop
118
+ }
119
+ }
120
+ end
121
+
122
+ it "should perform successfull POST" do
123
+ EventMachine.run {
124
+ http = EventMachine::HttpRequest.new('http://127.0.0.1:8080/').post :body => "data"
125
+
126
+ http.errback { failed }
127
+ http.callback {
128
+ http.response_header.status.should == 200
129
+ http.response.should match(/data/)
130
+ EventMachine.stop
131
+ }
132
+ }
133
+ end
134
+
135
+ it "should perform successfull POST with Ruby Hash/Array as params" do
136
+ EventMachine.run {
137
+ http = EventMachine::HttpRequest.new('http://127.0.0.1:8080/').post :body => {"key1" => 1, "key2" => [2,3]}
138
+
139
+ http.errback { failed }
140
+ http.callback {
141
+ http.response_header.status.should == 200
142
+
143
+ http.response.should match(/key1=1&key2\[0\]=2&key2\[1\]=3/)
144
+ EventMachine.stop
145
+ }
146
+ }
147
+ end
148
+
149
+ it "should perform successfull POST with Ruby Hash/Array as params and with the correct content length" do
150
+ EventMachine.run {
151
+ http = EventMachine::HttpRequest.new('http://127.0.0.1:8080/echo_content_length').post :body => {"key1" => "data1"}
152
+
153
+ http.errback { failed }
154
+ http.callback {
155
+ http.response_header.status.should == 200
156
+
157
+ http.response.to_i.should == 10
158
+ EventMachine.stop
159
+ }
160
+ }
161
+ end
162
+
163
+ it "should perform successfull GET with custom header" do
164
+ EventMachine.run {
165
+ http = EventMachine::HttpRequest.new('http://127.0.0.1:8080/').get :head => {'if-none-match' => 'evar!'}
166
+
167
+ http.errback { failed }
168
+ http.callback {
169
+ http.response_header.status.should == 304
170
+ EventMachine.stop
171
+ }
172
+ }
173
+ end
174
+
175
+ it "should perform a streaming GET" do
176
+ EventMachine.run {
177
+
178
+ # digg.com uses chunked encoding
179
+ http = EventMachine::HttpRequest.new('http://digg.com/').get
180
+
181
+ http.errback { failed }
182
+ http.callback {
183
+ http.response_header.status.should == 200
184
+ EventMachine.stop
185
+ }
186
+ }
187
+ end
188
+
189
+ it "should perform basic auth" do
190
+ EventMachine.run {
191
+
192
+ http = EventMachine::HttpRequest.new('http://127.0.0.1:8080/').get :head => {'authorization' => ['user', 'pass']}
193
+
194
+ http.errback { failed }
195
+ http.callback {
196
+ http.response_header.status.should == 200
197
+ EventMachine.stop
198
+ }
199
+ }
200
+ end
201
+
202
+ it "should work with keep-alive servers" do
203
+ EventMachine.run {
204
+
205
+ http = EventMachine::HttpRequest.new('http://mexicodiario.com/touch.public.json.php').get
206
+
207
+ http.errback { failed }
208
+ http.callback {
209
+ http.response_header.status.should == 200
210
+ EventMachine.stop
211
+ }
212
+ }
213
+ end
214
+
215
+ it "should detect deflate encoding" do
216
+ EventMachine.run {
217
+
218
+ http = EventMachine::HttpRequest.new('http://127.0.0.1:8080/deflate').get :head => {"accept-encoding" => "deflate"}
219
+
220
+ http.errback { failed }
221
+ http.callback {
222
+ http.response_header.status.should == 200
223
+ http.response_header["CONTENT_ENCODING"].should == "deflate"
224
+ http.response.should == "compressed"
225
+
226
+ EventMachine.stop
227
+ }
228
+ }
229
+ end
230
+
231
+ it "should detect gzip encoding" do
232
+ EventMachine.run {
233
+
234
+ http = EventMachine::HttpRequest.new('http://127.0.0.1:8080/gzip').get :head => {"accept-encoding" => "gzip, compressed"}
235
+
236
+ http.errback { failed }
237
+ http.callback {
238
+ http.response_header.status.should == 200
239
+ http.response_header["CONTENT_ENCODING"].should == "gzip"
240
+ http.response.should == "compressed"
241
+
242
+ EventMachine.stop
243
+ }
244
+ }
245
+ end
246
+
247
+ it "should timeout after 10 seconds" do
248
+ EventMachine.run {
249
+ t = Time.now.to_i
250
+ http = EventMachine::HttpRequest.new('http://127.0.0.1:8080/timeout').get :timeout => 2
251
+
252
+ http.errback {
253
+ (Time.now.to_i - t).should == 2
254
+ EventMachine.stop
255
+ }
256
+ http.callback { failed }
257
+ }
258
+ end
259
+
260
+ it "should optionally pass the response body progressively" do
261
+ EventMachine.run {
262
+ body = ''
263
+ http = EventMachine::HttpRequest.new('http://127.0.0.1:8080/').get
264
+
265
+ http.errback { failed }
266
+ http.stream { |chunk| body += chunk }
267
+
268
+ http.callback {
269
+ http.response_header.status.should == 200
270
+ http.response.should == ''
271
+ body.should match(/Hello/)
272
+ EventMachine.stop
273
+ }
274
+ }
275
+ end
276
+
277
+ it "should optionally pass the deflate-encoded response body progressively" do
278
+ EventMachine.run {
279
+ body = ''
280
+ http = EventMachine::HttpRequest.new('http://127.0.0.1:8080/deflate').get :head => {"accept-encoding" => "deflate, compressed"}
281
+
282
+ http.errback { failed }
283
+ http.stream { |chunk| body += chunk }
284
+
285
+ http.callback {
286
+ http.response_header.status.should == 200
287
+ http.response_header["CONTENT_ENCODING"].should == "deflate"
288
+ http.response.should == ''
289
+ body.should == "compressed"
290
+ EventMachine.stop
291
+ }
292
+ }
293
+ end
294
+
295
+ it "should initiate SSL/TLS on HTTPS connections" do
296
+ EventMachine.run {
297
+ http = EventMachine::HttpRequest.new('https://mail.google.com:443/mail/').get
298
+
299
+ http.errback { failed }
300
+ http.callback {
301
+ http.response_header.status.should == 302
302
+ EventMachine.stop
303
+ }
304
+ }
305
+ end
306
+
307
+ it "should accept & return cookie header to user" do
308
+ EventMachine.run {
309
+ http = EventMachine::HttpRequest.new('http://127.0.0.1:8080/set_cookie').get
310
+
311
+ http.errback { failed }
312
+ http.callback {
313
+ http.response_header.status.should == 200
314
+ http.response_header.cookie.should == "id=1; expires=Tue, 09-Aug-2011 17:53:39 GMT; path=/;"
315
+ EventMachine.stop
316
+ }
317
+ }
318
+ end
319
+
320
+ it "should pass cookie header to server from string" do
321
+ EventMachine.run {
322
+ http = EventMachine::HttpRequest.new('http://127.0.0.1:8080/echo_cookie').get :head => {'cookie' => 'id=2;'}
323
+
324
+ http.errback { failed }
325
+ http.callback {
326
+ http.response.should == "id=2;"
327
+ EventMachine.stop
328
+ }
329
+ }
330
+ end
331
+
332
+ it "should pass cookie header to server from Hash" do
333
+ EventMachine.run {
334
+ http = EventMachine::HttpRequest.new('http://127.0.0.1:8080/echo_cookie').get :head => {'cookie' => {'id' => 2}}
335
+
336
+ http.errback { failed }
337
+ http.callback {
338
+ http.response.should == "id=2;"
339
+ EventMachine.stop
340
+ }
341
+ }
342
+ end
343
+
344
+ end
metadata ADDED
@@ -0,0 +1,88 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: julien51-em-http-request
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.9
5
+ platform: ruby
6
+ authors:
7
+ - Ilya Grigorik
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-03-20 00:00:00 -07:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: eventmachine
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 0.12.2
24
+ version:
25
+ description: EventMachine based HTTP Request interface
26
+ email: ilya@igvita.com
27
+ executables: []
28
+
29
+ extensions:
30
+ - ext/buffer/extconf.rb
31
+ - ext/http11_client/extconf.rb
32
+ extra_rdoc_files: []
33
+
34
+ files:
35
+ - .autotest
36
+ - .gitignore
37
+ - LICENSE
38
+ - README.rdoc
39
+ - Rakefile
40
+ - em-http-request.gemspec
41
+ - ext/buffer/em_buffer.c
42
+ - ext/buffer/extconf.rb
43
+ - ext/http11_client/ext_help.h
44
+ - ext/http11_client/extconf.rb
45
+ - ext/http11_client/http11_client.c
46
+ - ext/http11_client/http11_parser.c
47
+ - ext/http11_client/http11_parser.h
48
+ - ext/http11_client/http11_parser.rl
49
+ - lib/em-http.rb
50
+ - lib/em-http/client.rb
51
+ - lib/em-http/core_ext/hash.rb
52
+ - lib/em-http/decoders.rb
53
+ - lib/em-http/multi.rb
54
+ - lib/em-http/request.rb
55
+ - test/test_hash.rb
56
+ - test/helper.rb
57
+ - test/stallion.rb
58
+ - test/test_multi.rb
59
+ - test/test_request.rb
60
+ has_rdoc: true
61
+ homepage: http://github.com/igrigorik/em-http-request
62
+ licenses:
63
+ post_install_message:
64
+ rdoc_options: []
65
+
66
+ require_paths:
67
+ - lib
68
+ required_ruby_version: !ruby/object:Gem::Requirement
69
+ requirements:
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: "0"
73
+ version:
74
+ required_rubygems_version: !ruby/object:Gem::Requirement
75
+ requirements:
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ version: "0"
79
+ version:
80
+ requirements: []
81
+
82
+ rubyforge_project: em-http-request
83
+ rubygems_version: 1.3.5
84
+ signing_key:
85
+ specification_version: 2
86
+ summary: EventMachine based HTTP Request interface
87
+ test_files: []
88
+