From 548442dc07e66f8d5709ccce524b04dd6e077a15 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Wed, 14 Dec 2022 13:09:57 +0100 Subject: [PATCH 1/3] Fix the Kotlin Maven plugin (#2815) --- pom.xml | 1 + spring-cloud-gateway-sample/pom.xml | 1 + spring-cloud-gateway-server/pom.xml | 1 + 3 files changed, 3 insertions(+) diff --git a/pom.xml b/pom.xml index a8540a6d..f68811bb 100644 --- a/pom.xml +++ b/pom.xml @@ -57,6 +57,7 @@ 2.1.6-SNAPSHOT 3.1.6-SNAPSHOT 1.17.2 + 1.6.21 diff --git a/spring-cloud-gateway-sample/pom.xml b/spring-cloud-gateway-sample/pom.xml index 88a043c4..adb771ec 100644 --- a/spring-cloud-gateway-sample/pom.xml +++ b/spring-cloud-gateway-sample/pom.xml @@ -146,6 +146,7 @@ org.jetbrains.kotlin kotlin-maven-plugin + ${kotlin-maven-plugin.version} -Xjsr305=strict diff --git a/spring-cloud-gateway-server/pom.xml b/spring-cloud-gateway-server/pom.xml index 7d8ed018..7697c0a8 100644 --- a/spring-cloud-gateway-server/pom.xml +++ b/spring-cloud-gateway-server/pom.xml @@ -234,6 +234,7 @@ kotlin-maven-plugin org.jetbrains.kotlin + ${kotlin-maven-plugin.version} 1.8 From 0280f96d1972a61b47e9206c579f14a1b7c455f6 Mon Sep 17 00:00:00 2001 From: wen-ys Date: Tue, 10 Jan 2023 10:00:06 +0900 Subject: [PATCH 2/3] Don't cache body twice. If "ServerWebExchangeUtils.cacheRequestBodyAndRequest" executed twice, first DataBuffer reference is missed without release. Fixes gh-2838 --- .../support/ServerWebExchangeUtils.java | 9 ++++- .../support/ServerWebExchangeUtilsTests.java | 39 ++++++++++++++++++- 2 files changed, 45 insertions(+), 3 deletions(-) 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 2b6c85a9..ef99e59f 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 @@ -359,14 +359,19 @@ public final class ServerWebExchangeUtils { if (log.isTraceEnabled()) { log.trace("retaining body in exchange attribute"); } - exchange.getAttributes().put(CACHED_REQUEST_BODY_ATTR, dataBuffer); + + Object cachedDataBuffer = exchange.getAttribute(CACHED_REQUEST_BODY_ATTR); + // don't cache if body is already cached + if (!(cachedDataBuffer instanceof DataBuffer)) { + exchange.getAttributes().put(CACHED_REQUEST_BODY_ATTR, dataBuffer); + } } ServerHttpRequest decorator = new ServerHttpRequestDecorator(exchange.getRequest()) { @Override public Flux getBody() { return Mono.fromSupplier(() -> { - if (exchange.getAttributeOrDefault(CACHED_REQUEST_BODY_ATTR, null) == null) { + if (exchange.getAttribute(CACHED_REQUEST_BODY_ATTR) == null) { // probably == downstream closed or no body return null; } 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 ed8bfcdd..9d082ef3 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 @@ -16,6 +16,7 @@ package org.springframework.cloud.gateway.support; +import java.nio.charset.StandardCharsets; import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -23,7 +24,9 @@ import java.util.Map; import org.junit.Assert; import org.junit.Test; +import org.springframework.core.io.buffer.DataBuffer; import org.springframework.core.io.buffer.DefaultDataBuffer; +import org.springframework.http.HttpMethod; import org.springframework.mock.http.server.reactive.MockServerHttpRequest; import org.springframework.mock.web.server.MockServerWebExchange; import org.springframework.web.reactive.function.server.HandlerStrategies; @@ -70,8 +73,42 @@ public class ServerWebExchangeUtilsTests { .block(); } + @Test + public void duplicatedCachingDataBufferHandling() { + MockServerWebExchange exchange = mockExchange(HttpMethod.POST, Collections.emptyMap()); + DataBuffer dataBufferBeforeCaching = exchange.getResponse().bufferFactory() + .wrap("Cached buffer".getBytes(StandardCharsets.UTF_8)); + exchange.getAttributes().put(CACHED_REQUEST_BODY_ATTR, dataBufferBeforeCaching); + + ServerWebExchangeUtils + .cacheRequestBodyAndRequest(exchange, + (serverHttpRequest) -> ServerRequest + .create(exchange.mutate().request(serverHttpRequest).build(), + HandlerStrategies.withDefaults().messageReaders()) + .bodyToMono(DefaultDataBuffer.class)) + .block(); + + DataBuffer dataBufferAfterCached = exchange.getAttribute(CACHED_REQUEST_BODY_ATTR); + + Assertions.assertEquals(dataBufferBeforeCaching, dataBufferAfterCached); + } + private MockServerWebExchange mockExchange(Map vars) { - MockServerHttpRequest request = MockServerHttpRequest.get("/get").build(); + return mockExchange(HttpMethod.GET, vars); + } + + private MockServerWebExchange mockExchange(HttpMethod method, Map vars) { + + MockServerHttpRequest request = null; + if (HttpMethod.GET.equals(method)) { + request = MockServerHttpRequest.get("/get").build(); + } + else if (HttpMethod.POST.equals(method)) { + request = MockServerHttpRequest.post("/post").body("post body"); + } + + Assertions.assertNotNull(request, "Method was not one of GET or POST"); + MockServerWebExchange exchange = MockServerWebExchange.from(request); ServerWebExchangeUtils.putUriTemplateVariables(exchange, vars); return exchange; From 0fe10b119b9e42343e90551595473f6882a94f87 Mon Sep 17 00:00:00 2001 From: spencergibb Date: Wed, 11 Jan 2023 16:20:13 -0500 Subject: [PATCH 3/3] Migrates to assertj in test --- .../cloud/gateway/support/ServerWebExchangeUtilsTests.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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 9d082ef3..004b1b01 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 @@ -21,6 +21,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.Map; +import org.assertj.core.api.Assertions; import org.junit.Assert; import org.junit.Test; @@ -90,7 +91,7 @@ public class ServerWebExchangeUtilsTests { DataBuffer dataBufferAfterCached = exchange.getAttribute(CACHED_REQUEST_BODY_ATTR); - Assertions.assertEquals(dataBufferBeforeCaching, dataBufferAfterCached); + Assertions.assertThat(dataBufferBeforeCaching).isEqualTo(dataBufferAfterCached); } private MockServerWebExchange mockExchange(Map vars) { @@ -107,7 +108,7 @@ public class ServerWebExchangeUtilsTests { request = MockServerHttpRequest.post("/post").body("post body"); } - Assertions.assertNotNull(request, "Method was not one of GET or POST"); + Assertions.assertThat(request).as("Method was not one of GET or POST").isNotNull(); MockServerWebExchange exchange = MockServerWebExchange.from(request); ServerWebExchangeUtils.putUriTemplateVariables(exchange, vars);