From cc626269976c6beef8e7d2dc75d79f402df193b1 Mon Sep 17 00:00:00 2001 From: sgibb Date: Wed, 20 Mar 2024 23:00:27 -0400 Subject: [PATCH] Short circuit caching request body if already done. Fixes gh-2969 --- .../cloud/gateway/support/ServerWebExchangeUtils.java | 8 ++++++++ 1 file changed, 8 insertions(+) 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