#467 - Restore error handling for failed downloads
This commit is contained in:
parent
e13da8e05e
commit
a68b8cb758
|
@ -23,6 +23,7 @@ module Google
|
||||||
# Streaming/resumable media download support
|
# Streaming/resumable media download support
|
||||||
class DownloadCommand < ApiCommand
|
class DownloadCommand < ApiCommand
|
||||||
RANGE_HEADER = 'range'
|
RANGE_HEADER = 'range'
|
||||||
|
OK_STATUS = [200, 201, 206]
|
||||||
|
|
||||||
# File or IO to write content to
|
# File or IO to write content to
|
||||||
# @return [String, File, #write]
|
# @return [String, File, #write]
|
||||||
|
@ -65,7 +66,7 @@ module Google
|
||||||
# @raise [Google::Apis::ClientError] The request is invalid and should not be retried without modification
|
# @raise [Google::Apis::ClientError] The request is invalid and should not be retried without modification
|
||||||
# @raise [Google::Apis::AuthorizationError] Authorization is required
|
# @raise [Google::Apis::AuthorizationError] Authorization is required
|
||||||
def execute_once(client, &block)
|
def execute_once(client, &block)
|
||||||
client.get(@download_url || url) do |req|
|
response = client.get(@download_url || url) do |req|
|
||||||
apply_request_options(req)
|
apply_request_options(req)
|
||||||
check_if_rewind_needed = false
|
check_if_rewind_needed = false
|
||||||
if @offset > 0
|
if @offset > 0
|
||||||
|
@ -73,7 +74,7 @@ module Google
|
||||||
req.header[RANGE_HEADER] = sprintf('bytes=%d-', @offset)
|
req.header[RANGE_HEADER] = sprintf('bytes=%d-', @offset)
|
||||||
check_if_rewind_needed = true
|
check_if_rewind_needed = true
|
||||||
end
|
end
|
||||||
req.on_body(200, 201, 206) do |res, chunk|
|
req.on_body(*OK_STATUS) do |res, chunk|
|
||||||
check_status(res.status_code, chunk) unless res.status_code.nil?
|
check_status(res.status_code, chunk) unless res.status_code.nil?
|
||||||
if check_if_rewind_needed && res.status_code != 206
|
if check_if_rewind_needed && res.status_code != 206
|
||||||
# Oh no! Requested a chunk, but received the entire content
|
# Oh no! Requested a chunk, but received the entire content
|
||||||
|
@ -88,6 +89,10 @@ module Google
|
||||||
@download_io.flush
|
@download_io.flush
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Since the on_body block only runs on success, check status again just in case it failed
|
||||||
|
check_status(response.status_code, response.body) unless OK_STATUS.include?(response.status_code.to_i)
|
||||||
|
|
||||||
if @close_io_on_finish
|
if @close_io_on_finish
|
||||||
result = nil
|
result = nil
|
||||||
else
|
else
|
||||||
|
|
|
@ -48,6 +48,17 @@ RSpec.describe Google::Apis::Core::DownloadCommand do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'with error' do
|
||||||
|
before(:example) do
|
||||||
|
stub_request(:get, 'https://www.googleapis.com/zoo/animals')
|
||||||
|
.to_return(status: [404, 'Not Found'], body: '')
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'should raise error' do
|
||||||
|
expect {received}.to raise_error(Google::Apis::ClientError)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
context 'with disconnects' do
|
context 'with disconnects' do
|
||||||
before(:example) do
|
before(:example) do
|
||||||
stub_request(:get, 'https://www.googleapis.com/zoo/animals')
|
stub_request(:get, 'https://www.googleapis.com/zoo/animals')
|
||||||
|
|
Loading…
Reference in New Issue