typhoeus 0.1.31 → 0.2.0
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/.gitignore +1 -0
- data/CHANGELOG.markdown +8 -0
- data/Gemfile +9 -0
- data/Gemfile.lock +30 -0
- data/README.textile +1 -1
- data/Rakefile +0 -1
- data/VERSION +1 -1
- data/ext/typhoeus/.gitignore +2 -1
- data/lib/typhoeus.rb +4 -1
- data/lib/typhoeus/easy.rb +4 -4
- data/lib/typhoeus/hydra.rb +25 -55
- data/lib/typhoeus/hydra/callbacks.rb +24 -0
- data/lib/typhoeus/hydra/connect_options.rb +45 -0
- data/lib/typhoeus/hydra/stubbing.rb +52 -0
- data/lib/typhoeus/hydra_mock.rb +131 -0
- data/lib/typhoeus/normalized_header_hash.rb +58 -0
- data/lib/typhoeus/request.rb +39 -8
- data/lib/typhoeus/response.rb +42 -15
- data/lib/typhoeus/utils.rb +24 -0
- data/spec/spec_helper.rb +1 -1
- data/spec/typhoeus/hydra_mock_spec.rb +300 -0
- data/spec/typhoeus/hydra_spec.rb +215 -70
- data/spec/typhoeus/normalized_header_hash_spec.rb +41 -0
- data/spec/typhoeus/remote_spec.rb +1 -1
- data/spec/typhoeus/request_spec.rb +54 -2
- data/spec/typhoeus/response_spec.rb +86 -10
- data/spec/typhoeus/utils_spec.rb +22 -0
- data/typhoeus.gemspec +18 -8
- metadata +40 -24
- data/ext/typhoeus/Makefile +0 -157
data/spec/typhoeus/hydra_spec.rb
CHANGED
@@ -30,76 +30,6 @@ describe Typhoeus::Hydra do
|
|
30
30
|
Typhoeus::Hydra.hydra = Typhoeus::Hydra.new
|
31
31
|
end
|
32
32
|
|
33
|
-
context "#stub" do
|
34
|
-
before do
|
35
|
-
@hydra = Typhoeus::Hydra.new
|
36
|
-
@on_complete_handler_called = nil
|
37
|
-
@request = Typhoeus::Request.new("http://localhost:3000/foo")
|
38
|
-
@request.on_complete do |response|
|
39
|
-
@on_complete_handler_called = true
|
40
|
-
response.code.should == 404
|
41
|
-
response.headers.should == "whatever"
|
42
|
-
end
|
43
|
-
@response = Typhoeus::Response.new(:code => 404, :headers => "whatever", :body => "not found", :time => 0.1)
|
44
|
-
end
|
45
|
-
|
46
|
-
it "stubs requests to a specific URI" do
|
47
|
-
@hydra.stub(:get, "http://localhost:3000/foo").and_return(@response)
|
48
|
-
@hydra.queue(@request)
|
49
|
-
@hydra.run
|
50
|
-
@on_complete_handler_called.should be_true
|
51
|
-
@response.request.should == @request
|
52
|
-
end
|
53
|
-
|
54
|
-
it "stubs requests to URIs matching a pattern" do
|
55
|
-
@hydra.stub(:get, /foo/).and_return(@response)
|
56
|
-
@hydra.queue(@request)
|
57
|
-
@hydra.run
|
58
|
-
@on_complete_handler_called.should be_true
|
59
|
-
@response.request.should == @request
|
60
|
-
end
|
61
|
-
|
62
|
-
it "can clear stubs" do
|
63
|
-
@hydra.clear_stubs
|
64
|
-
end
|
65
|
-
|
66
|
-
it "clears out previously queued requests once they are called" do
|
67
|
-
@hydra.stub(:get, "asdf").and_return(@response)
|
68
|
-
|
69
|
-
call_count = 0
|
70
|
-
request = Typhoeus::Request.new("asdf")
|
71
|
-
request.on_complete do |response|
|
72
|
-
call_count += 1
|
73
|
-
end
|
74
|
-
@hydra.queue(request)
|
75
|
-
@hydra.run
|
76
|
-
call_count.should == 1
|
77
|
-
@hydra.run
|
78
|
-
call_count.should == 1
|
79
|
-
end
|
80
|
-
|
81
|
-
it "calls stubs for requests that are queued up in the on_complete of a first stub" do
|
82
|
-
@hydra.stub(:get, "asdf").and_return(@response)
|
83
|
-
@hydra.stub(:get, "bar").and_return(@response)
|
84
|
-
|
85
|
-
second_handler_called = false
|
86
|
-
request = Typhoeus::Request.new("asdf")
|
87
|
-
request.on_complete do |response|
|
88
|
-
r = Typhoeus::Request.new("bar")
|
89
|
-
r.on_complete do |res|
|
90
|
-
second_handler_called = true
|
91
|
-
end
|
92
|
-
@hydra.queue(r)
|
93
|
-
end
|
94
|
-
@hydra.queue(request)
|
95
|
-
@hydra.run
|
96
|
-
|
97
|
-
second_handler_called.should be_true
|
98
|
-
end
|
99
|
-
|
100
|
-
it "matches a stub only when the HTTP method also matches"
|
101
|
-
end
|
102
|
-
|
103
33
|
it "queues a request" do
|
104
34
|
hydra = Typhoeus::Hydra.new
|
105
35
|
hydra.queue Typhoeus::Request.new("http://localhost:3000")
|
@@ -309,3 +239,218 @@ describe Typhoeus::Hydra do
|
|
309
239
|
request.response.code.should == 302
|
310
240
|
end
|
311
241
|
end
|
242
|
+
|
243
|
+
describe Typhoeus::Hydra::Stubbing do
|
244
|
+
shared_examples_for "any stubbable target" do
|
245
|
+
before(:each) do
|
246
|
+
@on_complete_handler_called = nil
|
247
|
+
@request = Typhoeus::Request.new("http://localhost:3000/foo",
|
248
|
+
:user_agent => 'test')
|
249
|
+
@request.on_complete do |response|
|
250
|
+
@on_complete_handler_called = true
|
251
|
+
response.code.should == 404
|
252
|
+
response.headers.should == "whatever"
|
253
|
+
end
|
254
|
+
@response = Typhoeus::Response.new(:code => 404,
|
255
|
+
:headers => "whatever",
|
256
|
+
:body => "not found",
|
257
|
+
:time => 0.1)
|
258
|
+
end
|
259
|
+
|
260
|
+
after(:each) do
|
261
|
+
@stub_target.clear_stubs
|
262
|
+
end
|
263
|
+
|
264
|
+
it "should provide a stubs accessor" do
|
265
|
+
begin
|
266
|
+
@stub_target.stubs.should == []
|
267
|
+
@stub_target.stubs = [:foo]
|
268
|
+
ensure
|
269
|
+
@stub_target.clear_stubs
|
270
|
+
end
|
271
|
+
end
|
272
|
+
|
273
|
+
it "stubs requests to a specific URI" do
|
274
|
+
@stub_target.stub(:get, "http://localhost:3000/foo",
|
275
|
+
:headers => { 'user-agent' => 'test'}).
|
276
|
+
and_return(@response)
|
277
|
+
|
278
|
+
@hydra.queue(@request)
|
279
|
+
@hydra.run
|
280
|
+
@on_complete_handler_called.should be_true
|
281
|
+
@response.request.should == @request
|
282
|
+
end
|
283
|
+
|
284
|
+
it "stubs requests to URIs matching a pattern" do
|
285
|
+
@stub_target.stub(:get, /foo/,
|
286
|
+
:headers => { 'user-agent' => 'test' }).
|
287
|
+
and_return(@response)
|
288
|
+
@hydra.queue(@request)
|
289
|
+
@hydra.run
|
290
|
+
@on_complete_handler_called.should be_true
|
291
|
+
@response.request.should == @request
|
292
|
+
end
|
293
|
+
|
294
|
+
it "can clear stubs" do
|
295
|
+
@stub_target.clear_stubs
|
296
|
+
end
|
297
|
+
|
298
|
+
it "clears out previously queued requests once they are called" do
|
299
|
+
@stub_target.stub(:get, "http://localhost:3000/asdf",
|
300
|
+
:headers => { 'user-agent' => 'test' }).
|
301
|
+
and_return(@response)
|
302
|
+
|
303
|
+
call_count = 0
|
304
|
+
request = Typhoeus::Request.new("http://localhost:3000/asdf", :user_agent => 'test')
|
305
|
+
request.on_complete do |response|
|
306
|
+
call_count += 1
|
307
|
+
end
|
308
|
+
@hydra.queue(request)
|
309
|
+
@hydra.run
|
310
|
+
call_count.should == 1
|
311
|
+
@hydra.run
|
312
|
+
call_count.should == 1
|
313
|
+
end
|
314
|
+
|
315
|
+
it "calls stubs for requests that are queued up in the on_complete of a first stub" do
|
316
|
+
@stub_target.stub(:get, "http://localhost:3000/asdf").and_return(@response)
|
317
|
+
@stub_target.stub(:get, "http://localhost:3000/bar").and_return(@response)
|
318
|
+
|
319
|
+
second_handler_called = false
|
320
|
+
request = Typhoeus::Request.new("http://localhost:3000/asdf")
|
321
|
+
request.on_complete do |response|
|
322
|
+
r = Typhoeus::Request.new("http://localhost:3000/bar")
|
323
|
+
r.on_complete do |res|
|
324
|
+
second_handler_called = true
|
325
|
+
end
|
326
|
+
@hydra.queue(r)
|
327
|
+
end
|
328
|
+
@hydra.queue(request)
|
329
|
+
@hydra.run
|
330
|
+
|
331
|
+
second_handler_called.should be_true
|
332
|
+
end
|
333
|
+
end
|
334
|
+
|
335
|
+
describe "global (class-level) stubbing" do
|
336
|
+
before(:each) do
|
337
|
+
@hydra = Typhoeus::Hydra.new
|
338
|
+
@stub_target = Typhoeus::Hydra
|
339
|
+
end
|
340
|
+
|
341
|
+
it_should_behave_like "any stubbable target"
|
342
|
+
end
|
343
|
+
|
344
|
+
describe "instance stubbing" do
|
345
|
+
before(:each) do
|
346
|
+
@hydra = Typhoeus::Hydra.new
|
347
|
+
@stub_target = @hydra
|
348
|
+
end
|
349
|
+
|
350
|
+
it_should_behave_like "any stubbable target"
|
351
|
+
end
|
352
|
+
end
|
353
|
+
|
354
|
+
describe Typhoeus::Hydra::Callbacks do
|
355
|
+
before(:all) do
|
356
|
+
@klass = Typhoeus::Hydra
|
357
|
+
end
|
358
|
+
|
359
|
+
describe "#after_request_before_on_complete" do
|
360
|
+
it "should provide a global hook after a request" do
|
361
|
+
begin
|
362
|
+
http_method = nil
|
363
|
+
@klass.after_request_before_on_complete do |request|
|
364
|
+
http_method = request.method
|
365
|
+
end
|
366
|
+
|
367
|
+
hydra = @klass.new
|
368
|
+
request = Typhoeus::Request.new('http://localhost:3000',
|
369
|
+
:method => :get)
|
370
|
+
response = Typhoeus::Response.new(:code => 404,
|
371
|
+
:headers => "whatever",
|
372
|
+
:body => "not found",
|
373
|
+
:time => 0.1)
|
374
|
+
hydra.stub(:get, 'http://localhost:3000').
|
375
|
+
and_return(response)
|
376
|
+
|
377
|
+
hydra.queue(request)
|
378
|
+
hydra.run
|
379
|
+
|
380
|
+
http_method.should == :get
|
381
|
+
ensure
|
382
|
+
@klass.clear_global_hooks
|
383
|
+
end
|
384
|
+
end
|
385
|
+
end
|
386
|
+
end
|
387
|
+
|
388
|
+
describe Typhoeus::Hydra::ConnectOptions do
|
389
|
+
before(:all) do
|
390
|
+
@klass = Typhoeus::Hydra
|
391
|
+
end
|
392
|
+
|
393
|
+
describe "#ignore_localhost" do
|
394
|
+
it "should allow localhost requests over the wire if true" do
|
395
|
+
begin
|
396
|
+
old_net_connect = @klass.allow_net_connect
|
397
|
+
old_ignore_localhost = @klass.ignore_localhost
|
398
|
+
@klass.allow_net_connect = false
|
399
|
+
@klass.ignore_localhost = true
|
400
|
+
|
401
|
+
req = Typhoeus::Request.new("http://localhost:3000")
|
402
|
+
hydra = @klass.new
|
403
|
+
|
404
|
+
lambda {
|
405
|
+
hydra.queue(req)
|
406
|
+
}.should_not raise_error
|
407
|
+
ensure
|
408
|
+
@klass.allow_net_connect = old_net_connect
|
409
|
+
@klass.ignore_localhost = old_ignore_localhost
|
410
|
+
end
|
411
|
+
end
|
412
|
+
end
|
413
|
+
|
414
|
+
describe "#allow_net_connect" do
|
415
|
+
it "should be settable" do
|
416
|
+
begin
|
417
|
+
# make sure to not mess up other specs.
|
418
|
+
old = @klass.allow_net_connect
|
419
|
+
@klass.allow_net_connect = true
|
420
|
+
@klass.allow_net_connect.should be_true
|
421
|
+
ensure
|
422
|
+
@klass.allow_net_connect = old
|
423
|
+
end
|
424
|
+
end
|
425
|
+
|
426
|
+
it "should default to true" do
|
427
|
+
@klass.allow_net_connect.should be_true
|
428
|
+
end
|
429
|
+
|
430
|
+
it "should raise an error if we queue a request while its false" do
|
431
|
+
begin
|
432
|
+
request = Typhoeus::Request.new("http://localhost:3000")
|
433
|
+
old_net_connect = @klass.allow_net_connect
|
434
|
+
old_ignore_localhost = @klass.ignore_localhost
|
435
|
+
|
436
|
+
@klass.allow_net_connect = false
|
437
|
+
@klass.ignore_localhost = false
|
438
|
+
|
439
|
+
hydra = Typhoeus::Hydra.new
|
440
|
+
|
441
|
+
lambda {
|
442
|
+
hydra.queue(request)
|
443
|
+
}.should raise_error(Typhoeus::Hydra::NetConnectNotAllowedError)
|
444
|
+
ensure
|
445
|
+
@klass.allow_net_connect = old_net_connect
|
446
|
+
@klass.ignore_localhost = old_ignore_localhost
|
447
|
+
end
|
448
|
+
end
|
449
|
+
end
|
450
|
+
|
451
|
+
describe "#allow_net_connect?" do
|
452
|
+
it "should return true by default" do
|
453
|
+
@klass.allow_net_connect?.should be_true
|
454
|
+
end
|
455
|
+
end
|
456
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/../spec_helper"
|
2
|
+
|
3
|
+
describe Typhoeus::NormalizedHeaderHash do
|
4
|
+
before(:all) do
|
5
|
+
@klass = Typhoeus::NormalizedHeaderHash
|
6
|
+
end
|
7
|
+
|
8
|
+
it "should normalize keys on assignment" do
|
9
|
+
hash = @klass.new
|
10
|
+
hash['Content-Type'] = 'text/html'
|
11
|
+
hash['content-type'].should == 'text/html'
|
12
|
+
hash[:content_type].should == 'text/html'
|
13
|
+
hash['Accepts'] = 'text/javascript'
|
14
|
+
hash['accepts'].should == 'text/javascript'
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should normalize the keys on instantiation" do
|
18
|
+
hash = @klass.new('Content-Type' => 'text/html', :x_http_header => 'foo', 'X-HTTP-USER' => 'bar')
|
19
|
+
hash.keys.should =~ ['Content-Type', 'X-Http-Header', 'X-Http-User']
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should merge keys correctly" do
|
23
|
+
hash = @klass.new
|
24
|
+
hash.merge!('Content-Type' => 'fdsa')
|
25
|
+
hash['content-type'].should == 'fdsa'
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should allow any casing of keys" do
|
29
|
+
hash = @klass.new
|
30
|
+
hash['Content-Type'] = 'fdsa'
|
31
|
+
hash['content-type'].should == 'fdsa'
|
32
|
+
hash['cOnTent-TYPE'].should == 'fdsa'
|
33
|
+
hash['Content-Type'].should == 'fdsa'
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should support has_key?" do
|
37
|
+
hash = @klass.new
|
38
|
+
hash['Content-Type'] = 'fdsa'
|
39
|
+
hash.has_key?('cOntent-Type').should be_true
|
40
|
+
end
|
41
|
+
end
|
@@ -1,6 +1,50 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/../spec_helper'
|
2
2
|
|
3
3
|
describe Typhoeus::Request do
|
4
|
+
describe "#inspect" do
|
5
|
+
before(:each) do
|
6
|
+
@request = Typhoeus::Request.new('http://www.google.com/',
|
7
|
+
:body => "a=1&b=2",
|
8
|
+
:params => { :c => 'ok' },
|
9
|
+
:method => :get,
|
10
|
+
:headers => { 'Content-Type' => 'text/html' })
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should dump out the URI" do
|
14
|
+
@request.inspect.should =~ /http:\/\/www\.google\.com/
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should dump out the body" do
|
18
|
+
@request.inspect.should =~ /a=1&b=2/
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should dump params" do
|
22
|
+
@request.inspect.should =~ /:c\s*=>\s*"ok"/
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should dump the method" do
|
26
|
+
@request.inspect.should =~ /:get/
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should dump out headers" do
|
30
|
+
@request.inspect.should =~ /"Content-Type"\s*=>\s*"text\/html"/
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe "#localhost?" do
|
35
|
+
%w(localhost 127.0.0.1 0.0.0.0).each do |host|
|
36
|
+
it "should be true for the #{host} host" do
|
37
|
+
req = Typhoeus::Request.new("http://#{host}")
|
38
|
+
req.should be_localhost
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should be false for other domains" do
|
43
|
+
req = Typhoeus::Request.new("http://google.com")
|
44
|
+
req.should_not be_localhost
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
4
48
|
describe "#params_string" do
|
5
49
|
it "should dump a sorted string" do
|
6
50
|
request = Typhoeus::Request.new(
|
@@ -24,6 +68,14 @@ describe Typhoeus::Request do
|
|
24
68
|
})
|
25
69
|
request.params_string.should == "a=jlk&b=fdsa&c=789"
|
26
70
|
end
|
71
|
+
|
72
|
+
it "should translate params with values that are arrays to the proper format" do
|
73
|
+
request = Typhoeus::Request.new('http://google.com',
|
74
|
+
:params => {
|
75
|
+
:a => ['789','2434']
|
76
|
+
})
|
77
|
+
request.params_string.should == "a[]=789&a[]=2434"
|
78
|
+
end
|
27
79
|
end
|
28
80
|
|
29
81
|
describe "quick request methods" do
|
@@ -160,9 +212,9 @@ describe Typhoeus::Request do
|
|
160
212
|
request.call_handlers
|
161
213
|
good.should be_true
|
162
214
|
end
|
163
|
-
|
215
|
+
|
164
216
|
describe "authentication" do
|
165
|
-
|
217
|
+
|
166
218
|
it "should allow to set username and password" do
|
167
219
|
auth = { :username => 'foo', :password => 'bar' }
|
168
220
|
e = Typhoeus::Request.get(
|
@@ -2,9 +2,35 @@ require File.dirname(__FILE__) + '/../spec_helper'
|
|
2
2
|
|
3
3
|
describe Typhoeus::Response do
|
4
4
|
describe "initialize" do
|
5
|
+
it "should store headers_hash" do
|
6
|
+
response = Typhoeus::Response.new(:headers_hash => {})
|
7
|
+
response.headers_hash.should == {}
|
8
|
+
end
|
9
|
+
|
10
|
+
it "allows header access using a different casing of the header key" do
|
11
|
+
response = Typhoeus::Response.new(:headers_hash => { 'content-type' => 'text/html' } )
|
12
|
+
response.headers_hash['Content-Type'].should == 'text/html'
|
13
|
+
end
|
14
|
+
|
5
15
|
it "should store response_code" do
|
6
16
|
Typhoeus::Response.new(:code => 200).code.should == 200
|
7
17
|
end
|
18
|
+
|
19
|
+
it "should store status_message" do
|
20
|
+
Typhoeus::Response.new(:status_message => 'Not Found').status_message.should == 'Not Found'
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should return nil for status_message if none is given and no header is given" do
|
24
|
+
Typhoeus::Response.new.status_message.should be_nil
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should store http_version" do
|
28
|
+
Typhoeus::Response.new(:http_version => '1.1').http_version.should == '1.1'
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should return nil for http version if none is given and no header is given" do
|
32
|
+
Typhoeus::Response.new.http_version.should be_nil
|
33
|
+
end
|
8
34
|
|
9
35
|
it "should store response_headers" do
|
10
36
|
Typhoeus::Response.new(:headers => "a header!").headers.should == "a header!"
|
@@ -27,34 +53,84 @@ describe Typhoeus::Response do
|
|
27
53
|
response = Typhoeus::Response.new(:requested_http_method => :delete)
|
28
54
|
response.requested_http_method.should == :delete
|
29
55
|
end
|
30
|
-
|
56
|
+
|
31
57
|
it "should store an associated request object" do
|
32
58
|
response = Typhoeus::Response.new(:request => "whatever")
|
33
59
|
response.request.should == "whatever"
|
34
60
|
end
|
61
|
+
|
62
|
+
it "should not default to be a mock response" do
|
63
|
+
response = Typhoeus::Response.new
|
64
|
+
response.should_not be_mock
|
65
|
+
end
|
35
66
|
end
|
36
|
-
|
67
|
+
|
68
|
+
describe "#mock?" do
|
69
|
+
it "should be true if it's a mock response" do
|
70
|
+
response = Typhoeus::Response.new(:mock => true)
|
71
|
+
response.should be_mock
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
37
75
|
describe "headers" do
|
38
|
-
it
|
39
|
-
response = Typhoeus::Response.new
|
40
|
-
response.headers_hash["Status"].should == "200"
|
41
|
-
response.headers_hash["Set-Cookie"].should == ["_some_session=BAh7CDoGciIAOg9zZXNzaW9uX2lkIiU1OTQ2OTcwMjljMWM5ZTQwODU1NjQwYTViMmQxMTkxMjoGcyIKL2NhcnQ%3D--b4c4663932243090c961bb93d4ad5e4327064730; path=/; HttpOnly", "foo=bar; path=/;"]
|
42
|
-
response.headers_hash["Content-Type"].should == "text/html; charset=utf-8"
|
76
|
+
it 'should return an empty hash from #headers_hash when no headers string is given' do
|
77
|
+
response = Typhoeus::Response.new.headers_hash.should == {}
|
43
78
|
end
|
44
|
-
|
79
|
+
|
80
|
+
describe "basic parsing" do
|
81
|
+
before(:all) do
|
82
|
+
@response = Typhoeus::Response.new(:headers => "HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=utf-8\r\nConnection: close\r\nStatus: 200\r\nX-Powered-By: Phusion Passenger (mod_rails/mod_rack) 2.2.9\r\nX-Cache: miss\r\nX-Runtime: 184\r\nETag: e001d08d9354ab7bc7c27a00163a3afa\r\nCache-Control: private, max-age=0, must-revalidate\r\nContent-Length: 4725\r\nSet-Cookie: _some_session=BAh7CDoGciIAOg9zZXNzaW9uX2lkIiU1OTQ2OTcwMjljMWM5ZTQwODU1NjQwYTViMmQxMTkxMjoGcyIKL2NhcnQ%3D--b4c4663932243090c961bb93d4ad5e4327064730; path=/; HttpOnly\r\nServer: nginx/0.6.37 + Phusion Passenger 2.2.4 (mod_rails/mod_rack)\r\nSet-Cookie: foo=bar; path=/;\r\nP3P: CP=\"NOI DSP COR NID ADMa OPTa OUR NOR\"\r\n\r\n")
|
83
|
+
end
|
84
|
+
|
85
|
+
it "can be accessed with lowercase keys" do
|
86
|
+
@response.headers_hash['content-type'].should == 'text/html; charset=utf-8'
|
87
|
+
end
|
88
|
+
|
89
|
+
it "can parse the headers into a hash" do
|
90
|
+
@response.headers_hash["Status"].should == "200"
|
91
|
+
@response.headers_hash["Set-Cookie"].should == ["_some_session=BAh7CDoGciIAOg9zZXNzaW9uX2lkIiU1OTQ2OTcwMjljMWM5ZTQwODU1NjQwYTViMmQxMTkxMjoGcyIKL2NhcnQ%3D--b4c4663932243090c961bb93d4ad5e4327064730; path=/; HttpOnly", "foo=bar; path=/;"]
|
92
|
+
@response.headers_hash["Content-Type"].should == "text/html; charset=utf-8"
|
93
|
+
end
|
94
|
+
|
95
|
+
it 'parses the status message' do
|
96
|
+
@response.status_message.should == 'OK'
|
97
|
+
end
|
98
|
+
|
99
|
+
it 'parses the HTTP version' do
|
100
|
+
@response.http_version.should == '1.1'
|
101
|
+
end
|
102
|
+
|
103
|
+
it 'parses all header keys except HTTP version declaration' do
|
104
|
+
@response.headers_hash.keys.should =~ %w[
|
105
|
+
X-Powered-By
|
106
|
+
P3p
|
107
|
+
X-Cache
|
108
|
+
Etag
|
109
|
+
X-Runtime
|
110
|
+
Content-Type
|
111
|
+
Content-Length
|
112
|
+
Server
|
113
|
+
Set-Cookie
|
114
|
+
Cache-Control
|
115
|
+
Connection
|
116
|
+
Status
|
117
|
+
]
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
45
121
|
it "parses a header key that appears multiple times into an array" do
|
46
122
|
response = Typhoeus::Response.new(:headers => "HTTP/1.1 302 Found\r\nContent-Type: text/html; charset=utf-8\r\nConnection: close\r\nStatus: 302\r\nX-Powered-By: Phusion Passenger (mod_rails/mod_rack) 2.2.9\r\nLocation: http://mckenzie-greenholt1512.myshopify.com/cart\r\nX-Runtime: 22\r\nCache-Control: no-cache\r\nContent-Length: 114\r\nSet-Cookie: cart=8fdd6a828d9c89a737a52668be0cebaf; path=/; expires=Fri, 12-Mar-2010 18:30:19 GMT\r\nSet-Cookie: _session=BAh7CToPc2Vzc2lvbl9pZCIlZTQzMDQzMDg1YjI3MTQ4MzAzMTZmMWZmMWJjMTU1NmI6CWNhcnQiJThmZGQ2YTgyOGQ5Yzg5YTczN2E1MjY2OGJlMGNlYmFmOgZyIgA6BnMiDi9jYXJ0L2FkZA%3D%3D--6b0a699625caed9597580d8e9b6ca5f5e5954125; path=/; HttpOnly\r\nServer: nginx/0.6.37 + Phusion Passenger 2.2.4 (mod_rails/mod_rack)\r\nP3P: CP=\"NOI DSP COR NID ADMa OPTa OUR NOR\"\r\n\r\n")
|
47
123
|
response.headers_hash["Set-Cookie"].should include("cart=8fdd6a828d9c89a737a52668be0cebaf; path=/; expires=Fri, 12-Mar-2010 18:30:19 GMT")
|
48
124
|
response.headers_hash["Set-Cookie"].should include("_session=BAh7CToPc2Vzc2lvbl9pZCIlZTQzMDQzMDg1YjI3MTQ4MzAzMTZmMWZmMWJjMTU1NmI6CWNhcnQiJThmZGQ2YTgyOGQ5Yzg5YTczN2E1MjY2OGJlMGNlYmFmOgZyIgA6BnMiDi9jYXJ0L2FkZA%3D%3D--6b0a699625caed9597580d8e9b6ca5f5e5954125; path=/; HttpOnly")
|
49
125
|
end
|
50
126
|
end
|
51
|
-
|
127
|
+
|
52
128
|
describe "status checking" do
|
53
129
|
it "is successful if response code is 200-299" do
|
54
130
|
Typhoeus::Response.new(:code => 220).success?.should be
|
55
131
|
Typhoeus::Response.new(:code => 400).success?.should_not be
|
56
132
|
end
|
57
|
-
|
133
|
+
|
58
134
|
it "is not modified if the status code is 304" do
|
59
135
|
Typhoeus::Response.new(:code => 304).modified?.should_not be
|
60
136
|
Typhoeus::Response.new(:code => 200).modified?.should be
|