diff --git a/google-apis-core/lib/google/apis/core/storage_upload.rb b/google-apis-core/lib/google/apis/core/storage_upload.rb index da31878d3a3..6a2a547e9f9 100644 --- a/google-apis-core/lib/google/apis/core/storage_upload.rb +++ b/google-apis-core/lib/google/apis/core/storage_upload.rb @@ -149,7 +149,7 @@ def initiate_resumable_upload(client) # Reinitiating resumable upload def reinitiate_resumable_upload(client) logger.debug { sprintf('Restarting resumable upload command to %s', url) } - check_resumable_upload client + return false unless check_resumable_upload client upload_io.pos = @offset end @@ -224,6 +224,10 @@ def check_resumable_upload(client) # Initiating call response = client.put(@upload_url, "", request_header) handle_resumable_upload_http_response_codes(response) + if response.status.to_i == 404 + logger.debug { "Failed to fetch upload session. Response: #{response.status.to_i} - #{response.body}" } + false + end end # Cancel resumable upload @@ -235,13 +239,17 @@ def cancel_resumable_upload(client) response = client.delete(@upload_url, nil, request_header) handle_resumable_upload_http_response_codes(response) - if !@upload_incomplete && (400..499).include?(response.status.to_i) + is_successful_cancellation = + !@upload_incomplete && + (400..499).cover?(response.status.to_i) && + response.status.to_i != 404 + if is_successful_cancellation @close_io_on_finish = true - true # method returns true if upload is successfully cancelled + return true # method returns true if upload is successfully cancelled else - logger.debug { sprintf("Failed to cancel upload session. Response: #{response.status.to_i} - #{response.body}") } + logger.debug { "Failed to cancel upload session. Response: #{response.status.to_i} - #{response.body}" } + return false end - end def handle_resumable_upload_http_response_codes(response) diff --git a/google-apis-core/spec/google/apis/core/service_spec.rb b/google-apis-core/spec/google/apis/core/service_spec.rb index a4403f6cc3f..ad156c4cc6a 100644 --- a/google-apis-core/spec/google/apis/core/service_spec.rb +++ b/google-apis-core/spec/google/apis/core/service_spec.rb @@ -287,6 +287,24 @@ expect(a_request(:put, upload_url)).to have_been_made end end + context 'Should return false if wrong upload id is provided' do + let(:upload_id) { 'wrong_id' } + let(:command) do + service.send( + :restart_resumable_upload, + bucket_name, file, upload_id, + options: { upload_chunk_size: 11} + ) + end + before(:example) do + stub_request(:put, upload_url) + .to_return(status: 404) + end + it 'should return false' do + expect(command).to be(false) + end + end + end context 'delete resumable upload with upload_id' do @@ -312,6 +330,24 @@ expect(a_request(:delete, upload_url)).to have_been_made expect(command).to be_truthy end + + context 'Should return false if wrong upload id is provided' do + let(:upload_id) { 'wrong_id' } + let(:command) do + service.send( + :delete_resumable_upload, + bucket_name, upload_id, + options: { upload_chunk_size: 11} + ) + end + before(:example) do + stub_request(:delete, upload_url) + .to_return(status: 404) + end + it 'should return false' do + expect(command).to be(false) + end + end end context 'with batch' do diff --git a/google-apis-core/spec/google/apis/core/storage_upload_spec.rb b/google-apis-core/spec/google/apis/core/storage_upload_spec.rb index 7435f9cafe8..607089569df 100644 --- a/google-apis-core/spec/google/apis/core/storage_upload_spec.rb +++ b/google-apis-core/spec/google/apis/core/storage_upload_spec.rb @@ -161,6 +161,26 @@ expect(a_request(:put, upload_url) .with(body: 'Hello world')).to have_been_made end + + end + + context('restart resumable upload with wrong upload_id') do + let(:file) { StringIO.new('Hello world' * 3) } + let(:upload_id) { 'wrong_upload_id' } + let(:upload_url) { "https://www.googleapis.com/zoo/animals?uploadType=resumable&upload_id=#{upload_id}" } + + before(:example) do + stub_request(:put, upload_url) + .to_return(status: 404) + end + + it 'should return false if wrong upload id is provided' do + stub_request(:put, upload_url) + .to_return(status: 404) + command.options.upload_chunk_size = 11 + command.upload_id = upload_id + expect(command.execute(client)).to be_falsy + end end context('should not restart resumable upload if upload is completed') do @@ -235,6 +255,25 @@ expect(a_request(:put, upload_url) .with(body: 'Hello world')).to have_not_been_made end + + end + + context('delete resumable upload with upload_id') do + let(:file) { StringIO.new('Hello world' * 3) } + let(:upload_id) { 'wrong_upload_id' } + let(:upload_url) { "https://www.googleapis.com/zoo/animals?uploadType=resumable&upload_id=#{upload_id}" } + + before(:example) do + stub_request(:delete, upload_url) + .to_return(status: 404) + end + + it 'should return false if wrong upload id is provided' do + command.options.upload_chunk_size = 11 + command.upload_id = upload_id + command.delete_upload = true + expect(command.execute(client)).to be_falsy + end end context('with chunking disabled') do