rest-client 1.6.0 → 1.6.1.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 +6 -6
- data/VERSION +1 -1
- data/history.md +9 -0
- data/lib/restclient.rb +4 -0
- data/lib/restclient/abstract_response.rb +26 -13
- data/lib/restclient/exceptions.rb +14 -5
- data/lib/restclient/request.rb +3 -3
- data/lib/restclient/resource.rb +7 -2
- data/spec/abstract_response_spec.rb +1 -1
- data/spec/base.rb +6 -0
- data/spec/exceptions_spec.rb +1 -1
- data/spec/integration/request_spec.rb +1 -1
- data/spec/integration_spec.rb +1 -1
- data/spec/payload_spec.rb +1 -1
- data/spec/raw_response_spec.rb +1 -1
- data/spec/request2_spec.rb +1 -1
- data/spec/request_spec.rb +1 -1
- data/spec/resource_spec.rb +26 -1
- data/spec/response_spec.rb +7 -1
- data/spec/restclient_spec.rb +6 -1
- metadata +6 -5
data/README.rdoc
CHANGED
@@ -100,11 +100,11 @@ A block can be passed to the RestClient method, this block will then be called w
|
|
100
100
|
Response.return! can be called to invoke the default response's behavior.
|
101
101
|
|
102
102
|
# Don't raise exceptions but return the response
|
103
|
-
RestClient.get('http://example.com/resource'){|response, request| response }
|
103
|
+
RestClient.get('http://example.com/resource'){|response, request, result| response }
|
104
104
|
➔ 404 Resource Not Found | text/html 282 bytes
|
105
105
|
|
106
106
|
# Manage a specific error code
|
107
|
-
RestClient.get('http://my-rest-service.com/resource'){ |response, request, &block|
|
107
|
+
RestClient.get('http://my-rest-service.com/resource'){ |response, request, result, &block|
|
108
108
|
case response.code
|
109
109
|
when 200
|
110
110
|
p "It worked !"
|
@@ -112,7 +112,7 @@ Response.return! can be called to invoke the default response's behavior.
|
|
112
112
|
when 423
|
113
113
|
raise SomeCustomExceptionIfYouWant
|
114
114
|
else
|
115
|
-
response.return!(request, &block)
|
115
|
+
response.return!(request, result, &block)
|
116
116
|
end
|
117
117
|
}
|
118
118
|
|
@@ -120,11 +120,11 @@ Response.return! can be called to invoke the default response's behavior.
|
|
120
120
|
# RFC : "If the 301, 302 or 307 status code is received in response to a request other than GET or HEAD,
|
121
121
|
# the user agent MUST NOT automatically redirect the request unless it can be confirmed by the user,
|
122
122
|
# since this might change the conditions under which the request was issued."
|
123
|
-
RestClient.get('http://my-rest-service.com/resource'){ |response, request, &block|
|
123
|
+
RestClient.get('http://my-rest-service.com/resource'){ |response, request, result, &block|
|
124
124
|
if [301, 302, 307].include? response.code
|
125
|
-
response.follow_redirection(request, &block)
|
125
|
+
response.follow_redirection(request, result, &block)
|
126
126
|
else
|
127
|
-
response.return!(request, &block)
|
127
|
+
response.return!(request, result, &block)
|
128
128
|
end
|
129
129
|
}
|
130
130
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.6.
|
1
|
+
1.6.1
|
data/history.md
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
# 1.6.1
|
2
|
+
|
3
|
+
- add response body in Exception#inspect
|
4
|
+
- add support for RestClient.options
|
5
|
+
- fix tests for 1.9.2 (patch provided by Niko Dittmann)
|
6
|
+
- block passing in Resource#[] (patch provided by Niko Dittmann)
|
7
|
+
- cookies set in a response should be kept in a redirect
|
8
|
+
- HEAD requests should process parameters just like GET (patch provided by Rob Eanes)
|
9
|
+
|
1
10
|
# 1.6.0
|
2
11
|
|
3
12
|
- forgot to include rest-client.rb in the gem
|
data/lib/restclient.rb
CHANGED
@@ -84,6 +84,10 @@ module RestClient
|
|
84
84
|
Request.execute(:method => :head, :url => url, :headers => headers, &block)
|
85
85
|
end
|
86
86
|
|
87
|
+
def self.options(url, headers={}, &block)
|
88
|
+
Request.execute(:method => :options, :url => url, :headers => headers, &block)
|
89
|
+
end
|
90
|
+
|
87
91
|
class << self
|
88
92
|
attr_accessor :proxy
|
89
93
|
end
|
@@ -25,34 +25,29 @@ module RestClient
|
|
25
25
|
# Hash of cookies extracted from response headers
|
26
26
|
def cookies
|
27
27
|
@cookies ||= (self.headers[:set_cookie] || {}).inject({}) do |out, cookie_content|
|
28
|
-
|
29
|
-
unless ['expires', 'path'].include? key
|
30
|
-
out[CGI::escape(key)] = cookie.value[0] ? (CGI::escape(cookie.value[0]) || '') : ''
|
31
|
-
end
|
32
|
-
end
|
33
|
-
out
|
28
|
+
out.merge parse_cookie(cookie_content)
|
34
29
|
end
|
35
30
|
end
|
36
31
|
|
37
32
|
# Return the default behavior corresponding to the response code:
|
38
33
|
# the response itself for code in 200..206, redirection for 301, 302 and 307 in get and head cases, redirection for 303 and an exception in other cases
|
39
|
-
def return! request = nil, &block
|
34
|
+
def return! request = nil, result = nil, & block
|
40
35
|
if (200..207).include? code
|
41
36
|
self
|
42
37
|
elsif [301, 302, 307].include? code
|
43
38
|
unless [:get, :head].include? args[:method]
|
44
|
-
raise Exceptions::EXCEPTIONS_MAP[code],
|
39
|
+
raise Exceptions::EXCEPTIONS_MAP[code].new(self, code)
|
45
40
|
else
|
46
|
-
follow_redirection(request, &block)
|
41
|
+
follow_redirection(request, result, & block)
|
47
42
|
end
|
48
43
|
elsif code == 303
|
49
44
|
args[:method] = :get
|
50
45
|
args.delete :payload
|
51
|
-
follow_redirection(request, &block)
|
46
|
+
follow_redirection(request, result, & block)
|
52
47
|
elsif Exceptions::EXCEPTIONS_MAP[code]
|
53
|
-
raise Exceptions::EXCEPTIONS_MAP[code],
|
48
|
+
raise Exceptions::EXCEPTIONS_MAP[code].new(self, code)
|
54
49
|
else
|
55
|
-
raise RequestFailed
|
50
|
+
raise RequestFailed self
|
56
51
|
end
|
57
52
|
end
|
58
53
|
|
@@ -65,7 +60,7 @@ module RestClient
|
|
65
60
|
end
|
66
61
|
|
67
62
|
# Follow a redirection
|
68
|
-
def follow_redirection request = nil, &block
|
63
|
+
def follow_redirection request = nil, result = nil, & block
|
69
64
|
url = headers[:location]
|
70
65
|
if url !~ /^http/
|
71
66
|
url = URI.parse(args[:url]).merge(url).to_s
|
@@ -75,6 +70,10 @@ module RestClient
|
|
75
70
|
args[:password] = request.password
|
76
71
|
args[:user] = request.user
|
77
72
|
args[:headers] = request.headers
|
73
|
+
# pass any cookie set in the result
|
74
|
+
if result && result['set-cookie']
|
75
|
+
args[:headers][:cookies] = (args[:headers][:cookies] || {}).merge(parse_cookie(result['set-cookie']))
|
76
|
+
end
|
78
77
|
end
|
79
78
|
Request.execute args, &block
|
80
79
|
end
|
@@ -85,5 +84,19 @@ module RestClient
|
|
85
84
|
out
|
86
85
|
end
|
87
86
|
end
|
87
|
+
|
88
|
+
private
|
89
|
+
|
90
|
+
# Parse a cookie value and return its content in an Hash
|
91
|
+
def parse_cookie cookie_content
|
92
|
+
out = {}
|
93
|
+
CGI::Cookie::parse(cookie_content).each do |key, cookie|
|
94
|
+
unless ['expires', 'path'].include? key
|
95
|
+
out[CGI::escape(key)] = cookie.value[0] ? (CGI::escape(cookie.value[0]) || '') : ''
|
96
|
+
end
|
97
|
+
end
|
98
|
+
out
|
99
|
+
end
|
88
100
|
end
|
101
|
+
|
89
102
|
end
|
@@ -82,8 +82,9 @@ module RestClient
|
|
82
82
|
class Exception < RuntimeError
|
83
83
|
attr_accessor :message, :response
|
84
84
|
|
85
|
-
def initialize response = nil
|
85
|
+
def initialize response = nil, initial_response_code = nil
|
86
86
|
@response = response
|
87
|
+
@initial_response_code = initial_response_code
|
87
88
|
|
88
89
|
# compatibility: this make the exception behave like a Net::HTTPResponse
|
89
90
|
response.extend ResponseForException if response
|
@@ -91,7 +92,11 @@ module RestClient
|
|
91
92
|
|
92
93
|
def http_code
|
93
94
|
# return integer for compatibility
|
94
|
-
|
95
|
+
if @response
|
96
|
+
@response.code.to_i
|
97
|
+
else
|
98
|
+
@initial_response_code
|
99
|
+
end
|
95
100
|
end
|
96
101
|
|
97
102
|
def http_body
|
@@ -99,7 +104,11 @@ module RestClient
|
|
99
104
|
end
|
100
105
|
|
101
106
|
def inspect
|
102
|
-
"#{
|
107
|
+
"#{message}: #{http_body}"
|
108
|
+
end
|
109
|
+
|
110
|
+
def to_s
|
111
|
+
inspect
|
103
112
|
end
|
104
113
|
|
105
114
|
end
|
@@ -131,7 +140,7 @@ module RestClient
|
|
131
140
|
# Compatibility
|
132
141
|
superclass = ([304, 401, 404].include? code) ? ExceptionWithResponse : RequestFailed
|
133
142
|
klass = Class.new(superclass) do
|
134
|
-
send(:define_method, :message) {message}
|
143
|
+
send(:define_method, :message) {"#{http_code ? "#{http_code} " : ''}#{message}"}
|
135
144
|
end
|
136
145
|
klass_constant = const_set message.delete(' \-\''), klass
|
137
146
|
Exceptions::EXCEPTIONS_MAP[code] = klass_constant
|
@@ -158,7 +167,7 @@ module RestClient
|
|
158
167
|
|
159
168
|
class SSLCertificateNotVerified < Exception
|
160
169
|
def initialize(message)
|
161
|
-
super
|
170
|
+
super nil, nil
|
162
171
|
self.message = message
|
163
172
|
end
|
164
173
|
end
|
data/lib/restclient/request.rb
CHANGED
@@ -62,7 +62,7 @@ module RestClient
|
|
62
62
|
|
63
63
|
# Extract the query parameters for get request and append them to the url
|
64
64
|
def process_get_params url, headers
|
65
|
-
if
|
65
|
+
if [:get, :head].include? method
|
66
66
|
get_params = {}
|
67
67
|
headers.delete_if do |key, value|
|
68
68
|
if 'params' == key.to_s.downcase && value.is_a?(Hash)
|
@@ -215,9 +215,9 @@ module RestClient
|
|
215
215
|
end
|
216
216
|
|
217
217
|
if block_given?
|
218
|
-
block.call(response, self, & block)
|
218
|
+
block.call(response, self, res, & block)
|
219
219
|
else
|
220
|
-
response.return!(self, & block)
|
220
|
+
response.return!(self, res, & block)
|
221
221
|
end
|
222
222
|
|
223
223
|
end
|
data/lib/restclient/resource.rb
CHANGED
@@ -130,8 +130,13 @@ module RestClient
|
|
130
130
|
# comments = first_post['comments']
|
131
131
|
# comments.post 'Hello', :content_type => 'text/plain'
|
132
132
|
#
|
133
|
-
def [](suburl)
|
134
|
-
|
133
|
+
def [](suburl, &new_block)
|
134
|
+
case
|
135
|
+
when block_given? then self.class.new(concat_urls(url, suburl), options, &new_block)
|
136
|
+
when block then self.class.new(concat_urls(url, suburl), options, &block)
|
137
|
+
else
|
138
|
+
self.class.new(concat_urls(url, suburl), options)
|
139
|
+
end
|
135
140
|
end
|
136
141
|
|
137
142
|
def concat_urls(url, suburl) # :nodoc:
|
data/spec/base.rb
CHANGED
data/spec/exceptions_spec.rb
CHANGED
data/spec/integration_spec.rb
CHANGED
data/spec/payload_spec.rb
CHANGED
data/spec/raw_response_spec.rb
CHANGED
data/spec/request2_spec.rb
CHANGED
data/spec/request_spec.rb
CHANGED
data/spec/resource_spec.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require File.dirname(__FILE__)
|
1
|
+
require File.join( File.dirname(File.expand_path(__FILE__)), 'base')
|
2
2
|
|
3
3
|
require 'webmock/rspec'
|
4
4
|
include WebMock
|
@@ -72,6 +72,31 @@ describe RestClient::Resource do
|
|
72
72
|
parent['posts'].password.should == 'password'
|
73
73
|
end
|
74
74
|
|
75
|
+
it "passes a given block to subresources" do
|
76
|
+
block = Proc.new{|r| r}
|
77
|
+
parent = RestClient::Resource.new('http://example.com', &block)
|
78
|
+
parent['posts'].block.should == block
|
79
|
+
end
|
80
|
+
|
81
|
+
it "the block should be overrideable" do
|
82
|
+
block1 = Proc.new{|r| r}
|
83
|
+
block2 = Proc.new{|r| r}
|
84
|
+
parent = RestClient::Resource.new('http://example.com', &block1)
|
85
|
+
# parent['posts', &block2].block.should == block2 # ruby 1.9 syntax
|
86
|
+
parent.send(:[], 'posts', &block2).block.should == block2
|
87
|
+
end
|
88
|
+
|
89
|
+
it "the block should be overrideable in ruby 1.9 syntax" do
|
90
|
+
block = Proc.new{|r| r}
|
91
|
+
parent = RestClient::Resource.new('http://example.com', &block)
|
92
|
+
r19_syntax = %q{
|
93
|
+
parent['posts', &->(r){r}].block.should_not == block
|
94
|
+
}
|
95
|
+
if is_ruby_19?
|
96
|
+
eval(r19_syntax)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
75
100
|
it "prints its url with to_s" do
|
76
101
|
RestClient::Resource.new('x').to_s.should == 'x'
|
77
102
|
end
|
data/spec/response_spec.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require File.dirname(__FILE__)
|
1
|
+
require File.join( File.dirname(File.expand_path(__FILE__)), 'base')
|
2
2
|
|
3
3
|
require 'webmock/rspec'
|
4
4
|
include WebMock
|
@@ -90,6 +90,12 @@ describe RestClient::Response do
|
|
90
90
|
RestClient::Request.execute(:url => 'http://some/resource', :method => :get, :user => 'foo', :password => 'bar', :headers => {:accept => :json}).body.should == 'Foo'
|
91
91
|
end
|
92
92
|
|
93
|
+
it "follows a redirection and keep the cookies" do
|
94
|
+
stub_request(:get, 'http://some/resource').to_return(:body => '', :status => 301, :headers => {'Set-Cookie' => CGI::Cookie.new('Foo', 'Bar'), 'Location' => 'http://new/resource', })
|
95
|
+
stub_request(:get, 'http://new/resource').with(:headers => {'Cookie' => 'Foo=Bar'}).to_return(:body => 'Qux')
|
96
|
+
RestClient::Request.execute(:url => 'http://some/resource', :method => :get).body.should == 'Qux'
|
97
|
+
end
|
98
|
+
|
93
99
|
it "doesn't follow a 301 when the request is a post" do
|
94
100
|
net_http_res = mock('net http response', :code => 301)
|
95
101
|
response = RestClient::Response.create('abc', net_http_res, {:method => :post})
|
data/spec/restclient_spec.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require File.dirname(__FILE__)
|
1
|
+
require File.join( File.dirname(File.expand_path(__FILE__)), 'base')
|
2
2
|
|
3
3
|
describe RestClient do
|
4
4
|
describe "API" do
|
@@ -26,6 +26,11 @@ describe RestClient do
|
|
26
26
|
RestClient::Request.should_receive(:execute).with(:method => :head, :url => 'http://some/resource', :headers => {})
|
27
27
|
RestClient.head('http://some/resource')
|
28
28
|
end
|
29
|
+
|
30
|
+
it "OPTIONS" do
|
31
|
+
RestClient::Request.should_receive(:execute).with(:method => :options, :url => 'http://some/resource', :headers => {})
|
32
|
+
RestClient.options('http://some/resource')
|
33
|
+
end
|
29
34
|
end
|
30
35
|
|
31
36
|
describe "logging" do
|
metadata
CHANGED
@@ -1,13 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rest-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 14
|
5
|
+
prerelease: true
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 6
|
9
|
-
-
|
10
|
-
|
9
|
+
- 1
|
10
|
+
- a
|
11
|
+
version: 1.6.1.a
|
11
12
|
platform: ruby
|
12
13
|
authors:
|
13
14
|
- Adam Wiggins
|
@@ -16,7 +17,7 @@ autorequire:
|
|
16
17
|
bindir: bin
|
17
18
|
cert_chain: []
|
18
19
|
|
19
|
-
date: 2010-
|
20
|
+
date: 2010-07-24 00:00:00 +02:00
|
20
21
|
default_executable: restclient
|
21
22
|
dependencies:
|
22
23
|
- !ruby/object:Gem::Dependency
|