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"));
+    }
 }

Reply via email to