rest-client 1.6.0 → 1.6.1.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 +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
|