diff --git a/clouddriver-artifacts/src/main/java/com/netflix/spinnaker/clouddriver/artifacts/config/BaseHttpArtifactCredentials.java b/clouddriver-artifacts/src/main/java/com/netflix/spinnaker/clouddriver/artifacts/config/BaseHttpArtifactCredentials.java index bd1ea8027b4..b4a177cafd2 100644 --- a/clouddriver-artifacts/src/main/java/com/netflix/spinnaker/clouddriver/artifacts/config/BaseHttpArtifactCredentials.java +++ b/clouddriver-artifacts/src/main/java/com/netflix/spinnaker/clouddriver/artifacts/config/BaseHttpArtifactCredentials.java @@ -76,6 +76,10 @@ protected ResponseBody fetchUrl(HttpUrl url) throws IOException { Request request = new Request.Builder().headers(headers).url(url).build(); Response downloadResponse = okHttpClient.newCall(request).execute(); + if (!downloadResponse.isSuccessful()) { + throw new IOException( + String.format("Received %d status code from %s", downloadResponse.code(), url.host())); + } return downloadResponse.body(); } } diff --git a/clouddriver-artifacts/src/test/java/com/netflix/spinnaker/clouddriver/artifacts/http/HttpArtifactCredentialsTest.java b/clouddriver-artifacts/src/test/java/com/netflix/spinnaker/clouddriver/artifacts/http/HttpArtifactCredentialsTest.java index e21c6aa2725..9374e1bd4a5 100644 --- a/clouddriver-artifacts/src/test/java/com/netflix/spinnaker/clouddriver/artifacts/http/HttpArtifactCredentialsTest.java +++ b/clouddriver-artifacts/src/test/java/com/netflix/spinnaker/clouddriver/artifacts/http/HttpArtifactCredentialsTest.java @@ -18,6 +18,7 @@ import static com.github.tomakehurst.wiremock.client.WireMock.*; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.catchThrowable; import com.github.tomakehurst.wiremock.WireMockServer; import com.github.tomakehurst.wiremock.client.MappingBuilder; @@ -73,6 +74,24 @@ void downloadWithNoAuth(@WiremockResolver.Wiremock WireMockServer server) throws runTestCase(server, account, m -> m.withHeader("Authorization", absent())); } + @Test + void throwExceptionOnNonSuccessfulResponse(@WiremockResolver.Wiremock WireMockServer server) { + HttpArtifactAccount account = new HttpArtifactAccount(); + HttpArtifactCredentials credentials = new HttpArtifactCredentials(account, okHttpClient); + Artifact artifact = + Artifact.builder().reference(server.baseUrl() + URL).type("http/file").build(); + account.setName("my-http-account"); + server.stubFor(any(urlPathEqualTo(URL)).willReturn(aResponse().withStatus(404))); + + Throwable thrown = catchThrowable(() -> credentials.download(artifact)); + + assertThat(thrown) + .isInstanceOf(IOException.class) + .hasMessageContaining("404") + .hasMessageContaining(server.baseUrl()); + assertThat(server.findUnmatchedRequests().getRequests()).isEmpty(); + } + private void runTestCase( WireMockServer server, HttpArtifactAccount account,