diff options
| author | Peteris Rudzusiks <rye@stripe.com> | 2025-06-19 18:17:24 +0200 |
|---|---|---|
| committer | Hiroshi SHIBATA <hsbt@ruby-lang.org> | 2025-07-09 13:48:37 +0900 |
| commit | 3feba181ed50b2109f35ed8225f3ed1e45bdca93 (patch) | |
| tree | 7af5bb576cd1e08e40690cd4c3b6197eeae0eea6 | |
| parent | 5d880b75efe75a2be7046e75ea62bd02e0cf94a5 (diff) | |
[rubygems/rubygems] Let s3_uri_signer accept the HTTP method
https://github.com/rubygems/rubygems/commit/35fc7f9547
| -rw-r--r-- | lib/rubygems/remote_fetcher.rb | 6 | ||||
| -rw-r--r-- | lib/rubygems/s3_uri_signer.rb | 8 | ||||
| -rw-r--r-- | test/rubygems/test_gem_remote_fetcher_s3.rb | 18 |
3 files changed, 16 insertions, 16 deletions
diff --git a/lib/rubygems/remote_fetcher.rb b/lib/rubygems/remote_fetcher.rb index 52a8bc243e..355a668b39 100644 --- a/lib/rubygems/remote_fetcher.rb +++ b/lib/rubygems/remote_fetcher.rb @@ -267,7 +267,7 @@ class Gem::RemoteFetcher def fetch_s3(uri, mtime = nil, head = false) begin - public_uri = s3_uri_signer(uri, head).sign + public_uri = s3_uri_signer(uri, head ? "HEAD" : "GET").sign rescue Gem::S3URISigner::ConfigurationError, Gem::S3URISigner::InstanceProfileError => e raise FetchError.new(e.message, "s3://#{uri.host}") end @@ -275,8 +275,8 @@ class Gem::RemoteFetcher end # we have our own signing code here to avoid a dependency on the aws-sdk gem - def s3_uri_signer(uri, head) - Gem::S3URISigner.new(uri, head) + def s3_uri_signer(uri, method) + Gem::S3URISigner.new(uri, method) end ## diff --git a/lib/rubygems/s3_uri_signer.rb b/lib/rubygems/s3_uri_signer.rb index 8dbf236442..0d8e9e8285 100644 --- a/lib/rubygems/s3_uri_signer.rb +++ b/lib/rubygems/s3_uri_signer.rb @@ -27,11 +27,11 @@ class Gem::S3URISigner end attr_accessor :uri - attr_accessor :head + attr_accessor :method - def initialize(uri, head) + def initialize(uri, method) @uri = uri - @head = head + @method = method end ## @@ -75,7 +75,7 @@ class Gem::S3URISigner def generate_canonical_request(canonical_host, query_params) [ - head ? "HEAD" : "GET", + method.upcase, uri.path, query_params, "host:#{canonical_host}", diff --git a/test/rubygems/test_gem_remote_fetcher_s3.rb b/test/rubygems/test_gem_remote_fetcher_s3.rb index 8dcf3469f1..e3aaa7a691 100644 --- a/test/rubygems/test_gem_remote_fetcher_s3.rb +++ b/test/rubygems/test_gem_remote_fetcher_s3.rb @@ -18,7 +18,7 @@ class TestGemRemoteFetcherS3 < Gem::TestCase @a1.loaded_from = File.join(@gemhome, "specifications", @a1.full_name) end - def assert_fetch_s3(url, signature, token=nil, region="us-east-1", instance_profile_json=nil, head=false) + def assert_fetch_s3(url, signature, token=nil, region="us-east-1", instance_profile_json=nil, method="GET") fetcher = Gem::RemoteFetcher.new nil @fetcher = fetcher $fetched_uri = nil @@ -33,9 +33,9 @@ class TestGemRemoteFetcherS3 < Gem::TestCase res end - def fetcher.s3_uri_signer(uri, head) + def fetcher.s3_uri_signer(uri, method) require "json" - s3_uri_signer = Gem::S3URISigner.new(uri, head) + s3_uri_signer = Gem::S3URISigner.new(uri, method) def s3_uri_signer.ec2_metadata_credentials_json JSON.parse($instance_profile) end @@ -45,13 +45,13 @@ class TestGemRemoteFetcherS3 < Gem::TestCase s3_uri_signer end - res = fetcher.fetch_s3 Gem::URI.parse(url), nil, head + res = fetcher.fetch_s3 Gem::URI.parse(url), nil, (method == "HEAD") assert_equal "https://my-bucket.s3.#{region}.amazonaws.com/gems/specs.4.8.gz?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=testuser%2F20190624%2F#{region}%2Fs3%2Faws4_request&X-Amz-Date=20190624T051941Z&X-Amz-Expires=86400#{token ? "&X-Amz-Security-Token=" + token : ""}&X-Amz-SignedHeaders=host&X-Amz-Signature=#{signature}", $fetched_uri.to_s - if !head - assert_equal "success", res - else + if method == "HEAD" assert_equal 200, res.code + else + assert_equal "success", res end ensure $fetched_uri = nil @@ -78,8 +78,8 @@ class TestGemRemoteFetcherS3 < Gem::TestCase token = nil region = "us-east-1" instance_profile_json = nil - head = true - assert_fetch_s3 url, "a3c6cf9a2db62e85f4e57f8fc8ac8b5ff5c1fdd4aeef55935d05e05174d9c885", token, region, instance_profile_json, head + method = "HEAD" + assert_fetch_s3 url, "a3c6cf9a2db62e85f4e57f8fc8ac8b5ff5c1fdd4aeef55935d05e05174d9c885", token, region, instance_profile_json, method end ensure Gem.configuration[:s3_source] = nil |
