This is an automated email from the ASF dual-hosted git repository.
dengliming pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shenyu.git
The following commit(s) were added to refs/heads/master by this push:
new 4bb6d3bc39 fix: handle non-standard status codes in GlobalErrorHandler
(#6933)
4bb6d3bc39 is described below
commit 4bb6d3bc39510bf09b5fd217754a74b7aff33ba1
Author: Limbo <[email protected]>
AuthorDate: Wed Sep 16 11:15:36 2026 +0800
fix: handle non-standard status codes in GlobalErrorHandler (#6933)
Co-authored-by: Liming Deng <[email protected]>
---
.../shenyu/web/handler/GlobalErrorHandler.java | 13 ++++----
.../shenyu/web/handler/GlobalErrorHandlerTest.java | 35 ++++++++++++++++++++--
2 files changed, 41 insertions(+), 7 deletions(-)
diff --git
a/shenyu-web/src/main/java/org/apache/shenyu/web/handler/GlobalErrorHandler.java
b/shenyu-web/src/main/java/org/apache/shenyu/web/handler/GlobalErrorHandler.java
index 8885fc8ae3..f97aa5fc68 100644
---
a/shenyu-web/src/main/java/org/apache/shenyu/web/handler/GlobalErrorHandler.java
+++
b/shenyu-web/src/main/java/org/apache/shenyu/web/handler/GlobalErrorHandler.java
@@ -34,6 +34,7 @@ import reactor.core.publisher.Mono;
import java.util.HashMap;
import java.util.Map;
+import java.util.Objects;
/**
* GlobalErrorHandler.
@@ -61,9 +62,13 @@ public class GlobalErrorHandler implements
ErrorWebExceptionHandler {
errorResult = ShenyuResultWrap.error(exchange,
httpStatusCode.value(), throwable.getMessage(), null);
errorMsg = throwable.getMessage();
} else if (throwable instanceof ResponseStatusException) {
- httpStatusCode = ((ResponseStatusException)
throwable).getStatusCode();
- HttpStatus httpStatus = (HttpStatus) httpStatusCode;
- String errMsg = StringUtils.hasLength(((ResponseStatusException)
throwable).getReason()) ? ((ResponseStatusException) throwable).getReason() :
httpStatus.getReasonPhrase();
+ ResponseStatusException responseStatusException =
(ResponseStatusException) throwable;
+ httpStatusCode = responseStatusException.getStatusCode();
+ String errMsg = responseStatusException.getReason();
+ if (!StringUtils.hasLength(errMsg)) {
+ HttpStatus httpStatus =
HttpStatus.resolve(httpStatusCode.value());
+ errMsg = Objects.isNull(httpStatus) ?
httpStatusCode.toString() : httpStatus.getReasonPhrase();
+ }
errorResult = ShenyuResultWrap.error(exchange,
httpStatusCode.value(), errMsg, null);
errorMsg = errMsg;
} else {
@@ -91,5 +96,3 @@ public class GlobalErrorHandler implements
ErrorWebExceptionHandler {
return "Resolved [" + reason + "] for HTTP " + request.getMethod() + "
" + request.getURI().getRawPath();
}
}
-
-
diff --git
a/shenyu-web/src/test/java/org/apache/shenyu/web/handler/GlobalErrorHandlerTest.java
b/shenyu-web/src/test/java/org/apache/shenyu/web/handler/GlobalErrorHandlerTest.java
index ad62f4fcad..cde8c43f18 100644
---
a/shenyu-web/src/test/java/org/apache/shenyu/web/handler/GlobalErrorHandlerTest.java
+++
b/shenyu-web/src/test/java/org/apache/shenyu/web/handler/GlobalErrorHandlerTest.java
@@ -33,15 +33,20 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.http.HttpStatus;
+import org.springframework.http.HttpStatusCode;
import org.springframework.mock.http.server.reactive.MockServerHttpRequest;
import org.springframework.mock.web.server.MockServerWebExchange;
import org.springframework.web.server.ResponseStatusException;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
+import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.lenient;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.mockStatic;
import static org.mockito.Mockito.spy;
@@ -78,9 +83,9 @@ public final class GlobalErrorHandlerTest {
SpringBeanUtils.getInstance().setApplicationContext(context);
when(context.getBean(ShenyuResult.class)).thenReturn(new
DefaultShenyuResult() {
});
- when(context.getBean(AlarmService.class)).thenReturn(content -> {
+ lenient().when(context.getBean(AlarmService.class)).thenReturn(content
-> {
});
- when(context.getBean(ShenyuConfig.class)).thenReturn(new
ShenyuConfig() {
+ lenient().when(context.getBean(ShenyuConfig.class)).thenReturn(new
ShenyuConfig() {
});
globalErrorHandler = new GlobalErrorHandler();
@@ -95,4 +100,30 @@ public final class GlobalErrorHandlerTest {
assertNotNull(response);
assertNotNull(globalErrorHandler.handle(webExchange, new
ResponseStatusException(HttpStatus.BAD_REQUEST)));
}
+
+ @Test
+ public void testHandleResponseStatusExceptionWithNonStandardStatusCode() {
+ MockServerWebExchange webExchange =
MockServerWebExchange.from(MockServerHttpRequest.get("http://localhost:8080/test"));
+ ResponseStatusException exception = new
ResponseStatusException(HttpStatusCode.valueOf(460), "Custom status");
+
+ Mono<Void> response = assertDoesNotThrow(() ->
globalErrorHandler.handle(webExchange, exception));
+ response.block();
+
+ assertNotNull(webExchange.getResponse().getStatusCode());
+ assertEquals(460, webExchange.getResponse().getStatusCode().value());
+
assertTrue(webExchange.getResponse().getBodyAsString().block().contains("Custom
status"));
+ }
+
+ @Test
+ public void
testHandleResponseStatusExceptionWithNonStandardStatusCodeWithoutReason() {
+ MockServerWebExchange webExchange =
MockServerWebExchange.from(MockServerHttpRequest.get("http://localhost:8080/test"));
+ ResponseStatusException exception = new
ResponseStatusException(HttpStatusCode.valueOf(460), null);
+
+ Mono<Void> response = assertDoesNotThrow(() ->
globalErrorHandler.handle(webExchange, exception));
+ response.block();
+
+ assertNotNull(webExchange.getResponse().getStatusCode());
+ assertEquals(460, webExchange.getResponse().getStatusCode().value());
+
assertTrue(webExchange.getResponse().getBodyAsString().block().contains("460"));
+ }
}