Merge branch '3.1.x'
This commit is contained in:
1
pom.xml
1
pom.xml
@@ -57,6 +57,7 @@
|
||||
<spring-cloud-circuitbreaker.version>3.0.1-SNAPSHOT</spring-cloud-circuitbreaker.version>
|
||||
<spring-cloud-commons.version>4.0.1-SNAPSHOT</spring-cloud-commons.version>
|
||||
<testcontainers.version>1.17.3</testcontainers.version>
|
||||
<kotlin-maven-plugin.version>1.6.21</kotlin-maven-plugin.version>
|
||||
</properties>
|
||||
|
||||
<dependencyManagement>
|
||||
|
||||
@@ -95,6 +95,7 @@
|
||||
<plugin>
|
||||
<groupId>org.jetbrains.kotlin</groupId>
|
||||
<artifactId>kotlin-maven-plugin</artifactId>
|
||||
<version>${kotlin-maven-plugin.version}</version>
|
||||
<configuration>
|
||||
<args>
|
||||
<arg>-Xjsr305=strict</arg>
|
||||
|
||||
@@ -230,6 +230,7 @@
|
||||
<!-- Based on instructions here - https://kotlinlang.org/docs/reference/using-maven.html -->
|
||||
<artifactId>kotlin-maven-plugin</artifactId>
|
||||
<groupId>org.jetbrains.kotlin</groupId>
|
||||
<version>${kotlin-maven-plugin.version}</version>
|
||||
<configuration>
|
||||
<jvmTarget>17</jvmTarget>
|
||||
</configuration>
|
||||
|
||||
@@ -369,14 +369,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<DataBuffer> 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;
|
||||
}
|
||||
|
||||
@@ -16,14 +16,17 @@
|
||||
|
||||
package org.springframework.cloud.gateway.support;
|
||||
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.junit.jupiter.api.Assertions;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.assertj.core.api.Assertions;
|
||||
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.assertThat(dataBufferBeforeCaching).isEqualTo(dataBufferAfterCached);
|
||||
}
|
||||
|
||||
private MockServerWebExchange mockExchange(Map<String, String> vars) {
|
||||
MockServerHttpRequest request = MockServerHttpRequest.get("/get").build();
|
||||
return mockExchange(HttpMethod.GET, vars);
|
||||
}
|
||||
|
||||
private MockServerWebExchange mockExchange(HttpMethod method, Map<String, String> 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.assertThat(request).as("Method was not one of GET or POST").isNotNull();
|
||||
|
||||
MockServerWebExchange exchange = MockServerWebExchange.from(request);
|
||||
ServerWebExchangeUtils.putUriTemplateVariables(exchange, vars);
|
||||
return exchange;
|
||||
|
||||
Reference in New Issue
Block a user