rest-client 1.4.2 → 1.5.0.a
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 +28 -0
- data/VERSION +1 -1
- data/history.md +11 -0
- data/lib/restclient/abstract_response.rb +7 -8
- data/lib/restclient/payload.rb +22 -7
- data/lib/restclient/raw_response.rb +5 -2
- data/lib/restclient/request.rb +27 -23
- data/lib/restclient/response.rb +11 -33
- data/spec/abstract_response_spec.rb +24 -3
- data/spec/payload_spec.rb +25 -2
- data/spec/request_spec.rb +16 -20
- data/spec/response_spec.rb +12 -10
- metadata +5 -4
data/README.rdoc
CHANGED
@@ -17,6 +17,28 @@ of specifying actions: get, put, post, delete.
|
|
17
17
|
|
18
18
|
RestClient.delete 'http://example.com/resource'
|
19
19
|
|
20
|
+
response = RestClient.get 'http://example.com/resource'
|
21
|
+
response.code
|
22
|
+
➔ 200
|
23
|
+
response.cookies
|
24
|
+
➔ {"Foo"=>"BAR", "QUUX"=>"QUUUUX"}
|
25
|
+
response.headers
|
26
|
+
➔ {:content_type=>"text/html; charset=utf-8", :cache_control=>"private" ...
|
27
|
+
response.to_str
|
28
|
+
➔ \n<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01//EN\"\n \"http://www.w3.org/TR/html4/strict.dtd\">\n\n<html ....
|
29
|
+
|
30
|
+
RestClient.post( url,
|
31
|
+
{
|
32
|
+
:transfer => {
|
33
|
+
:path => '/foo/bar',
|
34
|
+
:owner => 'that_guy',
|
35
|
+
:group => 'those_guys'
|
36
|
+
},
|
37
|
+
:upload => {
|
38
|
+
:file => File.new(path)
|
39
|
+
}
|
40
|
+
})
|
41
|
+
|
20
42
|
== Multipart
|
21
43
|
|
22
44
|
Yeah, that's right! This does multipart sends for you!
|
@@ -226,6 +248,12 @@ Example:
|
|
226
248
|
|
227
249
|
RestClient.get 'http://example.com'
|
228
250
|
|
251
|
+
== More
|
252
|
+
|
253
|
+
Need caching, more advanced logging or any ability provided by a rack middleware ?
|
254
|
+
|
255
|
+
Have a look at rest-client-components http://github.com/crohr/rest-client-components
|
256
|
+
|
229
257
|
== Meta
|
230
258
|
|
231
259
|
Written by Adam Wiggins, major modifications by Blake Mizerany, maintained by Julien Kirch
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.5.0.a
|
data/history.md
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
# 1.5.0
|
2
|
+
|
3
|
+
- the response is now a string with the Response module
|
4
|
+
- added AbstractResponse.to_i to improve semantic
|
5
|
+
- multipart Payloads ignores the name attribute if it's not set (patch provided by Tekin Suleyman)
|
6
|
+
- correctly takes into account user headers whose keys are strings (path provided by Cyril Rohr)
|
7
|
+
- use binary mode for payload temp file
|
8
|
+
- concatenate cookies with ';'
|
9
|
+
- fixed deeper parameter handling
|
10
|
+
- do not quote the boundary in the Content-Type header (patch provided by W. Andrew Loe III)
|
11
|
+
|
1
12
|
# 1.4.2
|
2
13
|
|
3
14
|
- fixed RestClient.add_before_execution_proc (patch provided by Nicholas Wieland)
|
@@ -1,14 +1,9 @@
|
|
1
1
|
module RestClient
|
2
2
|
|
3
|
-
|
3
|
+
module AbstractResponse
|
4
4
|
|
5
5
|
attr_reader :net_http_res, :args
|
6
6
|
|
7
|
-
def initialize net_http_res, args
|
8
|
-
@net_http_res = net_http_res
|
9
|
-
@args = args
|
10
|
-
end
|
11
|
-
|
12
7
|
# HTTP status code
|
13
8
|
def code
|
14
9
|
@code ||= @net_http_res.code.to_i
|
@@ -17,7 +12,7 @@ module RestClient
|
|
17
12
|
# A hash of the headers, beautified with symbols and underscores.
|
18
13
|
# e.g. "Content-type" will become :content_type.
|
19
14
|
def headers
|
20
|
-
@headers ||=
|
15
|
+
@headers ||= AbstractResponse.beautify_headers(@net_http_res.to_hash)
|
21
16
|
end
|
22
17
|
|
23
18
|
# The raw headers.
|
@@ -63,7 +58,11 @@ module RestClient
|
|
63
58
|
end
|
64
59
|
end
|
65
60
|
|
66
|
-
def
|
61
|
+
def to_i
|
62
|
+
code
|
63
|
+
end
|
64
|
+
|
65
|
+
def description
|
67
66
|
"#{code} #{STATUSES[code]} | #{(headers[:content_type] || '').gsub(/;.*$/, '')} #{size} bytes\n"
|
68
67
|
end
|
69
68
|
|
data/lib/restclient/payload.rb
CHANGED
@@ -52,7 +52,7 @@ module RestClient
|
|
52
52
|
end
|
53
53
|
|
54
54
|
# Flatten parameters by converting hashes of hashes to flat hashes
|
55
|
-
# {keys1 => {keys2 => value}} will be transformed into
|
55
|
+
# {keys1 => {keys2 => value}} will be transformed into [keys1[key2], value]
|
56
56
|
def flatten_params(params, parent_key = nil)
|
57
57
|
result = []
|
58
58
|
params.each do |key, value|
|
@@ -60,9 +60,7 @@ module RestClient
|
|
60
60
|
if value.is_a? Hash
|
61
61
|
result += flatten_params(value, calculated_key)
|
62
62
|
elsif value.is_a? Array
|
63
|
-
value
|
64
|
-
result << ["#{calculated_key}[]", elem]
|
65
|
-
end
|
63
|
+
result += flatten_params_array(value, calculated_key)
|
66
64
|
else
|
67
65
|
result << [calculated_key, value]
|
68
66
|
end
|
@@ -70,6 +68,20 @@ module RestClient
|
|
70
68
|
result
|
71
69
|
end
|
72
70
|
|
71
|
+
def flatten_params_array value, calculated_key
|
72
|
+
result = []
|
73
|
+
value.each do |elem|
|
74
|
+
if elem.is_a? Hash
|
75
|
+
result += flatten_params(elem, calculated_key)
|
76
|
+
elsif elem.is_a? Array
|
77
|
+
result += flatten_params_array(elem, calculated_key)
|
78
|
+
else
|
79
|
+
result << ["#{calculated_key}[]", elem]
|
80
|
+
end
|
81
|
+
end
|
82
|
+
result
|
83
|
+
end
|
84
|
+
|
73
85
|
def headers
|
74
86
|
{ 'Content-Length' => size.to_s }
|
75
87
|
end
|
@@ -91,7 +103,7 @@ module RestClient
|
|
91
103
|
end
|
92
104
|
|
93
105
|
def short_inspect
|
94
|
-
(size >
|
106
|
+
(size > 500 ? "#{size} byte(s) length" : inspect)
|
95
107
|
end
|
96
108
|
|
97
109
|
end
|
@@ -116,6 +128,7 @@ module RestClient
|
|
116
128
|
b = "--#{boundary}"
|
117
129
|
|
118
130
|
@stream = Tempfile.new("RESTClient.Stream.#{rand(1000)}")
|
131
|
+
@stream.binmode
|
119
132
|
@stream.write(b + EOL)
|
120
133
|
|
121
134
|
if params.is_a? Hash
|
@@ -149,7 +162,9 @@ module RestClient
|
|
149
162
|
|
150
163
|
def create_file_field(s, k, v)
|
151
164
|
begin
|
152
|
-
s.write("Content-Disposition: form-data;
|
165
|
+
s.write("Content-Disposition: form-data;")
|
166
|
+
s.write(" name=\"#{k}\";") unless (k.nil? || k=='')
|
167
|
+
s.write(" filename=\"#{v.respond_to?(:original_filename) ? v.original_filename : File.basename(v.path)}\"#{EOL}")
|
153
168
|
s.write("Content-Type: #{v.respond_to?(:content_type) ? v.content_type : mime_for(v.path)}#{EOL}")
|
154
169
|
s.write(EOL)
|
155
170
|
while data = v.read(8124)
|
@@ -170,7 +185,7 @@ module RestClient
|
|
170
185
|
end
|
171
186
|
|
172
187
|
def headers
|
173
|
-
super.merge({'Content-Type' => %Q{multipart/form-data; boundary
|
188
|
+
super.merge({'Content-Type' => %Q{multipart/form-data; boundary=#{boundary}}})
|
174
189
|
end
|
175
190
|
|
176
191
|
def close
|
@@ -9,12 +9,15 @@ module RestClient
|
|
9
9
|
# In addition, if you do not use the response as a string, you can access
|
10
10
|
# a Tempfile object at res.file, which contains the path to the raw
|
11
11
|
# downloaded request body.
|
12
|
-
class RawResponse
|
12
|
+
class RawResponse
|
13
|
+
|
14
|
+
include AbstractResponse
|
13
15
|
|
14
16
|
attr_reader :file
|
15
17
|
|
16
18
|
def initialize tempfile, net_http_res, args
|
17
|
-
|
19
|
+
@net_http_res = net_http_res
|
20
|
+
@args = args
|
18
21
|
@file = tempfile
|
19
22
|
end
|
20
23
|
|
data/lib/restclient/request.rb
CHANGED
@@ -57,28 +57,9 @@ module RestClient
|
|
57
57
|
|
58
58
|
def make_headers user_headers
|
59
59
|
unless @cookies.empty?
|
60
|
-
user_headers[:cookie] = @cookies.map {|(key, val)| "#{key.to_s}=#{val}" }.sort.join(
|
60
|
+
user_headers[:cookie] = @cookies.map {|(key, val)| "#{key.to_s}=#{val}" }.sort.join(';')
|
61
61
|
end
|
62
|
-
|
63
|
-
headers = default_headers.merge(user_headers).inject({}) do |final, (key, value)|
|
64
|
-
target_key = key.to_s.gsub(/_/, '-').capitalize
|
65
|
-
if 'CONTENT-TYPE' == target_key.upcase
|
66
|
-
target_value = value.to_s
|
67
|
-
final[target_key] = MIME::Types.type_for_extension target_value
|
68
|
-
elsif 'ACCEPT' == target_key.upcase
|
69
|
-
# Accept can be composed of several comma-separated values
|
70
|
-
if value.is_a? Array
|
71
|
-
target_values = value
|
72
|
-
else
|
73
|
-
target_values = value.to_s.split ','
|
74
|
-
end
|
75
|
-
final[target_key] = target_values.map{ |ext| MIME::Types.type_for_extension(ext.to_s.strip)}.join(', ')
|
76
|
-
else
|
77
|
-
final[target_key] = value.to_s
|
78
|
-
end
|
79
|
-
final
|
80
|
-
end
|
81
|
-
|
62
|
+
headers = stringify_headers(default_headers).merge(stringify_headers(user_headers))
|
82
63
|
headers.merge!(@payload.headers) if @payload
|
83
64
|
headers
|
84
65
|
end
|
@@ -195,7 +176,7 @@ module RestClient
|
|
195
176
|
# We don't decode raw requests
|
196
177
|
response = RawResponse.new(@tf, res, args)
|
197
178
|
else
|
198
|
-
response = Response.
|
179
|
+
response = Response.create(Request.decode(res['content-encoding'], res.body), res, args)
|
199
180
|
end
|
200
181
|
|
201
182
|
if block_given?
|
@@ -223,7 +204,7 @@ module RestClient
|
|
223
204
|
out = []
|
224
205
|
out << "RestClient.#{method} #{url.inspect}"
|
225
206
|
out << payload.short_inspect if payload
|
226
|
-
out << processed_headers.inspect.
|
207
|
+
out << processed_headers.to_a.sort.map{|(k,v)| [k.inspect, v.inspect].join("=>")}.join(", ")
|
227
208
|
RestClient.log << out.join(', ') + "\n"
|
228
209
|
end
|
229
210
|
end
|
@@ -235,9 +216,32 @@ module RestClient
|
|
235
216
|
end
|
236
217
|
end
|
237
218
|
|
219
|
+
# Return a hash of headers whose keys are capitalized strings
|
220
|
+
def stringify_headers headers
|
221
|
+
headers.inject({}) do |result, (key, value)|
|
222
|
+
target_key = key.to_s.split(/_/).map{|w| w.capitalize}.join('-')
|
223
|
+
if 'CONTENT-TYPE' == target_key.upcase
|
224
|
+
target_value = value.to_s
|
225
|
+
result[target_key] = MIME::Types.type_for_extension target_value
|
226
|
+
elsif 'ACCEPT' == target_key.upcase
|
227
|
+
# Accept can be composed of several comma-separated values
|
228
|
+
if value.is_a? Array
|
229
|
+
target_values = value
|
230
|
+
else
|
231
|
+
target_values = value.to_s.split ','
|
232
|
+
end
|
233
|
+
result[target_key] = target_values.map{ |ext| MIME::Types.type_for_extension(ext.to_s.strip)}.join(', ')
|
234
|
+
else
|
235
|
+
result[target_key] = value.to_s
|
236
|
+
end
|
237
|
+
result
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
238
241
|
def default_headers
|
239
242
|
{ :accept => '*/*; q=0.5, application/xml', :accept_encoding => 'gzip, deflate' }
|
240
243
|
end
|
244
|
+
|
241
245
|
end
|
242
246
|
end
|
243
247
|
|
data/lib/restclient/response.rb
CHANGED
@@ -2,44 +2,22 @@ module RestClient
|
|
2
2
|
|
3
3
|
# A Response from RestClient, you can access the response body, the code or the headers.
|
4
4
|
#
|
5
|
-
|
5
|
+
module Response
|
6
6
|
|
7
|
-
|
7
|
+
include AbstractResponse
|
8
8
|
|
9
|
-
|
9
|
+
attr_accessor :body, :net_http_res, :args
|
10
10
|
|
11
|
-
def
|
12
|
-
|
13
|
-
@body = body || ""
|
11
|
+
def body
|
12
|
+
self
|
14
13
|
end
|
15
14
|
|
16
|
-
def
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
def == o
|
26
|
-
if super
|
27
|
-
true
|
28
|
-
else
|
29
|
-
equal_body = (body == o)
|
30
|
-
if equal_body
|
31
|
-
warn WARNING_MESSAGE
|
32
|
-
end
|
33
|
-
equal_body
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
def to_s
|
38
|
-
body.to_s
|
39
|
-
end
|
40
|
-
|
41
|
-
def size
|
42
|
-
body.size
|
15
|
+
def Response.create body, net_http_res, args
|
16
|
+
result = body || ''
|
17
|
+
result.extend Response
|
18
|
+
result.net_http_res = net_http_res
|
19
|
+
result.args = args
|
20
|
+
result
|
43
21
|
end
|
44
22
|
|
45
23
|
end
|
@@ -1,9 +1,24 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/base'
|
2
2
|
|
3
3
|
describe RestClient::AbstractResponse do
|
4
|
+
|
5
|
+
class MyAbstractResponse
|
6
|
+
|
7
|
+
include RestClient::AbstractResponse
|
8
|
+
|
9
|
+
attr_accessor :size
|
10
|
+
|
11
|
+
def initialize net_http_res, args
|
12
|
+
@net_http_res = net_http_res
|
13
|
+
@args = args
|
14
|
+
end
|
15
|
+
|
16
|
+
|
17
|
+
end
|
18
|
+
|
4
19
|
before do
|
5
20
|
@net_http_res = mock('net http response')
|
6
|
-
@response =
|
21
|
+
@response = MyAbstractResponse.new(@net_http_res, {})
|
7
22
|
end
|
8
23
|
|
9
24
|
it "fetches the numeric response code" do
|
@@ -11,13 +26,19 @@ describe RestClient::AbstractResponse do
|
|
11
26
|
@response.code.should == 200
|
12
27
|
end
|
13
28
|
|
29
|
+
it "has a nice description" do
|
30
|
+
@net_http_res.should_receive(:to_hash).and_return({'Content-Type' => 'application/pdf'})
|
31
|
+
@net_http_res.should_receive(:code).and_return('200')
|
32
|
+
@response.description == '200 OK | application/pdf bytes\n'
|
33
|
+
end
|
34
|
+
|
14
35
|
it "beautifies the headers by turning the keys to symbols" do
|
15
|
-
h = RestClient::
|
36
|
+
h = RestClient::AbstractResponse.beautify_headers('content-type' => [ 'x' ])
|
16
37
|
h.keys.first.should == :content_type
|
17
38
|
end
|
18
39
|
|
19
40
|
it "beautifies the headers by turning the values to strings instead of one-element arrays" do
|
20
|
-
h = RestClient::
|
41
|
+
h = RestClient::AbstractResponse.beautify_headers('x' => [ 'text/html' ] )
|
21
42
|
h.values.first.should == 'text/html'
|
22
43
|
end
|
23
44
|
|
data/spec/payload_spec.rb
CHANGED
@@ -11,7 +11,7 @@ describe RestClient::Payload do
|
|
11
11
|
RestClient::Payload::UrlEncoded.new({:foo => 'bar'}).to_s.
|
12
12
|
should == "foo=bar"
|
13
13
|
["foo=bar&baz=qux", "baz=qux&foo=bar"].should include(
|
14
|
-
|
14
|
+
RestClient::Payload::UrlEncoded.new({:foo => 'bar', :baz => 'qux'}).to_s)
|
15
15
|
end
|
16
16
|
|
17
17
|
it "should properly handle hashes as parameter" do
|
@@ -26,6 +26,16 @@ describe RestClient::Payload do
|
|
26
26
|
parameters.should include("foo[bar]=baz", "foo[baz]=qux")
|
27
27
|
end
|
28
28
|
|
29
|
+
it "should handle attributes inside a an array inside an hash" do
|
30
|
+
parameters = RestClient::Payload::UrlEncoded.new({"foo" => [{"bar" => 'baz'}, {"bar" => 'qux'}]}).to_s
|
31
|
+
parameters.should include("foo[bar]=baz", "foo[bar]=qux")
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should handle attributes inside a an array inside an array inside an hash" do
|
35
|
+
parameters = RestClient::Payload::UrlEncoded.new({"foo" => [ [{"bar" => 'baz'}, {"bar" => 'qux'}]]}).to_s
|
36
|
+
parameters.should include("foo[bar]=baz", "foo[bar]=qux")
|
37
|
+
end
|
38
|
+
|
29
39
|
it "should form properly use symbols as parameters" do
|
30
40
|
RestClient::Payload::UrlEncoded.new({:foo => :bar}).to_s.
|
31
41
|
should == "foo=bar"
|
@@ -46,7 +56,7 @@ describe RestClient::Payload do
|
|
46
56
|
it "should use standard enctype as default content-type" do
|
47
57
|
m = RestClient::Payload::Multipart.new({})
|
48
58
|
m.stub!(:boundary).and_return(123)
|
49
|
-
m.headers['Content-Type'].should == 'multipart/form-data; boundary=
|
59
|
+
m.headers['Content-Type'].should == 'multipart/form-data; boundary=123'
|
50
60
|
end
|
51
61
|
|
52
62
|
it "should form properly separated multipart data" do
|
@@ -77,6 +87,19 @@ Content-Type: image/jpeg\r
|
|
77
87
|
EOS
|
78
88
|
end
|
79
89
|
|
90
|
+
it "should ignore the name attribute when it's not set" do
|
91
|
+
f = File.new(File.dirname(__FILE__) + "/master_shake.jpg")
|
92
|
+
m = RestClient::Payload::Multipart.new({nil => f})
|
93
|
+
m.to_s.should == <<-EOS
|
94
|
+
--#{m.boundary}\r
|
95
|
+
Content-Disposition: form-data; filename="master_shake.jpg"\r
|
96
|
+
Content-Type: image/jpeg\r
|
97
|
+
\r
|
98
|
+
#{IO.read(f.path)}\r
|
99
|
+
--#{m.boundary}--\r
|
100
|
+
EOS
|
101
|
+
end
|
102
|
+
|
80
103
|
it "should detect optional (original) content type and filename" do
|
81
104
|
f = File.new(File.dirname(__FILE__) + "/master_shake.jpg")
|
82
105
|
f.instance_eval "def content_type; 'text/plain'; end"
|
data/spec/request_spec.rb
CHANGED
@@ -99,7 +99,7 @@ describe RestClient::Request do
|
|
99
99
|
URI.stub!(:parse).and_return(mock('uri', :user => nil, :password => nil))
|
100
100
|
@request = RestClient::Request.new(:method => 'get', :url => 'example.com', :cookies => {:session_id => '1', :user_id => "someone" })
|
101
101
|
@request.should_receive(:default_headers).and_return({'foo' => 'bar'})
|
102
|
-
headers = @request.make_headers({}).should == { 'Foo' => 'bar', 'Cookie' => 'session_id=1
|
102
|
+
headers = @request.make_headers({}).should == { 'Foo' => 'bar', 'Cookie' => 'session_id=1;user_id=someone'}
|
103
103
|
end
|
104
104
|
|
105
105
|
it "determines the Net::HTTP class to instantiate by the method name" do
|
@@ -108,12 +108,12 @@ describe RestClient::Request do
|
|
108
108
|
|
109
109
|
describe "user headers" do
|
110
110
|
it "merges user headers with the default headers" do
|
111
|
-
@request.should_receive(:default_headers).and_return({ '
|
112
|
-
headers = @request.make_headers(
|
113
|
-
headers.should have_key
|
114
|
-
headers[
|
115
|
-
headers.should have_key
|
116
|
-
headers[
|
111
|
+
@request.should_receive(:default_headers).and_return({ :accept => '*/*; q=0.5, application/xml', :accept_encoding => 'gzip, deflate' })
|
112
|
+
headers = @request.make_headers("Accept" => "application/json", :accept_encoding => 'gzip')
|
113
|
+
headers.should have_key "Accept-Encoding"
|
114
|
+
headers["Accept-Encoding"].should == "gzip"
|
115
|
+
headers.should have_key "Accept"
|
116
|
+
headers["Accept"].should == "application/json"
|
117
117
|
end
|
118
118
|
|
119
119
|
it "prefers the user header when the same header exists in the defaults" do
|
@@ -126,18 +126,18 @@ describe RestClient::Request do
|
|
126
126
|
|
127
127
|
describe "header symbols" do
|
128
128
|
|
129
|
-
it "converts header symbols from :content_type to 'Content-
|
129
|
+
it "converts header symbols from :content_type to 'Content-Type'" do
|
130
130
|
@request.should_receive(:default_headers).and_return({})
|
131
131
|
headers = @request.make_headers(:content_type => 'abc')
|
132
|
-
headers.should have_key('Content-
|
133
|
-
headers['Content-
|
132
|
+
headers.should have_key('Content-Type')
|
133
|
+
headers['Content-Type'].should == 'abc'
|
134
134
|
end
|
135
135
|
|
136
136
|
it "converts content-type from extension to real content-type" do
|
137
137
|
@request.should_receive(:default_headers).and_return({})
|
138
138
|
headers = @request.make_headers(:content_type => 'json')
|
139
|
-
headers.should have_key('Content-
|
140
|
-
headers['Content-
|
139
|
+
headers.should have_key('Content-Type')
|
140
|
+
headers['Content-Type'].should == 'application/json'
|
141
141
|
end
|
142
142
|
|
143
143
|
it "converts accept from extension(s) to real content-type(s)" do
|
@@ -282,29 +282,25 @@ describe RestClient::Request do
|
|
282
282
|
it "logs a get request" do
|
283
283
|
log = RestClient.log = []
|
284
284
|
RestClient::Request.new(:method => :get, :url => 'http://url').log_request
|
285
|
-
[
|
286
|
-
'RestClient.get "http://url", "Accept"=>"*/*; q=0.5, application/xml", "Accept-encoding"=>"gzip, deflate"' + "\n"].should include(log[0])
|
285
|
+
log[0].should == %Q{RestClient.get "http://url", "Accept"=>"*/*; q=0.5, application/xml", "Accept-Encoding"=>"gzip, deflate"\n}
|
287
286
|
end
|
288
287
|
|
289
288
|
it "logs a post request with a small payload" do
|
290
289
|
log = RestClient.log = []
|
291
290
|
RestClient::Request.new(:method => :post, :url => 'http://url', :payload => 'foo').log_request
|
292
|
-
[
|
293
|
-
'RestClient.post "http://url", "foo", "Accept"=>"*/*; q=0.5, application/xml", "Accept-encoding"=>"gzip, deflate", "Content-Length"=>"3"' + "\n"].should include(log[0])
|
291
|
+
log[0].should == %Q{RestClient.post "http://url", "foo", "Accept"=>"*/*; q=0.5, application/xml", "Accept-Encoding"=>"gzip, deflate", "Content-Length"=>"3"\n}
|
294
292
|
end
|
295
293
|
|
296
294
|
it "logs a post request with a large payload" do
|
297
295
|
log = RestClient.log = []
|
298
296
|
RestClient::Request.new(:method => :post, :url => 'http://url', :payload => ('x' * 1000)).log_request
|
299
|
-
[
|
300
|
-
'RestClient.post "http://url", 1000 byte(s) length, "Accept"=>"*/*; q=0.5, application/xml", "Accept-encoding"=>"gzip, deflate", "Content-Length"=>"1000"' + "\n"].should include(log[0])
|
297
|
+
log[0].should == %Q{RestClient.post "http://url", 1000 byte(s) length, "Accept"=>"*/*; q=0.5, application/xml", "Accept-Encoding"=>"gzip, deflate", "Content-Length"=>"1000"\n}
|
301
298
|
end
|
302
299
|
|
303
300
|
it "logs input headers as a hash" do
|
304
301
|
log = RestClient.log = []
|
305
302
|
RestClient::Request.new(:method => :get, :url => 'http://url', :headers => { :accept => 'text/plain' }).log_request
|
306
|
-
[
|
307
|
-
'RestClient.get "http://url", "Accept"=>"text/plain", "Accept-encoding"=>"gzip, deflate"' + "\n"].should include(log[0])
|
303
|
+
log[0].should == %Q{RestClient.get "http://url", "Accept"=>"text/plain", "Accept-Encoding"=>"gzip, deflate"\n}
|
308
304
|
end
|
309
305
|
|
310
306
|
it "logs a response including the status code, content type, and result body size in bytes" do
|
data/spec/response_spec.rb
CHANGED
@@ -5,16 +5,18 @@ include WebMock
|
|
5
5
|
|
6
6
|
describe RestClient::Response do
|
7
7
|
before do
|
8
|
-
@net_http_res = mock('net http response', :to_hash => {"Status" => ["200 OK"]})
|
9
|
-
@response = RestClient::Response.
|
8
|
+
@net_http_res = mock('net http response', :to_hash => {"Status" => ["200 OK"]}, :code => 200)
|
9
|
+
@response = RestClient::Response.create('abc', @net_http_res, {})
|
10
10
|
end
|
11
11
|
|
12
12
|
it "behaves like string" do
|
13
13
|
@response.should.to_s == 'abc'
|
14
|
+
@response.to_str.should == 'abc'
|
15
|
+
@response.to_i.should == 200
|
14
16
|
end
|
15
17
|
|
16
18
|
it "accepts nil strings and sets it to empty for the case of HEAD" do
|
17
|
-
RestClient::Response.
|
19
|
+
RestClient::Response.create(nil, @net_http_res, {}).should.to_s == ""
|
18
20
|
end
|
19
21
|
|
20
22
|
it "test headers and raw headers" do
|
@@ -25,14 +27,14 @@ describe RestClient::Response do
|
|
25
27
|
describe "cookie processing" do
|
26
28
|
it "should correctly deal with one Set-Cookie header with one cookie inside" do
|
27
29
|
net_http_res = mock('net http response', :to_hash => {"etag" => ["\"e1ac1a2df945942ef4cac8116366baad\""], "set-cookie" => ["main_page=main_page_no_rewrite; path=/; expires=Tue, 20-Jan-2015 15:03:14 GMT"]})
|
28
|
-
response = RestClient::Response.
|
30
|
+
response = RestClient::Response.create('abc', net_http_res, {})
|
29
31
|
response.headers[:set_cookie].should == ["main_page=main_page_no_rewrite; path=/; expires=Tue, 20-Jan-2015 15:03:14 GMT"]
|
30
32
|
response.cookies.should == { "main_page" => "main_page_no_rewrite" }
|
31
33
|
end
|
32
34
|
|
33
35
|
it "should correctly deal with multiple cookies [multiple Set-Cookie headers]" do
|
34
36
|
net_http_res = mock('net http response', :to_hash => {"etag" => ["\"e1ac1a2df945942ef4cac8116366baad\""], "set-cookie" => ["main_page=main_page_no_rewrite; path=/; expires=Tue, 20-Jan-2015 15:03:14 GMT", "remember_me=; path=/; expires=Thu, 01-Jan-1970 00:00:00 GMT", "user=somebody; path=/; expires=Thu, 01-Jan-1970 00:00:00 GMT"]})
|
35
|
-
response = RestClient::Response.
|
37
|
+
response = RestClient::Response.create('abc', net_http_res, {})
|
36
38
|
response.headers[:set_cookie].should == ["main_page=main_page_no_rewrite; path=/; expires=Tue, 20-Jan-2015 15:03:14 GMT", "remember_me=; path=/; expires=Thu, 01-Jan-1970 00:00:00 GMT", "user=somebody; path=/; expires=Thu, 01-Jan-1970 00:00:00 GMT"]
|
37
39
|
response.cookies.should == {
|
38
40
|
"main_page" => "main_page_no_rewrite",
|
@@ -43,7 +45,7 @@ describe RestClient::Response do
|
|
43
45
|
|
44
46
|
it "should correctly deal with multiple cookies [one Set-Cookie header with multiple cookies]" do
|
45
47
|
net_http_res = mock('net http response', :to_hash => {"etag" => ["\"e1ac1a2df945942ef4cac8116366baad\""], "set-cookie" => ["main_page=main_page_no_rewrite; path=/; expires=Tue, 20-Jan-2015 15:03:14 GMT, remember_me=; path=/; expires=Thu, 01-Jan-1970 00:00:00 GMT, user=somebody; path=/; expires=Thu, 01-Jan-1970 00:00:00 GMT"]})
|
46
|
-
response = RestClient::Response.
|
48
|
+
response = RestClient::Response.create('abc', net_http_res, {})
|
47
49
|
response.cookies.should == {
|
48
50
|
"main_page" => "main_page_no_rewrite",
|
49
51
|
"remember_me" => "",
|
@@ -56,7 +58,7 @@ describe RestClient::Response do
|
|
56
58
|
it "should return itself for normal codes" do
|
57
59
|
(200..206).each do |code|
|
58
60
|
net_http_res = mock('net http response', :code => '200')
|
59
|
-
response = RestClient::Response.
|
61
|
+
response = RestClient::Response.create('abc', net_http_res, {})
|
60
62
|
response.return!
|
61
63
|
end
|
62
64
|
end
|
@@ -65,7 +67,7 @@ describe RestClient::Response do
|
|
65
67
|
RestClient::Exceptions::EXCEPTIONS_MAP.each_key do |code|
|
66
68
|
unless (200..206).include? code
|
67
69
|
net_http_res = mock('net http response', :code => code.to_i)
|
68
|
-
response = RestClient::Response.
|
70
|
+
response = RestClient::Response.create('abc', net_http_res, {})
|
69
71
|
lambda { response.return!}.should raise_error
|
70
72
|
end
|
71
73
|
end
|
@@ -83,13 +85,13 @@ describe RestClient::Response do
|
|
83
85
|
|
84
86
|
it "doesn't follow a redirection when the request is a post" do
|
85
87
|
net_http_res = mock('net http response', :code => 301)
|
86
|
-
response = RestClient::Response.
|
88
|
+
response = RestClient::Response.create('abc', net_http_res, {:method => :post})
|
87
89
|
lambda { response.return!}.should raise_error(RestClient::MovedPermanently)
|
88
90
|
end
|
89
91
|
|
90
92
|
it "doesn't follow a redirection when the request is a put" do
|
91
93
|
net_http_res = mock('net http response', :code => 301)
|
92
|
-
response = RestClient::Response.
|
94
|
+
response = RestClient::Response.create('abc', net_http_res, {:method => :put})
|
93
95
|
lambda { response.return!}.should raise_error(RestClient::MovedPermanently)
|
94
96
|
end
|
95
97
|
|
metadata
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rest-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
prerelease:
|
4
|
+
prerelease: true
|
5
5
|
segments:
|
6
6
|
- 1
|
7
|
-
-
|
8
|
-
-
|
9
|
-
|
7
|
+
- 5
|
8
|
+
- 0
|
9
|
+
- a
|
10
|
+
version: 1.5.0.a
|
10
11
|
platform: ruby
|
11
12
|
authors:
|
12
13
|
- Adam Wiggins
|