From 4004216a5b87bf98467c03e44fa37c37d97cbd4f Mon Sep 17 00:00:00 2001 From: Geoff Bourne Date: Fri, 20 Jan 2023 08:30:00 -0600 Subject: [PATCH 1/2] http: restore bad response status handling in file fetch --- .../helpers/http/FailedRequestException.java | 15 +++++++++++++++ .../http/SpecificFileFetchBuilder.java | 19 +++++++++++++++---- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/main/java/me/itzg/helpers/http/FailedRequestException.java b/src/main/java/me/itzg/helpers/http/FailedRequestException.java index 86616e1f..94f963c4 100644 --- a/src/main/java/me/itzg/helpers/http/FailedRequestException.java +++ b/src/main/java/me/itzg/helpers/http/FailedRequestException.java @@ -1,5 +1,6 @@ package me.itzg.helpers.http; +import io.netty.handler.codec.http.HttpResponseStatus; import java.net.URI; import lombok.Getter; import org.apache.hc.client5.http.HttpResponseException; @@ -11,6 +12,9 @@ public class FailedRequestException extends RuntimeException { @Getter private final int statusCode; + /** + * Apache HTTP Client flavor + */ public FailedRequestException(HttpResponseException e, URI uri) { super( String.format("HTTP request failed uri: %s %s", uri, e.getMessage()) @@ -18,4 +22,15 @@ public FailedRequestException(HttpResponseException e, URI uri) { this.uri = uri; this.statusCode = e.getStatusCode(); } + + /** + * Reactor Netty flavor + */ + public FailedRequestException(HttpResponseStatus status, URI uri, String msg) { + super( + String.format("HTTP request failed uri: %s %s", uri, msg) + ); + this.uri = uri; + this.statusCode = status.code(); + } } diff --git a/src/main/java/me/itzg/helpers/http/SpecificFileFetchBuilder.java b/src/main/java/me/itzg/helpers/http/SpecificFileFetchBuilder.java index f1b411dd..34c3869a 100644 --- a/src/main/java/me/itzg/helpers/http/SpecificFileFetchBuilder.java +++ b/src/main/java/me/itzg/helpers/http/SpecificFileFetchBuilder.java @@ -4,6 +4,8 @@ import static io.netty.handler.codec.http.HttpResponseStatus.NOT_MODIFIED; import static java.util.Objects.requireNonNull; +import io.netty.handler.codec.http.HttpResponseStatus; +import io.netty.handler.codec.http.HttpStatusClass; import java.io.IOException; import java.net.URI; import java.nio.file.Files; @@ -108,19 +110,28 @@ public Mono assemble() { .doOnRequest(debugLogRequest(log, "file fetch")) .get() .uri(uri) - .responseSingle((httpClientResponse, bodyMono) -> { + .responseSingle((resp, bodyMono) -> { + final HttpResponseStatus status = resp.status(); + + if (HttpStatusClass.valueOf(status.code()) != HttpStatusClass.SUCCESS) { + return Mono.error(new FailedRequestException(status, uri, "Trying to retrieve file")); + } + if (useIfModifiedSince - && httpClientResponse.status().equals(NOT_MODIFIED)) { + && status.equals(NOT_MODIFIED)) { return Mono.just(file); } final List contentTypes = getAcceptContentTypes(); if (contentTypes != null && !contentTypes.isEmpty()) { - final List respTypes = httpClientResponse.responseHeaders() + final List respTypes = resp.responseHeaders() .getAll(CONTENT_TYPE); if (respTypes.stream() .noneMatch(contentTypes::contains)) { - return Mono.error(new GenericException("Unexpected content type in response")); + return Mono.error(new GenericException( + String.format("Unexpected content type in response. Expected '%s' but got '%s'", + contentTypes, respTypes + ))); } } From 4f10dbd3c91965b188dac486c4169cb89d57d91f Mon Sep 17 00:00:00 2001 From: Geoff Bourne Date: Fri, 20 Jan 2023 08:52:49 -0600 Subject: [PATCH 2/2] Fixed not-modified case --- .../me/itzg/helpers/http/SpecificFileFetchBuilder.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/me/itzg/helpers/http/SpecificFileFetchBuilder.java b/src/main/java/me/itzg/helpers/http/SpecificFileFetchBuilder.java index 34c3869a..f3cf4e64 100644 --- a/src/main/java/me/itzg/helpers/http/SpecificFileFetchBuilder.java +++ b/src/main/java/me/itzg/helpers/http/SpecificFileFetchBuilder.java @@ -113,13 +113,12 @@ public Mono assemble() { .responseSingle((resp, bodyMono) -> { final HttpResponseStatus status = resp.status(); - if (HttpStatusClass.valueOf(status.code()) != HttpStatusClass.SUCCESS) { - return Mono.error(new FailedRequestException(status, uri, "Trying to retrieve file")); + if (useIfModifiedSince && status.equals(NOT_MODIFIED)) { + return Mono.just(file); } - if (useIfModifiedSince - && status.equals(NOT_MODIFIED)) { - return Mono.just(file); + if (HttpStatusClass.valueOf(status.code()) != HttpStatusClass.SUCCESS) { + return Mono.error(new FailedRequestException(status, uri, "Trying to retrieve file")); } final List contentTypes = getAcceptContentTypes();