parent
9c5dcad0e5
commit
d54a694f5a
|
@ -88,6 +88,14 @@ public sealed interface HttpStatusCode extends Serializable permits DefaultHttpS
|
||||||
return value() == other.value();
|
return value() == other.value();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks whether this status code is a well-known HTTP status code or not
|
||||||
|
* @return {@code true} if the status code corresponds to a standard HTTP status code, {@code false} otherwise
|
||||||
|
*/
|
||||||
|
default boolean isWellKnown() {
|
||||||
|
return HttpStatus.resolve(this.value()) != null;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return an {@code HttpStatusCode} object for the given integer value.
|
* Return an {@code HttpStatusCode} object for the given integer value.
|
||||||
* @param code the status code as integer
|
* @param code the status code as integer
|
||||||
|
|
|
@ -516,9 +516,11 @@ final class DefaultWebClient implements WebClient {
|
||||||
private static class DefaultResponseSpec implements ResponseSpec {
|
private static class DefaultResponseSpec implements ResponseSpec {
|
||||||
|
|
||||||
private static final Predicate<HttpStatusCode> STATUS_CODE_ERROR = HttpStatusCode::isError;
|
private static final Predicate<HttpStatusCode> STATUS_CODE_ERROR = HttpStatusCode::isError;
|
||||||
|
private static final Predicate<HttpStatusCode> STATUS_CODE_UNKNOWN = status -> !status.isWellKnown();
|
||||||
private static final StatusHandler DEFAULT_STATUS_HANDLER =
|
private static final StatusHandler DEFAULT_ERROR_STATUS_HANDLER =
|
||||||
new StatusHandler(STATUS_CODE_ERROR, ClientResponse::createException);
|
new StatusHandler(STATUS_CODE_ERROR, ClientResponse::createException);
|
||||||
|
private static final StatusHandler DEFAULT_UNKNOWN_STATUS_HANDLER =
|
||||||
|
new StatusHandler(STATUS_CODE_UNKNOWN, ClientResponse::createException);
|
||||||
|
|
||||||
private final HttpMethod httpMethod;
|
private final HttpMethod httpMethod;
|
||||||
|
|
||||||
|
@ -537,7 +539,8 @@ final class DefaultWebClient implements WebClient {
|
||||||
this.uri = uri;
|
this.uri = uri;
|
||||||
this.responseMono = responseMono;
|
this.responseMono = responseMono;
|
||||||
this.statusHandlers.addAll(defaultStatusHandlers);
|
this.statusHandlers.addAll(defaultStatusHandlers);
|
||||||
this.statusHandlers.add(DEFAULT_STATUS_HANDLER);
|
this.statusHandlers.add(DEFAULT_ERROR_STATUS_HANDLER);
|
||||||
|
this.statusHandlers.add(DEFAULT_UNKNOWN_STATUS_HANDLER);
|
||||||
this.defaultStatusHandlerCount = this.statusHandlers.size();
|
this.defaultStatusHandlerCount = this.statusHandlers.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -672,6 +672,40 @@ class WebClientIntegrationTests {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ParameterizedWebClientTest
|
||||||
|
void retrieve929CustomUnknownStatus(ClientHttpConnector connector) {
|
||||||
|
startServer(connector);
|
||||||
|
|
||||||
|
int errorStatus = 929;
|
||||||
|
assertThat(HttpStatus.resolve(errorStatus)).isNull();
|
||||||
|
String errorMessage = "Something went wrong";
|
||||||
|
prepareResponse(response -> response.setResponseCode(errorStatus)
|
||||||
|
.setHeader("Content-Type", "text/plain").setBody(errorMessage));
|
||||||
|
|
||||||
|
Mono<String> result = this.webClient.get()
|
||||||
|
.uri("/unknownPage")
|
||||||
|
.retrieve()
|
||||||
|
.bodyToMono(String.class);
|
||||||
|
|
||||||
|
StepVerifier.create(result)
|
||||||
|
.expectErrorSatisfies(throwable -> {
|
||||||
|
assertThat(throwable).isInstanceOf(UnknownHttpStatusCodeException.class);
|
||||||
|
UnknownHttpStatusCodeException ex = (UnknownHttpStatusCodeException) throwable;
|
||||||
|
assertThat(ex.getMessage()).isEqualTo(("Unknown status code ["+errorStatus+"]"));
|
||||||
|
assertThat(ex.getStatusCode().value()).isEqualTo(errorStatus);
|
||||||
|
assertThat(ex.getStatusText()).isEmpty();
|
||||||
|
assertThat(ex.getHeaders().getContentType()).isEqualTo(MediaType.TEXT_PLAIN);
|
||||||
|
assertThat(ex.getResponseBodyAsString()).isEqualTo(errorMessage);
|
||||||
|
})
|
||||||
|
.verify(Duration.ofSeconds(3));
|
||||||
|
|
||||||
|
expectRequestCount(1);
|
||||||
|
expectRequest(request -> {
|
||||||
|
assertThat(request.getHeader(HttpHeaders.ACCEPT)).isEqualTo("*/*");
|
||||||
|
assertThat(request.getPath()).isEqualTo("/unknownPage");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
@ParameterizedWebClientTest
|
@ParameterizedWebClientTest
|
||||||
void postPojoAsJson(ClientHttpConnector connector) {
|
void postPojoAsJson(ClientHttpConnector connector) {
|
||||||
startServer(connector);
|
startServer(connector);
|
||||||
|
|
Loading…
Reference in New Issue