diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClient.java b/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClient.java index f45841c7f31..1ecc3858af9 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClient.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClient.java @@ -543,12 +543,6 @@ class DefaultWebClient implements WebClient { return this.responseMono.flatMap(response -> handleBodyMono(response, response.bodyToMono(elementTypeRef))); } - private Mono handleBodyMono(ClientResponse response, Mono body) { - body = body.onErrorResume(WebClientUtils.WRAP_EXCEPTION_PREDICATE, exceptionWrappingFunction(response)); - Mono result = statusHandlers(response); - return (result != null ? result.switchIfEmpty(body) : body); - } - @Override public Flux bodyToFlux(Class elementClass) { Assert.notNull(elementClass, "Class must not be null"); @@ -561,45 +555,6 @@ class DefaultWebClient implements WebClient { return this.responseMono.flatMapMany(response -> handleBodyFlux(response, response.bodyToFlux(elementTypeRef))); } - private Publisher handleBodyFlux(ClientResponse response, Flux body) { - body = body.onErrorResume(WebClientUtils.WRAP_EXCEPTION_PREDICATE, exceptionWrappingFunction(response)); - Mono result = statusHandlers(response); - return (result != null ? result.flux().switchIfEmpty(body) : body); - } - - @Nullable - private Mono statusHandlers(ClientResponse response) { - int statusCode = response.rawStatusCode(); - for (StatusHandler handler : this.statusHandlers) { - if (handler.test(statusCode)) { - Mono exMono; - try { - exMono = handler.apply(response); - exMono = exMono.flatMap(ex -> releaseIfNotConsumed(response, ex)); - exMono = exMono.onErrorResume(ex -> releaseIfNotConsumed(response, ex)); - } - catch (Throwable ex2) { - exMono = releaseIfNotConsumed(response, ex2); - } - Mono result = exMono.flatMap(Mono::error); - HttpRequest request = this.requestSupplier.get(); - return insertCheckpoint(result, statusCode, request); - } - } - return null; - } - - private Mono insertCheckpoint(Mono result, int statusCode, HttpRequest request) { - String httpMethod = request.getMethodValue(); - URI uri = request.getURI(); - String description = statusCode + " from " + httpMethod + " " + uri + " [DefaultWebClient]"; - return result.checkpoint(description); - } - - private Function> exceptionWrappingFunction(ClientResponse response) { - return t -> response.createException().flatMap(ex -> Mono.error(ex.initCause(t))); - } - @Override public Mono> toEntity(Class bodyClass) { return this.responseMono.flatMap(response -> @@ -652,6 +607,51 @@ class DefaultWebClient implements WebClient { ); } + private Mono handleBodyMono(ClientResponse response, Mono body) { + body = body.onErrorResume(WebClientUtils.WRAP_EXCEPTION_PREDICATE, exceptionWrappingFunction(response)); + Mono result = applyStatusHandlers(response); + return (result != null ? result.switchIfEmpty(body) : body); + } + + private Publisher handleBodyFlux(ClientResponse response, Flux body) { + body = body.onErrorResume(WebClientUtils.WRAP_EXCEPTION_PREDICATE, exceptionWrappingFunction(response)); + Mono result = applyStatusHandlers(response); + return (result != null ? result.flux().switchIfEmpty(body) : body); + } + + private Function> exceptionWrappingFunction(ClientResponse response) { + return t -> response.createException().flatMap(ex -> Mono.error(ex.initCause(t))); + } + + @Nullable + private Mono applyStatusHandlers(ClientResponse response) { + int statusCode = response.rawStatusCode(); + for (StatusHandler handler : this.statusHandlers) { + if (handler.test(statusCode)) { + Mono exMono; + try { + exMono = handler.apply(response); + exMono = exMono.flatMap(ex -> releaseIfNotConsumed(response, ex)); + exMono = exMono.onErrorResume(ex -> releaseIfNotConsumed(response, ex)); + } + catch (Throwable ex2) { + exMono = releaseIfNotConsumed(response, ex2); + } + Mono result = exMono.flatMap(Mono::error); + HttpRequest request = this.requestSupplier.get(); + return insertCheckpoint(result, statusCode, request); + } + } + return null; + } + + private Mono insertCheckpoint(Mono result, int statusCode, HttpRequest request) { + String httpMethod = request.getMethodValue(); + URI uri = request.getURI(); + String description = statusCode + " from " + httpMethod + " " + uri + " [DefaultWebClient]"; + return result.checkpoint(description); + } + private static class StatusHandler {