summaryrefslogtreecommitdiff
path: root/lib/chef/rest.rb
diff options
context:
space:
mode:
authordanielsdeleo <dan@opscode.com>2013-10-07 16:40:04 -0700
committerdanielsdeleo <dan@opscode.com>2013-10-08 15:01:48 -0700
commit75a71fcdb1e03ba405fe0ddf1d9717e4a5c57b03 (patch)
treed36696d88b997580dc13d24856ecfde3a5cbd29c /lib/chef/rest.rb
parent4ba34085703951587586aa68f616087a9a95cb69 (diff)
downloadchef-75a71fcdb1e03ba405fe0ddf1d9717e4a5c57b03.tar.gz
Refactor HTTP streaming to reuse base implementations
Diffstat (limited to 'lib/chef/rest.rb')
-rw-r--r--lib/chef/rest.rb52
1 files changed, 22 insertions, 30 deletions
diff --git a/lib/chef/rest.rb b/lib/chef/rest.rb
index e93c19151a..c589373837 100644
--- a/lib/chef/rest.rb
+++ b/lib/chef/rest.rb
@@ -158,43 +158,35 @@ class Chef
# If no block is given, the tempfile is returned, which means it's up to
# you to unlink the tempfile when you're done with it.
def streaming_request(url, headers, &block)
+ rest_request = nil # ensure this is defined, it's referenced in rescue clause
+
+ # Manually apply middleware to avoid specifying an Accept
+ # application/json content type preference:
method, url, headers, data = [@decompressor, @authenticator].inject([:GET, url, headers, nil]) do |req_data, middleware|
middleware.handle_request(*req_data)
end
- headers = build_headers(method, url, headers, data)
- retriable_rest_request(method, url, data, headers) do |rest_request|
- begin
- tempfile = nil
- response = rest_request.call do |r|
- if block_given? && r.kind_of?(Net::HTTPSuccess)
- begin
- tempfile = stream_to_tempfile(url, r, &block)
- yield tempfile
- ensure
- tempfile.close!
- end
- else
- tempfile = stream_to_tempfile(url, r)
+ response, rest_request, return_value = send_http_request(method, url, headers, data) do |http_response|
+ @last_response = http_response
+ if http_response.kind_of?(Net::HTTPSuccess)
+ tempfile = stream_to_tempfile(url, http_response)
+ if block_given?
+ begin
+ yield tempfile
+ ensure
+ tempfile && tempfile.close!
end
end
- @last_response = response
- if response.kind_of?(Net::HTTPSuccess)
- tempfile
- elsif redirect_location = redirected_to(response)
- # TODO: test tempfile unlinked when following redirects.
- tempfile && tempfile.close!
- follow_redirect {streaming_request(create_url(redirect_location), {}, &block)}
- else
- tempfile && tempfile.close!
- response.error!
- end
- rescue Exception => e
- if e.respond_to?(:chef_rest_request=)
- e.chef_rest_request = rest_request
- end
- raise
+ return tempfile
end
end
+ unless response.kind_of?(Net::HTTPSuccess) or response.kind_of?(Net::HTTPRedirection)
+ response.error!
+ end
+ rescue Exception => e
+ if e.respond_to?(:chef_rest_request=)
+ e.chef_rest_request = rest_request
+ end
+ raise
end
def follow_redirect