typhoeus 0.6.3 → 0.6.4

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.
Files changed (61) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +8 -0
  3. data/.rspec +4 -0
  4. data/.travis.yml +10 -0
  5. data/CHANGELOG.md +7 -1
  6. data/CONTRIBUTING.md +16 -0
  7. data/Guardfile +9 -0
  8. data/README.md +303 -1
  9. data/UPGRADE.md +55 -0
  10. data/lib/rack/typhoeus/middleware/params_decoder.rb +1 -1
  11. data/lib/rack/typhoeus/middleware/params_decoder/helper.rb +6 -2
  12. data/lib/typhoeus/adapters/faraday.rb +4 -1
  13. data/lib/typhoeus/easy_factory.rb +36 -15
  14. data/lib/typhoeus/hydra/before.rb +2 -1
  15. data/lib/typhoeus/hydra/cacheable.rb +1 -0
  16. data/lib/typhoeus/hydra/memoizable.rb +1 -0
  17. data/lib/typhoeus/hydra/queueable.rb +15 -3
  18. data/lib/typhoeus/request.rb +6 -2
  19. data/lib/typhoeus/request/marshal.rb +3 -2
  20. data/lib/typhoeus/response/informations.rb +4 -0
  21. data/lib/typhoeus/version.rb +1 -1
  22. data/perf/profile.rb +14 -0
  23. data/perf/vs_nethttp.rb +64 -0
  24. data/spec/rack/typhoeus/middleware/params_decoder/helper_spec.rb +132 -0
  25. data/spec/rack/typhoeus/middleware/params_decoder_spec.rb +31 -0
  26. data/spec/spec_helper.rb +35 -0
  27. data/spec/support/localhost_server.rb +94 -0
  28. data/spec/support/server.rb +108 -0
  29. data/spec/typhoeus/adapters/faraday_spec.rb +245 -0
  30. data/spec/typhoeus/config_spec.rb +15 -0
  31. data/spec/typhoeus/easy_factory_spec.rb +96 -0
  32. data/spec/typhoeus/errors/no_stub_spec.rb +13 -0
  33. data/spec/typhoeus/expectation_spec.rb +273 -0
  34. data/spec/typhoeus/hydra/addable_spec.rb +22 -0
  35. data/spec/typhoeus/hydra/before_spec.rb +97 -0
  36. data/spec/typhoeus/hydra/block_connection_spec.rb +18 -0
  37. data/spec/typhoeus/hydra/cacheable_spec.rb +68 -0
  38. data/spec/typhoeus/hydra/memoizable_spec.rb +53 -0
  39. data/spec/typhoeus/hydra/queueable_spec.rb +34 -0
  40. data/spec/typhoeus/hydra/runnable_spec.rb +155 -0
  41. data/spec/typhoeus/hydra/stubbable_spec.rb +28 -0
  42. data/spec/typhoeus/hydra_spec.rb +26 -0
  43. data/spec/typhoeus/pool_spec.rb +79 -0
  44. data/spec/typhoeus/request/actions_spec.rb +19 -0
  45. data/spec/typhoeus/request/before_spec.rb +92 -0
  46. data/spec/typhoeus/request/block_connection_spec.rb +75 -0
  47. data/spec/typhoeus/request/cacheable_spec.rb +80 -0
  48. data/spec/typhoeus/request/callbacks_spec.rb +91 -0
  49. data/spec/typhoeus/request/marshal_spec.rb +62 -0
  50. data/spec/typhoeus/request/memoizable_spec.rb +34 -0
  51. data/spec/typhoeus/request/operations_spec.rb +70 -0
  52. data/spec/typhoeus/request/responseable_spec.rb +13 -0
  53. data/spec/typhoeus/request/stubbable_spec.rb +27 -0
  54. data/spec/typhoeus/request_spec.rb +131 -0
  55. data/spec/typhoeus/response/header_spec.rb +97 -0
  56. data/spec/typhoeus/response/informations_spec.rb +218 -0
  57. data/spec/typhoeus/response/status_spec.rb +218 -0
  58. data/spec/typhoeus/response_spec.rb +81 -0
  59. data/spec/typhoeus_spec.rb +105 -0
  60. data/typhoeus.gemspec +25 -0
  61. metadata +101 -27
