From fa01e9c566b4f212ce995ad3a67cc69830c83604 Mon Sep 17 00:00:00 2001 From: rstoyanchev Date: Fri, 29 Nov 2024 10:30:29 +0000 Subject: [PATCH] Use response decorator to check if error handled Closes gh-33980 --- .../client/DefaultResponseErrorHandler.java | 41 ++++++++++++++++--- .../web/client/ResponseErrorHandler.java | 1 - 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/web/client/DefaultResponseErrorHandler.java b/spring-web/src/main/java/org/springframework/web/client/DefaultResponseErrorHandler.java index e08ae70360d..1388224300b 100644 --- a/spring-web/src/main/java/org/springframework/web/client/DefaultResponseErrorHandler.java +++ b/spring-web/src/main/java/org/springframework/web/client/DefaultResponseErrorHandler.java @@ -136,18 +136,29 @@ public class DefaultResponseErrorHandler implements ResponseErrorHandler { */ @Override public void handleError(URI url, HttpMethod method, ClientHttpResponse response) throws IOException { - handleError(response); + + // For backwards compatibility try handle(response) first + HandleErrorResponseDecorator decorator = new HandleErrorResponseDecorator(response); + handleError(decorator); + if (decorator.isHandled()) { + return; + } + handleError(response, response.getStatusCode(), url, method); } - /** - * {@inheritDoc} - *

As of 6.2.1 this method is a no-op unless overridden. - */ @SuppressWarnings("removal") @Override public void handleError(ClientHttpResponse response) throws IOException { - // no-op, but here for backwards compatibility + + // Called via handleError(url, method, response) + if (response instanceof HandleErrorResponseDecorator decorator) { + decorator.setNotHandled(); + return; + } + + // Called directly, so do handle + handleError(response, response.getStatusCode(), null, null); } /** @@ -277,4 +288,22 @@ public class DefaultResponseErrorHandler implements ResponseErrorHandler { }; } + + private static class HandleErrorResponseDecorator extends ClientHttpResponseDecorator { + + private boolean handled = true; + + public HandleErrorResponseDecorator(ClientHttpResponse delegate) { + super(delegate); + } + + public void setNotHandled() { + this.handled = false; + } + + public boolean isHandled() { + return this.handled; + } + } + } diff --git a/spring-web/src/main/java/org/springframework/web/client/ResponseErrorHandler.java b/spring-web/src/main/java/org/springframework/web/client/ResponseErrorHandler.java index 4ca64425f80..be96fb29a11 100644 --- a/spring-web/src/main/java/org/springframework/web/client/ResponseErrorHandler.java +++ b/spring-web/src/main/java/org/springframework/web/client/ResponseErrorHandler.java @@ -65,7 +65,6 @@ public interface ResponseErrorHandler { */ @Deprecated(since = "6.2.1", forRemoval = true) default void handleError(ClientHttpResponse response) throws IOException { - // no-op unless overridden } }