From ca42944edff9a0745200acb33d0245da94df9758 Mon Sep 17 00:00:00 2001 From: Shubhangi Singh Date: Fri, 8 May 2026 11:13:27 +0000 Subject: [PATCH 1/7] removing accept encoding header from initialize --- google-cloud-storage/lib/google/cloud/storage/service.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/google-cloud-storage/lib/google/cloud/storage/service.rb b/google-cloud-storage/lib/google/cloud/storage/service.rb index d721509aa08d..6b389072d8c7 100644 --- a/google-cloud-storage/lib/google/cloud/storage/service.rb +++ b/google-cloud-storage/lib/google/cloud/storage/service.rb @@ -64,7 +64,6 @@ def initialize project, credentials, retries: nil, @service.request_options.header ||= {} @service.request_options.header["x-goog-api-client"] = "gl-ruby/#{RUBY_VERSION} gccl/#{Google::Cloud::Storage::VERSION}" - @service.request_options.header["Accept-Encoding"] = "gzip" @service.request_options.quota_project = quota_project if quota_project @service.request_options.max_elapsed_time = max_elapsed_time if max_elapsed_time @service.request_options.base_interval = base_interval if base_interval From 634e2e0379db1b340cd268b6d65e379c0b0874b4 Mon Sep 17 00:00:00 2001 From: Shubhangi Singh Date: Tue, 19 May 2026 04:55:22 +0000 Subject: [PATCH 2/7] blank commit --- google-cloud-storage/lib/google/cloud/storage/service.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/google-cloud-storage/lib/google/cloud/storage/service.rb b/google-cloud-storage/lib/google/cloud/storage/service.rb index 6b389072d8c7..7ee036fbe2e2 100644 --- a/google-cloud-storage/lib/google/cloud/storage/service.rb +++ b/google-cloud-storage/lib/google/cloud/storage/service.rb @@ -64,6 +64,7 @@ def initialize project, credentials, retries: nil, @service.request_options.header ||= {} @service.request_options.header["x-goog-api-client"] = "gl-ruby/#{RUBY_VERSION} gccl/#{Google::Cloud::Storage::VERSION}" + @service.request_options.quota_project = quota_project if quota_project @service.request_options.max_elapsed_time = max_elapsed_time if max_elapsed_time @service.request_options.base_interval = base_interval if base_interval From 4e868e8d661025465947fa86fd2a9b7f9bbe980b Mon Sep 17 00:00:00 2001 From: Shubhangi Singh Date: Tue, 19 May 2026 04:55:42 +0000 Subject: [PATCH 3/7] blank commit --- google-cloud-storage/lib/google/cloud/storage/service.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/google-cloud-storage/lib/google/cloud/storage/service.rb b/google-cloud-storage/lib/google/cloud/storage/service.rb index 7ee036fbe2e2..6b389072d8c7 100644 --- a/google-cloud-storage/lib/google/cloud/storage/service.rb +++ b/google-cloud-storage/lib/google/cloud/storage/service.rb @@ -64,7 +64,6 @@ def initialize project, credentials, retries: nil, @service.request_options.header ||= {} @service.request_options.header["x-goog-api-client"] = "gl-ruby/#{RUBY_VERSION} gccl/#{Google::Cloud::Storage::VERSION}" - @service.request_options.quota_project = quota_project if quota_project @service.request_options.max_elapsed_time = max_elapsed_time if max_elapsed_time @service.request_options.base_interval = base_interval if base_interval From 7892cdd18ed5847c2e302c29d0762f3dc62715fd Mon Sep 17 00:00:00 2001 From: Shubhangi Singh Date: Tue, 9 Jun 2026 04:47:34 +0000 Subject: [PATCH 4/7] adding test --- .../test/google/cloud/storage/project_test.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/google-cloud-storage/test/google/cloud/storage/project_test.rb b/google-cloud-storage/test/google/cloud/storage/project_test.rb index c07bff384157..831bb26144ea 100644 --- a/google-cloud-storage/test/google/cloud/storage/project_test.rb +++ b/google-cloud-storage/test/google/cloud/storage/project_test.rb @@ -67,6 +67,11 @@ def creds.is_a? target _(project.universe_domain).must_equal "googleapis.com" end + it "does not set Accept-Encoding gzip header by default" do + service = Google::Cloud::Storage::Service.new "my-project", default_credentials + _(service.service.request_options.header["Accept-Encoding"]).must_be :nil? + end + it "supports setting a universe domain argument" do service = Google::Cloud::Storage::Service.new "my-project", default_credentials, universe_domain: "mydomain1.com" _(service.universe_domain).must_equal "mydomain1.com" From 55eb740f7b82e01e0b3d30bb85a958113418faeb Mon Sep 17 00:00:00 2001 From: Shubhangi Singh Date: Tue, 9 Jun 2026 14:14:58 +0000 Subject: [PATCH 5/7] test headers --- .../acceptance/storage/headers_test.rb | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 google-cloud-storage/acceptance/storage/headers_test.rb diff --git a/google-cloud-storage/acceptance/storage/headers_test.rb b/google-cloud-storage/acceptance/storage/headers_test.rb new file mode 100644 index 000000000000..58354cb79e05 --- /dev/null +++ b/google-cloud-storage/acceptance/storage/headers_test.rb @@ -0,0 +1,87 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +require_relative "../storage_helper" + +describe "Accept-Encoding" do + + class HeaderRecorder + def self.captured_headers + @captured_headers ||= [] + end + + def self.clear_headers! + @captured_headers = [] + end + + def initialize(app) + @app = app + end + + def call(env) + self.class.captured_headers << env.request_headers + @app.call(env) + end + end + + before do + @fresh_storage = Google::Cloud::Storage.new + @client = @fresh_storage.service.service.client + @client.builder.insert_before(0, HeaderRecorder) + + # Start every test with a clean slate + HeaderRecorder.clear_headers! + end + + after do + @client.builder.delete(HeaderRecorder) rescue nil + end + + it "does not include Accept-Encoding gzip header on metadata calls" do + @fresh_storage.buckets(max: 1) + + refute_empty HeaderRecorder.captured_headers + HeaderRecorder.captured_headers.each do |headers| + assert_nil headers["Accept-Encoding"] + end + end + + it "includes Accept-Encoding gzip header on media calls (upload/download)" do + bucket_name = "gcloud-test-ae-#{Time.now.to_i}-#{SecureRandom.hex(4)}" + bucket = @fresh_storage.create_bucket(bucket_name) + + begin + # Clear the headers generated by the bucket creation above + HeaderRecorder.clear_headers! + + # Test Upload + file = bucket.create_file(StringIO.new("hello world"), "test.txt") + upload_headers = HeaderRecorder.captured_headers.map { |h| h["Accept-Encoding"] } + assert_includes upload_headers, "gzip" + + # Clear headers before the next action + HeaderRecorder.clear_headers! + + # Test Download + file.download + download_headers = HeaderRecorder.captured_headers.map { |h| h["Accept-Encoding"] } + + assert_includes download_headers, "gzip" + ensure + # Cleanup + safe_gcs_execute { file&.delete } + safe_gcs_execute { bucket&.delete } + end + end +end \ No newline at end of file From 7353031b22e97d0927d3883b0a565278389f3f25 Mon Sep 17 00:00:00 2001 From: Shubhangi Singh Date: Mon, 22 Jun 2026 13:12:19 +0000 Subject: [PATCH 6/7] try conformance tests --- .../acceptance/storage/headers_test.rb | 62 +++++++--------- .../google/cloud/storage/headers_test.rb | 72 +++++++++++++++++++ 2 files changed, 98 insertions(+), 36 deletions(-) create mode 100644 google-cloud-storage/conformance/google/cloud/storage/headers_test.rb diff --git a/google-cloud-storage/acceptance/storage/headers_test.rb b/google-cloud-storage/acceptance/storage/headers_test.rb index 58354cb79e05..2fd1b95b5f1c 100644 --- a/google-cloud-storage/acceptance/storage/headers_test.rb +++ b/google-cloud-storage/acceptance/storage/headers_test.rb @@ -13,71 +13,61 @@ # limitations under the License. require_relative "../storage_helper" +require 'pry' describe "Accept-Encoding" do - - class HeaderRecorder - def self.captured_headers - @captured_headers ||= [] - end - - def self.clear_headers! - @captured_headers = [] - end - - def initialize(app) - @app = app + # Inject an array into the middleware instead of using class-level state + class HeaderRecorder < Faraday::Middleware + def initialize(app, captured_headers) + super(app) + @captured_headers = captured_headers end def call(env) - self.class.captured_headers << env.request_headers + @captured_headers << env.request_headers @app.call(env) end end + let(:storage) { Google::Cloud::Storage.new } + let(:captured_headers) { [] } + let(:client) { storage.service.service.client } + before do - @fresh_storage = Google::Cloud::Storage.new - @client = @fresh_storage.service.service.client - @client.builder.insert_before(0, HeaderRecorder) - - # Start every test with a clean slate - HeaderRecorder.clear_headers! + # Pass our local captured_headers array to the middleware + client.builder.insert_before(0, HeaderRecorder, captured_headers) end after do - @client.builder.delete(HeaderRecorder) rescue nil + client.builder.delete(HeaderRecorder) rescue nil end - it "does not include Accept-Encoding gzip header on metadata calls" do - @fresh_storage.buckets(max: 1) + it "does not include Accept-Encoding header on metadata calls" do + storage.buckets(max: 1) - refute_empty HeaderRecorder.captured_headers - HeaderRecorder.captured_headers.each do |headers| - assert_nil headers["Accept-Encoding"] - end + refute_empty captured_headers + + # Assert none of the requests included the header + assert captured_headers.none? { |headers| headers.key?("Accept-Encoding") } end it "includes Accept-Encoding gzip header on media calls (upload/download)" do bucket_name = "gcloud-test-ae-#{Time.now.to_i}-#{SecureRandom.hex(4)}" - bucket = @fresh_storage.create_bucket(bucket_name) + bucket = storage.create_bucket(bucket_name) begin - # Clear the headers generated by the bucket creation above - HeaderRecorder.clear_headers! + # Reset our local array instead of calling a class method + captured_headers.clear # Test Upload file = bucket.create_file(StringIO.new("hello world"), "test.txt") - upload_headers = HeaderRecorder.captured_headers.map { |h| h["Accept-Encoding"] } - assert_includes upload_headers, "gzip" + assert_includes captured_headers.map { |h| h["Accept-Encoding"] }, "gzip" - # Clear headers before the next action - HeaderRecorder.clear_headers! + captured_headers.clear # Test Download file.download - download_headers = HeaderRecorder.captured_headers.map { |h| h["Accept-Encoding"] } - - assert_includes download_headers, "gzip" + assert_includes captured_headers.map { |h| h["Accept-Encoding"] }, "gzip" ensure # Cleanup safe_gcs_execute { file&.delete } diff --git a/google-cloud-storage/conformance/google/cloud/storage/headers_test.rb b/google-cloud-storage/conformance/google/cloud/storage/headers_test.rb new file mode 100644 index 000000000000..7b64d63a0556 --- /dev/null +++ b/google-cloud-storage/conformance/google/cloud/storage/headers_test.rb @@ -0,0 +1,72 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +require "helper" + +class HeadersTest < MockStorage + + HOST = "http://localhost:9000/" + + class HeaderRecorder < Faraday::Middleware + def initialize app, captured_headers + super app + @captured_headers = captured_headers + end + + def call env + @captured_headers << env.request_headers + @app.call env + end + end + + def setup + storage.service.service.root_url = HOST + @captured_headers = [] + @client = storage.service.service.client + @client.builder.insert_before 0, HeaderRecorder, @captured_headers + end + + def teardown + @client.builder.delete HeaderRecorder rescue nil + end + + def test_no_accept_encoding_on_metadata_calls + storage.buckets max: 1 + + refute_empty @captured_headers + assert @captured_headers.none? { |headers| headers.key? "Accept-Encoding" } + end + + def test_accept_encoding_gzip_on_media_calls + bucket_name = random_bucket_name + bucket = storage.create_bucket bucket_name + + begin + @captured_headers.clear + + # Test Upload + file = bucket.create_file StringIO.new("hello world"), "test.txt" + assert_includes @captured_headers.map { |h| h["Accept-Encoding"] }, "gzip" + + @captured_headers.clear + + # Test Download + file.download + assert_includes @captured_headers.map { |h| h["Accept-Encoding"] }, "gzip" + ensure + file&.delete rescue nil + bucket&.delete rescue nil + end + end +end From c21ea9b8b3668766bfc931f33b42cbfd8ce0a6c6 Mon Sep 17 00:00:00 2001 From: Shubhangi Singh Date: Tue, 23 Jun 2026 07:12:22 +0000 Subject: [PATCH 7/7] undo conformance --- .../google/cloud/storage/headers_test.rb | 72 ------------------- 1 file changed, 72 deletions(-) delete mode 100644 google-cloud-storage/conformance/google/cloud/storage/headers_test.rb diff --git a/google-cloud-storage/conformance/google/cloud/storage/headers_test.rb b/google-cloud-storage/conformance/google/cloud/storage/headers_test.rb deleted file mode 100644 index 7b64d63a0556..000000000000 --- a/google-cloud-storage/conformance/google/cloud/storage/headers_test.rb +++ /dev/null @@ -1,72 +0,0 @@ -# Copyright 2026 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -require "helper" - -class HeadersTest < MockStorage - - HOST = "http://localhost:9000/" - - class HeaderRecorder < Faraday::Middleware - def initialize app, captured_headers - super app - @captured_headers = captured_headers - end - - def call env - @captured_headers << env.request_headers - @app.call env - end - end - - def setup - storage.service.service.root_url = HOST - @captured_headers = [] - @client = storage.service.service.client - @client.builder.insert_before 0, HeaderRecorder, @captured_headers - end - - def teardown - @client.builder.delete HeaderRecorder rescue nil - end - - def test_no_accept_encoding_on_metadata_calls - storage.buckets max: 1 - - refute_empty @captured_headers - assert @captured_headers.none? { |headers| headers.key? "Accept-Encoding" } - end - - def test_accept_encoding_gzip_on_media_calls - bucket_name = random_bucket_name - bucket = storage.create_bucket bucket_name - - begin - @captured_headers.clear - - # Test Upload - file = bucket.create_file StringIO.new("hello world"), "test.txt" - assert_includes @captured_headers.map { |h| h["Accept-Encoding"] }, "gzip" - - @captured_headers.clear - - # Test Download - file.download - assert_includes @captured_headers.map { |h| h["Accept-Encoding"] }, "gzip" - ensure - file&.delete rescue nil - bucket&.delete rescue nil - end - end -end