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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +43 -1
- data/lib/typhoeus/expectation.rb +4 -2
- data/lib/typhoeus/request/responseable.rb +1 -1
- data/lib/typhoeus/version.rb +1 -1
- data/typhoeus.gemspec +14 -4
- metadata +18 -97
- data/.github/workflows/ci.yml +0 -30
- data/.github/workflows/experimental.yml +0 -33
- data/.gitignore +0 -8
- data/.rspec +0 -4
- data/Gemfile +0 -36
- data/Guardfile +0 -9
- data/Rakefile +0 -38
- data/perf/profile.rb +0 -14
- data/perf/vs_nethttp.rb +0 -64
- data/spec/rack/typhoeus/middleware/params_decoder/helper_spec.rb +0 -156
- data/spec/rack/typhoeus/middleware/params_decoder_spec.rb +0 -31
- data/spec/spec_helper.rb +0 -29
- data/spec/support/localhost_server.rb +0 -94
- data/spec/support/memory_cache.rb +0 -15
- data/spec/support/server.rb +0 -116
- data/spec/typhoeus/adapters/faraday_spec.rb +0 -339
- data/spec/typhoeus/cache/dalli_spec.rb +0 -41
- data/spec/typhoeus/cache/redis_spec.rb +0 -41
- data/spec/typhoeus/config_spec.rb +0 -15
- data/spec/typhoeus/easy_factory_spec.rb +0 -143
- data/spec/typhoeus/errors/no_stub_spec.rb +0 -13
- data/spec/typhoeus/expectation_spec.rb +0 -280
- data/spec/typhoeus/hydra/addable_spec.rb +0 -22
- data/spec/typhoeus/hydra/before_spec.rb +0 -98
- data/spec/typhoeus/hydra/block_connection_spec.rb +0 -18
- data/spec/typhoeus/hydra/cacheable_spec.rb +0 -88
- data/spec/typhoeus/hydra/memoizable_spec.rb +0 -53
- data/spec/typhoeus/hydra/queueable_spec.rb +0 -98
- data/spec/typhoeus/hydra/runnable_spec.rb +0 -137
- data/spec/typhoeus/hydra/stubbable_spec.rb +0 -48
- data/spec/typhoeus/hydra_spec.rb +0 -22
- data/spec/typhoeus/pool_spec.rb +0 -137
- data/spec/typhoeus/request/actions_spec.rb +0 -19
- data/spec/typhoeus/request/before_spec.rb +0 -93
- data/spec/typhoeus/request/block_connection_spec.rb +0 -75
- data/spec/typhoeus/request/cacheable_spec.rb +0 -94
- data/spec/typhoeus/request/callbacks_spec.rb +0 -91
- data/spec/typhoeus/request/marshal_spec.rb +0 -60
- data/spec/typhoeus/request/memoizable_spec.rb +0 -34
- data/spec/typhoeus/request/operations_spec.rb +0 -101
- data/spec/typhoeus/request/responseable_spec.rb +0 -13
- data/spec/typhoeus/request/stubbable_spec.rb +0 -45
- data/spec/typhoeus/request_spec.rb +0 -256
- data/spec/typhoeus/response/header_spec.rb +0 -147
- data/spec/typhoeus/response/informations_spec.rb +0 -323
- data/spec/typhoeus/response/status_spec.rb +0 -256
- data/spec/typhoeus/response_spec.rb +0 -100
- data/spec/typhoeus_spec.rb +0 -105
@@ -1,147 +0,0 @@
|
|
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'.gsub(/^\s{8}/, '')
|
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'].size).to eq(3)
|
67
|
-
end
|
68
|
-
|
69
|
-
it "provides case insensitive access" do
|
70
|
-
expect(header['Set-CooKie'].size).to eq(3)
|
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
|
-
|
96
|
-
context 'includes a multi-line header' do
|
97
|
-
let(:raw) do
|
98
|
-
'HTTP/1.1 200 OK
|
99
|
-
Date: Fri, 29 Jun 2012 10:09:23 GMT
|
100
|
-
Content-Security-Policy: default-src "self";
|
101
|
-
img-src * data: "self";
|
102
|
-
upgrade-insecure-requests;'.gsub(/^\s{10}/, '')
|
103
|
-
end
|
104
|
-
|
105
|
-
it "joins header parts" do
|
106
|
-
expect(header).to eq({
|
107
|
-
'Date' => 'Fri, 29 Jun 2012 10:09:23 GMT',
|
108
|
-
'Content-Security-Policy' => 'default-src "self"; img-src * data: "self"; upgrade-insecure-requests;'
|
109
|
-
})
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
context 'includes line with only whitespace' do
|
114
|
-
let(:raw) do
|
115
|
-
'HTTP/1.1 200 OK
|
116
|
-
Date: Fri, 29 Jun 2012 10:09:23 GMT
|
117
|
-
|
118
|
-
'.gsub(/^\s{10}/, '')
|
119
|
-
end
|
120
|
-
|
121
|
-
it 'ignores it' do
|
122
|
-
expect(header).to eq({ 'Date' => 'Fri, 29 Jun 2012 10:09:23 GMT' })
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
|
-
context 'with broken headers' do
|
127
|
-
let(:raw) do
|
128
|
-
'HTTP/1.1 200 OK
|
129
|
-
Date:
|
130
|
-
Content-Type
|
131
|
-
'.gsub(/^\s{10}/, '')
|
132
|
-
end
|
133
|
-
|
134
|
-
it 'returns empty string for invalid headers' do
|
135
|
-
expect(header.to_hash).to include({ 'Date' => '', 'Content-Type' => '' })
|
136
|
-
end
|
137
|
-
end
|
138
|
-
end
|
139
|
-
end
|
140
|
-
|
141
|
-
it "can be Marshal'd" do
|
142
|
-
header = Typhoeus::Response::Header.new("Foo: Bar")
|
143
|
-
expect {
|
144
|
-
Marshal.dump(header)
|
145
|
-
}.not_to raise_error
|
146
|
-
end
|
147
|
-
end
|
@@ -1,323 +0,0 @@
|
|
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
|
-
|
30
|
-
describe "with nil return_code" do
|
31
|
-
let(:options) { { :return_code => nil } }
|
32
|
-
|
33
|
-
it "returns nil" do
|
34
|
-
expect(response.return_message).to be_nil
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
describe "#response_body" do
|
40
|
-
context "when response_body" do
|
41
|
-
let(:options) { { :response_body => "body" } }
|
42
|
-
|
43
|
-
it "returns response_body from options" do
|
44
|
-
expect(response.response_body).to eq("body")
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
context "when body" do
|
49
|
-
let(:options) { { :body => "body" } }
|
50
|
-
|
51
|
-
it "returns body from options" do
|
52
|
-
expect(response.body).to eq("body")
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
describe "#response_headers" do
|
58
|
-
let(:options) { { :response_headers => "Length: 1" } }
|
59
|
-
|
60
|
-
context "when no mock" do
|
61
|
-
it "returns response_headers from options" do
|
62
|
-
expect(response.response_headers).to eq("Length: 1")
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
context "when mock" do
|
67
|
-
context "when no response_headers" do
|
68
|
-
context "when headers" do
|
69
|
-
let(:options) { { :mock => true, :headers => {"Length" => 1, "Content-Type" => "text/plain" } } }
|
70
|
-
|
71
|
-
it "constructs response_headers" do
|
72
|
-
expect(response.response_headers).to include("Length: 1")
|
73
|
-
expect(response.response_headers).to include("Content-Type: text/plain")
|
74
|
-
expect(response.response_headers).to include("\r\n")
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
context "when multiple values for a header" do
|
79
|
-
let(:options) { { :mock => true, :headers => {"Length" => 1, "Content-Type" => "text/plain", "set-cookie" => ["cookieone=one","cookietwo=two"] } } }
|
80
|
-
|
81
|
-
it "constructs response_headers" do
|
82
|
-
expect(response.response_headers).to include("Length: 1")
|
83
|
-
expect(response.response_headers).to include("Content-Type: text/plain")
|
84
|
-
expect(response.response_headers).to include("set-cookie: cookieone=one,cookietwo=two")
|
85
|
-
expect(response.response_headers).to include("\r\n")
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
describe "#response_code" do
|
93
|
-
context "when response_code" do
|
94
|
-
let(:options) { { :response_code => "200" } }
|
95
|
-
|
96
|
-
it "returns response_code from options" do
|
97
|
-
expect(response.response_code).to eq(200)
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
context "when code" do
|
102
|
-
let(:options) { { :code => "200" } }
|
103
|
-
|
104
|
-
it "returns code from options" do
|
105
|
-
expect(response.code).to eq(200)
|
106
|
-
end
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
describe "#httpauth_avail" do
|
111
|
-
let(:options) { { :httpauth_avail => "code" } }
|
112
|
-
|
113
|
-
it "returns httpauth_avail from options" do
|
114
|
-
expect(response.httpauth_avail).to eq("code")
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
describe "#total_time" do
|
119
|
-
let(:options) { { :total_time => 1 } }
|
120
|
-
|
121
|
-
it "returns total_time from options" do
|
122
|
-
expect(response.total_time).to eq(1)
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
|
-
describe "#starttransfer_time" do
|
127
|
-
let(:options) { { :starttransfer_time => 1 } }
|
128
|
-
|
129
|
-
it "returns starttransfer_time from options" do
|
130
|
-
expect(response.starttransfer_time).to eq(1)
|
131
|
-
end
|
132
|
-
end
|
133
|
-
|
134
|
-
describe "#appconnect_time" do
|
135
|
-
let(:options) { { :appconnect_time => 1 } }
|
136
|
-
|
137
|
-
it "returns appconnect_time from options" do
|
138
|
-
expect(response.appconnect_time).to eq(1)
|
139
|
-
end
|
140
|
-
end
|
141
|
-
|
142
|
-
describe "#pretransfer_time" do
|
143
|
-
let(:options) { { :pretransfer_time => 1 } }
|
144
|
-
|
145
|
-
it "returns pretransfer_time from options" do
|
146
|
-
expect(response.pretransfer_time).to eq(1)
|
147
|
-
end
|
148
|
-
end
|
149
|
-
|
150
|
-
describe "#connect_time" do
|
151
|
-
let(:options) { { :connect_time => 1 } }
|
152
|
-
|
153
|
-
it "returns connect_time from options" do
|
154
|
-
expect(response.connect_time).to eq(1)
|
155
|
-
end
|
156
|
-
end
|
157
|
-
|
158
|
-
describe "#namelookup_time" do
|
159
|
-
let(:options) { { :namelookup_time => 1 } }
|
160
|
-
|
161
|
-
it "returns namelookup_time from options" do
|
162
|
-
expect(response.namelookup_time).to eq(1)
|
163
|
-
end
|
164
|
-
end
|
165
|
-
|
166
|
-
describe "#redirect_time" do
|
167
|
-
let(:options) { { :redirect_time => 1 } }
|
168
|
-
|
169
|
-
it "returns redirect_time from options" do
|
170
|
-
expect(response.redirect_time).to eq(1)
|
171
|
-
end
|
172
|
-
end
|
173
|
-
|
174
|
-
describe "#effective_url" do
|
175
|
-
let(:options) { { :effective_url => "http://www.example.com" } }
|
176
|
-
|
177
|
-
it "returns effective_url from options" do
|
178
|
-
expect(response.effective_url).to eq("http://www.example.com")
|
179
|
-
end
|
180
|
-
end
|
181
|
-
|
182
|
-
describe "#primary_ip" do
|
183
|
-
let(:options) { { :primary_ip => "127.0.0.1" } }
|
184
|
-
|
185
|
-
it "returns primary_ip from options" do
|
186
|
-
expect(response.primary_ip).to eq("127.0.0.1")
|
187
|
-
end
|
188
|
-
end
|
189
|
-
|
190
|
-
describe "#redirect_count" do
|
191
|
-
let(:options) { { :redirect_count => 2 } }
|
192
|
-
|
193
|
-
it "returns redirect_count from options" do
|
194
|
-
expect(response.redirect_count).to eq(2)
|
195
|
-
end
|
196
|
-
end
|
197
|
-
|
198
|
-
describe "#redirect_url" do
|
199
|
-
let(:options) { { :redirect_url => "http://www.example.com" } }
|
200
|
-
|
201
|
-
it "returns redirect_url from options" do
|
202
|
-
expect(response.redirect_url).to eq("http://www.example.com")
|
203
|
-
end
|
204
|
-
end
|
205
|
-
|
206
|
-
describe "#request_size" do
|
207
|
-
let(:options) { { :request_size => 2 } }
|
208
|
-
|
209
|
-
it "returns request_size from options" do
|
210
|
-
expect(response.request_size).to eq(2)
|
211
|
-
end
|
212
|
-
end
|
213
|
-
|
214
|
-
describe "#size_upload" do
|
215
|
-
let(:options) { { :size_upload => 2.0 } }
|
216
|
-
|
217
|
-
it "returns size_upload from options" do
|
218
|
-
expect(response.size_upload).to eq(2.0)
|
219
|
-
end
|
220
|
-
end
|
221
|
-
|
222
|
-
describe "#size_download" do
|
223
|
-
let(:options) { { :size_download => 2.0 } }
|
224
|
-
|
225
|
-
it "returns size_download from options" do
|
226
|
-
expect(response.size_download).to eq(2.0)
|
227
|
-
end
|
228
|
-
end
|
229
|
-
|
230
|
-
describe "#speed_upload" do
|
231
|
-
let(:options) { { :speed_upload => 2.0 } }
|
232
|
-
|
233
|
-
it "returns speed_upload from options" do
|
234
|
-
expect(response.speed_upload).to eq(2.0)
|
235
|
-
end
|
236
|
-
end
|
237
|
-
|
238
|
-
describe "#speed_download" do
|
239
|
-
let(:options) { { :speed_download => 2.0 } }
|
240
|
-
|
241
|
-
it "returns speed_download from options" do
|
242
|
-
expect(response.speed_download).to eq(2.0)
|
243
|
-
end
|
244
|
-
end
|
245
|
-
|
246
|
-
describe "#headers" do
|
247
|
-
context "when no response_headers" do
|
248
|
-
it "returns nil" do
|
249
|
-
expect(response.headers).to be_nil
|
250
|
-
end
|
251
|
-
end
|
252
|
-
|
253
|
-
context "when response_headers" do
|
254
|
-
let(:options) { {:response_headers => "Expire: -1\nServer: gws"} }
|
255
|
-
|
256
|
-
it "returns nonempty headers" do
|
257
|
-
expect(response.headers).to_not be_empty
|
258
|
-
end
|
259
|
-
|
260
|
-
it "has Expire" do
|
261
|
-
expect(response.headers['expire']).to eq('-1')
|
262
|
-
end
|
263
|
-
|
264
|
-
it "has Server" do
|
265
|
-
expect(response.headers['server']).to eq('gws')
|
266
|
-
end
|
267
|
-
end
|
268
|
-
|
269
|
-
context "when multiple headers" do
|
270
|
-
let(:options) { {:response_headers => "Server: A\r\n\r\nServer: B"} }
|
271
|
-
|
272
|
-
it "returns the last" do
|
273
|
-
expect(response.headers['server']).to eq("B")
|
274
|
-
end
|
275
|
-
end
|
276
|
-
|
277
|
-
context "when mock" do
|
278
|
-
context "when headers" do
|
279
|
-
let(:options) { {:mock => true, :headers => {"Length" => "1"}} }
|
280
|
-
|
281
|
-
it "returns Typhoeus::Response::Header" do
|
282
|
-
expect(response.headers).to be_a(Typhoeus::Response::Header)
|
283
|
-
end
|
284
|
-
|
285
|
-
it "returns headers" do
|
286
|
-
expect(response.headers.to_hash).to include("Length" => "1")
|
287
|
-
end
|
288
|
-
end
|
289
|
-
end
|
290
|
-
|
291
|
-
context "when requesting" do
|
292
|
-
let(:response) { Typhoeus.get("localhost:3001") }
|
293
|
-
|
294
|
-
it "returns headers" do
|
295
|
-
expect(response.headers).to_not be_empty
|
296
|
-
end
|
297
|
-
end
|
298
|
-
end
|
299
|
-
|
300
|
-
describe "#redirections" do
|
301
|
-
context "when no response_headers" do
|
302
|
-
it "returns empty array" do
|
303
|
-
expect(response.redirections).to be_empty
|
304
|
-
end
|
305
|
-
end
|
306
|
-
|
307
|
-
context "when headers" do
|
308
|
-
let(:options) { {:response_headers => "Expire: -1\nServer: gws"} }
|
309
|
-
|
310
|
-
it "returns empty array" do
|
311
|
-
expect(response.redirections).to be_empty
|
312
|
-
end
|
313
|
-
end
|
314
|
-
|
315
|
-
context "when multiple headers" do
|
316
|
-
let(:options) { {:response_headers => "Server: A\r\n\r\nServer: B"} }
|
317
|
-
|
318
|
-
it "returns response from all but last headers" do
|
319
|
-
expect(response.redirections.size).to eq(1)
|
320
|
-
end
|
321
|
-
end
|
322
|
-
end
|
323
|
-
end
|