rest-client 0.9.2 → 1.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of rest-client might be problematic. Click here for more details.
- data/README.rdoc +14 -1
- data/Rakefile +1 -1
- data/lib/restclient.rb +2 -0
- data/lib/restclient/mixin/response.rb +43 -0
- data/lib/restclient/raw_response.rb +30 -0
- data/lib/restclient/request.rb +65 -15
- data/lib/restclient/resource.rb +2 -2
- data/lib/restclient/response.rb +4 -30
- data/spec/mixin/response_spec.rb +46 -0
- data/spec/raw_response_spec.rb +17 -0
- data/spec/request_spec.rb +158 -30
- data/spec/response_spec.rb +0 -29
- metadata +15 -9
data/README.rdoc
CHANGED
@@ -121,6 +121,18 @@ extract and set headers for them as needed:
|
|
121
121
|
)
|
122
122
|
# ...response body
|
123
123
|
|
124
|
+
== SSL Client Certificates
|
125
|
+
|
126
|
+
RestClient::Resource.new(
|
127
|
+
'https://example.com',
|
128
|
+
:ssl_client_cert => OpenSSL::X509::Certificate.new(File.read("cert.pem")),
|
129
|
+
:ssl_client_key => OpenSSL::PKey::RSA.new(File.read("key.pem"), "passphrase, if any"),
|
130
|
+
:ssl_ca_file => "ca_certificate.pem",
|
131
|
+
:verify_ssl => OpenSSL::SSL::VERIFY_PEER
|
132
|
+
).get
|
133
|
+
|
134
|
+
Self-signed certificates can be generated with the openssl command-line tool.
|
135
|
+
|
124
136
|
== Meta
|
125
137
|
|
126
138
|
Written by Adam Wiggins (adam at heroku dot com)
|
@@ -128,7 +140,8 @@ Written by Adam Wiggins (adam at heroku dot com)
|
|
128
140
|
Patches contributed by: Chris Anderson, Greg Borenstein, Ardekantur, Pedro
|
129
141
|
Belo, Rafael Souza, Rick Olson, Aman Gupta, Blake Mizerany, Brian Donovan, Ivan
|
130
142
|
Makfinsky, Marc-André Cournoyer, Coda Hale, Tetsuo Watanabe, Dusty Doris,
|
131
|
-
Lennon Day-Reynolds, James Edward Gray II, Cyril Rohr,
|
143
|
+
Lennon Day-Reynolds, James Edward Gray II, Cyril Rohr, Juan Alvarez, and Adam
|
144
|
+
Jacob
|
132
145
|
|
133
146
|
Released under the MIT License: http://www.opensource.org/licenses/mit-license.php
|
134
147
|
|
data/Rakefile
CHANGED
data/lib/restclient.rb
CHANGED
@@ -4,7 +4,9 @@ require 'zlib'
|
|
4
4
|
require 'stringio'
|
5
5
|
|
6
6
|
require File.dirname(__FILE__) + '/restclient/request'
|
7
|
+
require File.dirname(__FILE__) + '/restclient/mixin/response'
|
7
8
|
require File.dirname(__FILE__) + '/restclient/response'
|
9
|
+
require File.dirname(__FILE__) + '/restclient/raw_response'
|
8
10
|
require File.dirname(__FILE__) + '/restclient/resource'
|
9
11
|
require File.dirname(__FILE__) + '/restclient/exceptions'
|
10
12
|
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module RestClient
|
2
|
+
module Mixin
|
3
|
+
module Response
|
4
|
+
attr_reader :net_http_res
|
5
|
+
|
6
|
+
# HTTP status code, always 200 since RestClient throws exceptions for
|
7
|
+
# other codes.
|
8
|
+
def code
|
9
|
+
@code ||= @net_http_res.code.to_i
|
10
|
+
end
|
11
|
+
|
12
|
+
# A hash of the headers, beautified with symbols and underscores.
|
13
|
+
# e.g. "Content-type" will become :content_type.
|
14
|
+
def headers
|
15
|
+
@headers ||= self.class.beautify_headers(@net_http_res.to_hash)
|
16
|
+
end
|
17
|
+
|
18
|
+
# Hash of cookies extracted from response headers
|
19
|
+
def cookies
|
20
|
+
@cookies ||= (self.headers[:set_cookie] || "").split('; ').inject({}) do |out, raw_c|
|
21
|
+
key, val = raw_c.split('=')
|
22
|
+
unless %w(expires domain path secure).member?(key)
|
23
|
+
out[key] = val
|
24
|
+
end
|
25
|
+
out
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.included(receiver)
|
30
|
+
receiver.extend(RestClient::Mixin::Response::ClassMethods)
|
31
|
+
end
|
32
|
+
|
33
|
+
module ClassMethods
|
34
|
+
def beautify_headers(headers)
|
35
|
+
headers.inject({}) do |out, (key, value)|
|
36
|
+
out[key.gsub(/-/, '_').to_sym] = value.first
|
37
|
+
out
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/mixin/response'
|
2
|
+
|
3
|
+
module RestClient
|
4
|
+
# The response from RestClient on a raw request looks like a string, but is
|
5
|
+
# actually one of these. 99% of the time you're making a rest call all you
|
6
|
+
# care about is the body, but on the occassion you want to fetch the
|
7
|
+
# headers you can:
|
8
|
+
#
|
9
|
+
# RestClient.get('http://example.com').headers[:content_type]
|
10
|
+
#
|
11
|
+
# In addition, if you do not use the response as a string, you can access
|
12
|
+
# a Tempfile object at res.file, which contains the path to the raw
|
13
|
+
# downloaded request body.
|
14
|
+
class RawResponse
|
15
|
+
include RestClient::Mixin::Response
|
16
|
+
|
17
|
+
attr_reader :file
|
18
|
+
|
19
|
+
def initialize(tempfile, net_http_res)
|
20
|
+
@net_http_res = net_http_res
|
21
|
+
@file = tempfile
|
22
|
+
end
|
23
|
+
|
24
|
+
def to_s
|
25
|
+
@file.open
|
26
|
+
@file.read
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
data/lib/restclient/request.rb
CHANGED
@@ -1,12 +1,17 @@
|
|
1
|
+
require 'tempfile'
|
2
|
+
|
1
3
|
module RestClient
|
2
4
|
# This class is used internally by RestClient to send the request, but you can also
|
3
5
|
# access it internally if you'd like to use a method not directly supported by the
|
4
6
|
# main API. For example:
|
5
7
|
#
|
6
8
|
# RestClient::Request.execute(:method => :head, :url => 'http://example.com')
|
7
|
-
|
9
|
+
#
|
8
10
|
class Request
|
9
|
-
attr_reader :method, :url, :payload, :headers,
|
11
|
+
attr_reader :method, :url, :payload, :headers,
|
12
|
+
:cookies, :user, :password, :timeout, :open_timeout,
|
13
|
+
:verify_ssl, :ssl_client_cert, :ssl_client_key, :ssl_ca_file,
|
14
|
+
:raw_response
|
10
15
|
|
11
16
|
def self.execute(args)
|
12
17
|
new(args).execute
|
@@ -16,12 +21,18 @@ module RestClient
|
|
16
21
|
@method = args[:method] or raise ArgumentError, "must pass :method"
|
17
22
|
@url = args[:url] or raise ArgumentError, "must pass :url"
|
18
23
|
@headers = args[:headers] || {}
|
19
|
-
|
24
|
+
@cookies = @headers.delete(:cookies) || args[:cookies] || {}
|
20
25
|
@payload = process_payload(args[:payload])
|
21
26
|
@user = args[:user]
|
22
27
|
@password = args[:password]
|
23
28
|
@timeout = args[:timeout]
|
24
29
|
@open_timeout = args[:open_timeout]
|
30
|
+
@raw_response = args[:raw_response] || false
|
31
|
+
@verify_ssl = args[:verify_ssl] || false
|
32
|
+
@ssl_client_cert = args[:ssl_client_cert] || nil
|
33
|
+
@ssl_client_key = args[:ssl_client_key] || nil
|
34
|
+
@ssl_ca_file = args[:ssl_ca_file] || nil
|
35
|
+
@tf = nil # If you are a raw request, this is your tempfile
|
25
36
|
end
|
26
37
|
|
27
38
|
def execute
|
@@ -37,13 +48,13 @@ module RestClient
|
|
37
48
|
end
|
38
49
|
|
39
50
|
def make_headers(user_headers)
|
40
|
-
|
41
|
-
|
42
|
-
|
51
|
+
unless @cookies.empty?
|
52
|
+
user_headers[:cookie] = @cookies.map {|key, val| "#{key.to_s}=#{val}" }.join('; ')
|
53
|
+
end
|
43
54
|
|
44
55
|
default_headers.merge(user_headers).inject({}) do |final, (key, value)|
|
45
56
|
final[key.to_s.gsub(/_/, '-').capitalize] = value.to_s
|
46
|
-
|
57
|
+
final
|
47
58
|
end
|
48
59
|
end
|
49
60
|
|
@@ -94,19 +105,28 @@ module RestClient
|
|
94
105
|
|
95
106
|
net = net_http_class.new(uri.host, uri.port)
|
96
107
|
net.use_ssl = uri.is_a?(URI::HTTPS)
|
97
|
-
|
108
|
+
if @verify_ssl == false
|
109
|
+
net.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
110
|
+
elsif @verify_ssl.is_a? Integer
|
111
|
+
net.verify_mode = @verify_ssl
|
112
|
+
end
|
113
|
+
net.cert = @ssl_client_cert if @ssl_client_cert
|
114
|
+
net.key = @ssl_client_key if @ssl_client_key
|
115
|
+
net.ca_file = @ssl_ca_file if @ssl_ca_file
|
98
116
|
net.read_timeout = @timeout if @timeout
|
99
117
|
net.open_timeout = @open_timeout if @open_timeout
|
100
118
|
|
101
119
|
display_log request_log
|
102
120
|
|
103
121
|
net.start do |http|
|
104
|
-
res = http.request(req, payload)
|
122
|
+
res = http.request(req, payload) { |http_response| fetch_body(http_response) }
|
123
|
+
result = process_result(res)
|
105
124
|
display_log response_log(res)
|
106
|
-
string = process_result(res)
|
107
125
|
|
108
|
-
if
|
109
|
-
Response.new(
|
126
|
+
if result.kind_of?(String) or @method == :head
|
127
|
+
Response.new(result, res)
|
128
|
+
elsif @raw_response
|
129
|
+
RawResponse.new(@tf, res)
|
110
130
|
else
|
111
131
|
nil
|
112
132
|
end
|
@@ -121,9 +141,38 @@ module RestClient
|
|
121
141
|
req.basic_auth(user, password) if user
|
122
142
|
end
|
123
143
|
|
144
|
+
def fetch_body(http_response)
|
145
|
+
if @raw_response
|
146
|
+
# Taken from Chef, which as in turn...
|
147
|
+
# Stolen from http://www.ruby-forum.com/topic/166423
|
148
|
+
# Kudos to _why!
|
149
|
+
@tf = Tempfile.new("rest-client")
|
150
|
+
size, total = 0, http_response.header['Content-Length'].to_i
|
151
|
+
http_response.read_body do |chunk|
|
152
|
+
@tf.write(chunk)
|
153
|
+
size += chunk.size
|
154
|
+
if size == 0
|
155
|
+
display_log("#{@method} #{@url} done (0 length file)")
|
156
|
+
elsif total == 0
|
157
|
+
display_log("#{@method} #{@url} (zero content length)")
|
158
|
+
else
|
159
|
+
display_log("#{@method} #{@url} %d%% done (%d of %d)" % [(size * 100) / total, size, total])
|
160
|
+
end
|
161
|
+
end
|
162
|
+
@tf.close
|
163
|
+
@tf
|
164
|
+
else
|
165
|
+
http_response.read_body
|
166
|
+
end
|
167
|
+
http_response
|
168
|
+
end
|
169
|
+
|
124
170
|
def process_result(res)
|
125
|
-
if res.code =~ /\A2\d{2}\z/
|
126
|
-
|
171
|
+
if res.code =~ /\A2\d{2}\z/
|
172
|
+
# We don't decode raw requests
|
173
|
+
unless @raw_response
|
174
|
+
decode res['content-encoding'], res.body if res.body
|
175
|
+
end
|
127
176
|
elsif %w(301 302 303).include? res.code
|
128
177
|
url = res.header['Location']
|
129
178
|
|
@@ -164,7 +213,8 @@ module RestClient
|
|
164
213
|
end
|
165
214
|
|
166
215
|
def response_log(res)
|
167
|
-
|
216
|
+
size = @raw_response ? File.size(@tf.path) : res.body.size
|
217
|
+
"# => #{res.code} #{res.class.to_s.gsub(/^Net::HTTP/, '')} | #{(res['Content-type'] || '').gsub(/;.*$/, '')} #{size} bytes"
|
168
218
|
end
|
169
219
|
|
170
220
|
def display_log(msg)
|
data/lib/restclient/resource.rb
CHANGED
data/lib/restclient/response.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/mixin/response'
|
2
|
+
|
1
3
|
module RestClient
|
2
4
|
# The response from RestClient looks like a string, but is actually one of
|
3
5
|
# these. 99% of the time you're making a rest call all you care about is
|
@@ -6,41 +8,13 @@ module RestClient
|
|
6
8
|
# RestClient.get('http://example.com').headers[:content_type]
|
7
9
|
#
|
8
10
|
class Response < String
|
9
|
-
|
11
|
+
|
12
|
+
include RestClient::Mixin::Response
|
10
13
|
|
11
14
|
def initialize(string, net_http_res)
|
12
15
|
@net_http_res = net_http_res
|
13
16
|
super(string || "")
|
14
17
|
end
|
15
18
|
|
16
|
-
# HTTP status code, always 200 since RestClient throws exceptions for
|
17
|
-
# other codes.
|
18
|
-
def code
|
19
|
-
@code ||= @net_http_res.code.to_i
|
20
|
-
end
|
21
|
-
|
22
|
-
# A hash of the headers, beautified with symbols and underscores.
|
23
|
-
# e.g. "Content-type" will become :content_type.
|
24
|
-
def headers
|
25
|
-
@headers ||= self.class.beautify_headers(@net_http_res.to_hash)
|
26
|
-
end
|
27
|
-
|
28
|
-
# Hash of cookies extracted from response headers
|
29
|
-
def cookies
|
30
|
-
@cookies ||= (self.headers[:set_cookie] || "").split('; ').inject({}) do |out, raw_c|
|
31
|
-
key, val = raw_c.split('=')
|
32
|
-
unless %w(expires domain path secure).member?(key)
|
33
|
-
out[key] = val
|
34
|
-
end
|
35
|
-
out
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
def self.beautify_headers(headers)
|
40
|
-
headers.inject({}) do |out, (key, value)|
|
41
|
-
out[key.gsub(/-/, '_').to_sym] = value.first
|
42
|
-
out
|
43
|
-
end
|
44
|
-
end
|
45
19
|
end
|
46
20
|
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../base'
|
2
|
+
|
3
|
+
class MockResponse
|
4
|
+
include RestClient::Mixin::Response
|
5
|
+
|
6
|
+
def initialize(body, res)
|
7
|
+
@net_http_res = res
|
8
|
+
@body = @body
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
describe RestClient::Mixin::Response do
|
13
|
+
before do
|
14
|
+
@net_http_res = mock('net http response')
|
15
|
+
@response = MockResponse.new('abc', @net_http_res)
|
16
|
+
end
|
17
|
+
|
18
|
+
it "fetches the numeric response code" do
|
19
|
+
@net_http_res.should_receive(:code).and_return('200')
|
20
|
+
@response.code.should == 200
|
21
|
+
end
|
22
|
+
|
23
|
+
it "beautifies the headers by turning the keys to symbols" do
|
24
|
+
h = RestClient::Response.beautify_headers('content-type' => [ 'x' ])
|
25
|
+
h.keys.first.should == :content_type
|
26
|
+
end
|
27
|
+
|
28
|
+
it "beautifies the headers by turning the values to strings instead of one-element arrays" do
|
29
|
+
h = RestClient::Response.beautify_headers('x' => [ 'text/html' ] )
|
30
|
+
h.values.first.should == 'text/html'
|
31
|
+
end
|
32
|
+
|
33
|
+
it "fetches the headers" do
|
34
|
+
@net_http_res.should_receive(:to_hash).and_return('content-type' => [ 'text/html' ])
|
35
|
+
@response.headers.should == { :content_type => 'text/html' }
|
36
|
+
end
|
37
|
+
|
38
|
+
it "extracts cookies from response headers" do
|
39
|
+
@net_http_res.should_receive(:to_hash).and_return('set-cookie' => ['session_id=1; path=/'])
|
40
|
+
@response.cookies.should == { 'session_id' => '1' }
|
41
|
+
end
|
42
|
+
|
43
|
+
it "can access the net http result directly" do
|
44
|
+
@response.net_http_res.should == @net_http_res
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/base'
|
2
|
+
|
3
|
+
describe RestClient::RawResponse do
|
4
|
+
before do
|
5
|
+
@tf = mock("Tempfile", :read => "the answer is 42", :open => true)
|
6
|
+
@net_http_res = mock('net http response')
|
7
|
+
@response = RestClient::RawResponse.new(@tf, @net_http_res)
|
8
|
+
end
|
9
|
+
|
10
|
+
it "behaves like string" do
|
11
|
+
@response.to_s.should == 'the answer is 42'
|
12
|
+
end
|
13
|
+
|
14
|
+
it "exposes a Tempfile" do
|
15
|
+
@response.file.should == @tf
|
16
|
+
end
|
17
|
+
end
|
data/spec/request_spec.rb
CHANGED
@@ -28,7 +28,7 @@ describe RestClient::Request do
|
|
28
28
|
it "decodes a gzip body" do
|
29
29
|
@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 == "i'm gziped\n"
|
30
30
|
end
|
31
|
-
|
31
|
+
|
32
32
|
it "ingores gzip for empty bodies" do
|
33
33
|
@request.decode('gzip', '').should be_empty
|
34
34
|
end
|
@@ -37,23 +37,23 @@ describe RestClient::Request do
|
|
37
37
|
@request.decode('deflate', "x\234+\316\317MUHIM\313I,IMQ(I\255(\001\000A\223\006\363").should == "some deflated text"
|
38
38
|
end
|
39
39
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
40
|
+
it "processes a successful result" do
|
41
|
+
res = mock("result")
|
42
|
+
res.stub!(:code).and_return("200")
|
43
|
+
res.stub!(:body).and_return('body')
|
44
|
+
res.stub!(:[]).with('content-encoding').and_return(nil)
|
45
|
+
@request.process_result(res).should == 'body'
|
46
|
+
end
|
47
47
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
48
|
+
it "doesn't classify successful requests as failed" do
|
49
|
+
203.upto(206) do |code|
|
50
|
+
res = mock("result")
|
51
|
+
res.stub!(:code).and_return(code.to_s)
|
52
|
+
res.stub!(:body).and_return("")
|
53
|
+
res.stub!(:[]).with('content-encoding').and_return(nil)
|
54
|
+
@request.process_result(res).should be_empty
|
55
|
+
end
|
56
|
+
end
|
57
57
|
|
58
58
|
it "parses a url into a URI object" do
|
59
59
|
URI.should_receive(:parse).with('http://example.com/resource')
|
@@ -80,12 +80,12 @@ describe RestClient::Request do
|
|
80
80
|
@request.password.should == 'pass2'
|
81
81
|
end
|
82
82
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
83
|
+
it "correctly formats cookies provided to the constructor" do
|
84
|
+
URI.stub!(:parse).and_return(mock('uri', :user => nil, :password => nil))
|
85
|
+
@request = RestClient::Request.new(:method => 'get', :url => 'example.com', :cookies => {:session_id => '1' })
|
86
|
+
@request.should_receive(:default_headers).and_return({'foo' => 'bar'})
|
87
|
+
headers = @request.make_headers({}).should == { 'Foo' => 'bar', 'Cookie' => 'session_id=1'}
|
88
|
+
end
|
89
89
|
|
90
90
|
it "determines the Net::HTTP class to instantiate by the method name" do
|
91
91
|
@request.net_http_request_class(:put).should == Net::HTTP::Put
|
@@ -243,7 +243,7 @@ describe RestClient::Request do
|
|
243
243
|
end
|
244
244
|
|
245
245
|
it "creates a non-proxy class if a proxy url is not given" do
|
246
|
-
|
246
|
+
@request.net_http_class.should_not include(Net::HTTP::ProxyDelta)
|
247
247
|
end
|
248
248
|
|
249
249
|
it "logs a get request" do
|
@@ -303,26 +303,154 @@ describe RestClient::Request do
|
|
303
303
|
f.should_receive(:puts).with('xyz')
|
304
304
|
@request.display_log('xyz')
|
305
305
|
end
|
306
|
-
|
306
|
+
|
307
307
|
it "set read_timeout" do
|
308
308
|
@request = RestClient::Request.new(:method => :put, :url => 'http://some/resource', :payload => 'payload', :timeout => 123)
|
309
309
|
@http.stub!(:request)
|
310
310
|
@request.stub!(:process_result)
|
311
311
|
@request.stub!(:response_log)
|
312
|
-
|
312
|
+
|
313
313
|
@net.should_receive(:read_timeout=).with(123)
|
314
|
-
|
314
|
+
|
315
315
|
@request.transmit(@uri, 'req', nil)
|
316
316
|
end
|
317
|
-
|
317
|
+
|
318
318
|
it "set open_timeout" do
|
319
319
|
@request = RestClient::Request.new(:method => :put, :url => 'http://some/resource', :payload => 'payload', :open_timeout => 123)
|
320
320
|
@http.stub!(:request)
|
321
321
|
@request.stub!(:process_result)
|
322
322
|
@request.stub!(:response_log)
|
323
|
-
|
323
|
+
|
324
324
|
@net.should_receive(:open_timeout=).with(123)
|
325
|
-
|
325
|
+
|
326
326
|
@request.transmit(@uri, 'req', nil)
|
327
327
|
end
|
328
|
+
|
329
|
+
it "should default to not verifying ssl certificates" do
|
330
|
+
@request.verify_ssl.should == false
|
331
|
+
end
|
332
|
+
|
333
|
+
it "should set net.verify_mode to OpenSSL::SSL::VERIFY_NONE if verify_ssl is false" do
|
334
|
+
@net.should_receive(:verify_mode=).with(OpenSSL::SSL::VERIFY_NONE)
|
335
|
+
@http.stub!(:request)
|
336
|
+
@request.stub!(:process_result)
|
337
|
+
@request.stub!(:response_log)
|
338
|
+
@request.transmit(@uri, 'req', 'payload')
|
339
|
+
end
|
340
|
+
|
341
|
+
it "should not set net.verify_mode to OpenSSL::SSL::VERIFY_NONE if verify_ssl is true" do
|
342
|
+
@request = RestClient::Request.new(:method => :put, :url => 'https://some/resource', :payload => 'payload', :verify_ssl => true)
|
343
|
+
@net.should_not_receive(:verify_mode=).with(OpenSSL::SSL::VERIFY_NONE)
|
344
|
+
@http.stub!(:request)
|
345
|
+
@request.stub!(:process_result)
|
346
|
+
@request.stub!(:response_log)
|
347
|
+
@request.transmit(@uri, 'req', 'payload')
|
348
|
+
end
|
349
|
+
|
350
|
+
it "should set net.verify_mode to the passed value if verify_ssl is an OpenSSL constant" do
|
351
|
+
mode = OpenSSL::SSL::VERIFY_PEER |
|
352
|
+
OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT
|
353
|
+
@request = RestClient::Request.new( :method => :put,
|
354
|
+
:url => 'https://some/resource',
|
355
|
+
:payload => 'payload',
|
356
|
+
:verify_ssl => mode )
|
357
|
+
@net.should_receive(:verify_mode=).with(mode)
|
358
|
+
@http.stub!(:request)
|
359
|
+
@request.stub!(:process_result)
|
360
|
+
@request.stub!(:response_log)
|
361
|
+
@request.transmit(@uri, 'req', 'payload')
|
362
|
+
end
|
363
|
+
|
364
|
+
it "should default to not having an ssl_client_cert" do
|
365
|
+
@request.ssl_client_cert.should be(nil)
|
366
|
+
end
|
367
|
+
|
368
|
+
it "should set the ssl_client_cert if provided" do
|
369
|
+
@request = RestClient::Request.new(
|
370
|
+
:method => :put,
|
371
|
+
:url => 'https://some/resource',
|
372
|
+
:payload => 'payload',
|
373
|
+
:ssl_client_cert => "whatsupdoc!"
|
374
|
+
)
|
375
|
+
@net.should_receive(:cert=).with("whatsupdoc!")
|
376
|
+
@http.stub!(:request)
|
377
|
+
@request.stub!(:process_result)
|
378
|
+
@request.stub!(:response_log)
|
379
|
+
@request.transmit(@uri, 'req', 'payload')
|
380
|
+
end
|
381
|
+
|
382
|
+
it "should not set the ssl_client_cert if it is not provided" do
|
383
|
+
@request = RestClient::Request.new(
|
384
|
+
:method => :put,
|
385
|
+
:url => 'https://some/resource',
|
386
|
+
:payload => 'payload'
|
387
|
+
)
|
388
|
+
@net.should_not_receive(:cert=).with("whatsupdoc!")
|
389
|
+
@http.stub!(:request)
|
390
|
+
@request.stub!(:process_result)
|
391
|
+
@request.stub!(:response_log)
|
392
|
+
@request.transmit(@uri, 'req', 'payload')
|
393
|
+
end
|
394
|
+
|
395
|
+
it "should default to not having an ssl_client_key" do
|
396
|
+
@request.ssl_client_key.should be(nil)
|
397
|
+
end
|
398
|
+
|
399
|
+
it "should set the ssl_client_key if provided" do
|
400
|
+
@request = RestClient::Request.new(
|
401
|
+
:method => :put,
|
402
|
+
:url => 'https://some/resource',
|
403
|
+
:payload => 'payload',
|
404
|
+
:ssl_client_key => "whatsupdoc!"
|
405
|
+
)
|
406
|
+
@net.should_receive(:key=).with("whatsupdoc!")
|
407
|
+
@http.stub!(:request)
|
408
|
+
@request.stub!(:process_result)
|
409
|
+
@request.stub!(:response_log)
|
410
|
+
@request.transmit(@uri, 'req', 'payload')
|
411
|
+
end
|
412
|
+
|
413
|
+
it "should not set the ssl_client_key if it is not provided" do
|
414
|
+
@request = RestClient::Request.new(
|
415
|
+
:method => :put,
|
416
|
+
:url => 'https://some/resource',
|
417
|
+
:payload => 'payload'
|
418
|
+
)
|
419
|
+
@net.should_not_receive(:key=).with("whatsupdoc!")
|
420
|
+
@http.stub!(:request)
|
421
|
+
@request.stub!(:process_result)
|
422
|
+
@request.stub!(:response_log)
|
423
|
+
@request.transmit(@uri, 'req', 'payload')
|
424
|
+
end
|
425
|
+
|
426
|
+
it "should default to not having an ssl_ca_file" do
|
427
|
+
@request.ssl_ca_file.should be(nil)
|
428
|
+
end
|
429
|
+
|
430
|
+
it "should set the ssl_ca_file if provided" do
|
431
|
+
@request = RestClient::Request.new(
|
432
|
+
:method => :put,
|
433
|
+
:url => 'https://some/resource',
|
434
|
+
:payload => 'payload',
|
435
|
+
:ssl_ca_file => "Certificate Authority File"
|
436
|
+
)
|
437
|
+
@net.should_receive(:ca_file=).with("Certificate Authority File")
|
438
|
+
@http.stub!(:request)
|
439
|
+
@request.stub!(:process_result)
|
440
|
+
@request.stub!(:response_log)
|
441
|
+
@request.transmit(@uri, 'req', 'payload')
|
442
|
+
end
|
443
|
+
|
444
|
+
it "should not set the ssl_ca_file if it is not provided" do
|
445
|
+
@request = RestClient::Request.new(
|
446
|
+
:method => :put,
|
447
|
+
:url => 'https://some/resource',
|
448
|
+
:payload => 'payload'
|
449
|
+
)
|
450
|
+
@net.should_not_receive(:ca_file=).with("Certificate Authority File")
|
451
|
+
@http.stub!(:request)
|
452
|
+
@request.stub!(:process_result)
|
453
|
+
@request.stub!(:response_log)
|
454
|
+
@request.transmit(@uri, 'req', 'payload')
|
455
|
+
end
|
328
456
|
end
|
data/spec/response_spec.rb
CHANGED
@@ -10,35 +10,6 @@ describe RestClient::Response do
|
|
10
10
|
@response.should == 'abc'
|
11
11
|
end
|
12
12
|
|
13
|
-
it "fetches the numeric response code" do
|
14
|
-
@net_http_res.should_receive(:code).and_return('200')
|
15
|
-
@response.code.should == 200
|
16
|
-
end
|
17
|
-
|
18
|
-
it "beautifies the headers by turning the keys to symbols" do
|
19
|
-
h = RestClient::Response.beautify_headers('content-type' => [ 'x' ])
|
20
|
-
h.keys.first.should == :content_type
|
21
|
-
end
|
22
|
-
|
23
|
-
it "beautifies the headers by turning the values to strings instead of one-element arrays" do
|
24
|
-
h = RestClient::Response.beautify_headers('x' => [ 'text/html' ] )
|
25
|
-
h.values.first.should == 'text/html'
|
26
|
-
end
|
27
|
-
|
28
|
-
it "fetches the headers" do
|
29
|
-
@net_http_res.should_receive(:to_hash).and_return('content-type' => [ 'text/html' ])
|
30
|
-
@response.headers.should == { :content_type => 'text/html' }
|
31
|
-
end
|
32
|
-
|
33
|
-
it "extracts cookies from response headers" do
|
34
|
-
@net_http_res.should_receive(:to_hash).and_return('set-cookie' => ['session_id=1; path=/'])
|
35
|
-
@response.cookies.should == { 'session_id' => '1' }
|
36
|
-
end
|
37
|
-
|
38
|
-
it "can access the net http result directly" do
|
39
|
-
@response.net_http_res.should == @net_http_res
|
40
|
-
end
|
41
|
-
|
42
13
|
it "accepts nil strings and sets it to empty for the case of HEAD" do
|
43
14
|
RestClient::Response.new(nil, @net_http_res).should == ""
|
44
15
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rest-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0
|
4
|
+
version: "1.0"
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adam Wiggins
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-05-28 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -24,19 +24,25 @@ extra_rdoc_files: []
|
|
24
24
|
files:
|
25
25
|
- Rakefile
|
26
26
|
- README.rdoc
|
27
|
-
- lib/restclient.rb
|
28
27
|
- lib/rest_client.rb
|
29
28
|
- lib/restclient
|
30
|
-
- lib/restclient/response.rb
|
31
|
-
- lib/restclient/resource.rb
|
32
|
-
- lib/restclient/request.rb
|
33
29
|
- lib/restclient/exceptions.rb
|
34
|
-
-
|
35
|
-
-
|
36
|
-
-
|
30
|
+
- lib/restclient/mixin
|
31
|
+
- lib/restclient/mixin/response.rb
|
32
|
+
- lib/restclient/raw_response.rb
|
33
|
+
- lib/restclient/request.rb
|
34
|
+
- lib/restclient/resource.rb
|
35
|
+
- lib/restclient/response.rb
|
36
|
+
- lib/restclient.rb
|
37
37
|
- spec/base.rb
|
38
38
|
- spec/exceptions_spec.rb
|
39
|
+
- spec/mixin
|
40
|
+
- spec/mixin/response_spec.rb
|
41
|
+
- spec/raw_response_spec.rb
|
39
42
|
- spec/request_spec.rb
|
43
|
+
- spec/resource_spec.rb
|
44
|
+
- spec/response_spec.rb
|
45
|
+
- spec/restclient_spec.rb
|
40
46
|
has_rdoc: true
|
41
47
|
homepage: http://rest-client.heroku.com/
|
42
48
|
post_install_message:
|