@@ -0,0 +1,70 @@
1
+ require 'spec_helper'
2
+
3
+ describe Typhoeus::Request::Operations do
4
+ let(:base_url) { "localhost:3001" }
5
+ let(:options) { {} }
6
+ let(:request) { Typhoeus::Request.new(base_url, options) }
7
+
8
+ describe "#run" do
9
+ let(:easy) { Ethon::Easy.new }
10
+ before { Typhoeus::Pool.should_receive(:get).and_return(easy) }
11
+
12
+ it "grabs an easy" do
13
+ request.run
14
+ end
15
+
16
+ it "generates settings" do
17
+ easy.should_receive(:http_request)
18
+ request.run
19
+ end
20
+
21
+ it "performs" do
22
+ easy.should_receive(:perform)
23
+ request.run
24
+ end
25
+
26
+ it "sets response" do
27
+ request.run
28
+ expect(request.response).to be
29
+ end
30
+
31
+ it "releases easy" do
32
+ Typhoeus::Pool.should_receive(:release)
33
+ request.run
34
+ end
35
+
36
+ it "calls on_complete" do
37
+ callback = double(:call)
38
+ callback.should_receive(:call)
39
+ request.instance_variable_set(:@on_complete, [callback])
40
+ request.run
41
+ end
42
+
43
+ it "returns a response" do
44
+ expect(request.run).to be_a(Typhoeus::Response)
45
+ end
46
+ end
47
+
48
+ describe "#finish" do
49
+ let(:response) { Typhoeus::Response.new }
50
+
51
+ it "assigns response" do
52
+ request.finish(response)
53
+ expect(request.response).to be(response)
54
+ end
55
+
56
+ it "assigns request to response" do
57
+ request.finish(response)
58
+ expect(request.response.request).to be(request)
59
+ end
60
+
61
+ it "executes callbacks" do
62
+ request.should_receive(:execute_callbacks)
63
+ request.finish(response)
64
+ end
65
+
66
+ it "returns response" do
67
+ expect(request.finish(response)).to be(response)
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe Typhoeus::Request::Responseable do
4
+ let(:request) { Typhoeus::Request.new("base_url", {}) }
5
+ let(:response) { Typhoeus::Response.new }
6
+
7
+ describe "#response=" do
8
+ it "stores response" do
9
+ request.response = response
10
+ expect(request.response).to eq(response)
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+
3
+ describe Typhoeus::Request::Stubbable do
4
+ let(:base_url) { "localhost:3001" }
5
+ let(:request) { Typhoeus::Request.new(base_url) }
6
+ let(:response) { Typhoeus::Response.new }
7
+
8
+ before { Typhoeus.stub(base_url).and_return(response) }
9
+
10
+ describe "#run" do
11
+ it "checks expectations" do
12
+ request.run
13
+ end
14
+
15
+ context "when expectation found" do
16
+ it "finishes request" do
17
+ request.should_receive(:finish)
18
+ request.run
19
+ end
20
+
21
+ it "sets mock on response" do
22
+ request.run
23
+ expect(request.response.mock).to be(true)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,131 @@
1
+ require 'spec_helper'
2
+
3
+ describe Typhoeus::Request do
4
+ let(:base_url) { "localhost:3001" }
5
+ let(:options) { {:verbose => true, :headers => { 'User-Agent' => "Fubar" }} }
6
+ let(:request) { Typhoeus::Request.new(base_url, options) }
7
+
8
+ describe ".url" do
9
+ context "when no parameters" do
10
+ it "returns base_url" do
11
+ expect(request.url).to eq(request.base_url)
12
+ end
13
+ end
14
+
15
+ context "when parameters" do
16
+ let(:options) { {:params => {:a => 1}} }
17
+
18
+ it "returns full url" do
19
+ expect(request.url).to eq("#{request.base_url}?a=1")
20
+ end
21
+ end
22
+
23
+ it "pushes an easy back into the pool" do
24
+ easy = double.as_null_object
25
+ Typhoeus::Pool.stub(:get).and_return(easy)
26
+ Typhoeus::Pool.should_receive(:release).with(easy)
27
+ request.url
28
+ end
29
+ end
30
+
31
+ describe ".new" do
32
+ it "stores base_url" do
33
+ expect(request.base_url).to eq(base_url)
34
+ end
35
+
36
+ it "stores options" do
37
+ expect(request.options).to eq(options)
38
+ end
39
+
40
+ context "when header with user agent" do
41
+ let(:options) { {:headers => {'User-Agent' => "Custom"} } }
42
+
43
+ it "doesn't modify user agent" do
44
+ expect(request.options[:headers]['User-Agent']).to eq("Custom")
45
+ end
46
+ end
47
+
48
+ context "when header without user agent" do
49
+ let(:options) { {:headers => {} } }
50
+
51
+ it "add user agent" do
52
+ expect(request.options[:headers]['User-Agent']).to eq(Typhoeus::USER_AGENT)
53
+ end
54
+ end
55
+
56
+ context "when Config.verbose set" do
57
+ before { Typhoeus.configure { |config| config.verbose = true} }
58
+ after { Typhoeus.configure { |config| config.verbose = false} }
59
+
60
+ it "respects" do
61
+ expect(request.options[:verbose]).to be_true
62
+ end
63
+ end
64
+ end
65
+
66
+ describe "#eql?" do
67
+ context "when another class" do
68
+ let(:other) { "" }
69
+
70
+ it "returns false" do
71
+ expect(request).to_not eql other
72
+ end
73
+ end
74
+
75
+ context "when same class" do
76
+ let(:other) { Typhoeus::Request.new("base_url", options) }
77
+
78
+ context "when other base_url" do
79
+ it "returns false" do
80
+ expect(request).to_not eql other
81
+ end
82
+ end
83
+
84
+ context "when same base_url and other options" do
85
+ let(:other) { Typhoeus::Request.new(base_url, {}) }
86
+
87
+ it "returns false" do
88
+ expect(request).to_not eql other
89
+ end
90
+ end
91
+
92
+
93
+ context "when same base_url and options" do
94
+ context "when same order" do
95
+ let(:other) { Typhoeus::Request.new(base_url, options) }
96
+
97
+ it "returns true" do
98
+ expect(request).to eql other
99
+ end
100
+ end
101
+
102
+ context "when different order" do
103
+ let(:other_options) { {:headers => { 'User-Agent' => "Fubar", }, :verbose => true } }
104
+ let(:other) { Typhoeus::Request.new(base_url, other_options)}
105
+
106
+ it "returns true" do
107
+ expect(request).to eql other
108
+ end
109
+ end
110
+ end
111
+ end
112
+ end
113
+
114
+ describe "#hash" do
115
+ context "when request.eql?(other)" do
116
+ let(:other) { Typhoeus::Request.new(base_url, options) }
117
+
118
+ it "has same hashes" do
119
+ expect(request.hash).to eq(other.hash)
120
+ end
121
+ end
122
+
123
+ context "when not request.eql?(other)" do
124
+ let(:other) { Typhoeus::Request.new("base_url", {}) }
125
+
126
+ it "has different hashes" do
127
+ expect(request.hash).to_not eq(other.hash)
128
+ end
129
+ end
130
+ end
131
+ end
@@ -0,0 +1,97 @@
1
+ require 'spec_helper'
2
+
3
+ describe Typhoeus::Response::Header do
4
+ let(:raw) { nil }
5
+ let(:header) { Typhoeus::Response::Header.new(raw) }
6
+
7
+ describe ".new" do
8
+ context "when string" do
9
+ let(:raw) { 'Date: Fri, 29 Jun 2012 10:09:23 GMT' }
10
+
11
+ it "sets Date" do
12
+ expect(header['Date']).to eq('Fri, 29 Jun 2012 10:09:23 GMT')
13
+ end
14
+
15
+ it "provides case insensitive access" do
16
+ expect(header['DaTe']).to eq('Fri, 29 Jun 2012 10:09:23 GMT')
17
+ end
18
+
19
+ it "provides symbol access" do
20
+ expect(header[:date]).to eq('Fri, 29 Jun 2012 10:09:23 GMT')
21
+ end
22
+ end
23
+
24
+ context "when hash" do
25
+ let(:raw) { { 'Date' => 'Fri, 29 Jun 2012 10:09:23 GMT' } }
26
+
27
+ it "sets Date" do
28
+ expect(header['Date']).to eq(raw['Date'])
29
+ end
30
+
31
+ it "provides case insensitive access" do
32
+ expect(header['DaTe']).to eq(raw['Date'])
33
+ end
34
+ end
35
+ end
36
+
37
+ describe "#parse" do
38
+ context "when no header" do
39
+ it "returns nil" do
40
+ expect(header).to be_empty
41
+ end
42
+ end
43
+
44
+ context "when header" do
45
+ let(:raw) do
46
+ 'HTTP/1.1 200 OK
47
+ Set-Cookie: NID=61=LblqYgUOu; expires=Sat, 29-Dec-2012 10:09:23 GMT; path=/; domain=.google.de; HttpOnly
48
+ Date: Fri, 29 Jun 2012 10:09:23 GMT
49
+ Expires: -1
50
+ Cache-Control: private, max-age=0
51
+ Content-Type: text/html; charset=ISO-8859-1
52
+ Set-Cookie: PREF=ID=77e93yv0hPtejLou; expires=Sun, 29-Jun-2014 10:09:23 GMT; path=/; domain=.google.de
53
+ Set-Cookie: NID=61=LblqYgh5Ou; expires=Sat, 29-Dec-2012 10:09:23 GMT; path=/; domain=.google.de; HttpOnly
54
+ P3P: CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info."
55
+ Server: gws
56
+ X-XSS-Protection: 1; mode=block
57
+ X-Frame-Options: SAMEORIGIN
58
+ Transfer-Encoding: chunked'
59
+ end
60
+
61
+ it "sets raw" do
62
+ expect(header.send(:raw)).to eq(raw)
63
+ end
64
+
65
+ it "sets Set-Cookie" do
66
+ expect(header['set-cookie']).to have(3).items
67
+ end
68
+
69
+ it "provides case insensitive access" do
70
+ expect(header['Set-CooKie']).to have(3).items
71
+ end
72
+
73
+ [
74
+ 'NID=61=LblqYgUOu; expires=Sat, 29-Dec-2012 10:09:23 GMT; path=/; domain=.google.de; HttpOnly',
75
+ 'PREF=ID=77e93yv0hPtejLou; expires=Sun, 29-Jun-2014 10:09:23 GMT; path=/; domain=.google.de',
76
+ 'NID=61=LblqYgh5Ou; expires=Sat, 29-Dec-2012 10:09:23 GMT; path=/; domain=.google.de; HttpOnly'
77
+ ].each_with_index do |cookie, i|
78
+ it "sets Cookie##{i}" do
79
+ expect(header['set-cookie']).to include(cookie)
80
+ end
81
+ end
82
+
83
+ {
84
+ 'Date' => 'Fri, 29 Jun 2012 10:09:23 GMT', 'Expires' => '-1',
85
+ 'Cache-Control' => 'private, max-age=0',
86
+ 'Content-Type' => 'text/html; charset=ISO-8859-1',
87
+ 'P3P' => 'CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info."',
88
+ 'Server' => 'gws', 'X-XSS-Protection' => '1; mode=block',
89
+ 'X-Frame-Options' => 'SAMEORIGIN', 'Transfer-Encoding' => 'chunked'
90
+ }.each do |name, value|
91
+ it "sets #{name}" do
92
+ expect(header[name.downcase]).to eq(value)
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,218 @@
1
+ require 'spec_helper'
2
+
3
+ describe Typhoeus::Response::Informations do
4
+ let(:options) { {} }
5
+ let(:response) { Typhoeus::Response.new(options) }
6
+
7
+ describe "#return_code" do
8
+ let(:options) { { :return_code => :ok } }
9
+
10
+ it "returns return_code from options" do
11
+ expect(response.return_code).to be(:ok)
12
+ end
13
+ end
14
+
15
+ describe "#debug_info" do
16
+ let(:options) { { :debug_info => Ethon::Easy::DebugInfo.new } }
17
+
18
+ it "returns debug_info from options" do
19
+ expect(response.debug_info).to be_a(Ethon::Easy::DebugInfo)
20
+ end
21
+ end
22
+
23
+ describe "#return_message" do
24
+ let(:options) { { :return_code => :couldnt_connect } }
25
+
26
+ it "returns a message" do
27
+ expect(response.return_message).to eq("Couldn't connect to server")
28
+ end
29
+ end
30
+
31
+ describe "#response_body" do
32
+ context "when response_body" do
33
+ let(:options) { { :response_body => "body" } }
34
+
35
+ it "returns response_body from options" do
36
+ expect(response.response_body).to eq("body")
37
+ end
38
+ end
39
+
40
+ context "when body" do
41
+ let(:options) { { :body => "body" } }
42
+
43
+ it "returns body from options" do
44
+ expect(response.body).to eq("body")
45
+ end
46
+ end
47
+ end
48
+
49
+ describe "#response_headers" do
50
+ let(:options) { { :response_headers => "headers" } }
51
+
52
+ it "returns response_headers from options" do
53
+ expect(response.response_headers).to eq("headers")
54
+ end
55
+ end
56
+
57
+ describe "#response_code" do
58
+ context "when response_code" do
59
+ let(:options) { { :response_code => "200" } }
60
+
61
+ it "returns response_code from options" do
62
+ expect(response.response_code).to eq(200)
63
+ end
64
+ end
65
+
66
+ context "when code" do
67
+ let(:options) { { :code => "200" } }
68
+
69
+ it "returns code from options" do
70
+ expect(response.code).to eq(200)
71
+ end
72
+ end
73
+ end
74
+
75
+ describe "#httpauth_avail" do
76
+ let(:options) { { :httpauth_avail => "code" } }
77
+
78
+ it "returns httpauth_avail from options" do
79
+ expect(response.httpauth_avail).to eq("code")
80
+ end
81
+ end
82
+
83
+ describe "#total_time" do
84
+ let(:options) { { :total_time => 1 } }
85
+
86
+ it "returns total_time from options" do
87
+ expect(response.total_time).to eq(1)
88
+ end
89
+ end
90
+
91
+ describe "#starttransfer_time" do
92
+ let(:options) { { :starttransfer_time => 1 } }
93
+
94
+ it "returns starttransfer_time from options" do
95
+ expect(response.starttransfer_time).to eq(1)
96
+ end
97
+ end
98
+
99
+ describe "#appconnect_time" do
100
+ let(:options) { { :appconnect_time => 1 } }
101
+
102
+ it "returns appconnect_time from options" do
103
+ expect(response.appconnect_time).to eq(1)
104
+ end
105
+ end
106
+
107
+ describe "#pretransfer_time" do
108
+ let(:options) { { :pretransfer_time => 1 } }
109
+
110
+ it "returns pretransfer_time from options" do
111
+ expect(response.pretransfer_time).to eq(1)
112
+ end
113
+ end
114
+
115
+ describe "#connect_time" do
116
+ let(:options) { { :connect_time => 1 } }
117
+
118
+ it "returns connect_time from options" do
119
+ expect(response.connect_time).to eq(1)
120
+ end
121
+ end
122
+
123
+ describe "#namelookup_time" do
124
+ let(:options) { { :namelookup_time => 1 } }
125
+
126
+ it "returns namelookup_time from options" do
127
+ expect(response.namelookup_time).to eq(1)
128
+ end
129
+ end
130
+
131
+ describe "#effective_url" do
132
+ let(:options) { { :effective_url => "http://www.example.com" } }
133
+
134
+ it "returns effective_url from options" do
135
+ expect(response.effective_url).to eq("http://www.example.com")
136
+ end
137
+ end
138
+
139
+ describe "#primary_ip" do
140
+ let(:options) { { :primary_ip => "127.0.0.1" } }
141
+
142
+ it "returns primary_ip from options" do
143
+ expect(response.primary_ip).to eq("127.0.0.1")
144
+ end
145
+ end
146
+
147
+ describe "#redirect_count" do
148
+ let(:options) { { :redirect_count => 2 } }
149
+
150
+ it "returns redirect_count from options" do
151
+ expect(response.redirect_count).to eq(2)
152
+ end
153
+ end
154
+
155
+ describe "#headers" do
156
+ context "when no headers" do
157
+ it "returns nil" do
158
+ expect(response.headers).to be_nil
159
+ end
160
+ end
161
+
162
+ context "when headers" do
163
+ let(:options) { {:response_headers => "Expire: -1\nServer: gws"} }
164
+
165
+ it "returns nonempty headers" do
166
+ expect(response.headers).to_not be_empty
167
+ end
168
+
169
+ it "has Expire" do
170
+ expect(response.headers['expire']).to eq('-1')
171
+ end
172
+
173
+ it "has Server" do
174
+ expect(response.headers['server']).to eq('gws')
175
+ end
176
+ end
177
+
178
+ context "when multiple headers" do
179
+ let(:options) { {:response_headers => "Server: A\r\n\r\nServer: B"} }
180
+
181
+ it "returns the last" do
182
+ expect(response.headers['server']).to eq("B")
183
+ end
184
+ end
185
+
186
+ context "when requesting" do
187
+ let(:response) { Typhoeus.get("localhost:3001") }
188
+
189
+ it "returns headers" do
190
+ expect(response.headers).to_not be_empty
191
+ end
192
+ end
193
+ end
194
+
195
+ describe "#redirections" do
196
+ context "when no response_headers" do
197
+ it "returns empty array" do
198
+ expect(response.redirections).to be_empty
199
+ end
200
+ end
201
+
202
+ context "when headers" do
203
+ let(:options) { {:response_headers => "Expire: -1\nServer: gws"} }
204
+
205
+ it "returns empty array" do
206
+ expect(response.redirections).to be_empty
207
+ end
208
+ end
209
+
210
+ context "when multiple headers" do
211
+ let(:options) { {:response_headers => "Server: A\r\n\r\nServer: B"} }
212
+
213
+ it "returns response from all but last headers" do
214
+ expect(response.redirections).to have(1).item
215
+ end
216
+ end
217
+ end
218
+ end