Skip to content

Commit 7fefb0d

Browse files
authored
Merge pull request #301 from tmeire/bugfix-audit-error-reporting
Catch failure HTTP responses on calls to the npm registry
2 parents 628842b + 8e12aaf commit 7fefb0d

File tree

2 files changed

+55
-6
lines changed

2 files changed

+55
-6
lines changed

lib/importmap/npm.rb

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -76,13 +76,19 @@ def get_json(uri)
7676
request = Net::HTTP::Get.new(uri)
7777
request["Content-Type"] = "application/json"
7878

79-
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http|
80-
http.request(request)
81-
}
79+
response = begin
80+
Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http|
81+
http.request(request)
82+
}
83+
rescue => error
84+
raise HTTPError, "Unexpected transport error (#{error.class}: #{error.message})"
85+
end
86+
87+
unless response.code.to_i < 300
88+
raise HTTPError, "Unexpected error response #{response.code}: #{response.body}"
89+
end
8290

8391
response.body
84-
rescue => error
85-
raise HTTPError, "Unexpected transport error (#{error.class}: #{error.message})"
8692
end
8793

8894
def find_latest_version(response)
@@ -111,6 +117,11 @@ def get_audit
111117
return {} if body.empty?
112118

113119
response = post_json(uri, body)
120+
121+
unless response.code.to_i < 300
122+
raise HTTPError, "Unexpected error response #{response.code}: #{response.body}"
123+
end
124+
114125
JSON.parse(response.body)
115126
end
116127

test/npm_test.rb

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,14 +59,52 @@ class Importmap::NpmTest < ActiveSupport::TestCase
5959
end
6060
end
6161

62-
test "failed outdated packages request with mock" do
62+
test "failed outdated packages request with exception" do
6363
Net::HTTP.stub(:start, proc { raise "Unexpected Error" }) do
6464
assert_raises(Importmap::Npm::HTTPError) do
6565
@npm.outdated_packages
6666
end
6767
end
6868
end
6969

70+
test "failed outdated packages request with error response" do
71+
client = Minitest::Mock.new
72+
response = Class.new do
73+
def body
74+
{ "message" => "Service unavailable" }.to_json
75+
end
76+
77+
def code() "500" end
78+
end.new
79+
80+
client.expect(:request, nil, [Net::HTTP::Get])
81+
82+
Net::HTTP.stub(:start, response, client) do
83+
e = assert_raises(Importmap::Npm::HTTPError) do
84+
@npm.outdated_packages
85+
end
86+
87+
assert_equal "Unexpected error response 500: {\"message\":\"Service unavailable\"}", e.message
88+
end
89+
end
90+
91+
test "failed vulnerable packages with mock" do
92+
response = Class.new do
93+
def body
94+
{ "message" => "Service unavailable" }.to_json
95+
end
96+
97+
def code() "500" end
98+
end.new
99+
100+
@npm.stub(:post_json, response) do
101+
e = assert_raises(Importmap::Npm::HTTPError) do
102+
@npm.vulnerable_packages
103+
end
104+
assert_equal "Unexpected error response 500: {\"message\":\"Service unavailable\"}", e.message
105+
end
106+
end
107+
70108
test "successful vulnerable packages with mock" do
71109
response = Class.new do
72110
def body

0 commit comments

Comments
 (0)