alinta-rest-client 2.2.0-x64-mingw32
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +9 -0
- data/.mailmap +10 -0
- data/.rspec +2 -0
- data/.rubocop +2 -0
- data/.rubocop-disables.yml +393 -0
- data/.rubocop.yml +8 -0
- data/.travis.yml +49 -0
- data/AUTHORS +106 -0
- data/Gemfile +11 -0
- data/LICENSE +21 -0
- data/README.md +896 -0
- data/Rakefile +140 -0
- data/bin/restclient +92 -0
- data/history.md +357 -0
- data/lib/rest-client.rb +2 -0
- data/lib/rest_client.rb +2 -0
- data/lib/restclient.rb +183 -0
- data/lib/restclient/abstract_response.rb +252 -0
- data/lib/restclient/exceptions.rb +244 -0
- data/lib/restclient/params_array.rb +72 -0
- data/lib/restclient/payload.rb +234 -0
- data/lib/restclient/platform.rb +49 -0
- data/lib/restclient/raw_response.rb +49 -0
- data/lib/restclient/request.rb +875 -0
- data/lib/restclient/resource.rb +178 -0
- data/lib/restclient/response.rb +90 -0
- data/lib/restclient/utils.rb +274 -0
- data/lib/restclient/version.rb +8 -0
- data/lib/restclient/windows.rb +8 -0
- data/lib/restclient/windows/root_certs.rb +105 -0
- data/rest-client.gemspec +32 -0
- data/rest-client.windows.gemspec +19 -0
- data/spec/ISS.jpg +0 -0
- data/spec/helpers.rb +54 -0
- data/spec/integration/_lib.rb +1 -0
- data/spec/integration/capath_digicert/244b5494.0 +19 -0
- data/spec/integration/capath_digicert/81b9768f.0 +19 -0
- data/spec/integration/capath_digicert/README +8 -0
- data/spec/integration/capath_digicert/digicert.crt +19 -0
- data/spec/integration/capath_verisign/415660c1.0 +14 -0
- data/spec/integration/capath_verisign/7651b327.0 +14 -0
- data/spec/integration/capath_verisign/README +8 -0
- data/spec/integration/capath_verisign/verisign.crt +14 -0
- data/spec/integration/certs/digicert.crt +19 -0
- data/spec/integration/certs/verisign.crt +14 -0
- data/spec/integration/httpbin_spec.rb +128 -0
- data/spec/integration/integration_spec.rb +118 -0
- data/spec/integration/request_spec.rb +127 -0
- data/spec/spec_helper.rb +29 -0
- data/spec/unit/_lib.rb +1 -0
- data/spec/unit/abstract_response_spec.rb +145 -0
- data/spec/unit/exceptions_spec.rb +108 -0
- data/spec/unit/params_array_spec.rb +36 -0
- data/spec/unit/payload_spec.rb +295 -0
- data/spec/unit/raw_response_spec.rb +22 -0
- data/spec/unit/request2_spec.rb +54 -0
- data/spec/unit/request_spec.rb +1238 -0
- data/spec/unit/resource_spec.rb +134 -0
- data/spec/unit/response_spec.rb +252 -0
- data/spec/unit/restclient_spec.rb +80 -0
- data/spec/unit/utils_spec.rb +147 -0
- data/spec/unit/windows/root_certs_spec.rb +22 -0
- metadata +318 -0
@@ -0,0 +1,118 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require_relative '_lib'
|
3
|
+
require 'base64'
|
4
|
+
|
5
|
+
describe RestClient do
|
6
|
+
|
7
|
+
it "a simple request" do
|
8
|
+
body = 'abc'
|
9
|
+
stub_request(:get, "www.example.com").to_return(:body => body, :status => 200)
|
10
|
+
response = RestClient.get "www.example.com"
|
11
|
+
expect(response.code).to eq 200
|
12
|
+
expect(response.body).to eq body
|
13
|
+
end
|
14
|
+
|
15
|
+
it "a 404" do
|
16
|
+
body = "Ho hai ! I'm not here !"
|
17
|
+
stub_request(:get, "www.example.com").to_return(:body => body, :status => 404)
|
18
|
+
begin
|
19
|
+
RestClient.get "www.example.com"
|
20
|
+
raise
|
21
|
+
rescue RestClient::ResourceNotFound => e
|
22
|
+
expect(e.http_code).to eq 404
|
23
|
+
expect(e.response.code).to eq 404
|
24
|
+
expect(e.response.body).to eq body
|
25
|
+
expect(e.http_body).to eq body
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe 'charset parsing' do
|
30
|
+
it 'handles utf-8' do
|
31
|
+
body = "λ".force_encoding('ASCII-8BIT')
|
32
|
+
stub_request(:get, "www.example.com").to_return(
|
33
|
+
:body => body, :status => 200, :headers => {
|
34
|
+
'Content-Type' => 'text/plain; charset=UTF-8'
|
35
|
+
})
|
36
|
+
response = RestClient.get "www.example.com"
|
37
|
+
expect(response.encoding).to eq Encoding::UTF_8
|
38
|
+
expect(response.valid_encoding?).to eq true
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'handles windows-1252' do
|
42
|
+
body = "\xff".force_encoding('ASCII-8BIT')
|
43
|
+
stub_request(:get, "www.example.com").to_return(
|
44
|
+
:body => body, :status => 200, :headers => {
|
45
|
+
'Content-Type' => 'text/plain; charset=windows-1252'
|
46
|
+
})
|
47
|
+
response = RestClient.get "www.example.com"
|
48
|
+
expect(response.encoding).to eq Encoding::WINDOWS_1252
|
49
|
+
expect(response.encode('utf-8')).to eq "ÿ"
|
50
|
+
expect(response.valid_encoding?).to eq true
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'handles binary' do
|
54
|
+
body = "\xfe".force_encoding('ASCII-8BIT')
|
55
|
+
stub_request(:get, "www.example.com").to_return(
|
56
|
+
:body => body, :status => 200, :headers => {
|
57
|
+
'Content-Type' => 'application/octet-stream; charset=binary'
|
58
|
+
})
|
59
|
+
response = RestClient.get "www.example.com"
|
60
|
+
expect(response.encoding).to eq Encoding::BINARY
|
61
|
+
expect {
|
62
|
+
response.encode('utf-8')
|
63
|
+
}.to raise_error(Encoding::UndefinedConversionError)
|
64
|
+
expect(response.valid_encoding?).to eq true
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'handles euc-jp' do
|
68
|
+
body = "\xA4\xA2\xA4\xA4\xA4\xA6\xA4\xA8\xA4\xAA".
|
69
|
+
force_encoding(Encoding::BINARY)
|
70
|
+
body_utf8 = 'あいうえお'
|
71
|
+
expect(body_utf8.encoding).to eq Encoding::UTF_8
|
72
|
+
|
73
|
+
stub_request(:get, 'www.example.com').to_return(
|
74
|
+
:body => body, :status => 200, :headers => {
|
75
|
+
'Content-Type' => 'text/plain; charset=EUC-JP'
|
76
|
+
})
|
77
|
+
response = RestClient.get 'www.example.com'
|
78
|
+
expect(response.encoding).to eq Encoding::EUC_JP
|
79
|
+
expect(response.valid_encoding?).to eq true
|
80
|
+
expect(response.length).to eq 5
|
81
|
+
expect(response.encode('utf-8')).to eq body_utf8
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'defaults to the default encoding' do
|
85
|
+
stub_request(:get, 'www.example.com').to_return(
|
86
|
+
body: 'abc', status: 200, headers: {
|
87
|
+
'Content-Type' => 'text/plain'
|
88
|
+
})
|
89
|
+
|
90
|
+
response = RestClient.get 'www.example.com'
|
91
|
+
# expect(response.encoding).to eq Encoding.default_external
|
92
|
+
expect(response.encoding).to eq Encoding::UTF_8
|
93
|
+
end
|
94
|
+
|
95
|
+
it 'handles invalid encoding' do
|
96
|
+
stub_request(:get, 'www.example.com').to_return(
|
97
|
+
body: 'abc', status: 200, headers: {
|
98
|
+
'Content-Type' => 'text; charset=plain'
|
99
|
+
})
|
100
|
+
|
101
|
+
response = RestClient.get 'www.example.com'
|
102
|
+
# expect(response.encoding).to eq Encoding.default_external
|
103
|
+
expect(response.encoding).to eq Encoding::UTF_8
|
104
|
+
end
|
105
|
+
|
106
|
+
it 'leaves images as binary' do
|
107
|
+
gif = Base64.strict_decode64('R0lGODlhAQABAAAAADs=')
|
108
|
+
|
109
|
+
stub_request(:get, 'www.example.com').to_return(
|
110
|
+
body: gif, status: 200, headers: {
|
111
|
+
'Content-Type' => 'image/gif'
|
112
|
+
})
|
113
|
+
|
114
|
+
response = RestClient.get 'www.example.com'
|
115
|
+
expect(response.encoding).to eq Encoding::BINARY
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
@@ -0,0 +1,127 @@
|
|
1
|
+
require_relative '_lib'
|
2
|
+
|
3
|
+
describe RestClient::Request do
|
4
|
+
before(:all) do
|
5
|
+
WebMock.disable!
|
6
|
+
end
|
7
|
+
|
8
|
+
after(:all) do
|
9
|
+
WebMock.enable!
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "ssl verification" do
|
13
|
+
it "is successful with the correct ca_file" do
|
14
|
+
request = RestClient::Request.new(
|
15
|
+
:method => :get,
|
16
|
+
:url => 'https://www.mozilla.org',
|
17
|
+
:ssl_ca_file => File.join(File.dirname(__FILE__), "certs", "digicert.crt")
|
18
|
+
)
|
19
|
+
expect { request.execute }.to_not raise_error
|
20
|
+
end
|
21
|
+
|
22
|
+
it "is successful with the correct ca_path" do
|
23
|
+
request = RestClient::Request.new(
|
24
|
+
:method => :get,
|
25
|
+
:url => 'https://www.mozilla.org',
|
26
|
+
:ssl_ca_path => File.join(File.dirname(__FILE__), "capath_digicert")
|
27
|
+
)
|
28
|
+
expect { request.execute }.to_not raise_error
|
29
|
+
end
|
30
|
+
|
31
|
+
# TODO: deprecate and remove RestClient::SSLCertificateNotVerified and just
|
32
|
+
# pass through OpenSSL::SSL::SSLError directly. See note in
|
33
|
+
# lib/restclient/request.rb.
|
34
|
+
#
|
35
|
+
# On OS X, this test fails since Apple has patched OpenSSL to always fall
|
36
|
+
# back on the system CA store.
|
37
|
+
it "is unsuccessful with an incorrect ca_file", :unless => RestClient::Platform.mac_mri? do
|
38
|
+
request = RestClient::Request.new(
|
39
|
+
:method => :get,
|
40
|
+
:url => 'https://www.mozilla.org',
|
41
|
+
:ssl_ca_file => File.join(File.dirname(__FILE__), "certs", "verisign.crt")
|
42
|
+
)
|
43
|
+
expect { request.execute }.to raise_error(RestClient::SSLCertificateNotVerified)
|
44
|
+
end
|
45
|
+
|
46
|
+
# On OS X, this test fails since Apple has patched OpenSSL to always fall
|
47
|
+
# back on the system CA store.
|
48
|
+
it "is unsuccessful with an incorrect ca_path", :unless => RestClient::Platform.mac_mri? do
|
49
|
+
request = RestClient::Request.new(
|
50
|
+
:method => :get,
|
51
|
+
:url => 'https://www.mozilla.org',
|
52
|
+
:ssl_ca_path => File.join(File.dirname(__FILE__), "capath_verisign")
|
53
|
+
)
|
54
|
+
expect { request.execute }.to raise_error(RestClient::SSLCertificateNotVerified)
|
55
|
+
end
|
56
|
+
|
57
|
+
it "is successful using the default system cert store" do
|
58
|
+
request = RestClient::Request.new(
|
59
|
+
:method => :get,
|
60
|
+
:url => 'https://www.mozilla.org',
|
61
|
+
:verify_ssl => true,
|
62
|
+
)
|
63
|
+
expect {request.execute }.to_not raise_error
|
64
|
+
end
|
65
|
+
|
66
|
+
it "executes the verify_callback" do
|
67
|
+
ran_callback = false
|
68
|
+
request = RestClient::Request.new(
|
69
|
+
:method => :get,
|
70
|
+
:url => 'https://www.mozilla.org',
|
71
|
+
:verify_ssl => true,
|
72
|
+
:ssl_verify_callback => lambda { |preverify_ok, store_ctx|
|
73
|
+
ran_callback = true
|
74
|
+
preverify_ok
|
75
|
+
},
|
76
|
+
)
|
77
|
+
expect {request.execute }.to_not raise_error
|
78
|
+
expect(ran_callback).to eq(true)
|
79
|
+
end
|
80
|
+
|
81
|
+
it "fails verification when the callback returns false",
|
82
|
+
:unless => RestClient::Platform.mac_mri? do
|
83
|
+
request = RestClient::Request.new(
|
84
|
+
:method => :get,
|
85
|
+
:url => 'https://www.mozilla.org',
|
86
|
+
:verify_ssl => true,
|
87
|
+
:ssl_verify_callback => lambda { |preverify_ok, store_ctx| false },
|
88
|
+
)
|
89
|
+
expect { request.execute }.to raise_error(RestClient::SSLCertificateNotVerified)
|
90
|
+
end
|
91
|
+
|
92
|
+
it "succeeds verification when the callback returns true",
|
93
|
+
:unless => RestClient::Platform.mac_mri? do
|
94
|
+
request = RestClient::Request.new(
|
95
|
+
:method => :get,
|
96
|
+
:url => 'https://www.mozilla.org',
|
97
|
+
:verify_ssl => true,
|
98
|
+
:ssl_ca_file => File.join(File.dirname(__FILE__), "certs", "verisign.crt"),
|
99
|
+
:ssl_verify_callback => lambda { |preverify_ok, store_ctx| true },
|
100
|
+
)
|
101
|
+
expect { request.execute }.to_not raise_error
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
describe "timeouts" do
|
106
|
+
it "raises OpenTimeout when it hits an open timeout" do
|
107
|
+
request = RestClient::Request.new(
|
108
|
+
:method => :get,
|
109
|
+
:url => 'http://www.mozilla.org',
|
110
|
+
:open_timeout => 1e-10,
|
111
|
+
)
|
112
|
+
expect { request.execute }.to(
|
113
|
+
raise_error(RestClient::Exceptions::OpenTimeout))
|
114
|
+
end
|
115
|
+
|
116
|
+
it "raises ReadTimeout when it hits a read timeout via :read_timeout" do
|
117
|
+
request = RestClient::Request.new(
|
118
|
+
:method => :get,
|
119
|
+
:url => 'https://www.mozilla.org',
|
120
|
+
:read_timeout => 1e-10,
|
121
|
+
)
|
122
|
+
expect { request.execute }.to(
|
123
|
+
raise_error(RestClient::Exceptions::ReadTimeout))
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'webmock/rspec'
|
2
|
+
require 'rest-client'
|
3
|
+
|
4
|
+
require_relative './helpers'
|
5
|
+
|
6
|
+
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
|
7
|
+
RSpec.configure do |config|
|
8
|
+
config.raise_errors_for_deprecations!
|
9
|
+
|
10
|
+
# Run specs in random order to surface order dependencies. If you find an
|
11
|
+
# order dependency and want to debug it, you can fix the order by providing
|
12
|
+
# the seed, which is printed after each run.
|
13
|
+
# --seed 1234
|
14
|
+
config.order = 'random'
|
15
|
+
|
16
|
+
# always run with ruby warnings enabled
|
17
|
+
# TODO: figure out why this is so obscenely noisy (rspec bug?)
|
18
|
+
# config.warnings = true
|
19
|
+
|
20
|
+
# add helpers
|
21
|
+
config.include Helpers, :include_helpers
|
22
|
+
|
23
|
+
config.mock_with :rspec do |mocks|
|
24
|
+
mocks.yield_receiver_to_any_instance_implementation_blocks = true
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# always run with ruby warnings enabled (see above)
|
29
|
+
$VERBOSE = true
|
data/spec/unit/_lib.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require_relative '../spec_helper'
|
@@ -0,0 +1,145 @@
|
|
1
|
+
require_relative '_lib'
|
2
|
+
|
3
|
+
describe RestClient::AbstractResponse, :include_helpers do
|
4
|
+
|
5
|
+
# Sample class implementing AbstractResponse used for testing.
|
6
|
+
class MyAbstractResponse
|
7
|
+
|
8
|
+
include RestClient::AbstractResponse
|
9
|
+
|
10
|
+
attr_accessor :size
|
11
|
+
|
12
|
+
def initialize(net_http_res, request)
|
13
|
+
response_set_vars(net_http_res, request, Time.now - 1)
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
before do
|
19
|
+
@net_http_res = res_double()
|
20
|
+
@request = request_double(url: 'http://example.com', method: 'get')
|
21
|
+
@response = MyAbstractResponse.new(@net_http_res, @request)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "fetches the numeric response code" do
|
25
|
+
expect(@net_http_res).to receive(:code).and_return('200')
|
26
|
+
expect(@response.code).to eq 200
|
27
|
+
end
|
28
|
+
|
29
|
+
it "has a nice description" do
|
30
|
+
expect(@net_http_res).to receive(:to_hash).and_return({'Content-Type' => ['application/pdf']})
|
31
|
+
expect(@net_http_res).to receive(:code).and_return('200')
|
32
|
+
expect(@response.description).to eq "200 OK | application/pdf bytes\n"
|
33
|
+
end
|
34
|
+
|
35
|
+
describe '.beautify_headers' do
|
36
|
+
it "beautifies the headers by turning the keys to symbols" do
|
37
|
+
h = RestClient::AbstractResponse.beautify_headers('content-type' => [ 'x' ])
|
38
|
+
expect(h.keys.first).to eq :content_type
|
39
|
+
end
|
40
|
+
|
41
|
+
it "beautifies the headers by turning the values to strings instead of one-element arrays" do
|
42
|
+
h = RestClient::AbstractResponse.beautify_headers('x' => [ 'text/html' ] )
|
43
|
+
expect(h.values.first).to eq 'text/html'
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'joins multiple header values by comma' do
|
47
|
+
expect(RestClient::AbstractResponse.beautify_headers(
|
48
|
+
{'My-Header' => ['one', 'two']}
|
49
|
+
)).to eq({:my_header => 'one, two'})
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'leaves set-cookie headers as array' do
|
53
|
+
expect(RestClient::AbstractResponse.beautify_headers(
|
54
|
+
{'Set-Cookie' => ['cookie1=foo', 'cookie2=bar']}
|
55
|
+
)).to eq({:set_cookie => ['cookie1=foo', 'cookie2=bar']})
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
it "fetches the headers" do
|
60
|
+
expect(@net_http_res).to receive(:to_hash).and_return('content-type' => [ 'text/html' ])
|
61
|
+
expect(@response.headers).to eq({ :content_type => 'text/html' })
|
62
|
+
end
|
63
|
+
|
64
|
+
it "extracts cookies from response headers" do
|
65
|
+
expect(@net_http_res).to receive(:to_hash).and_return('set-cookie' => ['session_id=1; path=/'])
|
66
|
+
expect(@response.cookies).to eq({ 'session_id' => '1' })
|
67
|
+
end
|
68
|
+
|
69
|
+
it "extract strange cookies" do
|
70
|
+
expect(@net_http_res).to receive(:to_hash).and_return('set-cookie' => ['session_id=ZJ/HQVH6YE+rVkTpn0zvTQ==; path=/'])
|
71
|
+
expect(@response.headers).to eq({:set_cookie => ['session_id=ZJ/HQVH6YE+rVkTpn0zvTQ==; path=/']})
|
72
|
+
expect(@response.cookies).to eq({ 'session_id' => 'ZJ/HQVH6YE+rVkTpn0zvTQ==' })
|
73
|
+
end
|
74
|
+
|
75
|
+
it "doesn't escape cookies" do
|
76
|
+
expect(@net_http_res).to receive(:to_hash).and_return('set-cookie' => ['session_id=BAh7BzoNYXBwX25hbWUiEGFwcGxpY2F0aW9uOgpsb2dpbiIKYWRtaW4%3D%0A--08114ba654f17c04d20dcc5228ec672508f738ca; path=/'])
|
77
|
+
expect(@response.cookies).to eq({ 'session_id' => 'BAh7BzoNYXBwX25hbWUiEGFwcGxpY2F0aW9uOgpsb2dpbiIKYWRtaW4%3D%0A--08114ba654f17c04d20dcc5228ec672508f738ca' })
|
78
|
+
end
|
79
|
+
|
80
|
+
describe '.cookie_jar' do
|
81
|
+
it 'extracts cookies into cookie jar' do
|
82
|
+
expect(@net_http_res).to receive(:to_hash).and_return('set-cookie' => ['session_id=1; path=/'])
|
83
|
+
expect(@response.cookie_jar).to be_a HTTP::CookieJar
|
84
|
+
|
85
|
+
cookie = @response.cookie_jar.cookies.first
|
86
|
+
expect(cookie.domain).to eq 'example.com'
|
87
|
+
expect(cookie.name).to eq 'session_id'
|
88
|
+
expect(cookie.value).to eq '1'
|
89
|
+
expect(cookie.path).to eq '/'
|
90
|
+
end
|
91
|
+
|
92
|
+
it 'handles cookies when URI scheme is implicit' do
|
93
|
+
net_http_res = double('net http response')
|
94
|
+
expect(net_http_res).to receive(:to_hash).and_return('set-cookie' => ['session_id=1; path=/'])
|
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
|
+
response = MyAbstractResponse.new(net_http_res, request)
|
98
|
+
expect(response.cookie_jar).to be_a HTTP::CookieJar
|
99
|
+
|
100
|
+
cookie = response.cookie_jar.cookies.first
|
101
|
+
expect(cookie.domain).to eq 'example.com'
|
102
|
+
expect(cookie.name).to eq 'session_id'
|
103
|
+
expect(cookie.value).to eq '1'
|
104
|
+
expect(cookie.path).to eq '/'
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
it "can access the net http result directly" do
|
109
|
+
expect(@response.net_http_res).to eq @net_http_res
|
110
|
+
end
|
111
|
+
|
112
|
+
describe "#return!" do
|
113
|
+
it "should return the response itself on 200-codes" do
|
114
|
+
expect(@net_http_res).to receive(:code).and_return('200')
|
115
|
+
expect(@response.return!).to be_equal(@response)
|
116
|
+
end
|
117
|
+
|
118
|
+
it "should raise RequestFailed on unknown codes" do
|
119
|
+
expect(@net_http_res).to receive(:code).and_return('1000')
|
120
|
+
expect { @response.return! }.to raise_error RestClient::RequestFailed
|
121
|
+
end
|
122
|
+
|
123
|
+
it "should raise an error on a redirection after non-GET/HEAD requests" do
|
124
|
+
expect(@net_http_res).to receive(:code).and_return('301')
|
125
|
+
expect(@request).to receive(:method).and_return('put')
|
126
|
+
expect(@response).not_to receive(:follow_redirection)
|
127
|
+
expect { @response.return! }.to raise_error RestClient::RequestFailed
|
128
|
+
end
|
129
|
+
|
130
|
+
it "should follow 302 redirect" do
|
131
|
+
expect(@net_http_res).to receive(:code).and_return('302')
|
132
|
+
expect(@response).to receive(:check_max_redirects).and_return('fake-check')
|
133
|
+
expect(@response).to receive(:follow_redirection).and_return('fake-redirection')
|
134
|
+
expect(@response.return!).to eq 'fake-redirection'
|
135
|
+
end
|
136
|
+
|
137
|
+
it "should gracefully handle 302 redirect with no location header" do
|
138
|
+
@net_http_res = res_double(code: 302)
|
139
|
+
@request = request_double()
|
140
|
+
@response = MyAbstractResponse.new(@net_http_res, @request)
|
141
|
+
expect(@response).to receive(:check_max_redirects).and_return('fake-check')
|
142
|
+
expect { @response.return! }.to raise_error RestClient::Found
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
require_relative '_lib'
|
2
|
+
|
3
|
+
describe RestClient::Exception do
|
4
|
+
it "returns a 'message' equal to the class name if the message is not set, because 'message' should not be nil" do
|
5
|
+
e = RestClient::Exception.new
|
6
|
+
expect(e.message).to eq "RestClient::Exception"
|
7
|
+
end
|
8
|
+
|
9
|
+
it "returns the 'message' that was set" do
|
10
|
+
e = RestClient::Exception.new
|
11
|
+
message = "An explicitly set message"
|
12
|
+
e.message = message
|
13
|
+
expect(e.message).to eq message
|
14
|
+
end
|
15
|
+
|
16
|
+
it "sets the exception message to ErrorMessage" do
|
17
|
+
expect(RestClient::ResourceNotFound.new.message).to eq 'Not Found'
|
18
|
+
end
|
19
|
+
|
20
|
+
it "contains exceptions in RestClient" do
|
21
|
+
expect(RestClient::Unauthorized.new).to be_a_kind_of(RestClient::Exception)
|
22
|
+
expect(RestClient::ServerBrokeConnection.new).to be_a_kind_of(RestClient::Exception)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe RestClient::ServerBrokeConnection do
|
27
|
+
it "should have a default message of 'Server broke connection'" do
|
28
|
+
e = RestClient::ServerBrokeConnection.new
|
29
|
+
expect(e.message).to eq 'Server broke connection'
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe RestClient::RequestFailed do
|
34
|
+
before do
|
35
|
+
@response = double('HTTP Response', :code => '502')
|
36
|
+
end
|
37
|
+
|
38
|
+
it "stores the http response on the exception" do
|
39
|
+
response = "response"
|
40
|
+
begin
|
41
|
+
raise RestClient::RequestFailed, response
|
42
|
+
rescue RestClient::RequestFailed => e
|
43
|
+
expect(e.response).to eq response
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
it "http_code convenience method for fetching the code as an integer" do
|
48
|
+
expect(RestClient::RequestFailed.new(@response).http_code).to eq 502
|
49
|
+
end
|
50
|
+
|
51
|
+
it "http_body convenience method for fetching the body (decoding when necessary)" do
|
52
|
+
expect(RestClient::RequestFailed.new(@response).http_code).to eq 502
|
53
|
+
expect(RestClient::RequestFailed.new(@response).message).to eq 'HTTP status code 502'
|
54
|
+
end
|
55
|
+
|
56
|
+
it "shows the status code in the message" do
|
57
|
+
expect(RestClient::RequestFailed.new(@response).to_s).to match(/502/)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
describe RestClient::ResourceNotFound do
|
62
|
+
it "also has the http response attached" do
|
63
|
+
response = "response"
|
64
|
+
begin
|
65
|
+
raise RestClient::ResourceNotFound, response
|
66
|
+
rescue RestClient::ResourceNotFound => e
|
67
|
+
expect(e.response).to eq response
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
it 'stores the body on the response of the exception' do
|
72
|
+
body = "body"
|
73
|
+
stub_request(:get, "www.example.com").to_return(:body => body, :status => 404)
|
74
|
+
begin
|
75
|
+
RestClient.get "www.example.com"
|
76
|
+
raise
|
77
|
+
rescue RestClient::ResourceNotFound => e
|
78
|
+
expect(e.response.body).to eq body
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
describe "backwards compatibility" do
|
84
|
+
it 'aliases RestClient::NotFound as ResourceNotFound' do
|
85
|
+
expect(RestClient::ResourceNotFound).to eq RestClient::NotFound
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'aliases old names for HTTP 413, 414, 416' do
|
89
|
+
expect(RestClient::RequestEntityTooLarge).to eq RestClient::PayloadTooLarge
|
90
|
+
expect(RestClient::RequestURITooLong).to eq RestClient::URITooLong
|
91
|
+
expect(RestClient::RequestedRangeNotSatisfiable).to eq RestClient::RangeNotSatisfiable
|
92
|
+
end
|
93
|
+
|
94
|
+
it 'subclasses NotFound from RequestFailed, ExceptionWithResponse' do
|
95
|
+
expect(RestClient::NotFound).to be < RestClient::RequestFailed
|
96
|
+
expect(RestClient::NotFound).to be < RestClient::ExceptionWithResponse
|
97
|
+
end
|
98
|
+
|
99
|
+
it 'subclasses timeout from RestClient::RequestTimeout, RequestFailed, EWR' do
|
100
|
+
expect(RestClient::Exceptions::OpenTimeout).to be < RestClient::Exceptions::Timeout
|
101
|
+
expect(RestClient::Exceptions::ReadTimeout).to be < RestClient::Exceptions::Timeout
|
102
|
+
|
103
|
+
expect(RestClient::Exceptions::Timeout).to be < RestClient::RequestTimeout
|
104
|
+
expect(RestClient::Exceptions::Timeout).to be < RestClient::RequestFailed
|
105
|
+
expect(RestClient::Exceptions::Timeout).to be < RestClient::ExceptionWithResponse
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|