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 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 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"