jugend-httparty 0.5.2.2 → 0.5.2.3
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.
- data/History +7 -25
- data/Rakefile +4 -4
- data/VERSION +1 -1
- data/features/steps/env.rb +1 -8
- data/features/steps/httparty_steps.rb +0 -8
- data/features/steps/mongrel_helper.rb +0 -22
- data/features/steps/remote_service_steps.rb +2 -11
- data/features/supports_timeout_option.feature +0 -1
- data/jugend-httparty.gemspec +2 -2
- data/lib/httparty.rb +6 -45
- data/lib/httparty/request.rb +91 -103
- data/lib/httparty/response.rb +10 -54
- data/spec/httparty/request_spec.rb +0 -38
- data/spec/httparty/response_spec.rb +32 -53
- data/spec/httparty_spec.rb +1 -31
- data/spec/spec_helper.rb +2 -6
- data/spec/support/stub_response.rb +1 -1
- metadata +3 -3
data/History
CHANGED
@@ -1,30 +1,12 @@
|
|
1
|
-
== 0.5.3
|
2
|
-
*
|
3
|
-
|
4
|
-
== 0.5.3.3
|
5
|
-
* Remove RubyforgeTasks
|
6
|
-
|
7
|
-
== 0.5.3.2
|
8
|
-
* Remove deprecated rubyforge gem push
|
9
|
-
|
10
|
-
== 0.5.3.1
|
11
|
-
* Update Pathname initialization to support earlier version of ruby (<=1.8.4)
|
1
|
+
== 0.5.2.3
|
2
|
+
* Repackage gem, old gem contains master branch files
|
12
3
|
|
13
|
-
== 0.5.
|
14
|
-
*
|
15
|
-
* Digest Auth (bartiaco, sbecker, gilles, and aaronrussell)
|
16
|
-
* Maintain HTTP method across redirects (bartiaco and sbecker)
|
17
|
-
* HTTParty::Response#response returns the Net::HTTPResponse object
|
18
|
-
* HTTParty::Response#headers returns a HTTParty::Response::Headers object
|
19
|
-
which quacks like a Hash + Net::HTTPHeader. The #headers method continues
|
20
|
-
to be backwards-compatible with the old Hash return value but may become
|
21
|
-
deprecated in the future.
|
4
|
+
== 0.5.2.2
|
5
|
+
* Update gem package to include the right version of httparty.rb
|
22
6
|
|
23
|
-
|
24
|
-
* Update
|
25
|
-
|
26
|
-
* Timeout option can be set for all requests using HTTParty.default_timeout (taazza)
|
27
|
-
* Closed #38 "headers hash should downcase keys so canonical header name can be used"
|
7
|
+
== 0.5.2.1
|
8
|
+
* Update Pathname initialization to support earlier version of Ruby (1.8.4)
|
9
|
+
* Remove references to rubyforge
|
28
10
|
|
29
11
|
== 0.5.2 2010-01-31
|
30
12
|
* minor enhancements
|
data/Rakefile
CHANGED
@@ -7,14 +7,14 @@ begin
|
|
7
7
|
gem.summary = %Q{Makes http fun! Also, makes consuming restful web services dead easy.}
|
8
8
|
gem.description = %Q{Makes http fun! Also, makes consuming restful web services dead easy.}
|
9
9
|
gem.email = "nunemaker@gmail.com"
|
10
|
-
gem.homepage = "http://
|
10
|
+
gem.homepage = "http://httparty.rubyforge.org"
|
11
11
|
gem.authors = ["John Nunemaker", "Sandro Turriate"]
|
12
|
-
gem.add_dependency 'crack', '0.1.
|
12
|
+
gem.add_dependency 'crack', '0.1.6'
|
13
13
|
gem.add_development_dependency "activesupport", "~>2.3"
|
14
|
-
gem.add_development_dependency "cucumber", "~>0.
|
14
|
+
gem.add_development_dependency "cucumber", "~>0.4"
|
15
15
|
gem.add_development_dependency "fakeweb", "~>1.2"
|
16
16
|
gem.add_development_dependency "mongrel", "~>1.1"
|
17
|
-
gem.add_development_dependency "rspec", "
|
17
|
+
gem.add_development_dependency "rspec", "1.2.9"
|
18
18
|
gem.post_install_message = "When you HTTParty, you must party hard!"
|
19
19
|
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
20
20
|
end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.5.3
|
1
|
+
0.5.2.3
|
data/features/steps/env.rb
CHANGED
@@ -4,14 +4,7 @@ require 'lib/httparty'
|
|
4
4
|
require 'spec/expectations'
|
5
5
|
|
6
6
|
Before do
|
7
|
-
|
8
|
-
server = TCPServer.new('0.0.0.0', nil)
|
9
|
-
port = server.addr[1]
|
10
|
-
ensure
|
11
|
-
server.close
|
12
|
-
end
|
13
|
-
|
14
|
-
port = ENV["HTTPARTY_PORT"] || new_port
|
7
|
+
port = ENV["HTTPARTY_PORT"] || 31981
|
15
8
|
@host_and_port = "0.0.0.0:#{port}"
|
16
9
|
@server = Mongrel::HttpServer.new("0.0.0.0", port)
|
17
10
|
@server.run
|
@@ -17,11 +17,3 @@ When /I call HTTParty#get with '(.*)' and a basic_auth hash:/ do |url, auth_tabl
|
|
17
17
|
:basic_auth => { :username => h["username"], :password => h["password"] }
|
18
18
|
)
|
19
19
|
end
|
20
|
-
|
21
|
-
When /I call HTTParty#get with '(.*)' and a digest_auth hash:/ do |url, auth_table|
|
22
|
-
h = auth_table.hashes.first
|
23
|
-
@response_from_httparty = HTTParty.get(
|
24
|
-
"http://#{@host_and_port}#{url}",
|
25
|
-
:digest_auth => { :username => h["username"], :password => h["password"] }
|
26
|
-
)
|
27
|
-
end
|
@@ -50,28 +50,6 @@ def add_basic_authentication_to(handler)
|
|
50
50
|
handler.extend(m)
|
51
51
|
end
|
52
52
|
|
53
|
-
def add_digest_authentication_to(handler)
|
54
|
-
m = Module.new do
|
55
|
-
attr_writer :username, :password
|
56
|
-
|
57
|
-
def self.extended(base)
|
58
|
-
base.instance_eval { @custom_headers["WWW-Authenticate"] = 'Digest realm="testrealm@host.com",qop="auth,auth-int",nonce="nonce",opaque="opaque"' }
|
59
|
-
base.class_eval { alias_method_chain :process, :digest_authentication }
|
60
|
-
end
|
61
|
-
|
62
|
-
def process_with_digest_authentication(request, response)
|
63
|
-
if authorized?(request) then process_without_digest_authentication(request, response)
|
64
|
-
else reply_with(response, 401, "Incorrect. You have 20 seconds to comply.")
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
def authorized?(request)
|
69
|
-
request.params["HTTP_AUTHORIZATION"] =~ /Digest.*uri=/
|
70
|
-
end
|
71
|
-
end
|
72
|
-
handler.extend(m)
|
73
|
-
end
|
74
|
-
|
75
53
|
def new_mongrel_redirector(target_url, relative_path = false)
|
76
54
|
target_url = "http://#{@host_and_port}#{target_url}" unless relative_path
|
77
55
|
Mongrel::RedirectHandler.new(target_url)
|
@@ -13,8 +13,8 @@ Given /that service is accessed at the path '(.*)'/ do |path|
|
|
13
13
|
end
|
14
14
|
|
15
15
|
Given /^that service takes (\d+) seconds to generate a response$/ do |time|
|
16
|
-
|
17
|
-
@handler.preprocessor =
|
16
|
+
preprocessor = lambda { sleep time.to_i }
|
17
|
+
@handler.preprocessor = preprocessor
|
18
18
|
end
|
19
19
|
|
20
20
|
Given /the response from the service has a Content-Type of '(.*)'/ do |content_type|
|
@@ -33,10 +33,6 @@ Given /that service is protected by Basic Authentication/ do
|
|
33
33
|
add_basic_authentication_to @handler
|
34
34
|
end
|
35
35
|
|
36
|
-
Given /that service is protected by Digest Authentication/ do
|
37
|
-
add_digest_authentication_to @handler
|
38
|
-
end
|
39
|
-
|
40
36
|
Given /that service requires the username '(.*)' with the password '(.*)'/ do |username, password|
|
41
37
|
@handler.username = username
|
42
38
|
@handler.password = password
|
@@ -54,8 +50,3 @@ end
|
|
54
50
|
Given /I want to hit this in a browser/ do
|
55
51
|
@server.acceptor.join
|
56
52
|
end
|
57
|
-
|
58
|
-
Then /I wait for the server to recover/ do
|
59
|
-
timeout = @request_options[:timeout] || 0
|
60
|
-
sleep @server_response_time - timeout
|
61
|
-
end
|
data/jugend-httparty.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{jugend-httparty}
|
8
|
-
s.version = "0.5.2.
|
8
|
+
s.version = "0.5.2.3"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["John Nunemaker", "Sandro Turriate"]
|
12
|
-
s.date = %q{2010-06-
|
12
|
+
s.date = %q{2010-06-11}
|
13
13
|
s.default_executable = %q{httparty}
|
14
14
|
s.description = %q{Makes http fun! Also, makes consuming restful web services dead easy.}
|
15
15
|
s.email = %q{nunemaker@gmail.com}
|
data/lib/httparty.rb
CHANGED
@@ -3,15 +3,17 @@ require 'net/http'
|
|
3
3
|
require 'net/https'
|
4
4
|
require 'crack'
|
5
5
|
|
6
|
-
|
6
|
+
if Crack::VERSION != "0.1.6"
|
7
|
+
warn "warning: HTTParty depends on version 0.1.6 of crack, not #{Crack::VERSION}."
|
8
|
+
end
|
9
|
+
|
10
|
+
dir = Pathname(__FILE__).dirname.expand_path
|
7
11
|
|
8
12
|
require dir + 'httparty/module_inheritable_attributes'
|
9
13
|
require dir + 'httparty/cookie_hash'
|
10
|
-
require dir + 'httparty/net_digest_auth'
|
11
14
|
|
12
15
|
module HTTParty
|
13
16
|
VERSION = "0.5.2".freeze
|
14
|
-
CRACK_DEPENDENCY = "0.1.7".freeze
|
15
17
|
|
16
18
|
module AllowedFormatsDeprecation
|
17
19
|
def const_missing(const)
|
@@ -71,16 +73,6 @@ module HTTParty
|
|
71
73
|
default_options[:basic_auth] = {:username => u, :password => p}
|
72
74
|
end
|
73
75
|
|
74
|
-
# Allows setting digest authentication username and password.
|
75
|
-
#
|
76
|
-
# class Foo
|
77
|
-
# include HTTParty
|
78
|
-
# digest_auth 'username', 'password'
|
79
|
-
# end
|
80
|
-
def digest_auth(u, p)
|
81
|
-
default_options[:digest_auth] = {:username => u, :password => p}
|
82
|
-
end
|
83
|
-
|
84
76
|
# Allows setting default parameters to be appended to each request.
|
85
77
|
# Great for api keys and such.
|
86
78
|
#
|
@@ -94,18 +86,6 @@ module HTTParty
|
|
94
86
|
default_options[:default_params].merge!(h)
|
95
87
|
end
|
96
88
|
|
97
|
-
# Allows setting a default timeout for all HTTP calls
|
98
|
-
# Timeout is specified in seconds.
|
99
|
-
#
|
100
|
-
# class Foo
|
101
|
-
# include HTTParty
|
102
|
-
# default_timeout 10
|
103
|
-
# end
|
104
|
-
def default_timeout(t)
|
105
|
-
raise ArgumentError, 'Timeout must be an integer' unless t && t.is_a?(Integer)
|
106
|
-
default_options[:timeout] = t
|
107
|
-
end
|
108
|
-
|
109
89
|
# Set an output stream for debugging, defaults to $stderr.
|
110
90
|
# The output stream is passed on to Net::HTTP#set_debug_output.
|
111
91
|
#
|
@@ -117,7 +97,7 @@ module HTTParty
|
|
117
97
|
default_options[:debug_output] = stream
|
118
98
|
end
|
119
99
|
|
120
|
-
# Allows setting
|
100
|
+
# Allows setting a base uri to be used for each request.
|
121
101
|
#
|
122
102
|
# class Foo
|
123
103
|
# include HTTParty
|
@@ -174,21 +154,6 @@ module HTTParty
|
|
174
154
|
default_options[:no_follow] = value
|
175
155
|
end
|
176
156
|
|
177
|
-
# Declare that you wish to maintain the chosen HTTP method across redirects.
|
178
|
-
# The default behavior is to follow redirects via the GET method.
|
179
|
-
# If you wish to maintain the original method, you can set this option to true.
|
180
|
-
#
|
181
|
-
# @example
|
182
|
-
# class Foo
|
183
|
-
# include HTTParty
|
184
|
-
# base_uri 'http://google.com'
|
185
|
-
# maintain_method_across_redirects true
|
186
|
-
# end
|
187
|
-
|
188
|
-
def maintain_method_across_redirects(value = true)
|
189
|
-
default_options[:maintain_method_across_redirects] = value
|
190
|
-
end
|
191
|
-
|
192
157
|
# Allows setting a PEM file to be used
|
193
158
|
#
|
194
159
|
# class Foo
|
@@ -337,7 +302,3 @@ require dir + 'httparty/exceptions'
|
|
337
302
|
require dir + 'httparty/parser'
|
338
303
|
require dir + 'httparty/request'
|
339
304
|
require dir + 'httparty/response'
|
340
|
-
|
341
|
-
if Crack::VERSION != HTTParty::CRACK_DEPENDENCY
|
342
|
-
warn "warning: HTTParty depends on version #{HTTParty::CRACK_DEPENDENCY} of crack, not #{Crack::VERSION}."
|
343
|
-
end
|
data/lib/httparty/request.rb
CHANGED
@@ -13,7 +13,7 @@ module HTTParty
|
|
13
13
|
|
14
14
|
SupportedURISchemes = [URI::HTTP, URI::HTTPS]
|
15
15
|
|
16
|
-
attr_accessor :http_method, :path, :options, :last_response
|
16
|
+
attr_accessor :http_method, :path, :options, :last_response
|
17
17
|
|
18
18
|
def initialize(http_method, path, o={})
|
19
19
|
self.http_method = http_method
|
@@ -33,7 +33,7 @@ module HTTParty
|
|
33
33
|
new_uri = path.relative? ? URI.parse("#{options[:base_uri]}#{path}") : path
|
34
34
|
|
35
35
|
# avoid double query string on redirects [#12]
|
36
|
-
unless redirect
|
36
|
+
unless @redirect
|
37
37
|
new_uri.query = query_string(new_uri)
|
38
38
|
end
|
39
39
|
|
@@ -52,6 +52,7 @@ module HTTParty
|
|
52
52
|
options[:parser]
|
53
53
|
end
|
54
54
|
|
55
|
+
|
55
56
|
def perform
|
56
57
|
validate
|
57
58
|
setup_raw_request
|
@@ -61,146 +62,133 @@ module HTTParty
|
|
61
62
|
|
62
63
|
private
|
63
64
|
|
64
|
-
|
65
|
-
|
66
|
-
|
65
|
+
def http
|
66
|
+
http = Net::HTTP.new(uri.host, uri.port, options[:http_proxyaddr], options[:http_proxyport])
|
67
|
+
http.use_ssl = ssl_implied?
|
67
68
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
69
|
+
if options[:timeout] && options[:timeout].is_a?(Integer)
|
70
|
+
http.open_timeout = options[:timeout]
|
71
|
+
http.read_timeout = options[:timeout]
|
72
|
+
end
|
72
73
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
if options[:debug_output]
|
82
|
-
http.set_debug_output(options[:debug_output])
|
83
|
-
end
|
74
|
+
if options[:pem] && http.use_ssl?
|
75
|
+
http.cert = OpenSSL::X509::Certificate.new(options[:pem])
|
76
|
+
http.key = OpenSSL::PKey::RSA.new(options[:pem])
|
77
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
78
|
+
else
|
79
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
80
|
+
end
|
84
81
|
|
85
|
-
|
86
|
-
|
82
|
+
if options[:debug_output]
|
83
|
+
http.set_debug_output(options[:debug_output])
|
84
|
+
end
|
87
85
|
|
88
|
-
|
89
|
-
|
90
|
-
end
|
86
|
+
http
|
87
|
+
end
|
91
88
|
|
92
|
-
|
93
|
-
|
94
|
-
|
89
|
+
def ssl_implied?
|
90
|
+
uri.port == 443 || uri.instance_of?(URI::HTTPS)
|
91
|
+
end
|
95
92
|
|
96
|
-
|
97
|
-
|
98
|
-
|
93
|
+
def body
|
94
|
+
options[:body].is_a?(Hash) ? options[:body].to_params : options[:body]
|
95
|
+
end
|
99
96
|
|
100
|
-
|
101
|
-
|
102
|
-
|
97
|
+
def username
|
98
|
+
options[:basic_auth][:username]
|
99
|
+
end
|
103
100
|
|
104
|
-
|
105
|
-
|
106
|
-
|
101
|
+
def password
|
102
|
+
options[:basic_auth][:password]
|
103
|
+
end
|
107
104
|
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
end
|
105
|
+
def setup_raw_request
|
106
|
+
@raw_request = http_method.new(uri.request_uri)
|
107
|
+
@raw_request.body = body if body
|
108
|
+
@raw_request.initialize_http_header(options[:headers])
|
109
|
+
@raw_request.basic_auth(username, password) if options[:basic_auth]
|
110
|
+
end
|
115
111
|
|
116
|
-
|
117
|
-
|
118
|
-
if res['www-authenticate'] != nil && res['www-authenticate'].length > 0
|
119
|
-
@raw_request.digest_auth(username, password, res)
|
112
|
+
def perform_actual_request
|
113
|
+
http.request(@raw_request)
|
120
114
|
end
|
121
|
-
end
|
122
115
|
|
123
|
-
|
124
|
-
|
125
|
-
|
116
|
+
def get_response
|
117
|
+
self.last_response = perform_actual_request
|
118
|
+
options[:format] ||= format_from_mimetype(last_response['content-type'])
|
119
|
+
end
|
126
120
|
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
end
|
121
|
+
def query_string(uri)
|
122
|
+
query_string_parts = []
|
123
|
+
query_string_parts << uri.query unless uri.query.nil?
|
131
124
|
|
132
|
-
|
133
|
-
|
134
|
-
|
125
|
+
if options[:query].is_a?(Hash)
|
126
|
+
query_string_parts << options[:default_params].merge(options[:query]).to_params
|
127
|
+
else
|
128
|
+
query_string_parts << options[:default_params].to_params unless options[:default_params].empty?
|
129
|
+
query_string_parts << options[:query] unless options[:query].nil?
|
130
|
+
end
|
135
131
|
|
136
|
-
|
137
|
-
query_string_parts << options[:default_params].merge(options[:query]).to_params
|
138
|
-
else
|
139
|
-
query_string_parts << options[:default_params].to_params unless options[:default_params].empty?
|
140
|
-
query_string_parts << options[:query] unless options[:query].nil?
|
132
|
+
query_string_parts.size > 0 ? query_string_parts.join('&') : nil
|
141
133
|
end
|
142
134
|
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
Net::HTTPSeeOther, # 303
|
153
|
-
Net::HTTPUseProxy, # 305
|
154
|
-
Net::HTTPTemporaryRedirect
|
135
|
+
# Raises exception Net::XXX (http error code) if an http error occured
|
136
|
+
def handle_response
|
137
|
+
case last_response
|
138
|
+
when Net::HTTPMultipleChoice, # 300
|
139
|
+
Net::HTTPMovedPermanently, # 301
|
140
|
+
Net::HTTPFound, # 302
|
141
|
+
Net::HTTPSeeOther, # 303
|
142
|
+
Net::HTTPUseProxy, # 305
|
143
|
+
Net::HTTPTemporaryRedirect
|
155
144
|
if last_response.key?('location')
|
156
145
|
options[:limit] -= 1
|
157
146
|
self.path = last_response['location']
|
158
|
-
|
159
|
-
self.http_method = Net::HTTP::Get
|
147
|
+
@redirect = true
|
148
|
+
self.http_method = Net::HTTP::Get
|
160
149
|
capture_cookies(last_response)
|
161
150
|
perform
|
162
151
|
else
|
163
152
|
last_response
|
164
153
|
end
|
165
154
|
else
|
166
|
-
Response.new(last_response,
|
155
|
+
Response.new(parse_response(last_response.body), last_response.body, last_response.code, last_response.message, last_response.to_hash)
|
156
|
+
end
|
167
157
|
end
|
168
|
-
end
|
169
158
|
|
170
|
-
|
171
|
-
|
172
|
-
|
159
|
+
def parse_response(body)
|
160
|
+
parser.call(body, format)
|
161
|
+
end
|
173
162
|
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
163
|
+
def capture_cookies(response)
|
164
|
+
return unless response['Set-Cookie']
|
165
|
+
cookies_hash = HTTParty::CookieHash.new()
|
166
|
+
cookies_hash.add_cookies(options[:headers]['Cookie']) if options[:headers] && options[:headers]['Cookie']
|
167
|
+
cookies_hash.add_cookies(response['Set-Cookie'])
|
168
|
+
options[:headers] ||= {}
|
169
|
+
options[:headers]['Cookie'] = cookies_hash.to_cookie_string
|
170
|
+
end
|
182
171
|
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
172
|
+
# Uses the HTTP Content-Type header to determine the format of the
|
173
|
+
# response It compares the MIME type returned to the types stored in the
|
174
|
+
# SupportedFormats hash
|
175
|
+
def format_from_mimetype(mimetype)
|
176
|
+
if mimetype && parser.respond_to?(:format_from_mimetype)
|
177
|
+
parser.format_from_mimetype(mimetype)
|
178
|
+
end
|
189
179
|
end
|
190
|
-
end
|
191
180
|
|
192
181
|
def validate
|
193
182
|
raise HTTParty::RedirectionTooDeep.new(last_response), 'HTTP redirects too deep' if options[:limit].to_i <= 0
|
194
183
|
raise ArgumentError, 'only get, post, put, delete, head, and options methods are supported' unless SupportedHTTPMethods.include?(http_method)
|
195
184
|
raise ArgumentError, ':headers must be a hash' if options[:headers] && !options[:headers].is_a?(Hash)
|
196
|
-
raise ArgumentError, 'only one authentication method, :basic_auth or :digest_auth may be used at a time' if options[:basic_auth] && options[:digest_auth]
|
197
185
|
raise ArgumentError, ':basic_auth must be a hash' if options[:basic_auth] && !options[:basic_auth].is_a?(Hash)
|
198
|
-
raise ArgumentError, ':digest_auth must be a hash' if options[:digest_auth] && !options[:digest_auth].is_a?(Hash)
|
199
186
|
raise ArgumentError, ':query must be hash if using HTTP Post' if post? && !options[:query].nil? && !options[:query].is_a?(Hash)
|
200
187
|
end
|
201
188
|
|
202
|
-
|
203
|
-
|
204
|
-
|
189
|
+
def post?
|
190
|
+
Net::HTTP::Post == http_method
|
191
|
+
end
|
205
192
|
end
|
206
193
|
end
|
194
|
+
|
data/lib/httparty/response.rb
CHANGED
@@ -1,62 +1,18 @@
|
|
1
1
|
module HTTParty
|
2
2
|
class Response < HTTParty::BasicObject #:nodoc:
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
end
|
13
|
-
|
14
|
-
def inspect
|
15
|
-
@header.inspect
|
16
|
-
end
|
17
|
-
|
18
|
-
def method_missing(name, *args, &block)
|
19
|
-
if @header.respond_to?(name)
|
20
|
-
@header.send(name, *args, &block)
|
21
|
-
else
|
22
|
-
super
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def respond_to?(method)
|
27
|
-
super || @header.respond_to?(method)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
attr_reader :response, :parsed_response, :body, :headers
|
32
|
-
|
33
|
-
def initialize(response, parsed_response)
|
34
|
-
@response = response
|
35
|
-
@body = response.body
|
36
|
-
@parsed_response = parsed_response
|
37
|
-
@headers = Headers.new(response.to_hash)
|
38
|
-
end
|
39
|
-
|
40
|
-
def class
|
41
|
-
Object.instance_method(:class).bind(self).call
|
42
|
-
end
|
43
|
-
|
44
|
-
def code
|
45
|
-
response.code.to_i
|
46
|
-
end
|
47
|
-
|
48
|
-
def inspect
|
49
|
-
%(<#{self.class} @response=#{response.inspect}>)
|
3
|
+
attr_accessor :body, :code, :message, :headers
|
4
|
+
attr_reader :delegate
|
5
|
+
|
6
|
+
def initialize(delegate, body, code, message, headers={})
|
7
|
+
@delegate = delegate
|
8
|
+
@body = body
|
9
|
+
@code = code.to_i
|
10
|
+
@message = message
|
11
|
+
@headers = headers
|
50
12
|
end
|
51
13
|
|
52
14
|
def method_missing(name, *args, &block)
|
53
|
-
|
54
|
-
parsed_response.send(name, *args, &block)
|
55
|
-
elsif response.respond_to?(name)
|
56
|
-
response.send(name, *args, &block)
|
57
|
-
else
|
58
|
-
super
|
59
|
-
end
|
15
|
+
@delegate.send(name, *args, &block)
|
60
16
|
end
|
61
17
|
end
|
62
18
|
end
|
@@ -30,17 +30,6 @@ describe HTTParty::Request do
|
|
30
30
|
@request.send(:setup_raw_request)
|
31
31
|
@request.instance_variable_get(:@raw_request)['authorization'].should_not be_nil
|
32
32
|
end
|
33
|
-
|
34
|
-
it "should use digest auth when configured" do
|
35
|
-
FakeWeb.register_uri(:head, "http://api.foo.com/v1",
|
36
|
-
:www_authenticate => 'Digest realm="Log Viewer", qop="auth", nonce="2CA0EC6B0E126C4800E56BA0C0003D3C", opaque="5ccc069c403ebaf9f0171e9517f40e41", stale=false')
|
37
|
-
|
38
|
-
@request.options[:digest_auth] = {:username => 'foobar', :password => 'secret'}
|
39
|
-
@request.send(:setup_raw_request)
|
40
|
-
|
41
|
-
raw_request = @request.instance_variable_get(:@raw_request)
|
42
|
-
raw_request.instance_variable_get(:@header)['Authorization'].should_not be_nil
|
43
|
-
end
|
44
33
|
end
|
45
34
|
|
46
35
|
describe "#uri" do
|
@@ -364,13 +353,6 @@ describe HTTParty::Request do
|
|
364
353
|
@request.perform.should == {"hash" => {"foo" => "bar"}}
|
365
354
|
@request.http_method.should == Net::HTTP::Get
|
366
355
|
end
|
367
|
-
|
368
|
-
it 'should not make resulting request a get request if options[:maintain_method_across_redirects] is true' do
|
369
|
-
@request.options[:maintain_method_across_redirects] = true
|
370
|
-
@request.http_method = Net::HTTP::Delete
|
371
|
-
@request.perform.should == {"hash" => {"foo" => "bar"}}
|
372
|
-
@request.http_method.should == Net::HTTP::Delete
|
373
|
-
end
|
374
356
|
end
|
375
357
|
|
376
358
|
describe "infinitely" do
|
@@ -391,25 +373,5 @@ describe HTTParty::Request do
|
|
391
373
|
}.should raise_error(ArgumentError)
|
392
374
|
end
|
393
375
|
end
|
394
|
-
|
395
|
-
describe "argument validation" do
|
396
|
-
it "should raise argument error if basic_auth and digest_auth are both present" do
|
397
|
-
lambda {
|
398
|
-
HTTParty::Request.new(Net::HTTP::Post, 'http://api.foo.com/v1', :basic_auth => {}, :digest_auth => {}).perform
|
399
|
-
}.should raise_error(ArgumentError, "only one authentication method, :basic_auth or :digest_auth may be used at a time")
|
400
|
-
end
|
401
|
-
|
402
|
-
it "should raise argument error if basic_auth is not a hash" do
|
403
|
-
lambda {
|
404
|
-
HTTParty::Request.new(Net::HTTP::Post, 'http://api.foo.com/v1', :basic_auth => ["foo", "bar"]).perform
|
405
|
-
}.should raise_error(ArgumentError, ":basic_auth must be a hash")
|
406
|
-
end
|
407
|
-
|
408
|
-
it "should raise argument error if digest_auth is not a hash" do
|
409
|
-
lambda {
|
410
|
-
HTTParty::Request.new(Net::HTTP::Post, 'http://api.foo.com/v1', :digest_auth => ["foo", "bar"]).perform
|
411
|
-
}.should raise_error(ArgumentError, ":digest_auth must be a hash")
|
412
|
-
end
|
413
|
-
end
|
414
376
|
end
|
415
377
|
|
@@ -1,83 +1,62 @@
|
|
1
1
|
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper'))
|
2
2
|
|
3
3
|
describe HTTParty::Response do
|
4
|
-
before do
|
5
|
-
@last_modified = Date.new(2010, 1, 15).to_s
|
6
|
-
@content_length = '1024'
|
7
|
-
@response_object = {'foo' => 'bar'}
|
8
|
-
@response_object = Net::HTTPOK.new('1.1', 200, 'OK')
|
9
|
-
@response_object.stub(:body => "{foo:'bar'}")
|
10
|
-
@response_object['last-modified'] = @last_modified
|
11
|
-
@response_object['content-length'] = @content_length
|
12
|
-
@parsed_response = {"foo" => "bar"}
|
13
|
-
@response = HTTParty::Response.new(@response_object, @parsed_response)
|
14
|
-
end
|
15
|
-
|
16
4
|
describe "initialization" do
|
17
|
-
|
18
|
-
@
|
5
|
+
before do
|
6
|
+
@response_object = {'foo' => 'bar'}
|
7
|
+
@body = "{foo:'bar'}"
|
8
|
+
@code = '200'
|
9
|
+
@message = 'OK'
|
10
|
+
@response = HTTParty::Response.new(@response_object, @body, @code, @message)
|
19
11
|
end
|
20
|
-
|
12
|
+
|
13
|
+
it "should set delegate" do
|
14
|
+
@response.delegate.should == @response_object
|
15
|
+
end
|
16
|
+
|
21
17
|
it "should set body" do
|
22
|
-
@response.body.should == @
|
18
|
+
@response.body.should == @body
|
23
19
|
end
|
24
|
-
|
20
|
+
|
25
21
|
it "should set code" do
|
26
|
-
@response.code.should.to_s == @
|
22
|
+
@response.code.should.to_s == @code
|
27
23
|
end
|
28
24
|
|
29
25
|
it "should set code as a Fixnum" do
|
30
26
|
@response.code.should be_an_instance_of(Fixnum)
|
31
27
|
end
|
28
|
+
|
29
|
+
it "should set body" do
|
30
|
+
@response.body.should == @body
|
31
|
+
end
|
32
32
|
end
|
33
|
-
|
34
|
-
it "
|
35
|
-
response = HTTParty::Response.new(
|
36
|
-
response.headers.should == {'
|
33
|
+
|
34
|
+
it "should be able to set headers during initialization" do
|
35
|
+
response = HTTParty::Response.new({'foo' => 'bar'}, "{foo:'bar'}", 200, 'OK', {'foo' => 'bar'})
|
36
|
+
response.headers.should == {'foo' => 'bar'}
|
37
37
|
end
|
38
|
-
|
38
|
+
|
39
39
|
it "should send missing methods to delegate" do
|
40
|
-
response = HTTParty::Response.new(
|
40
|
+
response = HTTParty::Response.new({'foo' => 'bar'}, "{foo:'bar'}", 200, 'OK')
|
41
41
|
response['foo'].should == 'bar'
|
42
42
|
end
|
43
|
-
|
44
|
-
it "should be able to iterate if it is array" do
|
45
|
-
response = HTTParty::Response.new(
|
43
|
+
|
44
|
+
it "should be able to iterate delegate if it is array" do
|
45
|
+
response = HTTParty::Response.new([{'foo' => 'bar'}, {'foo' => 'baz'}], "[{foo:'bar'}, {foo:'baz'}]", 200, 'OK')
|
46
46
|
response.size.should == 2
|
47
|
-
|
47
|
+
lambda {
|
48
48
|
response.each { |item| }
|
49
|
-
}.
|
50
|
-
end
|
51
|
-
|
52
|
-
it "allows headers to be accessed by mixed-case names in hash notation" do
|
53
|
-
response = HTTParty::Response.new(@response_object, @parsed_response)
|
54
|
-
response.headers['Content-LENGTH'].should == @content_length
|
55
|
-
end
|
56
|
-
|
57
|
-
it "returns a comma-delimited value when multiple values exist" do
|
58
|
-
@response_object.add_field 'set-cookie', 'csrf_id=12345; path=/'
|
59
|
-
@response_object.add_field 'set-cookie', '_github_ses=A123CdE; path=/'
|
60
|
-
response = HTTParty::Response.new(@response_object, @parsed_response)
|
61
|
-
response.headers['set-cookie'].should == "csrf_id=12345; path=/, _github_ses=A123CdE; path=/"
|
49
|
+
}.should_not raise_error
|
62
50
|
end
|
63
|
-
|
64
|
-
# Backwards-compatibility - previously, #headers returned a Hash
|
65
|
-
it "responds to hash methods" do
|
66
|
-
response = HTTParty::Response.new(@response_object, @parsed_response)
|
67
|
-
hash_methods = {}.methods - response.headers.methods
|
68
|
-
hash_methods.each do |method_name|
|
69
|
-
response.headers.respond_to?(method_name).should be_true
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
51
|
+
|
73
52
|
xit "should allow hashes to be accessed with dot notation" do
|
74
53
|
response = HTTParty::Response.new({'foo' => 'bar'}, "{foo:'bar'}", 200, 'OK')
|
75
54
|
response.foo.should == 'bar'
|
76
55
|
end
|
77
|
-
|
56
|
+
|
78
57
|
xit "should allow nested hashes to be accessed with dot notation" do
|
79
58
|
response = HTTParty::Response.new({'foo' => {'bar' => 'baz'}}, "{foo: {bar:'baz'}}", 200, 'OK')
|
80
59
|
response.foo.should == {'bar' => 'baz'}
|
81
60
|
response.foo.bar.should == 'baz'
|
82
61
|
end
|
83
|
-
end
|
62
|
+
end
|
data/spec/httparty_spec.rb
CHANGED
@@ -203,17 +203,6 @@ describe HTTParty do
|
|
203
203
|
end
|
204
204
|
end
|
205
205
|
|
206
|
-
describe "default timeout" do
|
207
|
-
it "should default to nil" do
|
208
|
-
@klass.default_options[:timeout].should == nil
|
209
|
-
end
|
210
|
-
|
211
|
-
it "should support updating" do
|
212
|
-
@klass.default_timeout 10
|
213
|
-
@klass.default_options[:timeout].should == 10
|
214
|
-
end
|
215
|
-
end
|
216
|
-
|
217
206
|
describe "debug_output" do
|
218
207
|
it "stores the given stream as a default_option" do
|
219
208
|
@klass.debug_output $stdout
|
@@ -233,13 +222,6 @@ describe HTTParty do
|
|
233
222
|
end
|
234
223
|
end
|
235
224
|
|
236
|
-
describe "digest http authentication" do
|
237
|
-
it "should work" do
|
238
|
-
@klass.digest_auth 'foobar', 'secret'
|
239
|
-
@klass.default_options[:digest_auth].should == {:username => 'foobar', :password => 'secret'}
|
240
|
-
end
|
241
|
-
end
|
242
|
-
|
243
225
|
describe "parser" do
|
244
226
|
let(:parser) do
|
245
227
|
Proc.new{ |data, format| CustomParser.parse(data) }
|
@@ -261,7 +243,7 @@ describe HTTParty do
|
|
261
243
|
@klass.format :json
|
262
244
|
class MyParser < HTTParty::Parser
|
263
245
|
SupportedFormats = {}
|
264
|
-
end
|
246
|
+
end
|
265
247
|
expect do
|
266
248
|
@klass.parser MyParser
|
267
249
|
end.to raise_error(HTTParty::UnsupportedFormat)
|
@@ -334,18 +316,6 @@ describe HTTParty do
|
|
334
316
|
end
|
335
317
|
end
|
336
318
|
|
337
|
-
describe "#maintain_method_across_redirects" do
|
338
|
-
it "sets maintain_method_across_redirects to true by default" do
|
339
|
-
@klass.maintain_method_across_redirects
|
340
|
-
@klass.default_options[:maintain_method_across_redirects].should be_true
|
341
|
-
end
|
342
|
-
|
343
|
-
it "sets the maintain_method_across_redirects option to false" do
|
344
|
-
@klass.maintain_method_across_redirects false
|
345
|
-
@klass.default_options[:maintain_method_across_redirects].should be_false
|
346
|
-
end
|
347
|
-
end
|
348
|
-
|
349
319
|
describe "with explicit override of automatic redirect handling" do
|
350
320
|
before do
|
351
321
|
@request = HTTParty::Request.new(Net::HTTP::Get, 'http://api.foo.com/v1', :format => :xml, :no_follow => true)
|
data/spec/spec_helper.rb
CHANGED
@@ -2,6 +2,8 @@ require File.join(File.dirname(__FILE__), '..', 'lib', 'httparty')
|
|
2
2
|
require 'spec/autorun'
|
3
3
|
require 'fakeweb'
|
4
4
|
|
5
|
+
FakeWeb.allow_net_connect = false
|
6
|
+
|
5
7
|
def file_fixture(filename)
|
6
8
|
open(File.join(File.dirname(__FILE__), 'fixtures', "#{filename.to_s}")).read
|
7
9
|
end
|
@@ -10,10 +12,4 @@ Dir[File.expand_path(File.join(File.dirname(__FILE__),'support','**','*.rb'))].e
|
|
10
12
|
|
11
13
|
Spec::Runner.configure do |config|
|
12
14
|
config.include HTTParty::StubResponse
|
13
|
-
config.before(:suite) do
|
14
|
-
FakeWeb.allow_net_connect = false
|
15
|
-
end
|
16
|
-
config.after(:suite) do
|
17
|
-
FakeWeb.allow_net_connect = true
|
18
|
-
end
|
19
15
|
end
|
@@ -14,7 +14,7 @@ module HTTParty
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def stub_response(body, code = 200)
|
17
|
-
unless
|
17
|
+
unless @http
|
18
18
|
@http = Net::HTTP.new('localhost', 80)
|
19
19
|
@request.stub!(:http).and_return(@http)
|
20
20
|
@request.stub!(:uri).and_return(URI.parse("http://foo.com/foobar"))
|
metadata
CHANGED
@@ -6,8 +6,8 @@ version: !ruby/object:Gem::Version
|
|
6
6
|
- 0
|
7
7
|
- 5
|
8
8
|
- 2
|
9
|
-
-
|
10
|
-
version: 0.5.2.
|
9
|
+
- 3
|
10
|
+
version: 0.5.2.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- John Nunemaker
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2010-06-
|
19
|
+
date: 2010-06-11 00:00:00 +08:00
|
20
20
|
default_executable: httparty
|
21
21
|
dependencies:
|
22
22
|
- !ruby/object:Gem::Dependency
|