summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuis J. Gonzalez <lgonzalez@sonatype.com>2026-01-26 14:39:00 -0500
committergit <svn-admin@ruby-lang.org>2026-02-13 06:53:50 +0000
commit74c066a711972ba0927d980ce0010ec68c77e74e (patch)
tree14674e8b69d771dc44ffea17f1d13963e8dbd22d
parentf94f28481b8450c0dfa18304be420fd969321b7e (diff)
[ruby/rubygems] Add support for custom error response from external registries
https://github.com/ruby/rubygems/commit/b021dde989
-rw-r--r--lib/rubygems/remote_fetcher.rb4
-rw-r--r--test/rubygems/test_gem_remote_fetcher.rb35
2 files changed, 38 insertions, 1 deletions
diff --git a/lib/rubygems/remote_fetcher.rb b/lib/rubygems/remote_fetcher.rb
index ea8d3f9d1f..5b83dc6f6f 100644
--- a/lib/rubygems/remote_fetcher.rb
+++ b/lib/rubygems/remote_fetcher.rb
@@ -237,7 +237,9 @@ class Gem::RemoteFetcher
fetch_http(location, last_modified, head, depth + 1)
else
- raise FetchError.new("bad response #{response.message} #{response.code}", uri)
+ custom_error = response["X-Error-Message"]
+ error_detail = custom_error || response.message
+ raise FetchError.new("Bad response #{error_detail} #{response.code}", uri)
end
end
diff --git a/test/rubygems/test_gem_remote_fetcher.rb b/test/rubygems/test_gem_remote_fetcher.rb
index 9228193152..c35da2fc5a 100644
--- a/test/rubygems/test_gem_remote_fetcher.rb
+++ b/test/rubygems/test_gem_remote_fetcher.rb
@@ -643,6 +643,41 @@ class TestGemRemoteFetcher < Gem::TestCase
end
end
+ def test_fetch_http_with_custom_error_header
+ fetcher = Gem::RemoteFetcher.new nil
+ @fetcher = fetcher
+ url = "http://gems.example.com/error"
+
+ def fetcher.request(uri, request_class, last_modified = nil)
+ res = Gem::Net::HTTPBadRequest.new nil, 403, "Forbidden"
+ res.add_field "X-Error-Message", "Component blocked by policy"
+ res
+ end
+
+ e = assert_raise Gem::RemoteFetcher::FetchError do
+ fetcher.fetch_http Gem::URI.parse(url)
+ end
+
+ assert_equal "Bad response Component blocked by policy 403 (#{url})", e.message
+ end
+
+ def test_fetch_http_without_custom_error_header
+ fetcher = Gem::RemoteFetcher.new nil
+ @fetcher = fetcher
+ url = "http://gems.example.com/error"
+
+ def fetcher.request(uri, request_class, last_modified = nil)
+ res = Gem::Net::HTTPBadRequest.new nil, 403, "Forbidden"
+ res
+ end
+
+ e = assert_raise Gem::RemoteFetcher::FetchError do
+ fetcher.fetch_http Gem::URI.parse(url)
+ end
+
+ assert_equal "Bad response Forbidden 403 (#{url})", e.message
+ end
+
private
def assert_error(exception_class = Exception)