rest-client 1.8.0-x64-mingw32 → 2.0.0.rc1-x64-mingw32
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/.rspec +2 -1
- data/.rubocop-disables.yml +375 -0
- data/.rubocop.yml +3 -0
- data/.travis.yml +3 -4
- data/AUTHORS +11 -1
- data/README.rdoc +84 -16
- data/Rakefile +16 -0
- data/bin/restclient +3 -5
- data/history.md +61 -0
- data/lib/restclient.rb +19 -2
- data/lib/restclient/abstract_response.rb +107 -42
- data/lib/restclient/exceptions.rb +44 -44
- data/lib/restclient/payload.rb +2 -2
- data/lib/restclient/platform.rb +19 -0
- data/lib/restclient/raw_response.rb +4 -0
- data/lib/restclient/request.rb +141 -38
- data/lib/restclient/resource.rb +3 -3
- data/lib/restclient/response.rb +61 -5
- data/lib/restclient/utils.rb +93 -0
- data/lib/restclient/version.rb +2 -1
- data/rest-client.gemspec +6 -5
- data/spec/helpers.rb +14 -0
- data/spec/integration/_lib.rb +1 -0
- data/spec/integration/httpbin_spec.rb +72 -0
- data/spec/integration/integration_spec.rb +79 -1
- data/spec/integration/request_spec.rb +24 -1
- data/spec/spec_helper.rb +21 -1
- data/spec/unit/_lib.rb +1 -0
- data/spec/unit/abstract_response_spec.rb +22 -8
- data/spec/unit/exceptions_spec.rb +9 -17
- data/spec/unit/payload_spec.rb +10 -10
- data/spec/unit/raw_response_spec.rb +1 -1
- data/spec/unit/request2_spec.rb +6 -6
- data/spec/unit/request_spec.rb +234 -43
- data/spec/unit/resource_spec.rb +1 -1
- data/spec/unit/response_spec.rb +72 -28
- data/spec/unit/restclient_spec.rb +3 -3
- data/spec/unit/utils_spec.rb +71 -0
- data/spec/unit/windows/root_certs_spec.rb +1 -1
- metadata +41 -14
data/spec/unit/_lib.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require_relative '../spec_helper'
|
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
require_relative '_lib'
|
2
2
|
|
3
3
|
describe RestClient::AbstractResponse do
|
4
4
|
|
@@ -33,14 +33,28 @@ describe RestClient::AbstractResponse do
|
|
33
33
|
@response.description.should eq "200 OK | application/pdf bytes\n"
|
34
34
|
end
|
35
35
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
36
|
+
describe '.beautify_headers' do
|
37
|
+
it "beautifies the headers by turning the keys to symbols" do
|
38
|
+
h = RestClient::AbstractResponse.beautify_headers('content-type' => [ 'x' ])
|
39
|
+
h.keys.first.should eq :content_type
|
40
|
+
end
|
41
|
+
|
42
|
+
it "beautifies the headers by turning the values to strings instead of one-element arrays" do
|
43
|
+
h = RestClient::AbstractResponse.beautify_headers('x' => [ 'text/html' ] )
|
44
|
+
h.values.first.should eq 'text/html'
|
45
|
+
end
|
40
46
|
|
41
|
-
|
42
|
-
|
43
|
-
|
47
|
+
it 'joins multiple header values by comma' do
|
48
|
+
RestClient::AbstractResponse.beautify_headers(
|
49
|
+
{'My-Header' => ['one', 'two']}
|
50
|
+
).should eq({:my_header => 'one, two'})
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'leaves set-cookie headers as array' do
|
54
|
+
RestClient::AbstractResponse.beautify_headers(
|
55
|
+
{'Set-Cookie' => ['cookie1=foo', 'cookie2=bar']}
|
56
|
+
).should eq({:set_cookie => ['cookie1=foo', 'cookie2=bar']})
|
57
|
+
end
|
44
58
|
end
|
45
59
|
|
46
60
|
it "fetches the headers" do
|
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
require_relative '_lib'
|
2
2
|
|
3
3
|
describe RestClient::Exception do
|
4
4
|
it "returns a 'message' equal to the class name if the message is not set, because 'message' should not be nil" do
|
@@ -14,7 +14,7 @@ describe RestClient::Exception do
|
|
14
14
|
end
|
15
15
|
|
16
16
|
it "sets the exception message to ErrorMessage" do
|
17
|
-
RestClient::ResourceNotFound.new.message.should eq '
|
17
|
+
RestClient::ResourceNotFound.new.message.should eq 'Not Found'
|
18
18
|
end
|
19
19
|
|
20
20
|
it "contains exceptions in RestClient" do
|
@@ -67,22 +67,8 @@ describe RestClient::ResourceNotFound do
|
|
67
67
|
e.response.should eq response
|
68
68
|
end
|
69
69
|
end
|
70
|
-
end
|
71
|
-
|
72
|
-
describe "backwards compatibility" do
|
73
|
-
it "alias RestClient::Request::Redirect to RestClient::Redirect" do
|
74
|
-
RestClient::Request::Redirect.should eq RestClient::Redirect
|
75
|
-
end
|
76
|
-
|
77
|
-
it "alias RestClient::Request::Unauthorized to RestClient::Unauthorized" do
|
78
|
-
RestClient::Request::Unauthorized.should eq RestClient::Unauthorized
|
79
|
-
end
|
80
70
|
|
81
|
-
it
|
82
|
-
RestClient::Request::RequestFailed.should eq RestClient::RequestFailed
|
83
|
-
end
|
84
|
-
|
85
|
-
it "make the exception's response act like an Net::HTTPResponse" do
|
71
|
+
it 'stores the body on the response of the exception' do
|
86
72
|
body = "body"
|
87
73
|
stub_request(:get, "www.example.com").to_return(:body => body, :status => 404)
|
88
74
|
begin
|
@@ -93,3 +79,9 @@ describe "backwards compatibility" do
|
|
93
79
|
end
|
94
80
|
end
|
95
81
|
end
|
82
|
+
|
83
|
+
describe "backwards compatibility" do
|
84
|
+
it 'aliases RestClient::NotFound as ResourceNotFound' do
|
85
|
+
RestClient::ResourceNotFound.should eq RestClient::NotFound
|
86
|
+
end
|
87
|
+
end
|
data/spec/unit/payload_spec.rb
CHANGED
@@ -1,31 +1,31 @@
|
|
1
1
|
# encoding: binary
|
2
2
|
|
3
|
-
|
3
|
+
require_relative '_lib'
|
4
4
|
|
5
5
|
describe RestClient::Payload do
|
6
6
|
context "A regular Payload" do
|
7
7
|
it "should use standard enctype as default content-type" do
|
8
8
|
RestClient::Payload::UrlEncoded.new({}).headers['Content-Type'].
|
9
|
-
|
9
|
+
should eq 'application/x-www-form-urlencoded'
|
10
10
|
end
|
11
11
|
|
12
12
|
it "should form properly encoded params" do
|
13
13
|
RestClient::Payload::UrlEncoded.new({:foo => 'bar'}).to_s.
|
14
|
-
|
14
|
+
should eq "foo=bar"
|
15
15
|
["foo=bar&baz=qux", "baz=qux&foo=bar"].should include(
|
16
16
|
RestClient::Payload::UrlEncoded.new({:foo => 'bar', :baz => 'qux'}).to_s)
|
17
17
|
end
|
18
18
|
|
19
19
|
it "should escape parameters" do
|
20
20
|
RestClient::Payload::UrlEncoded.new({'foo ' => 'bar'}).to_s.
|
21
|
-
|
21
|
+
should eq "foo%20=bar"
|
22
22
|
end
|
23
23
|
|
24
24
|
it "should properly handle hashes as parameter" do
|
25
25
|
RestClient::Payload::UrlEncoded.new({:foo => {:bar => 'baz'}}).to_s.
|
26
|
-
|
26
|
+
should eq "foo[bar]=baz"
|
27
27
|
RestClient::Payload::UrlEncoded.new({:foo => {:bar => {:baz => 'qux'}}}).to_s.
|
28
|
-
|
28
|
+
should eq "foo[bar][baz]=qux"
|
29
29
|
end
|
30
30
|
|
31
31
|
it "should handle many attributes inside a hash" do
|
@@ -45,16 +45,16 @@ describe RestClient::Payload do
|
|
45
45
|
|
46
46
|
it "should form properly use symbols as parameters" do
|
47
47
|
RestClient::Payload::UrlEncoded.new({:foo => :bar}).to_s.
|
48
|
-
|
48
|
+
should eq "foo=bar"
|
49
49
|
RestClient::Payload::UrlEncoded.new({:foo => {:bar => :baz}}).to_s.
|
50
|
-
|
50
|
+
should eq "foo[bar]=baz"
|
51
51
|
end
|
52
52
|
|
53
53
|
it "should properly handle arrays as repeated parameters" do
|
54
54
|
RestClient::Payload::UrlEncoded.new({:foo => ['bar']}).to_s.
|
55
|
-
|
55
|
+
should eq "foo[]=bar"
|
56
56
|
RestClient::Payload::UrlEncoded.new({:foo => ['bar', 'baz']}).to_s.
|
57
|
-
|
57
|
+
should eq "foo[]=bar&foo[]=baz"
|
58
58
|
end
|
59
59
|
|
60
60
|
it 'should not close if stream already closed' do
|
data/spec/unit/request2_spec.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
|
-
|
1
|
+
require_relative '_lib'
|
2
2
|
|
3
3
|
describe RestClient::Request do
|
4
4
|
|
5
5
|
it "manage params for get requests" do
|
6
|
-
stub_request(:get, 'http://some/resource?a=b&c=d').with(:headers => {'Accept'=>'
|
6
|
+
stub_request(:get, 'http://some/resource?a=b&c=d').with(:headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip, deflate', 'Foo'=>'bar'}).to_return(:body => 'foo', :status => 200)
|
7
7
|
RestClient::Request.execute(:url => 'http://some/resource', :method => :get, :headers => {:foo => :bar, :params => {:a => :b, 'c' => 'd'}}).body.should eq 'foo'
|
8
8
|
|
9
|
-
stub_request(:get, 'http://some/resource').with(:headers => {'Accept'=>'
|
9
|
+
stub_request(:get, 'http://some/resource').with(:headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip, deflate', 'Foo'=>'bar', 'params' => 'a'}).to_return(:body => 'foo', :status => 200)
|
10
10
|
RestClient::Request.execute(:url => 'http://some/resource', :method => :get, :headers => {:foo => :bar, :params => :a}).body.should eq 'foo'
|
11
11
|
end
|
12
12
|
|
@@ -15,7 +15,7 @@ describe RestClient::Request do
|
|
15
15
|
block = proc do |http_response|
|
16
16
|
response_value = http_response.body
|
17
17
|
end
|
18
|
-
stub_request(:get, 'http://some/resource?a=b&c=d').with(:headers => {'Accept'=>'
|
18
|
+
stub_request(:get, 'http://some/resource?a=b&c=d').with(:headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip, deflate', 'Foo'=>'bar'}).to_return(:body => 'foo', :status => 200)
|
19
19
|
RestClient::Request.execute(:url => 'http://some/resource', :method => :get, :headers => {:foo => :bar, :params => {:a => :b, 'c' => 'd'}}, :block_response => block)
|
20
20
|
response_value.should eq "foo"
|
21
21
|
end
|
@@ -23,10 +23,10 @@ describe RestClient::Request do
|
|
23
23
|
it 'closes payload if not nil' do
|
24
24
|
test_file = File.new(File.join( File.dirname(File.expand_path(__FILE__)), 'master_shake.jpg'))
|
25
25
|
|
26
|
-
stub_request(:post, 'http://some/resource').with(:headers => {'Accept'=>'
|
26
|
+
stub_request(:post, 'http://some/resource').with(:headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip, deflate'}).to_return(:body => 'foo', :status => 200)
|
27
27
|
RestClient::Request.execute(:url => 'http://some/resource', :method => :post, :payload => {:file => test_file})
|
28
28
|
|
29
|
-
test_file.closed?.should
|
29
|
+
test_file.closed?.should be true
|
30
30
|
end
|
31
31
|
|
32
32
|
end
|
data/spec/unit/request_spec.rb
CHANGED
@@ -1,17 +1,19 @@
|
|
1
|
-
|
1
|
+
require_relative './_lib'
|
2
2
|
|
3
|
-
describe RestClient::Request do
|
3
|
+
describe RestClient::Request, :include_helpers do
|
4
4
|
before do
|
5
5
|
@request = RestClient::Request.new(:method => :put, :url => 'http://some/resource', :payload => 'payload')
|
6
6
|
|
7
7
|
@uri = double("uri")
|
8
8
|
@uri.stub(:request_uri).and_return('/resource')
|
9
|
-
@uri.stub(:
|
9
|
+
@uri.stub(:hostname).and_return('some')
|
10
10
|
@uri.stub(:port).and_return(80)
|
11
11
|
|
12
12
|
@net = double("net::http base")
|
13
13
|
@http = double("net::http connection")
|
14
|
+
|
14
15
|
Net::HTTP.stub(:new).and_return(@net)
|
16
|
+
|
15
17
|
@net.stub(:start).and_yield(@http)
|
16
18
|
@net.stub(:use_ssl=)
|
17
19
|
@net.stub(:verify_mode=)
|
@@ -21,8 +23,8 @@ describe RestClient::Request do
|
|
21
23
|
RestClient.log = nil
|
22
24
|
end
|
23
25
|
|
24
|
-
it "accept */* mimetype
|
25
|
-
@request.default_headers[:accept].should eq '
|
26
|
+
it "accept */* mimetype" do
|
27
|
+
@request.default_headers[:accept].should eq '*/*'
|
26
28
|
end
|
27
29
|
|
28
30
|
describe "compression" do
|
@@ -50,7 +52,7 @@ describe RestClient::Request do
|
|
50
52
|
end
|
51
53
|
|
52
54
|
it "processes a successful result" do
|
53
|
-
res =
|
55
|
+
res = response_double
|
54
56
|
res.stub(:code).and_return("200")
|
55
57
|
res.stub(:body).and_return('body')
|
56
58
|
res.stub(:[]).with('content-encoding').and_return(nil)
|
@@ -60,7 +62,7 @@ describe RestClient::Request do
|
|
60
62
|
|
61
63
|
it "doesn't classify successful requests as failed" do
|
62
64
|
203.upto(207) do |code|
|
63
|
-
res =
|
65
|
+
res = response_double
|
64
66
|
res.stub(:code).and_return(code.to_s)
|
65
67
|
res.stub(:body).and_return("")
|
66
68
|
res.stub(:[]).with('content-encoding').and_return(nil)
|
@@ -68,14 +70,36 @@ describe RestClient::Request do
|
|
68
70
|
end
|
69
71
|
end
|
70
72
|
|
71
|
-
|
72
|
-
URI
|
73
|
-
|
74
|
-
|
73
|
+
describe '.parse_url' do
|
74
|
+
it "parses a url into a URI object" do
|
75
|
+
URI.should_receive(:parse).with('http://example.com/resource')
|
76
|
+
@request.parse_url('http://example.com/resource')
|
77
|
+
end
|
78
|
+
|
79
|
+
it "adds http:// to the front of resources specified in the syntax example.com/resource" do
|
80
|
+
URI.should_receive(:parse).with('http://example.com/resource')
|
81
|
+
@request.parse_url('example.com/resource')
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'adds http:// to resources containing a colon' do
|
85
|
+
URI.should_receive(:parse).with('http://example.com:1234')
|
86
|
+
@request.parse_url('example.com:1234')
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'does not add http:// to the front of https resources' do
|
90
|
+
URI.should_receive(:parse).with('https://example.com/resource')
|
91
|
+
@request.parse_url('https://example.com/resource')
|
92
|
+
end
|
93
|
+
|
94
|
+
it 'does not add http:// to the front of capital HTTP resources' do
|
95
|
+
URI.should_receive(:parse).with('HTTP://example.com/resource')
|
96
|
+
@request.parse_url('HTTP://example.com/resource')
|
97
|
+
end
|
75
98
|
|
76
|
-
|
77
|
-
|
78
|
-
|
99
|
+
it 'does not add http:// to the front of capital HTTPS resources' do
|
100
|
+
URI.should_receive(:parse).with('HTTPS://example.com/resource')
|
101
|
+
@request.parse_url('HTTPS://example.com/resource')
|
102
|
+
end
|
79
103
|
end
|
80
104
|
|
81
105
|
describe "user - password" do
|
@@ -145,7 +169,7 @@ describe RestClient::Request do
|
|
145
169
|
end
|
146
170
|
|
147
171
|
it "uses netrc credentials" do
|
148
|
-
URI.stub(:parse).and_return(double('uri', :user => nil, :password => nil, :
|
172
|
+
URI.stub(:parse).and_return(double('uri', :user => nil, :password => nil, :hostname => 'example.com'))
|
149
173
|
Netrc.stub(:read).and_return('example.com' => ['a', 'b'])
|
150
174
|
@request.parse_url_with_auth('http://example.com/resource')
|
151
175
|
@request.user.should eq 'a'
|
@@ -153,7 +177,7 @@ describe RestClient::Request do
|
|
153
177
|
end
|
154
178
|
|
155
179
|
it "uses credentials in the url in preference to netrc" do
|
156
|
-
URI.stub(:parse).and_return(double('uri', :user => 'joe%20', :password => 'pass1', :
|
180
|
+
URI.stub(:parse).and_return(double('uri', :user => 'joe%20', :password => 'pass1', :hostname => 'example.com'))
|
157
181
|
Netrc.stub(:read).and_return('example.com' => ['a', 'b'])
|
158
182
|
@request.parse_url_with_auth('http://joe%20:pass1@example.com/resource')
|
159
183
|
@request.user.should eq 'joe '
|
@@ -166,7 +190,7 @@ describe RestClient::Request do
|
|
166
190
|
|
167
191
|
describe "user headers" do
|
168
192
|
it "merges user headers with the default headers" do
|
169
|
-
@request.should_receive(:default_headers).and_return({ :accept => '
|
193
|
+
@request.should_receive(:default_headers).and_return({ :accept => '*/*', :accept_encoding => 'gzip, deflate' })
|
170
194
|
headers = @request.make_headers("Accept" => "application/json", :accept_encoding => 'gzip')
|
171
195
|
headers.should have_key "Accept-Encoding"
|
172
196
|
headers["Accept-Encoding"].should eq "gzip"
|
@@ -238,6 +262,21 @@ describe RestClient::Request do
|
|
238
262
|
@request.execute
|
239
263
|
end
|
240
264
|
|
265
|
+
it "IPv6: executes by constructing the Net::HTTP object, headers, and payload and calling transmit" do
|
266
|
+
@request = RestClient::Request.new(:method => :put, :url => 'http://[::1]/some/resource', :payload => 'payload')
|
267
|
+
klass = double("net:http class")
|
268
|
+
@request.should_receive(:net_http_request_class).with(:put).and_return(klass)
|
269
|
+
|
270
|
+
if RUBY_VERSION >= "2.0.0"
|
271
|
+
klass.should_receive(:new).with(kind_of(URI), kind_of(Hash)).and_return('result')
|
272
|
+
else
|
273
|
+
klass.should_receive(:new).with(kind_of(String), kind_of(Hash)).and_return('result')
|
274
|
+
end
|
275
|
+
|
276
|
+
@request.should_receive(:transmit)
|
277
|
+
@request.execute
|
278
|
+
end
|
279
|
+
|
241
280
|
it "transmits the request with Net::HTTP" do
|
242
281
|
@http.should_receive(:request).with('req', 'payload')
|
243
282
|
@request.should_receive(:process_result)
|
@@ -301,6 +340,15 @@ describe RestClient::Request do
|
|
301
340
|
req.should_receive(:basic_auth).with('joe', 'mypass')
|
302
341
|
@request.setup_credentials(req)
|
303
342
|
end
|
343
|
+
|
344
|
+
it "does not attempt to send credentials if Authorization header is set" do
|
345
|
+
@request.headers['Authorization'] = 'Token abc123'
|
346
|
+
@request.stub(:user).and_return('joe')
|
347
|
+
@request.stub(:password).and_return('mypass')
|
348
|
+
req = double("request")
|
349
|
+
req.should_not_receive(:basic_auth)
|
350
|
+
@request.setup_credentials(req)
|
351
|
+
end
|
304
352
|
end
|
305
353
|
|
306
354
|
it "catches EOFError and shows the more informative ServerBrokeConnection" do
|
@@ -313,14 +361,26 @@ describe RestClient::Request do
|
|
313
361
|
lambda { @request.transmit(@uri, 'req', nil) }.should raise_error(OpenSSL::SSL::SSLError)
|
314
362
|
end
|
315
363
|
|
316
|
-
it "catches Timeout::Error and raise the more informative
|
364
|
+
it "catches Timeout::Error and raise the more informative ReadTimeout" do
|
317
365
|
@http.stub(:request).and_raise(Timeout::Error)
|
318
|
-
lambda { @request.transmit(@uri, 'req', nil) }.should raise_error(RestClient::
|
366
|
+
lambda { @request.transmit(@uri, 'req', nil) }.should raise_error(RestClient::Exceptions::ReadTimeout)
|
319
367
|
end
|
320
368
|
|
321
|
-
it "catches
|
369
|
+
it "catches Errno::ETIMEDOUT and raise the more informative ReadTimeout" do
|
322
370
|
@http.stub(:request).and_raise(Errno::ETIMEDOUT)
|
323
|
-
lambda { @request.transmit(@uri, 'req', nil) }.should raise_error(RestClient::
|
371
|
+
lambda { @request.transmit(@uri, 'req', nil) }.should raise_error(RestClient::Exceptions::ReadTimeout)
|
372
|
+
end
|
373
|
+
|
374
|
+
it "catches Net::ReadTimeout and raises RestClient's ReadTimeout",
|
375
|
+
:if => defined?(Net::ReadTimeout) do
|
376
|
+
@http.stub(:request).and_raise(Net::ReadTimeout)
|
377
|
+
lambda { @request.transmit(@uri, 'req', nil) }.should raise_error(RestClient::Exceptions::ReadTimeout)
|
378
|
+
end
|
379
|
+
|
380
|
+
it "catches Net::OpenTimeout and raises RestClient's OpenTimeout",
|
381
|
+
:if => defined?(Net::OpenTimeout) do
|
382
|
+
@http.stub(:request).and_raise(Net::OpenTimeout)
|
383
|
+
lambda { @request.transmit(@uri, 'req', nil) }.should raise_error(RestClient::Exceptions::OpenTimeout)
|
324
384
|
end
|
325
385
|
|
326
386
|
it "class method execute wraps constructor" do
|
@@ -332,36 +392,105 @@ describe RestClient::Request do
|
|
332
392
|
|
333
393
|
describe "exception" do
|
334
394
|
it "raises Unauthorized when the response is 401" do
|
335
|
-
res =
|
395
|
+
res = response_double(:code => '401', :[] => ['content-encoding' => ''], :body => '' )
|
336
396
|
lambda { @request.process_result(res) }.should raise_error(RestClient::Unauthorized)
|
337
397
|
end
|
338
398
|
|
339
399
|
it "raises ResourceNotFound when the response is 404" do
|
340
|
-
res =
|
400
|
+
res = response_double(:code => '404', :[] => ['content-encoding' => ''], :body => '' )
|
341
401
|
lambda { @request.process_result(res) }.should raise_error(RestClient::ResourceNotFound)
|
342
402
|
end
|
343
403
|
|
344
404
|
it "raises RequestFailed otherwise" do
|
345
|
-
res =
|
405
|
+
res = response_double(:code => '500', :[] => ['content-encoding' => ''], :body => '' )
|
346
406
|
lambda { @request.process_result(res) }.should raise_error(RestClient::InternalServerError)
|
347
407
|
end
|
348
408
|
end
|
349
409
|
|
350
410
|
describe "block usage" do
|
351
411
|
it "returns what asked to" do
|
352
|
-
res =
|
412
|
+
res = response_double(:code => '401', :[] => ['content-encoding' => ''], :body => '' )
|
353
413
|
@request.process_result(res){|response, request| "foo"}.should eq "foo"
|
354
414
|
end
|
355
415
|
end
|
356
416
|
|
357
417
|
describe "proxy" do
|
418
|
+
before do
|
419
|
+
# unstub Net::HTTP creation since we need to test it
|
420
|
+
Net::HTTP.unstub(:new)
|
421
|
+
|
422
|
+
@proxy_req = RestClient::Request.new(:method => :put, :url => 'http://some/resource', :payload => 'payload')
|
423
|
+
end
|
424
|
+
|
358
425
|
it "creates a proxy class if a proxy url is given" do
|
359
426
|
RestClient.stub(:proxy).and_return("http://example.com/")
|
360
|
-
|
427
|
+
RestClient.stub(:proxy_set?).and_return(true)
|
428
|
+
@proxy_req.net_http_object('host', 80).proxy?.should be true
|
429
|
+
end
|
430
|
+
|
431
|
+
it "creates a proxy class with the correct address if a IPv6 proxy url is given" do
|
432
|
+
RestClient.stub(:proxy).and_return("http://[::1]/")
|
433
|
+
RestClient.stub(:proxy_set?).and_return(true)
|
434
|
+
@proxy_req.net_http_object('host', 80).proxy?.should be true
|
435
|
+
@proxy_req.net_http_object('host', 80).proxy_address.should == '::1'
|
361
436
|
end
|
362
437
|
|
363
438
|
it "creates a non-proxy class if a proxy url is not given" do
|
364
|
-
@
|
439
|
+
@proxy_req.net_http_object('host', 80).proxy?.should be_falsey
|
440
|
+
end
|
441
|
+
|
442
|
+
it "disables proxy on a per-request basis" do
|
443
|
+
RestClient.stub(:proxy).and_return('http://example.com')
|
444
|
+
RestClient.stub(:proxy_set?).and_return(true)
|
445
|
+
@proxy_req.net_http_object('host', 80).proxy?.should be true
|
446
|
+
|
447
|
+
disabled_req = RestClient::Request.new(:method => :put, :url => 'http://some/resource', :payload => 'payload', :proxy => nil)
|
448
|
+
disabled_req.net_http_object('host', 80).proxy?.should be_falsey
|
449
|
+
end
|
450
|
+
|
451
|
+
it "sets proxy on a per-request basis" do
|
452
|
+
@proxy_req.net_http_object('some', 80).proxy?.should be_falsey
|
453
|
+
|
454
|
+
req = RestClient::Request.new(:method => :put, :url => 'http://some/resource', :payload => 'payload', :proxy => 'http://example.com')
|
455
|
+
req.net_http_object('host', 80).proxy?.should be true
|
456
|
+
end
|
457
|
+
|
458
|
+
it "overrides proxy from environment", if: RUBY_VERSION >= '2.0' do
|
459
|
+
allow(ENV).to receive(:[]).with("http_proxy").and_return("http://127.0.0.1")
|
460
|
+
allow(ENV).to receive(:[]).with("no_proxy").and_return(nil)
|
461
|
+
allow(ENV).to receive(:[]).with("NO_PROXY").and_return(nil)
|
462
|
+
req = RestClient::Request.new(:method => :put, :url => 'http://some/resource', :payload => 'payload')
|
463
|
+
obj = req.net_http_object('host', 80)
|
464
|
+
obj.proxy?.should be true
|
465
|
+
obj.proxy_address.should eq '127.0.0.1'
|
466
|
+
|
467
|
+
# test original method .proxy?
|
468
|
+
req = RestClient::Request.new(:method => :put, :url => 'http://some/resource', :payload => 'payload', :proxy => nil)
|
469
|
+
obj = req.net_http_object('host', 80)
|
470
|
+
obj.proxy?.should be_falsey
|
471
|
+
|
472
|
+
# stub RestClient.proxy_set? to peek into implementation
|
473
|
+
RestClient.stub(:proxy_set?).and_return(true)
|
474
|
+
req = RestClient::Request.new(:method => :put, :url => 'http://some/resource', :payload => 'payload')
|
475
|
+
obj = req.net_http_object('host', 80)
|
476
|
+
obj.proxy?.should be_falsey
|
477
|
+
|
478
|
+
# test stubbed Net::HTTP.new
|
479
|
+
req = RestClient::Request.new(:method => :put, :url => 'http://some/resource', :payload => 'payload', :proxy => nil)
|
480
|
+
expect(Net::HTTP).to receive(:new).with('host', 80, nil, nil, nil, nil)
|
481
|
+
req.net_http_object('host', 80)
|
482
|
+
end
|
483
|
+
|
484
|
+
it "overrides global proxy with per-request proxy" do
|
485
|
+
RestClient.stub(:proxy).and_return('http://example.com')
|
486
|
+
RestClient.stub(:proxy_set?).and_return(true)
|
487
|
+
obj = @proxy_req.net_http_object('host', 80)
|
488
|
+
obj.proxy?.should be true
|
489
|
+
obj.proxy_address.should eq 'example.com'
|
490
|
+
|
491
|
+
req = RestClient::Request.new(:method => :put, :url => 'http://some/resource', :payload => 'payload', :proxy => 'http://127.0.0.1/')
|
492
|
+
req.net_http_object('host', 80).proxy?.should be true
|
493
|
+
req.net_http_object('host', 80).proxy_address.should == '127.0.0.1'
|
365
494
|
end
|
366
495
|
end
|
367
496
|
|
@@ -369,26 +498,26 @@ describe RestClient::Request do
|
|
369
498
|
describe "logging" do
|
370
499
|
it "logs a get request" do
|
371
500
|
log = RestClient.log = []
|
372
|
-
RestClient::Request.new(:method => :get, :url => 'http://url').log_request
|
373
|
-
log[0].should eq %Q{RestClient.get "http://url", "Accept"=>"
|
501
|
+
RestClient::Request.new(:method => :get, :url => 'http://url', :headers => {:user_agent => 'rest-client'}).log_request
|
502
|
+
log[0].should eq %Q{RestClient.get "http://url", "Accept"=>"*/*", "Accept-Encoding"=>"gzip, deflate", "User-Agent"=>"rest-client"\n}
|
374
503
|
end
|
375
504
|
|
376
505
|
it "logs a post request with a small payload" do
|
377
506
|
log = RestClient.log = []
|
378
|
-
RestClient::Request.new(:method => :post, :url => 'http://url', :payload => 'foo').log_request
|
379
|
-
log[0].should eq %Q{RestClient.post "http://url", "foo", "Accept"=>"
|
507
|
+
RestClient::Request.new(:method => :post, :url => 'http://url', :payload => 'foo', :headers => {:user_agent => 'rest-client'}).log_request
|
508
|
+
log[0].should eq %Q{RestClient.post "http://url", "foo", "Accept"=>"*/*", "Accept-Encoding"=>"gzip, deflate", "Content-Length"=>"3", "User-Agent"=>"rest-client"\n}
|
380
509
|
end
|
381
510
|
|
382
511
|
it "logs a post request with a large payload" do
|
383
512
|
log = RestClient.log = []
|
384
|
-
RestClient::Request.new(:method => :post, :url => 'http://url', :payload => ('x' * 1000)).log_request
|
385
|
-
log[0].should eq %Q{RestClient.post "http://url", 1000 byte(s) length, "Accept"=>"
|
513
|
+
RestClient::Request.new(:method => :post, :url => 'http://url', :payload => ('x' * 1000), :headers => {:user_agent => 'rest-client'}).log_request
|
514
|
+
log[0].should eq %Q{RestClient.post "http://url", 1000 byte(s) length, "Accept"=>"*/*", "Accept-Encoding"=>"gzip, deflate", "Content-Length"=>"1000", "User-Agent"=>"rest-client"\n}
|
386
515
|
end
|
387
516
|
|
388
517
|
it "logs input headers as a hash" do
|
389
518
|
log = RestClient.log = []
|
390
|
-
RestClient::Request.new(:method => :get, :url => 'http://url', :headers => { :accept => 'text/plain' }).log_request
|
391
|
-
log[0].should eq %Q{RestClient.get "http://url", "Accept"=>"text/plain", "Accept-Encoding"=>"gzip, deflate"\n}
|
519
|
+
RestClient::Request.new(:method => :get, :url => 'http://url', :headers => { :accept => 'text/plain', :user_agent => 'rest-client' }).log_request
|
520
|
+
log[0].should eq %Q{RestClient.get "http://url", "Accept"=>"text/plain", "Accept-Encoding"=>"gzip, deflate", "User-Agent"=>"rest-client"\n}
|
392
521
|
end
|
393
522
|
|
394
523
|
it "logs a response including the status code, content type, and result body size in bytes" do
|
@@ -417,13 +546,13 @@ describe RestClient::Request do
|
|
417
546
|
|
418
547
|
it 'does not log request password' do
|
419
548
|
log = RestClient.log = []
|
420
|
-
RestClient::Request.new(:method => :get, :url => 'http://user:password@url', :headers => {:user_agent => 'rest-client'
|
549
|
+
RestClient::Request.new(:method => :get, :url => 'http://user:password@url', :headers => {:user_agent => 'rest-client'}).log_request
|
421
550
|
log[0].should eq %Q{RestClient.get "http://user:REDACTED@url", "Accept"=>"*/*", "Accept-Encoding"=>"gzip, deflate", "User-Agent"=>"rest-client"\n}
|
422
551
|
end
|
423
552
|
|
424
553
|
it 'logs invalid URIs, even though they will fail elsewhere' do
|
425
554
|
log = RestClient.log = []
|
426
|
-
RestClient::Request.new(:method => :get, :url => 'http://a@b:c', :headers => {:user_agent => 'rest-client'
|
555
|
+
RestClient::Request.new(:method => :get, :url => 'http://a@b:c', :headers => {:user_agent => 'rest-client'}).log_request
|
427
556
|
log[0].should eq %Q{RestClient.get "[invalid uri]", "Accept"=>"*/*", "Accept-Encoding"=>"gzip, deflate", "User-Agent"=>"rest-client"\n}
|
428
557
|
end
|
429
558
|
end
|
@@ -449,8 +578,8 @@ describe RestClient::Request do
|
|
449
578
|
@request.transmit(@uri, 'req', nil)
|
450
579
|
end
|
451
580
|
|
452
|
-
it
|
453
|
-
@request = RestClient::Request.new(:method => :put, :url => 'http://some/resource', :payload => 'payload', :
|
581
|
+
it 'sets read_timeout' do
|
582
|
+
@request = RestClient::Request.new(:method => :put, :url => 'http://some/resource', :payload => 'payload', :read_timeout => 123)
|
454
583
|
@http.stub(:request)
|
455
584
|
@request.stub(:process_result)
|
456
585
|
@request.stub(:response_log)
|
@@ -460,7 +589,7 @@ describe RestClient::Request do
|
|
460
589
|
@request.transmit(@uri, 'req', nil)
|
461
590
|
end
|
462
591
|
|
463
|
-
it "
|
592
|
+
it "sets open_timeout" do
|
464
593
|
@request = RestClient::Request.new(:method => :put, :url => 'http://some/resource', :payload => 'payload', :open_timeout => 123)
|
465
594
|
@http.stub(:request)
|
466
595
|
@request.stub(:process_result)
|
@@ -471,8 +600,33 @@ describe RestClient::Request do
|
|
471
600
|
@request.transmit(@uri, 'req', nil)
|
472
601
|
end
|
473
602
|
|
603
|
+
it 'sets both timeouts with :timeout' do
|
604
|
+
@request = RestClient::Request.new(:method => :put, :url => 'http://some/resource', :payload => 'payload', :timeout => 123)
|
605
|
+
@http.stub(:request)
|
606
|
+
@request.stub(:process_result)
|
607
|
+
@request.stub(:response_log)
|
608
|
+
|
609
|
+
@net.should_receive(:open_timeout=).with(123)
|
610
|
+
@net.should_receive(:read_timeout=).with(123)
|
611
|
+
|
612
|
+
@request.transmit(@uri, 'req', nil)
|
613
|
+
end
|
614
|
+
|
615
|
+
it 'supersedes :timeout with open/read_timeout' do
|
616
|
+
@request = RestClient::Request.new(:method => :put, :url => 'http://some/resource', :payload => 'payload', :timeout => 123, :open_timeout => 34, :read_timeout => 56)
|
617
|
+
@http.stub(:request)
|
618
|
+
@request.stub(:process_result)
|
619
|
+
@request.stub(:response_log)
|
620
|
+
|
621
|
+
@net.should_receive(:open_timeout=).with(34)
|
622
|
+
@net.should_receive(:read_timeout=).with(56)
|
623
|
+
|
624
|
+
@request.transmit(@uri, 'req', nil)
|
625
|
+
end
|
626
|
+
|
627
|
+
|
474
628
|
it "disable timeout by setting it to nil" do
|
475
|
-
@request = RestClient::Request.new(:method => :put, :url => 'http://some/resource', :payload => 'payload', :
|
629
|
+
@request = RestClient::Request.new(:method => :put, :url => 'http://some/resource', :payload => 'payload', :read_timeout => nil, :open_timeout => nil)
|
476
630
|
@http.stub(:request)
|
477
631
|
@request.stub(:process_result)
|
478
632
|
@request.stub(:response_log)
|
@@ -483,8 +637,21 @@ describe RestClient::Request do
|
|
483
637
|
@request.transmit(@uri, 'req', nil)
|
484
638
|
end
|
485
639
|
|
640
|
+
it 'deprecated: warns when disabling timeout by setting it to -1' do
|
641
|
+
@request = RestClient::Request.new(:method => :put, :url => 'http://some/resource', :payload => 'payload', :read_timeout => -1)
|
642
|
+
@http.stub(:request)
|
643
|
+
@request.stub(:process_result)
|
644
|
+
@request.stub(:response_log)
|
645
|
+
|
646
|
+
@net.should_receive(:read_timeout=).with(nil)
|
647
|
+
|
648
|
+
fake_stderr {
|
649
|
+
@request.transmit(@uri, 'req', nil)
|
650
|
+
}.should match(/^Deprecated: .*timeout.* nil instead of -1$/)
|
651
|
+
end
|
652
|
+
|
486
653
|
it "deprecated: disable timeout by setting it to -1" do
|
487
|
-
@request = RestClient::Request.new(:method => :put, :url => 'http://some/resource', :payload => 'payload', :
|
654
|
+
@request = RestClient::Request.new(:method => :put, :url => 'http://some/resource', :payload => 'payload', :read_timeout => -1, :open_timeout => -1)
|
488
655
|
@http.stub(:request)
|
489
656
|
@request.stub(:process_result)
|
490
657
|
@request.stub(:response_log)
|
@@ -907,11 +1074,35 @@ describe RestClient::Request do
|
|
907
1074
|
tempfile.should_receive(:binmode)
|
908
1075
|
tempfile.stub(:open)
|
909
1076
|
tempfile.stub(:close)
|
910
|
-
Tempfile.should_receive(:new).with("rest-client").and_return(tempfile)
|
1077
|
+
Tempfile.should_receive(:new).with("rest-client.").and_return(tempfile)
|
911
1078
|
|
912
1079
|
net_http_res = Net::HTTPOK.new(nil, "200", "body")
|
913
1080
|
net_http_res.stub(:read_body).and_return("body")
|
914
1081
|
@request.fetch_body(net_http_res)
|
915
1082
|
end
|
916
1083
|
end
|
1084
|
+
|
1085
|
+
describe 'payloads' do
|
1086
|
+
it 'should accept string payloads' do
|
1087
|
+
payload = 'Foo'
|
1088
|
+
@request = RestClient::Request.new(method: :get, url: 'example.com', :payload => payload)
|
1089
|
+
@request.should_receive(:process_result)
|
1090
|
+
@http.should_receive(:request).with('req', payload)
|
1091
|
+
@request.transmit(@uri, 'req', payload)
|
1092
|
+
end
|
1093
|
+
|
1094
|
+
it 'should accept streaming IO payloads' do
|
1095
|
+
payload = StringIO.new('streamed')
|
1096
|
+
|
1097
|
+
@request = RestClient::Request.new(method: :get, url: 'example.com', :payload => payload)
|
1098
|
+
@request.should_receive(:process_result)
|
1099
|
+
|
1100
|
+
@get = double('net::http::get')
|
1101
|
+
@get.should_receive(:body_stream=).with(instance_of(RestClient::Payload::Streamed))
|
1102
|
+
|
1103
|
+
@request.net_http_request_class(:GET).stub(:new).and_return(@get)
|
1104
|
+
@http.should_receive(:request).with(@get, nil)
|
1105
|
+
@request.execute
|
1106
|
+
end
|
1107
|
+
end
|
917
1108
|
end
|