typhoeus 1.4.1 → 1.5.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.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +43 -1
  3. data/lib/typhoeus/expectation.rb +4 -2
  4. data/lib/typhoeus/request/responseable.rb +1 -1
  5. data/lib/typhoeus/version.rb +1 -1
  6. data/typhoeus.gemspec +14 -4
  7. metadata +18 -97
  8. data/.github/workflows/ci.yml +0 -30
  9. data/.github/workflows/experimental.yml +0 -33
  10. data/.gitignore +0 -8
  11. data/.rspec +0 -4
  12. data/Gemfile +0 -36
  13. data/Guardfile +0 -9
  14. data/Rakefile +0 -38
  15. data/perf/profile.rb +0 -14
  16. data/perf/vs_nethttp.rb +0 -64
  17. data/spec/rack/typhoeus/middleware/params_decoder/helper_spec.rb +0 -156
  18. data/spec/rack/typhoeus/middleware/params_decoder_spec.rb +0 -31
  19. data/spec/spec_helper.rb +0 -29
  20. data/spec/support/localhost_server.rb +0 -94
  21. data/spec/support/memory_cache.rb +0 -15
  22. data/spec/support/server.rb +0 -116
  23. data/spec/typhoeus/adapters/faraday_spec.rb +0 -339
  24. data/spec/typhoeus/cache/dalli_spec.rb +0 -41
  25. data/spec/typhoeus/cache/redis_spec.rb +0 -41
  26. data/spec/typhoeus/config_spec.rb +0 -15
  27. data/spec/typhoeus/easy_factory_spec.rb +0 -143
  28. data/spec/typhoeus/errors/no_stub_spec.rb +0 -13
  29. data/spec/typhoeus/expectation_spec.rb +0 -280
  30. data/spec/typhoeus/hydra/addable_spec.rb +0 -22
  31. data/spec/typhoeus/hydra/before_spec.rb +0 -98
  32. data/spec/typhoeus/hydra/block_connection_spec.rb +0 -18
  33. data/spec/typhoeus/hydra/cacheable_spec.rb +0 -88
  34. data/spec/typhoeus/hydra/memoizable_spec.rb +0 -53
  35. data/spec/typhoeus/hydra/queueable_spec.rb +0 -98
  36. data/spec/typhoeus/hydra/runnable_spec.rb +0 -137
  37. data/spec/typhoeus/hydra/stubbable_spec.rb +0 -48
  38. data/spec/typhoeus/hydra_spec.rb +0 -22
  39. data/spec/typhoeus/pool_spec.rb +0 -137
  40. data/spec/typhoeus/request/actions_spec.rb +0 -19
  41. data/spec/typhoeus/request/before_spec.rb +0 -93
  42. data/spec/typhoeus/request/block_connection_spec.rb +0 -75
  43. data/spec/typhoeus/request/cacheable_spec.rb +0 -94
  44. data/spec/typhoeus/request/callbacks_spec.rb +0 -91
  45. data/spec/typhoeus/request/marshal_spec.rb +0 -60
  46. data/spec/typhoeus/request/memoizable_spec.rb +0 -34
  47. data/spec/typhoeus/request/operations_spec.rb +0 -101
  48. data/spec/typhoeus/request/responseable_spec.rb +0 -13
  49. data/spec/typhoeus/request/stubbable_spec.rb +0 -45
  50. data/spec/typhoeus/request_spec.rb +0 -256
  51. data/spec/typhoeus/response/header_spec.rb +0 -147
  52. data/spec/typhoeus/response/informations_spec.rb +0 -323
  53. data/spec/typhoeus/response/status_spec.rb +0 -256
  54. data/spec/typhoeus/response_spec.rb +0 -100
  55. data/spec/typhoeus_spec.rb +0 -105
