diff --git a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/support/ServerWebExchangeUtils.java b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/support/ServerWebExchangeUtils.java index a2e31d14..2b6c85a9 100644 --- a/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/support/ServerWebExchangeUtils.java +++ b/spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/support/ServerWebExchangeUtils.java @@ -166,6 +166,8 @@ public final class ServerWebExchangeUtils { */ public static final String GATEWAY_LOADBALANCER_RESPONSE_ATTR = qualify("gatewayLoadBalancerResponse"); + private static final byte[] EMPTY_BYTES = {}; + private ServerWebExchangeUtils() { throw new AssertionError("Must not instantiate utility class."); } @@ -346,7 +348,7 @@ public final class ServerWebExchangeUtils { ServerHttpResponse response = exchange.getResponse(); DataBufferFactory factory = response.bufferFactory(); // Join all the DataBuffers so we have a single DataBuffer for the body - return DataBufferUtils.join(exchange.getRequest().getBody()).defaultIfEmpty(factory.wrap(new byte[] {})) + return DataBufferUtils.join(exchange.getRequest().getBody()).defaultIfEmpty(factory.wrap(EMPTY_BYTES)) .map(dataBuffer -> decorate(exchange, dataBuffer, cacheDecoratedRequest)) .switchIfEmpty(Mono.just(exchange.getRequest())).flatMap(function); } @@ -363,12 +365,11 @@ public final class ServerWebExchangeUtils { ServerHttpRequest decorator = new ServerHttpRequestDecorator(exchange.getRequest()) { @Override public Flux getBody() { - return Mono.fromSupplier(() -> { + return Mono.fromSupplier(() -> { if (exchange.getAttributeOrDefault(CACHED_REQUEST_BODY_ATTR, null) == null) { // probably == downstream closed or no body return null; } - // TODO: deal with Netty if (dataBuffer instanceof NettyDataBuffer) { NettyDataBuffer pdb = (NettyDataBuffer) dataBuffer; return pdb.factory().wrap(pdb.getNativeBuffer().retainedSlice()); diff --git a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/support/ServerWebExchangeUtilsTests.java b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/support/ServerWebExchangeUtilsTests.java index 0db028dd..ed8bfcdd 100644 --- a/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/support/ServerWebExchangeUtilsTests.java +++ b/spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/support/ServerWebExchangeUtilsTests.java @@ -61,10 +61,13 @@ public class ServerWebExchangeUtilsTests { MockServerWebExchange exchange = mockExchange(Collections.emptyMap()); exchange.getAttributes().put(CACHED_REQUEST_BODY_ATTR, "foo"); - ServerWebExchangeUtils.cacheRequestBodyAndRequest(exchange, - (serverHttpRequest) -> ServerRequest - .create(exchange.mutate().request(serverHttpRequest).build(), HandlerStrategies.withDefaults().messageReaders()) - .bodyToMono(DefaultDataBuffer.class)).block(); + ServerWebExchangeUtils + .cacheRequestBodyAndRequest(exchange, + (serverHttpRequest) -> ServerRequest + .create(exchange.mutate().request(serverHttpRequest).build(), + HandlerStrategies.withDefaults().messageReaders()) + .bodyToMono(DefaultDataBuffer.class)) + .block(); } private MockServerWebExchange mockExchange(Map vars) {