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 8ab2b8cd..a2792394 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 @@ -361,6 +361,14 @@ public final class ServerWebExchangeUtils { */ private static Mono cacheRequestBody(ServerWebExchange exchange, boolean cacheDecoratedRequest, Function> function) { + // don't cache if body is already cached + Object cachedDataBuffer = exchange.getAttribute(CACHED_REQUEST_BODY_ATTR); + if (cachedDataBuffer instanceof DataBuffer) { + if (log.isTraceEnabled()) { + log.trace("body already in exchange attribute, short circuiting"); + } + return Mono.just(exchange.getRequest()).flatMap(function); + } ServerHttpResponse response = exchange.getResponse(); DataBufferFactory factory = response.bufferFactory(); // Join all the DataBuffers so we have a single DataBuffer for the body