@@ -1,339 +0,0 @@
1
- if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("1.9.0")
2
- require 'spec_helper'
3
- require 'typhoeus/adapters/faraday'
4
-
5
- describe Faraday::Adapter::Typhoeus do
6
- let(:base_url) { "http://localhost:3001" }
7
- let(:adapter) { described_class.new(nil) }
8
- let(:request) { Typhoeus::Request.new(base_url) }
9
- let(:conn) do
10
- Faraday.new(:url => base_url) do |faraday|
11
- faraday.adapter :typhoeus
12
- end
13
- end
14
- let(:response) { conn.get("/") }
15
-
16
- context "when parallel" do
17
- it "returns a faraday response" do
18
- response = nil
19
- conn.in_parallel { response = conn.get("/") }
20
- expect(response).to be_a(Faraday::Response)
21
- end
22
-
23
- it "succeeds" do
24
- response = nil
25
- conn.in_parallel { response = conn.get("/") }
26
- expect(response.status).to be(200)
27
- end
28
- end
29
-
30
- context "when not parallel" do
31
- it "returns a faraday response" do
32
- expect(response).to be_a(Faraday::Response)
33
- end
34
-
35
- it "succeeds" do
36
- expect(response.status).to be(200)
37
- end
38
- end
39
-
40
- context "when a response is stubbed" do
41
- before do
42
- stub = Typhoeus::Response.new \
43
- :code => 200,
44
- :headers => { "Foo" => "2", "Bar" => "3" },
45
- :body => "Hello",
46
- :mock => true
47
-
48
- Typhoeus.stub(base_url + '/').and_return(stub)
49
- end
50
-
51
- it 'stubs the status code' do
52
- expect(response.status).to eq(200)
53
- end
54
-
55
- it 'stubs the response body' do
56
- expect(response.body).to eq("Hello")
57
- end
58
-
59
- it 'stubs the headers' do
60
- expect(response.headers).to eq("Foo" => "2", "Bar" => "3")
61
- end
62
- end
63
-
64
- describe "#initialize" do
65
- let(:request) { adapter.method(:typhoeus_request).call({}) }
66
-
67
- context "when typhoeus request options specified" do
68
- let(:adapter) { described_class.new(nil, { :forbid_reuse => true, :maxredirs => 1 }) }
69
-
70
- it "should set option for request" do
71
- expect(request.options[:forbid_reuse]).to be_truthy
72
- expect(request.options[:maxredirs]).to eq(1)
73
- end
74
- end
75
- end
76
-
77
- describe "#perform_request" do
78
- let(:env) { {} }
79
-
80
- context "when body" do
81
- let(:env) { { :body => double(:read => "body") } }
82
-
83
- it "reads body" do
84
- expect(adapter.method(:read_body).call(env)).to eq("body")
85
- end
86
- end
87
-
88
- context "parallel_manager" do
89
- context "when given" do
90
- let(:env) { { :parallel_manager => double(:queue => true), :ssl => {}, :request => {} } }
91
-
92
- it "uses" do
93
- adapter.method(:perform_request).call(env)
94
- end
95
- end
96
-
97
- context "when not given" do
98
- let(:env) { { :method => :get, :ssl => {}, :request => {} } }
99
-
100
- it "falls back to single" do
101
- expect(Typhoeus::Request).to receive(:new).and_return(double(:options => {}, :on_complete => [], :run => true))
102
- adapter.method(:perform_request).call(env)
103
- end
104
- end
105
- end
106
- end
107
-
108
- describe "#request" do
109
- let(:env) do
110
- { :url => "url", :method => :get, :body => "body", :request_headers => {}, :ssl => {}, :request => {} }
111
- end
112
-
113
- let(:request) { adapter.method(:request).call(env) }
114
-
115
- it "returns request" do
116
- expect(request).to be_a(Typhoeus::Request)
117
- end
118
-
119
- it "sets url" do
120
- expect(request.base_url).to eq("url")
121
- end
122
-
123
- it "sets http method" do
124
- expect(request.original_options[:method]).to eq(:get)
125
- end
126
-
127
- it "sets body" do
128
- expect(request.original_options[:body]).to eq("body")
129
- end
130
-
131
- it "sets headers" do
132
- expect(request.original_options[:headers]).to eq({})
133
- end
134
-
135
- it "sets on_complete callback" do
136
- expect(request.on_complete.size).to eq(1)
137
- end
138
- end
139
-
140
- context "when the connection failed" do
141
- before do
142
- stub = Typhoeus::Response.new \
143
- :response_code => 0,
144
- :return_code => 0,
145
- :mock => true
146
-
147
- Typhoeus.stub(base_url + '/').and_return(stub)
148
- end
149
-
150
- context "when parallel" do
151
- it "isn't successful" do
152
- response = nil
153
- conn.in_parallel { response = conn.get("/") }
154
- expect(response.success?).to be_falsey
155
- end
156
-
157
- it "translates the response code into an error message" do
158
- response = nil
159
- conn.in_parallel { response = conn.get("/") }
160
- expect(response.env[:typhoeus_return_message]).to eq("No error")
161
- end
162
- end
163
-
164
- context "when not parallel" do
165
- it "raises an error" do
166
- expect { conn.get("/") }.to raise_error(Faraday::ConnectionFailed, "No error")
167
- end
168
- end
169
- end
170
-
171
- describe "#configure_socket" do
172
- let(:env) { { :request => { :bind => { :host => "interface" } } } }
173
-
174
- before { adapter.method(:configure_socket).call(request, env) }
175
-
176
- context "when host" do
177
- it "sets interface" do
178
- expect(request.options[:interface]).to eq("interface")
179
- end
180
- end
181
- end
182
-
183
- describe "#configure_timeout" do
184
- before { adapter.method(:configure_timeout).call(request, env) }
185
-
186
- context "when timeout" do
187
- let(:env) { { :request => { :timeout => 1 } } }
188
-
189
- it "sets timeout_ms" do
190
- expect(request.options[:timeout_ms]).to eq(1000)
191
- end
192
- end
193
-
194
- context "when open_timeout" do
195
- let(:env) { { :request => { :open_timeout => 1 } } }
196
-
197
- it "sets connecttimeout_ms" do
198
- expect(request.options[:connecttimeout_ms]).to eq(1000)
199
- end
200
- end
201
- end
202
-
203
- describe "#configure_proxy" do
204
- before { adapter.method(:configure_proxy).call(request, env) }
205
-
206
- context "when proxy" do
207
- let(:env) { { :request => { :proxy => { :uri => double(:scheme => 'http', :host => "localhost", :port => "3001") } } } }
208
-
209
- it "sets proxy" do
210
- expect(request.options[:proxy]).to eq("http://localhost:3001")
211
- end
212
-
213
- context "when username and password" do
214
- let(:env) do
215
- { :request => { :proxy => {
216
- :uri => double(:scheme => 'http', :host => :a, :port => :b),
217
- :user => "a",
218
- :password => "b"
219
- } } }
220
- end
221
-
222
- it "sets proxyuserpwd" do
223
- expect(request.options[:proxyuserpwd]).to eq("a:b")
224
- end
225
- end
226
- end
227
- end
228
-
229
- describe "#configure_ssl" do
230
- before { adapter.method(:configure_ssl).call(request, env) }
231
-
232
- context "when version" do
233
- let(:env) { { :ssl => { :version => "a" } } }
234
-
235
- it "sets sslversion" do
236
- expect(request.options[:sslversion]).to eq("a")
237
- end
238
- end
239
-
240
- context "when client_cert" do
241
- let(:env) { { :ssl => { :client_cert => "a" } } }
242
-
243
- it "sets sslcert" do
244
- expect(request.options[:sslcert]).to eq("a")
245
- end
246
- end
247
-
248
- context "when client_key" do
249
- let(:env) { { :ssl => { :client_key => "a" } } }
250
-
251
- it "sets sslkey" do
252
- expect(request.options[:sslkey]).to eq("a")
253
- end
254
- end
255
-
256
- context "when ca_file" do
257
- let(:env) { { :ssl => { :ca_file => "a" } } }
258
-
259
- it "sets cainfo" do
260
- expect(request.options[:cainfo]).to eq("a")
261
- end
262
- end
263
-
264
- context "when ca_path" do
265
- let(:env) { { :ssl => { :ca_path => "a" } } }
266
-
267
- it "sets capath" do
268
- expect(request.options[:capath]).to eq("a")
269
- end
270
- end
271
-
272
- context "when client_cert_passwd" do
273
- let(:env) { { :ssl => { :client_cert_passwd => "a" } } }
274
-
275
- it "sets keypasswd to the value of client_cert_passwd" do
276
- expect(request.options[:keypasswd]).to eq("a")
277
- end
278
- end
279
-
280
- context "when client_certificate_password" do
281
- let(:env) { { :ssl => { :client_certificate_password => "a" } } }
282
-
283
- it "sets keypasswd to the value of client_cert_passwd" do
284
- expect(request.options[:keypasswd]).to eq("a")
285
- end
286
- end
287
-
288
- context "when no client_cert_passwd" do
289
- let(:env) { { :ssl => { } } }
290
-
291
- it "does not set keypasswd on options" do
292
- expect(request.options).not_to have_key :keypasswd
293
- end
294
- end
295
-
296
- context "when verify is false" do
297
- let(:env) { { :ssl => { :verify => false } } }
298
-
299
- it "sets ssl_verifyhost to 0" do
300
- expect(request.options[:ssl_verifyhost]).to eq(0)
301
- end
302
-
303
- it "sets ssl_verifypeer to false" do
304
- expect(request.options[:ssl_verifypeer]).to be_falsey
305
- end
306
- end
307
-
308
- context "when verify is true" do
309
- let(:env) { { :ssl => { :verify => true } } }
310
-
311
- it "sets ssl_verifyhost to 2" do
312
- expect(request.options[:ssl_verifyhost]).to eq(2)
313
- end
314
-
315
- it "sets ssl_verifypeer to true" do
316
- expect(request.options[:ssl_verifypeer]).to be_truthy
317
- end
318
- end
319
- end
320
-
321
- describe "#parallel?" do
322
- context "when parallel_manager" do
323
- let(:env) { { :parallel_manager => true } }
324
-
325
- it "returns true" do
326
- expect(adapter.method(:parallel?).call(env)).to be_truthy
327
- end
328
- end
329
-
330
- context "when no parallel_manager" do
331
- let(:env) { { :parallel_manager => nil } }
332
-
333
- it "returns false" do
334
- expect(adapter.method(:parallel?).call(env)).to be_falsey
335
- end
336
- end
337
- end
338
- end
339
- end
@@ -1,41 +0,0 @@
1
- if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("1.9.0")
2
- require 'dalli'
3
- require 'typhoeus/cache/dalli'
4
- require 'spec_helper'
5
-
6
- describe Typhoeus::Cache::Dalli do
7
- let(:dalli) { instance_double(Dalli::Client) }
8
- let(:cache) { Typhoeus::Cache::Dalli.new(dalli) }
9
-
10
- let(:base_url) { "localhost:3001" }
11
- let(:request) { Typhoeus::Request.new(base_url, {:method => :get}) }
12
- let(:response) { Typhoeus::Response.new(:response_code => 0, :return_code => 0, :mock => true) }
13
-
14
- describe "#set" do
15
- it "sends the request to Dalli" do
16
- expect(dalli).to receive(:set).with(request.cache_key, response, nil)
17
-
18
- cache.set(request, response)
19
- end
20
- end
21
-
22
- describe "#get" do
23
- it "returns nil when the key is not in the cache" do
24
- expect(dalli).to receive(:get).with(request.cache_key).and_return(nil)
25
-
26
- expect(cache.get(request)).to be_nil
27
- end
28
-
29
- it "returns the cached response when the key is in cache" do
30
- expect(dalli).to receive(:get).with(request.cache_key).and_return(response)
31
-
32
- result = cache.get(request)
33
- expect(result).to_not be_nil
34
- expect(result.response_code).to eq(response.response_code)
35
- expect(result.return_code).to eq(response.return_code)
36
- expect(result.headers).to eq(response.headers)
37
- expect(result.body).to eq(response.body)
38
- end
39
- end
40
- end
41
- end
@@ -1,41 +0,0 @@
1
- require 'redis'
2
- require 'typhoeus/cache/redis'
3
- require 'spec_helper'
4
-
5
- describe Typhoeus::Cache::Redis do
6
- let(:redis) { instance_double(Redis) }
7
- let(:cache) { Typhoeus::Cache::Redis.new(redis) }
8
-
9
- let(:base_url) { "localhost:3001" }
10
- let(:request) { Typhoeus::Request.new(base_url, {:method => :get}) }
11
- let(:response) { Typhoeus::Response.new(:response_code => 0, :return_code => 0, :mock => true) }
12
- let(:serialized_response) { Marshal.dump(response) }
13
-
14
- describe "#set" do
15
- it "sends the serialized request to Redis" do
16
- expect(redis).to receive(:set).with(request.cache_key, serialized_response)
17
- expect(redis).to_not receive(:expire).with(request.cache_key, request.cache_ttl)
18
-
19
- cache.set(request, response)
20
- end
21
- end
22
-
23
- describe "#get" do
24
- it "returns nil when the key is not in Redis" do
25
- expect(redis).to receive(:get).with(request.cache_key).and_return(nil)
26
-
27
- expect(cache.get(request)).to be_nil
28
- end
29
-
30
- it "returns the cached response when the key is in Redis" do
31
- expect(redis).to receive(:get).with(request.cache_key).and_return(serialized_response)
32
-
33
- result = cache.get(request)
34
- expect(result).to_not be_nil
35
- expect(result.response_code).to eq(response.response_code)
36
- expect(result.return_code).to eq(response.return_code)
37
- expect(result.headers).to eq(response.headers)
38
- expect(result.body).to eq(response.body)
39
- end
40
- end
41
- end
@@ -1,15 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Typhoeus::Config do
4
- let(:config) { Typhoeus::Config }
5
-
6
- [:block_connection, :memoize, :verbose, :cache, :user_agent, :proxy].each do |name|
7
- it "responds to #{name}" do
8
- expect(config).to respond_to(name)
9
- end
10
-
11
- it "responds to #{name}=" do
12
- expect(config).to respond_to("#{name}=")
13
- end
14
- end
15
- end
@@ -1,143 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Typhoeus::EasyFactory do
4
- let(:base_url) { "http://localhost:3001" }
5
- let(:hydra) { Typhoeus::Hydra.new(:max_concurrency => 1) }
6
- let(:options) { {} }
7
- let(:request) { Typhoeus::Request.new(base_url, options) }
8
- let(:easy_factory) { described_class.new(request, hydra) }
9
-
10
- describe "#get" do
11
- context "when option[:cache_ttl]" do
12
- let(:options) { {:cache_ttl => 1} }
13
-
14
- it "creates Ethon::Easy" do
15
- expect(easy_factory.get).to be_a(Ethon::Easy)
16
- end
17
- end
18
-
19
- context "timeouts" do
20
- it "sets nosignal to true by default" do
21
- expect(easy_factory.easy).to receive(:http_request).with(anything(), anything(), hash_including(:nosignal => true))
22
- easy_factory.get
23
- end
24
-
25
- context "when timeout is not a whole number and timeout_ms is not set" do
26
- let(:options) { {:timeout => 0.1} }
27
- it "ceils timeout and sets timeout_ms" do
28
- expect(easy_factory.easy).to receive(:http_request).with(anything(), anything(), hash_including(:timeout_ms => 100, :timeout => 1))
29
- easy_factory.get
30
- end
31
- end
32
-
33
- context "when timeout is not a whole number and timeout_ms is set" do
34
- let(:options) { {:timeout => 0.1, :timeout_ms => 123} }
35
- it "ceils timeout and does not change timeout_ms" do
36
- expect(easy_factory.easy).to receive(:http_request).with(anything(), anything(), hash_including(:timeout_ms => 123, :timeout => 1))
37
- easy_factory.get
38
- end
39
- end
40
-
41
- context "when connecttimeout is not a whole number and connecttimeout_ms is not set" do
42
- let(:options) { {:connecttimeout => 0.1} }
43
- it "ceils connecttimeout and sets connecttimeout_ms" do
44
- expect(easy_factory.easy).to receive(:http_request).with(anything(), anything(), hash_including(:connecttimeout_ms => 100, :connecttimeout => 1))
45
- easy_factory.get
46
- end
47
- end
48
-
49
- context "when connecttimeout is not a whole number and connecttimeout_ms is set" do
50
- let(:options) { {:connecttimeout => 0.1, :connecttimeout_ms => 123} }
51
- it "ceils connecttimeout and does not change connecttimeout_ms" do
52
- expect(easy_factory.easy).to receive(:http_request).with(anything(), anything(), hash_including(:connecttimeout_ms => 123, :connecttimeout => 1))
53
- easy_factory.get
54
- end
55
- end
56
-
57
-
58
- end
59
-
60
- context "when invalid option" do
61
- let(:options) { {:invalid => 1} }
62
-
63
- it "reraises" do
64
- expect{ easy_factory.get }.to raise_error(Ethon::Errors::InvalidOption)
65
- end
66
- end
67
-
68
- context "when removed option" do
69
- let(:options) { {:cache_timeout => 1} }
70
-
71
- it "reraises with help" do
72
- expect{ easy_factory.get }.to raise_error(
73
- Ethon::Errors::InvalidOption, /The option cache_timeout was removed/
74
- )
75
- end
76
- end
77
-
78
- context "when changed option" do
79
- let(:options) { {:proxy_auth_method => 1} }
80
-
81
- it "reraises with help" do
82
- expect{ easy_factory.get }.to raise_error(
83
- Ethon::Errors::InvalidOption, /Please try proxyauth instead of proxy_auth_method/
84
- )
85
- end
86
- end
87
-
88
- context "when renamed option" do
89
- let(:options) { {:connect_timeout => 1} }
90
-
91
- it "warns" do
92
- expect(easy_factory).to receive(:warn).with(
93
- "Deprecated option connect_timeout. Please use connecttimeout instead."
94
- )
95
- easy_factory.get
96
- end
97
-
98
- it "passes correct option" do
99
- expect(easy_factory).to receive(:warn)
100
- expect(easy_factory.easy).to receive(:connecttimeout=).with(1)
101
- easy_factory.get
102
- end
103
- end
104
- end
105
-
106
- describe "#set_callback" do
107
- it "sets easy.on_progress callback when an on_progress callback is provided" do
108
- request.on_progress { 1 }
109
- expect(easy_factory.easy).to receive(:on_progress)
110
- easy_factory.send(:set_callback)
111
- end
112
-
113
- it "sets easy.on_complete callback" do
114
- expect(easy_factory.easy).to receive(:on_complete)
115
- easy_factory.send(:set_callback)
116
- end
117
-
118
- it "finishes request" do
119
- easy_factory.send(:set_callback)
120
- expect(request).to receive(:finish)
121
- easy_factory.easy.complete
122
- end
123
-
124
- it "resets easy" do
125
- easy_factory.send(:set_callback)
126
- expect(easy_factory.easy).to receive(:reset)
127
- easy_factory.easy.complete
128
- end
129
-
130
- it "pushes easy back into the pool" do
131
- easy_factory.send(:set_callback)
132
- easy_factory.easy.complete
133
- expect(Typhoeus::Pool.send(:easies)).to include(easy_factory.easy)
134
- end
135
-
136
- it "adds next request" do
137
- easy_factory.hydra.instance_variable_set(:@queued_requests, [request])
138
- expect(easy_factory.hydra).to receive(:add).with(request)
139
- easy_factory.send(:set_callback)
140
- easy_factory.easy.complete
141
- end
142
- end
143
- end
@@ -1,13 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Typhoeus::Errors::NoStub do
4
- let(:base_url) { "localhost:3001" }
5
- let(:request) { Typhoeus::Request.new(base_url) }
6
- let(:message) { "The connection is blocked and no stub defined: " }
7
-
8
- subject { Typhoeus::Errors::NoStub }
9
-
10
- it "displays the request url" do
11
- expect { raise subject.new(request) }.to raise_error(subject, message + base_url)
12
- end
13
- end