From 822f7559f10ca45c5b75214866ec9a5336db1bcd Mon Sep 17 00:00:00 2001
From: David Fernandez <dfernandez@gitlab.com>
Date: Sat, 18 May 2024 09:29:59 +0000
Subject: [PATCH] Fix an overwrite bug in the gcs metrics concern

When writing the gcs signed url metrics don't overwrite the existing
value if there is one. Now, we're going to merge the metrics into the
existing value.

Changelog: fixed
---
 .../packages/gcs_signed_url_metadata.rb       |  2 +-
 .../packages/package_files_controller_spec.rb | 30 +++++++++++++++++++
 2 files changed, 31 insertions(+), 1 deletion(-)

diff --git a/app/uploaders/packages/gcs_signed_url_metadata.rb b/app/uploaders/packages/gcs_signed_url_metadata.rb
index 10f68abeab430..2f1a87b508c5f 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 0f934b4a451c1..623a57221fdf7 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' }
 
-- 
GitLab