This is an automated email from the ASF dual-hosted git repository.

Aias00 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 fe6ab5b22a fix(httpclient): support non-enum status codes on decorated 
responses (#7801) (#7810)
fe6ab5b22a is described below

commit fe6ab5b22abbb90b92b9f26a2734c76d5cec0027
Author: imDwAaY <[email protected]>
AuthorDate: Mon Oct 19 15:20:15 2026 +0800

    fix(httpclient): support non-enum status codes on decorated responses 
(#7801) (#7810)
---
 .../plugin/httpclient/NettyHttpClientPlugin.java   | 13 ++------
 .../httpclient/NettyHttpClientPluginTest.java      | 38 ++++++++++++++++++++++
 2 files changed, 40 insertions(+), 11 deletions(-)

diff --git 
a/shenyu-plugin/shenyu-plugin-httpclient/src/main/java/org/apache/shenyu/plugin/httpclient/NettyHttpClientPlugin.java
 
b/shenyu-plugin/shenyu-plugin-httpclient/src/main/java/org/apache/shenyu/plugin/httpclient/NettyHttpClientPlugin.java
index f35c02a2b3..de1b71710e 100644
--- 
a/shenyu-plugin/shenyu-plugin-httpclient/src/main/java/org/apache/shenyu/plugin/httpclient/NettyHttpClientPlugin.java
+++ 
b/shenyu-plugin/shenyu-plugin-httpclient/src/main/java/org/apache/shenyu/plugin/httpclient/NettyHttpClientPlugin.java
@@ -29,8 +29,7 @@ import org.slf4j.LoggerFactory;
 import org.springframework.core.io.buffer.DataBuffer;
 import org.springframework.core.io.buffer.NettyDataBuffer;
 import org.springframework.http.HttpHeaders;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.server.reactive.AbstractServerHttpResponse;
+import org.springframework.http.HttpStatusCode;
 import org.springframework.http.server.reactive.ServerHttpRequest;
 import org.springframework.http.server.reactive.ServerHttpResponse;
 import org.springframework.web.server.ServerWebExchange;
@@ -40,7 +39,6 @@ import reactor.netty.http.client.HttpClient;
 import reactor.netty.http.client.HttpClientResponse;
 
 import java.net.URI;
-import java.util.Objects;
 
 /**
  * The type Netty http client plugin.
@@ -121,14 +119,7 @@ public class NettyHttpClientPlugin extends 
AbstractHttpClientPlugin<HttpClientRe
                     if (StringUtils.isNotBlank(contentTypeValue)) {
                         
exchange.getAttributes().put(Constants.ORIGINAL_RESPONSE_CONTENT_TYPE_ATTR, 
contentTypeValue);
                     }
-                    HttpStatus status = 
HttpStatus.resolve(res.status().code());
-                    if (Objects.nonNull(status)) {
-                        response.setStatusCode(status);
-                    } else if (response instanceof AbstractServerHttpResponse) 
{
-                        response.setRawStatusCode(res.status().code());
-                    } else {
-                        throw new IllegalStateException("Unable to set status 
code on response: " + res.status().code() + ", " + response.getClass());
-                    }
+                    
response.setStatusCode(HttpStatusCode.valueOf(res.status().code()));
                     try {
                         response.getHeaders().putAll(headers);
                     } catch (UnsupportedOperationException ex) {
diff --git 
a/shenyu-plugin/shenyu-plugin-httpclient/src/test/java/org/apache/shenyu/plugin/httpclient/NettyHttpClientPluginTest.java
 
b/shenyu-plugin/shenyu-plugin-httpclient/src/test/java/org/apache/shenyu/plugin/httpclient/NettyHttpClientPluginTest.java
index 5d54bb633d..94b9773594 100644
--- 
a/shenyu-plugin/shenyu-plugin-httpclient/src/test/java/org/apache/shenyu/plugin/httpclient/NettyHttpClientPluginTest.java
+++ 
b/shenyu-plugin/shenyu-plugin-httpclient/src/test/java/org/apache/shenyu/plugin/httpclient/NettyHttpClientPluginTest.java
@@ -35,9 +35,12 @@ import org.mockito.junit.jupiter.MockitoExtension;
 import org.mockito.junit.jupiter.MockitoSettings;
 import org.mockito.quality.Strictness;
 import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.http.server.reactive.ServerHttpResponse;
+import org.springframework.http.server.reactive.ServerHttpResponseDecorator;
 import org.springframework.mock.http.server.reactive.MockServerHttpRequest;
 import org.springframework.mock.web.server.MockServerWebExchange;
 import org.springframework.web.server.ServerWebExchange;
+import org.springframework.web.server.ServerWebExchangeDecorator;
 import reactor.core.publisher.Mono;
 import reactor.core.publisher.Flux;
 import reactor.netty.DisposableServer;
@@ -112,6 +115,41 @@ public final class NettyHttpClientPluginTest {
         }
     }
 
+    /**
+     * A non-standard upstream status code must be preserved even when the 
response is decorated.
+     *
+     * <p>Regression test for #7801. A {@link ServerHttpResponseDecorator} 
only implements the
+     * {@link ServerHttpResponse} interface and does not extend Spring's
+     * {@code AbstractServerHttpResponse}, so the raw-status fallback in the 
Netty client must not
+     * depend on that concrete type.</p>
+     */
+    @Test
+    public void testNonStandardStatusWithDecoratedResponse() {
+        final DisposableServer server = HttpServer.create()
+                .port(0)
+                .handle((request, response) -> 
response.status(529).sendString(Mono.just("payload")))
+                .bindNow();
+        try {
+            final ServerWebExchange baseExchange = generateServerWebExchange();
+            final ServerHttpResponse decoratedResponse = new 
ServerHttpResponseDecorator(baseExchange.getResponse());
+            final ServerWebExchange decoratedExchange = new 
ServerWebExchangeDecorator(baseExchange) {
+                @Override
+                public ServerHttpResponse getResponse() {
+                    return decoratedResponse;
+                }
+            };
+            final URI uri = URI.create("http://127.0.0.1:"; + server.port() + 
"/test");
+
+            
StepVerifier.create(nettyHttpClientPlugin.doRequest(decoratedExchange, "GET", 
uri, Flux.empty()))
+                    .expectNextCount(1)
+                    .verifyComplete();
+
+            assertEquals(529, 
baseExchange.getResponse().getStatusCode().value());
+        } finally {
+            server.disposeNow();
+        }
+    }
+
     /**
      * test case for NettyHttpClientPlugin {@link 
NettyHttpClientPlugin#skip(ServerWebExchange)}.
      */

Reply via email to