summaryrefslogtreecommitdiff
path: root/lib/chef/http.rb
diff options
context:
space:
mode:
authorThom May <thom@chef.io>2016-03-03 10:11:29 +0000
committerThom May <thom@chef.io>2016-03-03 10:11:29 +0000
commit788ec4597c9f1517c26d85703bdc79ea01e5ff53 (patch)
tree23364a04f0906df0697565ba84f9163b48a61298 /lib/chef/http.rb
parenta4d98365c1d68d7a24fba62783538951d2bbd2e0 (diff)
parent9c7bc8730af9ddba70d5095301517ae9e07e5024 (diff)
downloadchef-788ec4597c9f1517c26d85703bdc79ea01e5ff53.tar.gz
Merge branch 'remote-file-download-progress' of https://github.com/brandocorp/chef into tm/remote_file_download_progress
Diffstat (limited to 'lib/chef/http.rb')
-rw-r--r--lib/chef/http.rb36
1 files changed, 35 insertions, 1 deletions
diff --git a/lib/chef/http.rb b/lib/chef/http.rb
index a3673ce281..c90f799cd9 100644
--- a/lib/chef/http.rb
+++ b/lib/chef/http.rb
@@ -74,6 +74,9 @@ class Chef
attr_reader :redirect_limit
attr_reader :options
+ attr_reader :show_progress
+ attr_reader :progress_interval
+
attr_reader :middlewares
# Create a HTTP client object. The supplied +url+ is used as the base for
@@ -153,6 +156,34 @@ class Chef
raise
end
+
+ def streaming_request_with_progress(path, headers={}, &progress_block)
+ url = create_url(path)
+ response, rest_request, return_value = nil, nil, nil
+ tempfile = nil
+
+ method = :GET
+ method, url, headers, data = apply_request_middleware(method, url, headers, data)
+
+ response, rest_request, return_value = send_http_request(method, url, headers, data) do |http_response|
+ if http_response.kind_of?(Net::HTTPSuccess)
+ tempfile = stream_to_tempfile(url, http_response, &progress_block)
+ end
+ apply_stream_complete_middleware(http_response, rest_request, return_value)
+ end
+ return nil if response.kind_of?(Net::HTTPRedirection)
+ unless response.kind_of?(Net::HTTPSuccess)
+ response.error!
+ end
+ tempfile
+ rescue Exception => e
+ log_failed_request(response, return_value) unless response.nil?
+ if e.respond_to?(:chef_rest_request=)
+ e.chef_rest_request = rest_request
+ end
+ raise
+ end
+
# Makes a streaming download request, streaming the response body to a
# tempfile. If a block is given, the tempfile is passed to the block and
# the tempfile will automatically be unlinked after the block is executed.
@@ -389,7 +420,8 @@ class Chef
headers
end
- def stream_to_tempfile(url, response)
+ def stream_to_tempfile(url, response, &progress_block)
+ content_length = response['Content-Length']
tf = Tempfile.open("chef-rest")
if Chef::Platform.windows?
tf.binmode # required for binary files on Windows platforms
@@ -402,6 +434,7 @@ class Chef
response.read_body do |chunk|
tf.write(stream_handler.handle_chunk(chunk))
+ yield tf.size, content_length if block_given?
end
tf.close
tf
@@ -425,3 +458,4 @@ class Chef
end
end
+