rest-client 1.4.2 → 1.5.0.a
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.
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
|