Skip to content

Commit d54a694

Browse files
duesenklipperrstoyanchev
authored andcommitted
Add handler for unknown status codes
See gh-31202
1 parent 9c5dcad commit d54a694

File tree

3 files changed

+48
-3
lines changed

3 files changed

+48
-3
lines changed

spring-web/src/main/java/org/springframework/http/HttpStatusCode.java

+8
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,14 @@ default boolean isSameCodeAs(HttpStatusCode other) {
8888
return value() == other.value();
8989
}
9090

91+
/**
92+
* Checks whether this status code is a well-known HTTP status code or not
93+
* @return {@code true} if the status code corresponds to a standard HTTP status code, {@code false} otherwise
94+
*/
95+
default boolean isWellKnown() {
96+
return HttpStatus.resolve(this.value()) != null;
97+
}
98+
9199
/**
92100
* Return an {@code HttpStatusCode} object for the given integer value.
93101
* @param code the status code as integer

spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClient.java

+6-3
Original file line numberDiff line numberDiff line change
@@ -516,9 +516,11 @@ private void initCookies(MultiValueMap<String, String> out) {
516516
private static class DefaultResponseSpec implements ResponseSpec {
517517

518518
private static final Predicate<HttpStatusCode> STATUS_CODE_ERROR = HttpStatusCode::isError;
519-
520-
private static final StatusHandler DEFAULT_STATUS_HANDLER =
519+
private static final Predicate<HttpStatusCode> STATUS_CODE_UNKNOWN = status -> !status.isWellKnown();
520+
private static final StatusHandler DEFAULT_ERROR_STATUS_HANDLER =
521521
new StatusHandler(STATUS_CODE_ERROR, ClientResponse::createException);
522+
private static final StatusHandler DEFAULT_UNKNOWN_STATUS_HANDLER =
523+
new StatusHandler(STATUS_CODE_UNKNOWN, ClientResponse::createException);
522524

523525
private final HttpMethod httpMethod;
524526

@@ -537,7 +539,8 @@ private static class DefaultResponseSpec implements ResponseSpec {
537539
this.uri = uri;
538540
this.responseMono = responseMono;
539541
this.statusHandlers.addAll(defaultStatusHandlers);
540-
this.statusHandlers.add(DEFAULT_STATUS_HANDLER);
542+
this.statusHandlers.add(DEFAULT_ERROR_STATUS_HANDLER);
543+
this.statusHandlers.add(DEFAULT_UNKNOWN_STATUS_HANDLER);
541544
this.defaultStatusHandlerCount = this.statusHandlers.size();
542545
}
543546

spring-webflux/src/test/java/org/springframework/web/reactive/function/client/WebClientIntegrationTests.java

+34
Original file line numberDiff line numberDiff line change
@@ -672,6 +672,40 @@ void retrieve555UnknownStatus(ClientHttpConnector connector) {
672672
});
673673
}
674674

675+
@ParameterizedWebClientTest
676+
void retrieve929CustomUnknownStatus(ClientHttpConnector connector) {
677+
startServer(connector);
678+
679+
int errorStatus = 929;
680+
assertThat(HttpStatus.resolve(errorStatus)).isNull();
681+
String errorMessage = "Something went wrong";
682+
prepareResponse(response -> response.setResponseCode(errorStatus)
683+
.setHeader("Content-Type", "text/plain").setBody(errorMessage));
684+
685+
Mono<String> result = this.webClient.get()
686+
.uri("/unknownPage")
687+
.retrieve()
688+
.bodyToMono(String.class);
689+
690+
StepVerifier.create(result)
691+
.expectErrorSatisfies(throwable -> {
692+
assertThat(throwable).isInstanceOf(UnknownHttpStatusCodeException.class);
693+
UnknownHttpStatusCodeException ex = (UnknownHttpStatusCodeException) throwable;
694+
assertThat(ex.getMessage()).isEqualTo(("Unknown status code ["+errorStatus+"]"));
695+
assertThat(ex.getStatusCode().value()).isEqualTo(errorStatus);
696+
assertThat(ex.getStatusText()).isEmpty();
697+
assertThat(ex.getHeaders().getContentType()).isEqualTo(MediaType.TEXT_PLAIN);
698+
assertThat(ex.getResponseBodyAsString()).isEqualTo(errorMessage);
699+
})
700+
.verify(Duration.ofSeconds(3));
701+
702+
expectRequestCount(1);
703+
expectRequest(request -> {
704+
assertThat(request.getHeader(HttpHeaders.ACCEPT)).isEqualTo("*/*");
705+
assertThat(request.getPath()).isEqualTo("/unknownPage");
706+
});
707+
}
708+
675709
@ParameterizedWebClientTest
676710
void postPojoAsJson(ClientHttpConnector connector) {
677711
startServer(connector);

0 commit comments

Comments
 (0)