rest-client 1.6.14 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +6 -6
  3. data/.rspec +2 -1
  4. data/.rubocop-disables.yml +384 -0
  5. data/.rubocop.yml +3 -0
  6. data/.travis.yml +46 -1
  7. data/AUTHORS +28 -5
  8. data/Gemfile +5 -1
  9. data/LICENSE +21 -0
  10. data/README.md +784 -0
  11. data/Rakefile +95 -12
  12. data/bin/restclient +11 -12
  13. data/history.md +180 -16
  14. data/lib/restclient.rb +25 -11
  15. data/lib/restclient/abstract_response.rb +171 -51
  16. data/lib/restclient/exceptions.rb +102 -56
  17. data/lib/restclient/params_array.rb +72 -0
  18. data/lib/restclient/payload.rb +43 -74
  19. data/lib/restclient/platform.rb +22 -2
  20. data/lib/restclient/raw_response.rb +7 -3
  21. data/lib/restclient/request.rb +672 -179
  22. data/lib/restclient/resource.rb +6 -7
  23. data/lib/restclient/response.rb +64 -10
  24. data/lib/restclient/utils.rb +235 -0
  25. data/lib/restclient/version.rb +2 -1
  26. data/lib/restclient/windows.rb +8 -0
  27. data/lib/restclient/windows/root_certs.rb +105 -0
  28. data/rest-client.gemspec +16 -11
  29. data/rest-client.windows.gemspec +19 -0
  30. data/spec/helpers.rb +22 -0
  31. data/spec/integration/_lib.rb +1 -0
  32. data/spec/integration/capath_verisign/415660c1.0 +14 -0
  33. data/spec/integration/capath_verisign/7651b327.0 +14 -0
  34. data/spec/integration/capath_verisign/README +8 -0
  35. data/spec/integration/capath_verisign/verisign.crt +14 -0
  36. data/spec/integration/httpbin_spec.rb +87 -0
  37. data/spec/integration/integration_spec.rb +125 -0
  38. data/spec/integration/request_spec.rb +72 -20
  39. data/spec/spec_helper.rb +29 -0
  40. data/spec/unit/_lib.rb +1 -0
  41. data/spec/unit/abstract_response_spec.rb +145 -0
  42. data/spec/unit/exceptions_spec.rb +108 -0
  43. data/spec/{master_shake.jpg → unit/master_shake.jpg} +0 -0
  44. data/spec/unit/params_array_spec.rb +36 -0
  45. data/spec/{payload_spec.rb → unit/payload_spec.rb} +73 -54
  46. data/spec/{raw_response_spec.rb → unit/raw_response_spec.rb} +5 -4
  47. data/spec/unit/request2_spec.rb +54 -0
  48. data/spec/unit/request_spec.rb +1250 -0
  49. data/spec/unit/resource_spec.rb +134 -0
  50. data/spec/unit/response_spec.rb +241 -0
  51. data/spec/unit/restclient_spec.rb +79 -0
  52. data/spec/unit/utils_spec.rb +147 -0
  53. data/spec/unit/windows/root_certs_spec.rb +22 -0
  54. metadata +143 -53
  55. data/README.rdoc +0 -300
  56. data/lib/restclient/net_http_ext.rb +0 -55
  57. data/spec/abstract_response_spec.rb +0 -85
  58. data/spec/base.rb +0 -13
  59. data/spec/exceptions_spec.rb +0 -98
  60. data/spec/integration_spec.rb +0 -38
  61. data/spec/request2_spec.rb +0 -35
  62. data/spec/request_spec.rb +0 -528
  63. data/spec/resource_spec.rb +0 -136
  64. data/spec/response_spec.rb +0 -169
  65. data/spec/restclient_spec.rb +0 -73
