diff --git a/app/uploaders/packages/gcs_signed_url_metadata.rb b/app/uploaders/packages/gcs_signed_url_metadata.rb index 10f68abeab430e024d5d18606711cce15a13b09f..2f1a87b508c5fda0bd81c733e499ec5b06f5b15f 100644 --- a/app/uploaders/packages/gcs_signed_url_metadata.rb +++ b/app/uploaders/packages/gcs_signed_url_metadata.rb @@ -19,7 +19,7 @@ def url(*args, **kwargs) 'x-goog-custom-audit-gitlab-size-bytes' => model.try(:size) || size }.compact.transform_values(&:to_s) - super(*args, **kwargs.merge(query: metadata_params)) + super(*args, **kwargs.deep_merge(query: metadata_params)) rescue StandardError => e Gitlab::ErrorTracking.track_exception( e, diff --git a/spec/requests/projects/packages/package_files_controller_spec.rb b/spec/requests/projects/packages/package_files_controller_spec.rb index 0f934b4a451c1501f30da335e9e8521d6a274c83..623a57221fdf7c1ae0ed61c1999e699527195ed7 100644 --- a/spec/requests/projects/packages/package_files_controller_spec.rb +++ b/spec/requests/projects/packages/package_files_controller_spec.rb @@ -25,6 +25,36 @@ .to eq(%(attachment; filename="#{filename}"; filename*=UTF-8''#{filename})) end + context 'when the fog provider is Google and on .com', :saas do + let(:package_file) { create(:package_file, :object_storage, package: package, file_name: filename) } + + before do + stub_package_file_object_storage( + config: Gitlab.config.packages.object_store.merge(connection: { + provider: 'Google', + google_storage_access_key_id: 'test-access-id', + google_storage_secret_access_key: 'secret' + }), + proxy_download: true + ) + end + + it 'send the correct headers' do + subject + + command, encoded_params = response.headers[::Gitlab::Workhorse::SEND_DATA_HEADER].split(':') + params = Gitlab::Json.parse(Base64.urlsafe_decode64(encoded_params)) + + expect(command).to eq('send-url') + expect(params['URL']).to include( + %(response-content-disposition=attachment%3B%20filename%3D%22#{filename}), + 'x-goog-custom-audit-gitlab-project', + 'x-goog-custom-audit-gitlab-namespace', + 'x-goog-custom-audit-gitlab-size-bytes' + ) + end + end + context 'when file name has directory structure' do let(:filename) { 'dir%2Ffile.zip' }