rest-client 2.0.2 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.gitignore +1 -0
- data/.mailmap +10 -0
- data/.rubocop +2 -0
- data/.rubocop-disables.yml +46 -44
- data/.rubocop.yml +5 -0
- data/.travis.yml +31 -17
- data/AUTHORS +8 -0
- data/README.md +126 -9
- data/Rakefile +12 -4
- data/history.md +53 -0
- data/lib/restclient.rb +0 -1
- data/lib/restclient/abstract_response.rb +28 -2
- data/lib/restclient/exceptions.rb +3 -3
- data/lib/restclient/payload.rb +29 -4
- data/lib/restclient/raw_response.rb +17 -6
- data/lib/restclient/request.rb +94 -67
- data/lib/restclient/resource.rb +16 -6
- data/lib/restclient/response.rb +14 -4
- data/lib/restclient/utils.rb +47 -8
- data/lib/restclient/version.rb +2 -2
- data/rest-client.gemspec +3 -2
- data/spec/ISS.jpg +0 -0
- data/spec/helpers.rb +37 -5
- data/spec/integration/capath_digicert/3513523f.0 +22 -0
- data/spec/integration/capath_digicert/399e7759.0 +22 -0
- data/spec/integration/capath_digicert/digicert.crt +20 -17
- data/spec/integration/certs/digicert.crt +20 -17
- data/spec/integration/httpbin_spec.rb +41 -0
- data/spec/integration/integration_spec.rb +0 -7
- data/spec/unit/abstract_response_spec.rb +7 -7
- data/spec/unit/payload_spec.rb +51 -19
- data/spec/unit/raw_response_spec.rb +6 -2
- data/spec/unit/request2_spec.rb +8 -8
- data/spec/unit/request_spec.rb +53 -65
- data/spec/unit/resource_spec.rb +7 -7
- data/spec/unit/response_spec.rb +33 -22
- data/spec/unit/restclient_spec.rb +3 -2
- data/spec/unit/utils_spec.rb +10 -10
- metadata +34 -13
- data/spec/integration/capath_digicert/244b5494.0 +0 -19
- data/spec/integration/capath_digicert/81b9768f.0 +0 -19
- data/spec/unit/master_shake.jpg +0 -0
@@ -12,13 +12,6 @@ describe RestClient do
|
|
12
12
|
expect(response.body).to eq body
|
13
13
|
end
|
14
14
|
|
15
|
-
it "a simple request with gzipped content" do
|
16
|
-
stub_request(:get, "www.example.com").with(:headers => { 'Accept-Encoding' => 'gzip, deflate' }).to_return(:body => "\037\213\b\b\006'\252H\000\003t\000\313T\317UH\257\312,HM\341\002\000G\242(\r\v\000\000\000", :status => 200, :headers => { 'Content-Encoding' => 'gzip' } )
|
17
|
-
response = RestClient.get "www.example.com"
|
18
|
-
expect(response.code).to eq 200
|
19
|
-
expect(response.body).to eq "i'm gziped\n"
|
20
|
-
end
|
21
|
-
|
22
15
|
it "a 404" do
|
23
16
|
body = "Ho hai ! I'm not here !"
|
24
17
|
stub_request(:get, "www.example.com").to_return(:body => body, :status => 404)
|
@@ -2,21 +2,21 @@ require_relative '_lib'
|
|
2
2
|
|
3
3
|
describe RestClient::AbstractResponse, :include_helpers do
|
4
4
|
|
5
|
+
# Sample class implementing AbstractResponse used for testing.
|
5
6
|
class MyAbstractResponse
|
6
7
|
|
7
8
|
include RestClient::AbstractResponse
|
8
9
|
|
9
10
|
attr_accessor :size
|
10
11
|
|
11
|
-
def initialize
|
12
|
-
|
13
|
-
@request = request
|
12
|
+
def initialize(net_http_res, request)
|
13
|
+
response_set_vars(net_http_res, request, Time.now - 1)
|
14
14
|
end
|
15
15
|
|
16
16
|
end
|
17
17
|
|
18
18
|
before do
|
19
|
-
@net_http_res =
|
19
|
+
@net_http_res = res_double()
|
20
20
|
@request = request_double(url: 'http://example.com', method: 'get')
|
21
21
|
@response = MyAbstractResponse.new(@net_http_res, @request)
|
22
22
|
end
|
@@ -92,8 +92,8 @@ describe RestClient::AbstractResponse, :include_helpers do
|
|
92
92
|
it 'handles cookies when URI scheme is implicit' do
|
93
93
|
net_http_res = double('net http response')
|
94
94
|
expect(net_http_res).to receive(:to_hash).and_return('set-cookie' => ['session_id=1; path=/'])
|
95
|
-
request = double(url: 'example.com', uri: URI.parse('http://example.com'),
|
96
|
-
method: 'get', cookie_jar: HTTP::CookieJar.new)
|
95
|
+
request = double('request', url: 'example.com', uri: URI.parse('http://example.com'),
|
96
|
+
method: 'get', cookie_jar: HTTP::CookieJar.new, redirection_history: nil)
|
97
97
|
response = MyAbstractResponse.new(net_http_res, request)
|
98
98
|
expect(response.cookie_jar).to be_a HTTP::CookieJar
|
99
99
|
|
@@ -135,7 +135,7 @@ describe RestClient::AbstractResponse, :include_helpers do
|
|
135
135
|
end
|
136
136
|
|
137
137
|
it "should gracefully handle 302 redirect with no location header" do
|
138
|
-
@net_http_res =
|
138
|
+
@net_http_res = res_double(code: 302)
|
139
139
|
@request = request_double()
|
140
140
|
@response = MyAbstractResponse.new(@net_http_res, @request)
|
141
141
|
expect(@response).to receive(:check_max_redirects).and_return('fake-check')
|
data/spec/unit/payload_spec.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
require_relative '_lib'
|
4
4
|
|
5
|
-
describe RestClient::Payload do
|
5
|
+
describe RestClient::Payload, :include_helpers do
|
6
6
|
context "Base Payload" do
|
7
7
|
it "should reset stream after to_s" do
|
8
8
|
payload = RestClient::Payload::Base.new('foobar')
|
@@ -80,7 +80,7 @@ describe RestClient::Payload do
|
|
80
80
|
end
|
81
81
|
|
82
82
|
it 'should not error on close if stream already closed' do
|
83
|
-
m = RestClient::Payload::Multipart.new(:file => File.new(
|
83
|
+
m = RestClient::Payload::Multipart.new(:file => File.new(test_image_path))
|
84
84
|
3.times {m.close}
|
85
85
|
end
|
86
86
|
|
@@ -111,11 +111,11 @@ baz\r
|
|
111
111
|
end
|
112
112
|
|
113
113
|
it "should form properly separated multipart data" do
|
114
|
-
f = File.new(
|
114
|
+
f = File.new(test_image_path)
|
115
115
|
m = RestClient::Payload::Multipart.new({:foo => f})
|
116
116
|
expect(m.to_s).to eq <<-EOS
|
117
117
|
--#{m.boundary}\r
|
118
|
-
Content-Disposition: form-data; name="foo"; filename="
|
118
|
+
Content-Disposition: form-data; name="foo"; filename="ISS.jpg"\r
|
119
119
|
Content-Type: image/jpeg\r
|
120
120
|
\r
|
121
121
|
#{File.open(f.path, 'rb'){|bin| bin.read}}\r
|
@@ -124,11 +124,11 @@ Content-Type: image/jpeg\r
|
|
124
124
|
end
|
125
125
|
|
126
126
|
it "should ignore the name attribute when it's not set" do
|
127
|
-
f = File.new(
|
127
|
+
f = File.new(test_image_path)
|
128
128
|
m = RestClient::Payload::Multipart.new({nil => f})
|
129
129
|
expect(m.to_s).to eq <<-EOS
|
130
130
|
--#{m.boundary}\r
|
131
|
-
Content-Disposition: form-data; filename="
|
131
|
+
Content-Disposition: form-data; filename="ISS.jpg"\r
|
132
132
|
Content-Type: image/jpeg\r
|
133
133
|
\r
|
134
134
|
#{File.open(f.path, 'rb'){|bin| bin.read}}\r
|
@@ -137,9 +137,9 @@ Content-Type: image/jpeg\r
|
|
137
137
|
end
|
138
138
|
|
139
139
|
it "should detect optional (original) content type and filename" do
|
140
|
-
f = File.new(
|
141
|
-
f.
|
142
|
-
f.
|
140
|
+
f = File.new(test_image_path)
|
141
|
+
expect(f).to receive(:content_type).and_return('text/plain')
|
142
|
+
expect(f).to receive(:original_filename).and_return('foo.txt')
|
143
143
|
m = RestClient::Payload::Multipart.new({:foo => f})
|
144
144
|
expect(m.to_s).to eq <<-EOS
|
145
145
|
--#{m.boundary}\r
|
@@ -161,7 +161,7 @@ foo\r
|
|
161
161
|
--#{m.boundary}--\r
|
162
162
|
EOS
|
163
163
|
|
164
|
-
f = File.new(
|
164
|
+
f = File.new(test_image_path)
|
165
165
|
f.instance_eval "def content_type; 'text/plain'; end"
|
166
166
|
f.instance_eval "def original_filename; 'foo.txt'; end"
|
167
167
|
m = RestClient::Payload::Multipart.new({:foo => {:bar => f}})
|
@@ -177,7 +177,7 @@ Content-Type: text/plain\r
|
|
177
177
|
|
178
178
|
it 'should correctly format hex boundary' do
|
179
179
|
allow(SecureRandom).to receive(:base64).with(12).and_return('TGs89+ttw/xna6TV')
|
180
|
-
f = File.new(
|
180
|
+
f = File.new(test_image_path)
|
181
181
|
m = RestClient::Payload::Multipart.new({:foo => f})
|
182
182
|
expect(m.boundary).to eq('-' * 4 + 'RubyFormBoundary' + 'TGs89AttwBxna6TV')
|
183
183
|
end
|
@@ -186,10 +186,10 @@ Content-Type: text/plain\r
|
|
186
186
|
|
187
187
|
context "streamed payloads" do
|
188
188
|
it "should properly determine the size of file payloads" do
|
189
|
-
f = File.new(
|
189
|
+
f = File.new(test_image_path)
|
190
190
|
payload = RestClient::Payload.generate(f)
|
191
|
-
expect(payload.size).to eq
|
192
|
-
expect(payload.length).to eq
|
191
|
+
expect(payload.size).to eq 72_463
|
192
|
+
expect(payload.length).to eq 72_463
|
193
193
|
end
|
194
194
|
|
195
195
|
it "should properly determine the size of other kinds of streaming payloads" do
|
@@ -209,6 +209,14 @@ Content-Type: text/plain\r
|
|
209
209
|
f.close
|
210
210
|
end
|
211
211
|
end
|
212
|
+
|
213
|
+
it "should have a closed? method" do
|
214
|
+
f = File.new(test_image_path)
|
215
|
+
payload = RestClient::Payload.generate(f)
|
216
|
+
expect(payload.closed?).to be_falsey
|
217
|
+
payload.close
|
218
|
+
expect(payload.closed?).to be_truthy
|
219
|
+
end
|
212
220
|
end
|
213
221
|
|
214
222
|
context "Payload generation" do
|
@@ -217,7 +225,7 @@ Content-Type: text/plain\r
|
|
217
225
|
end
|
218
226
|
|
219
227
|
it "should recognize multipart params" do
|
220
|
-
f = File.new(
|
228
|
+
f = File.new(test_image_path)
|
221
229
|
expect(RestClient::Payload.generate({"foo" => f})).to be_kind_of(RestClient::Payload::Multipart)
|
222
230
|
end
|
223
231
|
|
@@ -226,7 +234,7 @@ Content-Type: text/plain\r
|
|
226
234
|
end
|
227
235
|
|
228
236
|
it "should handle deeply nested multipart" do
|
229
|
-
f = File.new(
|
237
|
+
f = File.new(test_image_path)
|
230
238
|
params = {foo: RestClient::ParamsArray.new({nested: f})}
|
231
239
|
expect(RestClient::Payload.generate(params)).to be_kind_of(RestClient::Payload::Multipart)
|
232
240
|
end
|
@@ -237,17 +245,17 @@ Content-Type: text/plain\r
|
|
237
245
|
end
|
238
246
|
|
239
247
|
it "should recognize nested multipart payloads in hashes" do
|
240
|
-
f = File.new(
|
248
|
+
f = File.new(test_image_path)
|
241
249
|
expect(RestClient::Payload.generate({"foo" => {"file" => f}})).to be_kind_of(RestClient::Payload::Multipart)
|
242
250
|
end
|
243
251
|
|
244
252
|
it "should recognize nested multipart payloads in arrays" do
|
245
|
-
f = File.new(
|
253
|
+
f = File.new(test_image_path)
|
246
254
|
expect(RestClient::Payload.generate({"foo" => [f]})).to be_kind_of(RestClient::Payload::Multipart)
|
247
255
|
end
|
248
256
|
|
249
257
|
it "should recognize file payloads that can be streamed" do
|
250
|
-
f = File.new(
|
258
|
+
f = File.new(test_image_path)
|
251
259
|
expect(RestClient::Payload.generate(f)).to be_kind_of(RestClient::Payload::Streamed)
|
252
260
|
end
|
253
261
|
|
@@ -259,5 +267,29 @@ Content-Type: text/plain\r
|
|
259
267
|
it "shouldn't treat hashes as streameable" do
|
260
268
|
expect(RestClient::Payload.generate({"foo" => 'bar'})).to be_kind_of(RestClient::Payload::UrlEncoded)
|
261
269
|
end
|
270
|
+
|
271
|
+
it "should recognize multipart payload wrapped in ParamsArray" do
|
272
|
+
f = File.new(test_image_path)
|
273
|
+
params = RestClient::ParamsArray.new([[:image, f]])
|
274
|
+
expect(RestClient::Payload.generate(params)).to be_kind_of(RestClient::Payload::Multipart)
|
275
|
+
end
|
276
|
+
|
277
|
+
it "should handle non-multipart payload wrapped in ParamsArray" do
|
278
|
+
params = RestClient::ParamsArray.new([[:arg, 'value1'], [:arg, 'value2']])
|
279
|
+
expect(RestClient::Payload.generate(params)).to be_kind_of(RestClient::Payload::UrlEncoded)
|
280
|
+
end
|
281
|
+
|
282
|
+
it "should pass through Payload::Base and subclasses unchanged" do
|
283
|
+
payloads = [
|
284
|
+
RestClient::Payload::Base.new('foobar'),
|
285
|
+
RestClient::Payload::UrlEncoded.new({:foo => 'bar'}),
|
286
|
+
RestClient::Payload::Streamed.new(File.new(test_image_path)),
|
287
|
+
RestClient::Payload::Multipart.new({myfile: File.new(test_image_path)}),
|
288
|
+
]
|
289
|
+
|
290
|
+
payloads.each do |payload|
|
291
|
+
expect(RestClient::Payload.generate(payload)).to equal(payload)
|
292
|
+
end
|
293
|
+
end
|
262
294
|
end
|
263
295
|
end
|
@@ -2,9 +2,9 @@ require_relative '_lib'
|
|
2
2
|
|
3
3
|
describe RestClient::RawResponse do
|
4
4
|
before do
|
5
|
-
@tf = double("Tempfile", :read => "the answer is 42", :open => true)
|
5
|
+
@tf = double("Tempfile", :read => "the answer is 42", :open => true, :rewind => true)
|
6
6
|
@net_http_res = double('net http response')
|
7
|
-
@request = double('
|
7
|
+
@request = double('restclient request', :redirection_history => nil)
|
8
8
|
@response = RestClient::RawResponse.new(@tf, @net_http_res, @request)
|
9
9
|
end
|
10
10
|
|
@@ -15,4 +15,8 @@ describe RestClient::RawResponse do
|
|
15
15
|
it "exposes a Tempfile" do
|
16
16
|
expect(@response.file).to eq @tf
|
17
17
|
end
|
18
|
+
|
19
|
+
it "includes AbstractResponse" do
|
20
|
+
expect(RestClient::RawResponse.ancestors).to include(RestClient::AbstractResponse)
|
21
|
+
end
|
18
22
|
end
|
data/spec/unit/request2_spec.rb
CHANGED
@@ -1,23 +1,23 @@
|
|
1
1
|
require_relative '_lib'
|
2
2
|
|
3
|
-
describe RestClient::Request do
|
3
|
+
describe RestClient::Request, :include_helpers do
|
4
4
|
|
5
5
|
context 'params for GET requests' do
|
6
6
|
it "manage params for get requests" do
|
7
|
-
stub_request(:get, 'http://some/resource?a=b&c=d').with(:headers => {'Accept'=>'*/*', '
|
7
|
+
stub_request(:get, 'http://some/resource?a=b&c=d').with(:headers => {'Accept'=>'*/*', 'Foo'=>'bar'}).to_return(:body => 'foo', :status => 200)
|
8
8
|
expect(RestClient::Request.execute(:url => 'http://some/resource', :method => :get, :headers => {:foo => :bar, :params => {:a => :b, 'c' => 'd'}}).body).to eq 'foo'
|
9
9
|
|
10
|
-
stub_request(:get, 'http://some/resource').with(:headers => {'Accept'=>'*/*', '
|
10
|
+
stub_request(:get, 'http://some/resource').with(:headers => {'Accept'=>'*/*', 'Foo'=>'bar'}).to_return(:body => 'foo', :status => 200)
|
11
11
|
expect(RestClient::Request.execute(:url => 'http://some/resource', :method => :get, :headers => {:foo => :bar, :params => :a}).body).to eq 'foo'
|
12
12
|
end
|
13
13
|
|
14
14
|
it 'adds GET params when params are present in URL' do
|
15
|
-
stub_request(:get, 'http://some/resource?a=b&c=d').with(:headers => {'Accept'=>'*/*', '
|
15
|
+
stub_request(:get, 'http://some/resource?a=b&c=d').with(:headers => {'Accept'=>'*/*', 'Foo'=>'bar'}).to_return(:body => 'foo', :status => 200)
|
16
16
|
expect(RestClient::Request.execute(:url => 'http://some/resource?a=b', :method => :get, :headers => {:foo => :bar, :params => {:c => 'd'}}).body).to eq 'foo'
|
17
17
|
end
|
18
18
|
|
19
19
|
it 'encodes nested GET params' do
|
20
|
-
stub_request(:get, 'http://some/resource?a[foo][]=1&a[foo][]=2&a[bar]&b=foo+bar&math=2+%2B+2+%3D%3D+4').with(:headers => {'Accept'=>'*/*',
|
20
|
+
stub_request(:get, 'http://some/resource?a[foo][]=1&a[foo][]=2&a[bar]&b=foo+bar&math=2+%2B+2+%3D%3D+4').with(:headers => {'Accept'=>'*/*',}).to_return(:body => 'foo', :status => 200)
|
21
21
|
expect(RestClient::Request.execute(url: 'http://some/resource', method: :get, headers: {
|
22
22
|
params: {
|
23
23
|
a: {
|
@@ -37,15 +37,15 @@ describe RestClient::Request do
|
|
37
37
|
block = proc do |http_response|
|
38
38
|
response_value = http_response.body
|
39
39
|
end
|
40
|
-
stub_request(:get, 'http://some/resource?a=b&c=d').with(:headers => {'Accept'=>'*/*', '
|
40
|
+
stub_request(:get, 'http://some/resource?a=b&c=d').with(:headers => {'Accept'=>'*/*', 'Foo'=>'bar'}).to_return(:body => 'foo', :status => 200)
|
41
41
|
RestClient::Request.execute(:url => 'http://some/resource', :method => :get, :headers => {:foo => :bar, :params => {:a => :b, 'c' => 'd'}}, :block_response => block)
|
42
42
|
expect(response_value).to eq "foo"
|
43
43
|
end
|
44
44
|
|
45
45
|
it 'closes payload if not nil' do
|
46
|
-
test_file = File.new(
|
46
|
+
test_file = File.new(test_image_path)
|
47
47
|
|
48
|
-
stub_request(:post, 'http://some/resource').with(:headers => {'Accept'=>'*/*'
|
48
|
+
stub_request(:post, 'http://some/resource').with(:headers => {'Accept'=>'*/*'}).to_return(:body => 'foo', :status => 200)
|
49
49
|
RestClient::Request.execute(:url => 'http://some/resource', :method => :post, :payload => {:file => test_file})
|
50
50
|
|
51
51
|
expect(test_file.closed?).to be true
|
data/spec/unit/request_spec.rb
CHANGED
@@ -27,46 +27,22 @@ describe RestClient::Request, :include_helpers do
|
|
27
27
|
expect(@request.default_headers[:accept]).to eq '*/*'
|
28
28
|
end
|
29
29
|
|
30
|
-
describe "compression" do
|
31
|
-
|
32
|
-
it "decodes an uncompressed result body by passing it straight through" do
|
33
|
-
expect(RestClient::Request.decode(nil, 'xyz')).to eq 'xyz'
|
34
|
-
end
|
35
|
-
|
36
|
-
it "doesn't fail for nil bodies" do
|
37
|
-
expect(RestClient::Request.decode('gzip', nil)).to be_nil
|
38
|
-
end
|
39
|
-
|
40
|
-
|
41
|
-
it "decodes a gzip body" do
|
42
|
-
expect(RestClient::Request.decode('gzip', "\037\213\b\b\006'\252H\000\003t\000\313T\317UH\257\312,HM\341\002\000G\242(\r\v\000\000\000")).to eq "i'm gziped\n"
|
43
|
-
end
|
44
|
-
|
45
|
-
it "ingores gzip for empty bodies" do
|
46
|
-
expect(RestClient::Request.decode('gzip', '')).to be_empty
|
47
|
-
end
|
48
|
-
|
49
|
-
it "decodes a deflated body" do
|
50
|
-
expect(RestClient::Request.decode('deflate', "x\234+\316\317MUHIM\313I,IMQ(I\255(\001\000A\223\006\363")).to eq "some deflated text"
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
30
|
it "processes a successful result" do
|
55
|
-
res =
|
31
|
+
res = res_double
|
56
32
|
allow(res).to receive(:code).and_return("200")
|
57
33
|
allow(res).to receive(:body).and_return('body')
|
58
34
|
allow(res).to receive(:[]).with('content-encoding').and_return(nil)
|
59
|
-
expect(@request.send(:process_result, res).body).to eq 'body'
|
60
|
-
expect(@request.send(:process_result, res).to_s).to eq 'body'
|
35
|
+
expect(@request.send(:process_result, res, Time.now).body).to eq 'body'
|
36
|
+
expect(@request.send(:process_result, res, Time.now).to_s).to eq 'body'
|
61
37
|
end
|
62
38
|
|
63
39
|
it "doesn't classify successful requests as failed" do
|
64
40
|
203.upto(207) do |code|
|
65
|
-
res =
|
41
|
+
res = res_double
|
66
42
|
allow(res).to receive(:code).and_return(code.to_s)
|
67
43
|
allow(res).to receive(:body).and_return("")
|
68
44
|
allow(res).to receive(:[]).with('content-encoding').and_return(nil)
|
69
|
-
expect(@request.send(:process_result, res)).to be_empty
|
45
|
+
expect(@request.send(:process_result, res, Time.now)).to be_empty
|
70
46
|
end
|
71
47
|
end
|
72
48
|
|
@@ -315,7 +291,7 @@ describe RestClient::Request, :include_helpers do
|
|
315
291
|
|
316
292
|
describe "user headers" do
|
317
293
|
it "merges user headers with the default headers" do
|
318
|
-
expect(@request).to receive(:default_headers).and_return({
|
294
|
+
expect(@request).to receive(:default_headers).and_return({:accept => '*/*'})
|
319
295
|
headers = @request.make_headers("Accept" => "application/json", :accept_encoding => 'gzip')
|
320
296
|
expect(headers).to have_key "Accept-Encoding"
|
321
297
|
expect(headers["Accept-Encoding"]).to eq "gzip"
|
@@ -472,12 +448,13 @@ describe RestClient::Request, :include_helpers do
|
|
472
448
|
end
|
473
449
|
|
474
450
|
it "does not attempt to send credentials if Authorization header is set" do
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
|
451
|
+
['Authorization', 'authorization', 'auTHORization', :authorization].each do |authorization|
|
452
|
+
headers = {authorization => 'Token abc123'}
|
453
|
+
request = RestClient::Request.new(method: :get, url: 'http://some/resource', headers: headers, user: 'joe', password: 'mypass')
|
454
|
+
req = double("net::http request")
|
455
|
+
expect(req).not_to receive(:basic_auth)
|
456
|
+
request.send(:setup_credentials, req)
|
457
|
+
end
|
481
458
|
end
|
482
459
|
end
|
483
460
|
|
@@ -535,25 +512,25 @@ describe RestClient::Request, :include_helpers do
|
|
535
512
|
|
536
513
|
describe "exception" do
|
537
514
|
it "raises Unauthorized when the response is 401" do
|
538
|
-
res =
|
539
|
-
expect { @request.send(:process_result, res) }.to raise_error(RestClient::Unauthorized)
|
515
|
+
res = res_double(:code => '401', :[] => ['content-encoding' => ''], :body => '' )
|
516
|
+
expect { @request.send(:process_result, res, Time.now) }.to raise_error(RestClient::Unauthorized)
|
540
517
|
end
|
541
518
|
|
542
519
|
it "raises ResourceNotFound when the response is 404" do
|
543
|
-
res =
|
544
|
-
expect { @request.send(:process_result, res) }.to raise_error(RestClient::ResourceNotFound)
|
520
|
+
res = res_double(:code => '404', :[] => ['content-encoding' => ''], :body => '' )
|
521
|
+
expect { @request.send(:process_result, res, Time.now) }.to raise_error(RestClient::ResourceNotFound)
|
545
522
|
end
|
546
523
|
|
547
524
|
it "raises RequestFailed otherwise" do
|
548
|
-
res =
|
549
|
-
expect { @request.send(:process_result, res) }.to raise_error(RestClient::InternalServerError)
|
525
|
+
res = res_double(:code => '500', :[] => ['content-encoding' => ''], :body => '' )
|
526
|
+
expect { @request.send(:process_result, res, Time.now) }.to raise_error(RestClient::InternalServerError)
|
550
527
|
end
|
551
528
|
end
|
552
529
|
|
553
530
|
describe "block usage" do
|
554
531
|
it "returns what asked to" do
|
555
|
-
res =
|
556
|
-
expect(@request.send(:process_result, res){|response, request| "foo"}).to eq "foo"
|
532
|
+
res = res_double(:code => '401', :[] => ['content-encoding' => ''], :body => '' )
|
533
|
+
expect(@request.send(:process_result, res, Time.now){|response, request| "foo"}).to eq "foo"
|
557
534
|
end
|
558
535
|
end
|
559
536
|
|
@@ -644,64 +621,74 @@ describe RestClient::Request, :include_helpers do
|
|
644
621
|
it "logs a get request" do
|
645
622
|
log = RestClient.log = []
|
646
623
|
RestClient::Request.new(:method => :get, :url => 'http://url', :headers => {:user_agent => 'rest-client'}).log_request
|
647
|
-
expect(log[0]).to eq %Q{RestClient.get "http://url", "Accept"=>"*/*", "
|
624
|
+
expect(log[0]).to eq %Q{RestClient.get "http://url", "Accept"=>"*/*", "User-Agent"=>"rest-client"\n}
|
648
625
|
end
|
649
626
|
|
650
627
|
it "logs a post request with a small payload" do
|
651
628
|
log = RestClient.log = []
|
652
629
|
RestClient::Request.new(:method => :post, :url => 'http://url', :payload => 'foo', :headers => {:user_agent => 'rest-client'}).log_request
|
653
|
-
expect(log[0]).to eq %Q{RestClient.post "http://url", "foo", "Accept"=>"*/*", "
|
630
|
+
expect(log[0]).to eq %Q{RestClient.post "http://url", "foo", "Accept"=>"*/*", "Content-Length"=>"3", "User-Agent"=>"rest-client"\n}
|
654
631
|
end
|
655
632
|
|
656
633
|
it "logs a post request with a large payload" do
|
657
634
|
log = RestClient.log = []
|
658
635
|
RestClient::Request.new(:method => :post, :url => 'http://url', :payload => ('x' * 1000), :headers => {:user_agent => 'rest-client'}).log_request
|
659
|
-
expect(log[0]).to eq %Q{RestClient.post "http://url", 1000 byte(s) length, "Accept"=>"*/*", "
|
636
|
+
expect(log[0]).to eq %Q{RestClient.post "http://url", 1000 byte(s) length, "Accept"=>"*/*", "Content-Length"=>"1000", "User-Agent"=>"rest-client"\n}
|
660
637
|
end
|
661
638
|
|
662
639
|
it "logs input headers as a hash" do
|
663
640
|
log = RestClient.log = []
|
664
641
|
RestClient::Request.new(:method => :get, :url => 'http://url', :headers => { :accept => 'text/plain', :user_agent => 'rest-client' }).log_request
|
665
|
-
expect(log[0]).to eq %Q{RestClient.get "http://url", "Accept"=>"text/plain", "
|
642
|
+
expect(log[0]).to eq %Q{RestClient.get "http://url", "Accept"=>"text/plain", "User-Agent"=>"rest-client"\n}
|
666
643
|
end
|
667
644
|
|
668
645
|
it "logs a response including the status code, content type, and result body size in bytes" do
|
669
646
|
log = RestClient.log = []
|
670
|
-
res =
|
647
|
+
res = res_double(code: '200', class: Net::HTTPOK, body: 'abcd')
|
671
648
|
allow(res).to receive(:[]).with('Content-type').and_return('text/html')
|
672
|
-
@request
|
673
|
-
|
649
|
+
response = response_from_res_double(res, @request)
|
650
|
+
response.log_response
|
651
|
+
expect(log).to eq ["# => 200 OK | text/html 4 bytes, 1.00s\n"]
|
674
652
|
end
|
675
653
|
|
676
654
|
it "logs a response with a nil Content-type" do
|
677
655
|
log = RestClient.log = []
|
678
|
-
res =
|
656
|
+
res = res_double(code: '200', class: Net::HTTPOK, body: 'abcd')
|
679
657
|
allow(res).to receive(:[]).with('Content-type').and_return(nil)
|
680
|
-
@request
|
681
|
-
|
658
|
+
response = response_from_res_double(res, @request)
|
659
|
+
response.log_response
|
660
|
+
expect(log).to eq ["# => 200 OK | 4 bytes, 1.00s\n"]
|
682
661
|
end
|
683
662
|
|
684
663
|
it "logs a response with a nil body" do
|
685
664
|
log = RestClient.log = []
|
686
|
-
res =
|
665
|
+
res = res_double(code: '200', class: Net::HTTPOK, body: nil)
|
687
666
|
allow(res).to receive(:[]).with('Content-type').and_return('text/html; charset=utf-8')
|
688
|
-
@request
|
689
|
-
|
667
|
+
response = response_from_res_double(res, @request)
|
668
|
+
response.log_response
|
669
|
+
expect(log).to eq ["# => 200 OK | text/html 0 bytes, 1.00s\n"]
|
690
670
|
end
|
691
671
|
|
692
672
|
it 'does not log request password' do
|
693
673
|
log = RestClient.log = []
|
694
674
|
RestClient::Request.new(:method => :get, :url => 'http://user:password@url', :headers => {:user_agent => 'rest-client'}).log_request
|
695
|
-
expect(log[0]).to eq %Q{RestClient.get "http://user:REDACTED@url", "Accept"=>"*/*", "
|
675
|
+
expect(log[0]).to eq %Q{RestClient.get "http://user:REDACTED@url", "Accept"=>"*/*", "User-Agent"=>"rest-client"\n}
|
676
|
+
end
|
677
|
+
|
678
|
+
it 'logs to a passed logger, if provided' do
|
679
|
+
logger = double('logger', '<<' => true)
|
680
|
+
expect(logger).to receive(:<<)
|
681
|
+
RestClient::Request.new(:method => :get, :url => 'http://user:password@url', log: logger).log_request
|
696
682
|
end
|
697
683
|
end
|
698
684
|
|
699
685
|
it "strips the charset from the response content type" do
|
700
686
|
log = RestClient.log = []
|
701
|
-
res =
|
687
|
+
res = res_double(code: '200', class: Net::HTTPOK, body: 'abcd')
|
702
688
|
allow(res).to receive(:[]).with('Content-type').and_return('text/html; charset=utf-8')
|
703
|
-
@request
|
704
|
-
|
689
|
+
response = response_from_res_double(res, @request)
|
690
|
+
response.log_response
|
691
|
+
expect(log).to eq ["# => 200 OK | text/html 4 bytes, 1.00s\n"]
|
705
692
|
end
|
706
693
|
|
707
694
|
describe "timeout" do
|
@@ -1149,7 +1136,7 @@ describe RestClient::Request, :include_helpers do
|
|
1149
1136
|
)
|
1150
1137
|
net_http_res = Net::HTTPNoContent.new("", "204", "No Content")
|
1151
1138
|
allow(net_http_res).to receive(:read_body).and_return(nil)
|
1152
|
-
expect(@http).to receive(:request).and_return(
|
1139
|
+
expect(@http).to receive(:request).and_return(net_http_res)
|
1153
1140
|
response = @request.send(:transmit, @uri, 'req', 'payload')
|
1154
1141
|
expect(response).not_to be_nil
|
1155
1142
|
expect(response.code).to eq 204
|
@@ -1167,7 +1154,8 @@ describe RestClient::Request, :include_helpers do
|
|
1167
1154
|
|
1168
1155
|
net_http_res = Net::HTTPOK.new(nil, "200", "body")
|
1169
1156
|
allow(net_http_res).to receive(:read_body).and_return("body")
|
1170
|
-
@request.send(:
|
1157
|
+
received_tempfile = @request.send(:fetch_body_to_tempfile, net_http_res)
|
1158
|
+
expect(received_tempfile).to eq tempfile
|
1171
1159
|
end
|
1172
1160
|
end
|
1173
1161
|
|
@@ -1233,10 +1221,10 @@ describe RestClient::Request, :include_helpers do
|
|
1233
1221
|
expect(@request.process_url_params('https://example.com/', params: {
|
1234
1222
|
foo: [1,2,3],
|
1235
1223
|
null: nil,
|
1236
|
-
|
1224
|
+
falsy: false,
|
1237
1225
|
math: '2+2=4',
|
1238
1226
|
nested: {'key + escaped' => 'value + escaped', other: [], arr: [1,2]},
|
1239
|
-
})).to eq 'https://example.com/?foo[]=1&foo[]=2&foo[]=3&null&
|
1227
|
+
})).to eq 'https://example.com/?foo[]=1&foo[]=2&foo[]=3&null&falsy=false&math=2%2B2%3D4' \
|
1240
1228
|
'&nested[key+%2B+escaped]=value+%2B+escaped&nested[other]' \
|
1241
1229
|
'&nested[arr][]=1&nested[arr][]=2'
|
1242
1230
|
end
|