@@ -1,98 +0,0 @@
1
- require File.join( File.dirname(File.expand_path(__FILE__)), 'base')
2
-
3
- require 'webmock/rspec'
4
- include WebMock::API
5
-
6
- describe RestClient::Exception do
7
- it "returns a 'message' equal to the class name if the message is not set, because 'message' should not be nil" do
8
- e = RestClient::Exception.new
9
- e.message.should eq "RestClient::Exception"
10
- end
11
-
12
- it "returns the 'message' that was set" do
13
- e = RestClient::Exception.new
14
- message = "An explicitly set message"
15
- e.message = message
16
- e.message.should eq message
17
- end
18
-
19
- it "sets the exception message to ErrorMessage" do
20
- RestClient::ResourceNotFound.new.message.should eq 'Resource Not Found'
21
- end
22
-
23
- it "contains exceptions in RestClient" do
24
- RestClient::Unauthorized.new.should be_a_kind_of(RestClient::Exception)
25
- RestClient::ServerBrokeConnection.new.should be_a_kind_of(RestClient::Exception)
26
- end
27
- end
28
-
29
- describe RestClient::ServerBrokeConnection do
30
- it "should have a default message of 'Server broke connection'" do
31
- e = RestClient::ServerBrokeConnection.new
32
- e.message.should eq 'Server broke connection'
33
- end
34
- end
35
-
36
- describe RestClient::RequestFailed do
37
- before do
38
- @response = double('HTTP Response', :code => '502')
39
- end
40
-
41
- it "stores the http response on the exception" do
42
- response = "response"
43
- begin
44
- raise RestClient::RequestFailed, response
45
- rescue RestClient::RequestFailed => e
46
- e.response.should eq response
47
- end
48
- end
49
-
50
- it "http_code convenience method for fetching the code as an integer" do
51
- RestClient::RequestFailed.new(@response).http_code.should eq 502
52
- end
53
-
54
- it "http_body convenience method for fetching the body (decoding when necessary)" do
55
- RestClient::RequestFailed.new(@response).http_code.should eq 502
56
- RestClient::RequestFailed.new(@response).message.should eq 'HTTP status code 502'
57
- end
58
-
59
- it "shows the status code in the message" do
60
- RestClient::RequestFailed.new(@response).to_s.should match(/502/)
61
- end
62
- end
63
-
64
- describe RestClient::ResourceNotFound do
65
- it "also has the http response attached" do
66
- response = "response"
67
- begin
68
- raise RestClient::ResourceNotFound, response
69
- rescue RestClient::ResourceNotFound => e
70
- e.response.should eq response
71
- end
72
- end
73
- end
74
-
75
- describe "backwards compatibility" do
76
- it "alias RestClient::Request::Redirect to RestClient::Redirect" do
77
- RestClient::Request::Redirect.should eq RestClient::Redirect
78
- end
79
-
80
- it "alias RestClient::Request::Unauthorized to RestClient::Unauthorized" do
81
- RestClient::Request::Unauthorized.should eq RestClient::Unauthorized
82
- end
83
-
84
- it "alias RestClient::Request::RequestFailed to RestClient::RequestFailed" do
85
- RestClient::Request::RequestFailed.should eq RestClient::RequestFailed
86
- end
87
-
88
- it "make the exception's response act like an Net::HTTPResponse" do
89
- body = "body"
90
- stub_request(:get, "www.example.com").to_return(:body => body, :status => 404)
91
- begin
92
- RestClient.get "www.example.com"
93
- raise
94
- rescue RestClient::ResourceNotFound => e
95
- e.response.body.should eq body
96
- end
97
- end
98
- end
@@ -1,38 +0,0 @@
1
- require File.join( File.dirname(File.expand_path(__FILE__)), 'base')
2
-
3
- require 'webmock/rspec'
4
- include WebMock::API
5
-
6
- describe RestClient do
7
-
8
- it "a simple request" do
9
- body = 'abc'
10
- stub_request(:get, "www.example.com").to_return(:body => body, :status => 200)
11
- response = RestClient.get "www.example.com"
12
- response.code.should eq 200
13
- response.body.should eq body
14
- end
15
-
16
- it "a simple request with gzipped content" do
17
- 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' } )
18
- response = RestClient.get "www.example.com"
19
- response.code.should eq 200
20
- response.body.should eq "i'm gziped\n"
21
- end
22
-
23
- it "a 404" do
24
- body = "Ho hai ! I'm not here !"
25
- stub_request(:get, "www.example.com").to_return(:body => body, :status => 404)
26
- begin
27
- RestClient.get "www.example.com"
28
- raise
29
- rescue RestClient::ResourceNotFound => e
30
- e.http_code.should eq 404
31
- e.response.code.should eq 404
32
- e.response.body.should eq body
33
- e.http_body.should eq body
34
- end
35
- end
36
-
37
-
38
- end
@@ -1,35 +0,0 @@
1
- require File.join( File.dirname(File.expand_path(__FILE__)), 'base')
2
-
3
- require 'webmock/rspec'
4
- include WebMock::API
5
-
6
- describe RestClient::Request do
7
-
8
- it "manage params for get requests" do
9
- stub_request(:get, 'http://some/resource?a=b&c=d').with(:headers => {'Accept'=>'*/*; q=0.5, application/xml', 'Accept-Encoding'=>'gzip, deflate', 'Foo'=>'bar'}).to_return(:body => 'foo', :status => 200)
10
- RestClient::Request.execute(:url => 'http://some/resource', :method => :get, :headers => {:foo => :bar, :params => {:a => :b, 'c' => 'd'}}).body.should eq 'foo'
11
-
12
- stub_request(:get, 'http://some/resource').with(:headers => {'Accept'=>'*/*; q=0.5, application/xml', 'Accept-Encoding'=>'gzip, deflate', 'Foo'=>'bar', 'params' => 'a'}).to_return(:body => 'foo', :status => 200)
13
- RestClient::Request.execute(:url => 'http://some/resource', :method => :get, :headers => {:foo => :bar, :params => :a}).body.should eq 'foo'
14
- end
15
-
16
- it "can use a block to process response" do
17
- response_value = nil
18
- block = Proc.new do |http_response|
19
- response_value = http_response.body
20
- end
21
- stub_request(:get, 'http://some/resource?a=b&c=d').with(:headers => {'Accept'=>'*/*; q=0.5, application/xml', 'Accept-Encoding'=>'gzip, deflate', 'Foo'=>'bar'}).to_return(:body => 'foo', :status => 200)
22
- RestClient::Request.execute(:url => 'http://some/resource', :method => :get, :headers => {:foo => :bar, :params => {:a => :b, 'c' => 'd'}}, :block_response => block)
23
- response_value.should eq "foo"
24
- end
25
-
26
- it 'closes payload if not nil' do
27
- test_file = File.new(File.join( File.dirname(File.expand_path(__FILE__)), 'master_shake.jpg'))
28
-
29
- stub_request(:post, 'http://some/resource').with(:headers => {'Accept'=>'*/*; q=0.5, application/xml', 'Accept-Encoding'=>'gzip, deflate'}).to_return(:body => 'foo', :status => 200)
30
- RestClient::Request.execute(:url => 'http://some/resource', :method => :post, :payload => {:file => test_file})
31
-
32
- test_file.closed?.should be_true
33
- end
34
-
35
- end
@@ -1,528 +0,0 @@
1
- require File.join( File.dirname(File.expand_path(__FILE__)), 'base')
2
-
3
- require 'webmock/rspec'
4
- include WebMock::API
5
-
6
- describe RestClient::Request do
7
- before do
8
- @request = RestClient::Request.new(:method => :put, :url => 'http://some/resource', :payload => 'payload')
9
-
10
- @uri = double("uri")
11
- @uri.stub(:request_uri).and_return('/resource')
12
- @uri.stub(:host).and_return('some')
13
- @uri.stub(:port).and_return(80)
14
-
15
- @net = double("net::http base")
16
- @http = double("net::http connection")
17
- Net::HTTP.stub(:new).and_return(@net)
18
- @net.stub(:start).and_yield(@http)
19
- @net.stub(:use_ssl=)
20
- @net.stub(:verify_mode=)
21
- RestClient.log = nil
22
- end
23
-
24
- it "accept */* mimetype, preferring xml" do
25
- @request.default_headers[:accept].should eq '*/*; q=0.5, application/xml'
26
- end
27
-
28
- describe "compression" do
29
-
30
- it "decodes an uncompressed result body by passing it straight through" do
31
- RestClient::Request.decode(nil, 'xyz').should eq 'xyz'
32
- end
33
-
34
- it "doesn't fail for nil bodies" do
35
- RestClient::Request.decode('gzip', nil).should be_nil
36
- end
37
-
38
-
39
- it "decodes a gzip body" do
40
- 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").should eq "i'm gziped\n"
41
- end
42
-
43
- it "ingores gzip for empty bodies" do
44
- RestClient::Request.decode('gzip', '').should be_empty
45
- end
46
-
47
- it "decodes a deflated body" do
48
- RestClient::Request.decode('deflate', "x\234+\316\317MUHIM\313I,IMQ(I\255(\001\000A\223\006\363").should eq "some deflated text"
49
- end
50
- end
51
-
52
- it "processes a successful result" do
53
- res = double("result")
54
- res.stub(:code).and_return("200")
55
- res.stub(:body).and_return('body')
56
- res.stub(:[]).with('content-encoding').and_return(nil)
57
- @request.process_result(res).body.should eq 'body'
58
- @request.process_result(res).to_s.should eq 'body'
59
- end
60
-
61
- it "doesn't classify successful requests as failed" do
62
- 203.upto(207) do |code|
63
- res = double("result")
64
- res.stub(:code).and_return(code.to_s)
65
- res.stub(:body).and_return("")
66
- res.stub(:[]).with('content-encoding').and_return(nil)
67
- @request.process_result(res).should be_empty
68
- end
69
- end
70
-
71
- it "parses a url into a URI object" do
72
- URI.should_receive(:parse).with('http://example.com/resource')
73
- @request.parse_url('http://example.com/resource')
74
- end
75
-
76
- it "adds http:// to the front of resources specified in the syntax example.com/resource" do
77
- URI.should_receive(:parse).with('http://example.com/resource')
78
- @request.parse_url('example.com/resource')
79
- end
80
-
81
- describe "user - password" do
82
- it "extracts the username and password when parsing http://user:password@example.com/" do
83
- URI.stub(:parse).and_return(double('uri', :user => 'joe', :password => 'pass1'))
84
- @request.parse_url_with_auth('http://joe:pass1@example.com/resource')
85
- @request.user.should eq 'joe'
86
- @request.password.should eq 'pass1'
87
- end
88
-
89
- it "extracts with escaping the username and password when parsing http://user:password@example.com/" do
90
- URI.stub(:parse).and_return(double('uri', :user => 'joe%20', :password => 'pass1'))
91
- @request.parse_url_with_auth('http://joe%20:pass1@example.com/resource')
92
- @request.user.should eq 'joe '
93
- @request.password.should eq 'pass1'
94
- end
95
-
96
- it "doesn't overwrite user and password (which may have already been set by the Resource constructor) if there is no user/password in the url" do
97
- URI.stub(:parse).and_return(double('uri', :user => nil, :password => nil))
98
- @request = RestClient::Request.new(:method => 'get', :url => 'example.com', :user => 'beth', :password => 'pass2')
99
- @request.parse_url_with_auth('http://example.com/resource')
100
- @request.user.should eq 'beth'
101
- @request.password.should eq 'pass2'
102
- end
103
- end
104
-
105
- it "correctly formats cookies provided to the constructor" do
106
- URI.stub(:parse).and_return(double('uri', :user => nil, :password => nil))
107
- @request = RestClient::Request.new(:method => 'get', :url => 'example.com', :cookies => {:session_id => '1', :user_id => "someone" })
108
- @request.should_receive(:default_headers).and_return({'Foo' => 'bar'})
109
- @request.make_headers({}).should eq({ 'Foo' => 'bar', 'Cookie' => 'session_id=1; user_id=someone'})
110
- end
111
-
112
- it "determines the Net::HTTP class to instantiate by the method name" do
113
- @request.net_http_request_class(:put).should eq Net::HTTP::Put
114
- end
115
-
116
- describe "user headers" do
117
- it "merges user headers with the default headers" do
118
- @request.should_receive(:default_headers).and_return({ :accept => '*/*; q=0.5, application/xml', :accept_encoding => 'gzip, deflate' })
119
- headers = @request.make_headers("Accept" => "application/json", :accept_encoding => 'gzip')
120
- headers.should have_key "Accept-Encoding"
121
- headers["Accept-Encoding"].should eq "gzip"
122
- headers.should have_key "Accept"
123
- headers["Accept"].should eq "application/json"
124
- end
125
-
126
- it "prefers the user header when the same header exists in the defaults" do
127
- @request.should_receive(:default_headers).and_return({ '1' => '2' })
128
- headers = @request.make_headers('1' => '3')
129
- headers.should have_key('1')
130
- headers['1'].should eq '3'
131
- end
132
- end
133
-
134
- describe "header symbols" do
135
-
136
- it "converts header symbols from :content_type to 'Content-Type'" do
137
- @request.should_receive(:default_headers).and_return({})
138
- headers = @request.make_headers(:content_type => 'abc')
139
- headers.should have_key('Content-Type')
140
- headers['Content-Type'].should eq 'abc'
141
- end
142
-
143
- it "converts content-type from extension to real content-type" do
144
- @request.should_receive(:default_headers).and_return({})
145
- headers = @request.make_headers(:content_type => 'json')
146
- headers.should have_key('Content-Type')
147
- headers['Content-Type'].should eq 'application/json'
148
- end
149
-
150
- it "converts accept from extension(s) to real content-type(s)" do
151
- @request.should_receive(:default_headers).and_return({})
152
- headers = @request.make_headers(:accept => 'json, mp3')
153
- headers.should have_key('Accept')
154
- headers['Accept'].should eq 'application/json, audio/mpeg'
155
-
156
- @request.should_receive(:default_headers).and_return({})
157
- headers = @request.make_headers(:accept => :json)
158
- headers.should have_key('Accept')
159
- headers['Accept'].should eq 'application/json'
160
- end
161
-
162
- it "only convert symbols in header" do
163
- @request.should_receive(:default_headers).and_return({})
164
- headers = @request.make_headers({:foo_bar => 'value', "bar_bar" => 'value'})
165
- headers['Foo-Bar'].should eq 'value'
166
- headers['bar_bar'].should eq 'value'
167
- end
168
-
169
- it "converts header values to strings" do
170
- @request.make_headers('A' => 1)['A'].should eq '1'
171
- end
172
- end
173
-
174
- it "executes by constructing the Net::HTTP object, headers, and payload and calling transmit" do
175
- @request.should_receive(:parse_url_with_auth).with('http://some/resource').and_return(@uri)
176
- klass = double("net:http class")
177
- @request.should_receive(:net_http_request_class).with(:put).and_return(klass)
178
- klass.should_receive(:new).and_return('result')
179
- @request.should_receive(:transmit).with(@uri, 'result', kind_of(RestClient::Payload::Base))
180
- @request.execute
181
- end
182
-
183
- it "transmits the request with Net::HTTP" do
184
- @http.should_receive(:request).with('req', 'payload')
185
- @request.should_receive(:process_result)
186
- @request.transmit(@uri, 'req', 'payload')
187
- end
188
-
189
- describe "payload" do
190
- it "sends nil payloads" do
191
- @http.should_receive(:request).with('req', nil)
192
- @request.should_receive(:process_result)
193
- @request.stub(:response_log)
194
- @request.transmit(@uri, 'req', nil)
195
- end
196
-
197
- it "passes non-hash payloads straight through" do
198
- @request.process_payload("x").should eq "x"
199
- end
200
-
201
- it "converts a hash payload to urlencoded data" do
202
- @request.process_payload(:a => 'b c+d').should eq "a=b%20c%2Bd"
203
- end
204
-
205
- it "accepts nested hashes in payload" do
206
- payload = @request.process_payload(:user => { :name => 'joe', :location => { :country => 'USA', :state => 'CA' }})
207
- payload.should include('user[name]=joe')
208
- payload.should include('user[location][country]=USA')
209
- payload.should include('user[location][state]=CA')
210
- end
211
- end
212
-
213
- it "set urlencoded content_type header on hash payloads" do
214
- @request.process_payload(:a => 1)
215
- @request.headers[:content_type].should eq 'application/x-www-form-urlencoded'
216
- end
217
-
218
- describe "credentials" do
219
- it "sets up the credentials prior to the request" do
220
- @http.stub(:request)
221
- @request.stub(:process_result)
222
- @request.stub(:response_log)
223
-
224
- @request.stub(:user).and_return('joe')
225
- @request.stub(:password).and_return('mypass')
226
- @request.should_receive(:setup_credentials).with('req')
227
-
228
- @request.transmit(@uri, 'req', nil)
229
- end
230
-
231
- it "does not attempt to send any credentials if user is nil" do
232
- @request.stub(:user).and_return(nil)
233
- req = double("request")
234
- req.should_not_receive(:basic_auth)
235
- @request.setup_credentials(req)
236
- end
237
-
238
- it "setup credentials when there's a user" do
239
- @request.stub(:user).and_return('joe')
240
- @request.stub(:password).and_return('mypass')
241
- req = double("request")
242
- req.should_receive(:basic_auth).with('joe', 'mypass')
243
- @request.setup_credentials(req)
244
- end
245
- end
246
-
247
- it "catches EOFError and shows the more informative ServerBrokeConnection" do
248
- @http.stub(:request).and_raise(EOFError)
249
- lambda { @request.transmit(@uri, 'req', nil) }.should raise_error(RestClient::ServerBrokeConnection)
250
- end
251
-
252
- it "class method execute wraps constructor" do
253
- req = double("rest request")
254
- RestClient::Request.should_receive(:new).with(1 => 2).and_return(req)
255
- req.should_receive(:execute)
256
- RestClient::Request.execute(1 => 2)
257
- end
258
-
259
- describe "exception" do
260
- it "raises Unauthorized when the response is 401" do
261
- res = double('response', :code => '401', :[] => ['content-encoding' => ''], :body => '' )
262
- lambda { @request.process_result(res) }.should raise_error(RestClient::Unauthorized)
263
- end
264
-
265
- it "raises ResourceNotFound when the response is 404" do
266
- res = double('response', :code => '404', :[] => ['content-encoding' => ''], :body => '' )
267
- lambda { @request.process_result(res) }.should raise_error(RestClient::ResourceNotFound)
268
- end
269
-
270
- it "raises RequestFailed otherwise" do
271
- res = double('response', :code => '500', :[] => ['content-encoding' => ''], :body => '' )
272
- lambda { @request.process_result(res) }.should raise_error(RestClient::InternalServerError)
273
- end
274
- end
275
-
276
- describe "block usage" do
277
- it "returns what asked to" do
278
- res = double('response', :code => '401', :[] => ['content-encoding' => ''], :body => '' )
279
- @request.process_result(res){|response, request| "foo"}.should eq "foo"
280
- end
281
- end
282
-
283
- describe "proxy" do
284
- it "creates a proxy class if a proxy url is given" do
285
- RestClient.stub(:proxy).and_return("http://example.com/")
286
- @request.net_http_class.proxy_class?.should be_true
287
- end
288
-
289
- it "creates a non-proxy class if a proxy url is not given" do
290
- @request.net_http_class.proxy_class?.should be_false
291
- end
292
- end
293
-
294
-
295
- describe "logging" do
296
- it "logs a get request" do
297
- log = RestClient.log = []
298
- RestClient::Request.new(:method => :get, :url => 'http://url').log_request
299
- log[0].should eq %Q{RestClient.get "http://url", "Accept"=>"*/*; q=0.5, application/xml", "Accept-Encoding"=>"gzip, deflate"\n}
300
- end
301
-
302
- it "logs a post request with a small payload" do
303
- log = RestClient.log = []
304
- RestClient::Request.new(:method => :post, :url => 'http://url', :payload => 'foo').log_request
305
- log[0].should eq %Q{RestClient.post "http://url", "foo", "Accept"=>"*/*; q=0.5, application/xml", "Accept-Encoding"=>"gzip, deflate", "Content-Length"=>"3"\n}
306
- end
307
-
308
- it "logs a post request with a large payload" do
309
- log = RestClient.log = []
310
- RestClient::Request.new(:method => :post, :url => 'http://url', :payload => ('x' * 1000)).log_request
311
- log[0].should eq %Q{RestClient.post "http://url", 1000 byte(s) length, "Accept"=>"*/*; q=0.5, application/xml", "Accept-Encoding"=>"gzip, deflate", "Content-Length"=>"1000"\n}
312
- end
313
-
314
- it "logs input headers as a hash" do
315
- log = RestClient.log = []
316
- RestClient::Request.new(:method => :get, :url => 'http://url', :headers => { :accept => 'text/plain' }).log_request
317
- log[0].should eq %Q{RestClient.get "http://url", "Accept"=>"text/plain", "Accept-Encoding"=>"gzip, deflate"\n}
318
- end
319
-
320
- it "logs a response including the status code, content type, and result body size in bytes" do
321
- log = RestClient.log = []
322
- res = double('result', :code => '200', :class => Net::HTTPOK, :body => 'abcd')
323
- res.stub(:[]).with('Content-type').and_return('text/html')
324
- @request.log_response res
325
- log[0].should eq "# => 200 OK | text/html 4 bytes\n"
326
- end
327
-
328
- it "logs a response with a nil Content-type" do
329
- log = RestClient.log = []
330
- res = double('result', :code => '200', :class => Net::HTTPOK, :body => 'abcd')
331
- res.stub(:[]).with('Content-type').and_return(nil)
332
- @request.log_response res
333
- log[0].should eq "# => 200 OK | 4 bytes\n"
334
- end
335
-
336
- it "logs a response with a nil body" do
337
- log = RestClient.log = []
338
- res = double('result', :code => '200', :class => Net::HTTPOK, :body => nil)
339
- res.stub(:[]).with('Content-type').and_return('text/html; charset=utf-8')
340
- @request.log_response res
341
- log[0].should eq "# => 200 OK | text/html 0 bytes\n"
342
- end
343
- end
344
-
345
- it "strips the charset from the response content type" do
346
- log = RestClient.log = []
347
- res = double('result', :code => '200', :class => Net::HTTPOK, :body => 'abcd')
348
- res.stub(:[]).with('Content-type').and_return('text/html; charset=utf-8')
349
- @request.log_response res
350
- log[0].should eq "# => 200 OK | text/html 4 bytes\n"
351
- end
352
-
353
- describe "timeout" do
354
- it "set read_timeout" do
355
- @request = RestClient::Request.new(:method => :put, :url => 'http://some/resource', :payload => 'payload', :timeout => 123)
356
- @http.stub(:request)
357
- @request.stub(:process_result)
358
- @request.stub(:response_log)
359
-
360
- @net.should_receive(:read_timeout=).with(123)
361
-
362
- @request.transmit(@uri, 'req', nil)
363
- end
364
-
365
- it "set open_timeout" do
366
- @request = RestClient::Request.new(:method => :put, :url => 'http://some/resource', :payload => 'payload', :open_timeout => 123)
367
- @http.stub(:request)
368
- @request.stub(:process_result)
369
- @request.stub(:response_log)
370
-
371
- @net.should_receive(:open_timeout=).with(123)
372
-
373
- @request.transmit(@uri, 'req', nil)
374
- end
375
- end
376
-
377
- describe "ssl" do
378
- it "uses SSL when the URI refers to a https address" do
379
- @uri.stub(:is_a?).with(URI::HTTPS).and_return(true)
380
- @net.should_receive(:use_ssl=).with(true)
381
- @http.stub(:request)
382
- @request.stub(:process_result)
383
- @request.stub(:response_log)
384
- @request.transmit(@uri, 'req', 'payload')
385
- end
386
-
387
- it "should default to not verifying ssl certificates" do
388
- @request.verify_ssl.should eq false
389
- end
390
-
391
- it "should set net.verify_mode to OpenSSL::SSL::VERIFY_NONE if verify_ssl is false" do
392
- @net.should_receive(:verify_mode=).with(OpenSSL::SSL::VERIFY_NONE)
393
- @http.stub(:request)
394
- @request.stub(:process_result)
395
- @request.stub(:response_log)
396
- @request.transmit(@uri, 'req', 'payload')
397
- end
398
-
399
- it "should not set net.verify_mode to OpenSSL::SSL::VERIFY_NONE if verify_ssl is true" do
400
- @request = RestClient::Request.new(:method => :put, :url => 'https://some/resource', :payload => 'payload', :verify_ssl => true)
401
- @net.should_not_receive(:verify_mode=).with(OpenSSL::SSL::VERIFY_NONE)
402
- @http.stub(:request)
403
- @request.stub(:process_result)
404
- @request.stub(:response_log)
405
- @request.transmit(@uri, 'req', 'payload')
406
- end
407
-
408
- it "should set net.verify_mode to the passed value if verify_ssl is an OpenSSL constant" do
409
- mode = OpenSSL::SSL::VERIFY_PEER | OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT
410
- @request = RestClient::Request.new( :method => :put,
411
- :url => 'https://some/resource',
412
- :payload => 'payload',
413
- :verify_ssl => mode )
414
- @net.should_receive(:verify_mode=).with(mode)
415
- @http.stub(:request)
416
- @request.stub(:process_result)
417
- @request.stub(:response_log)
418
- @request.transmit(@uri, 'req', 'payload')
419
- end
420
-
421
- it "should default to not having an ssl_client_cert" do
422
- @request.ssl_client_cert.should be(nil)
423
- end
424
-
425
- it "should set the ssl_client_cert if provided" do
426
- @request = RestClient::Request.new(
427
- :method => :put,
428
- :url => 'https://some/resource',
429
- :payload => 'payload',
430
- :ssl_client_cert => "whatsupdoc!"
431
- )
432
- @net.should_receive(:cert=).with("whatsupdoc!")
433
- @http.stub(:request)
434
- @request.stub(:process_result)
435
- @request.stub(:response_log)
436
- @request.transmit(@uri, 'req', 'payload')
437
- end
438
-
439
- it "should not set the ssl_client_cert if it is not provided" do
440
- @request = RestClient::Request.new(
441
- :method => :put,
442
- :url => 'https://some/resource',
443
- :payload => 'payload'
444
- )
445
- @net.should_not_receive(:cert=).with("whatsupdoc!")
446
- @http.stub(:request)
447
- @request.stub(:process_result)
448
- @request.stub(:response_log)
449
- @request.transmit(@uri, 'req', 'payload')
450
- end
451
-
452
- it "should default to not having an ssl_client_key" do
453
- @request.ssl_client_key.should be(nil)
454
- end
455
-
456
- it "should set the ssl_client_key if provided" do
457
- @request = RestClient::Request.new(
458
- :method => :put,
459
- :url => 'https://some/resource',
460
- :payload => 'payload',
461
- :ssl_client_key => "whatsupdoc!"
462
- )
463
- @net.should_receive(:key=).with("whatsupdoc!")
464
- @http.stub(:request)
465
- @request.stub(:process_result)
466
- @request.stub(:response_log)
467
- @request.transmit(@uri, 'req', 'payload')
468
- end
469
-
470
- it "should not set the ssl_client_key if it is not provided" do
471
- @request = RestClient::Request.new(
472
- :method => :put,
473
- :url => 'https://some/resource',
474
- :payload => 'payload'
475
- )
476
- @net.should_not_receive(:key=).with("whatsupdoc!")
477
- @http.stub(:request)
478
- @request.stub(:process_result)
479
- @request.stub(:response_log)
480
- @request.transmit(@uri, 'req', 'payload')
481
- end
482
-
483
- it "should default to not having an ssl_ca_file" do
484
- @request.ssl_ca_file.should be(nil)
485
- end
486
-
487
- it "should set the ssl_ca_file if provided" do
488
- @request = RestClient::Request.new(
489
- :method => :put,
490
- :url => 'https://some/resource',
491
- :payload => 'payload',
492
- :ssl_ca_file => "Certificate Authority File"
493
- )
494
- @net.should_receive(:ca_file=).with("Certificate Authority File")
495
- @http.stub(:request)
496
- @request.stub(:process_result)
497
- @request.stub(:response_log)
498
- @request.transmit(@uri, 'req', 'payload')
499
- end
500
-
501
- it "should not set the ssl_ca_file if it is not provided" do
502
- @request = RestClient::Request.new(
503
- :method => :put,
504
- :url => 'https://some/resource',
505
- :payload => 'payload'
506
- )
507
- @net.should_not_receive(:ca_file=).with("Certificate Authority File")
508
- @http.stub(:request)
509
- @request.stub(:process_result)
510
- @request.stub(:response_log)
511
- @request.transmit(@uri, 'req', 'payload')
512
- end
513
- end
514
-
515
- it "should still return a response object for 204 No Content responses" do
516
- @request = RestClient::Request.new(
517
- :method => :put,
518
- :url => 'https://some/resource',
519
- :payload => 'payload'
520
- )
521
- net_http_res = Net::HTTPNoContent.new("", "204", "No Content")
522
- net_http_res.stub(:read_body).and_return(nil)
523
- @http.should_receive(:request).and_return(@request.fetch_body(net_http_res))
524
- response = @request.transmit(@uri, 'req', 'payload')
525
- response.should_not be_nil
526
- response.code.should eq 204
527
- end
528
- end