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)}.
*/