Browse Source

Merge branch '3.1.x'

pull/2842/head
spencergibb 2 years ago
parent
commit
cb235831d6
No known key found for this signature in database
GPG Key ID: 7788A47380690861
  1. 1
      pom.xml
  2. 1
      spring-cloud-gateway-sample/pom.xml
  3. 1
      spring-cloud-gateway-server/pom.xml
  4. 9
      spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/support/ServerWebExchangeUtils.java
  5. 43
      spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/support/ServerWebExchangeUtilsTests.java

1
pom.xml

@ -57,6 +57,7 @@ @@ -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>

1
spring-cloud-gateway-sample/pom.xml

@ -95,6 +95,7 @@ @@ -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>

1
spring-cloud-gateway-server/pom.xml

@ -230,6 +230,7 @@ @@ -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>

9
spring-cloud-gateway-server/src/main/java/org/springframework/cloud/gateway/support/ServerWebExchangeUtils.java

@ -369,14 +369,19 @@ public final class ServerWebExchangeUtils { @@ -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;
}

43
spring-cloud-gateway-server/src/test/java/org/springframework/cloud/gateway/support/ServerWebExchangeUtilsTests.java

@ -16,14 +16,17 @@ @@ -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 { @@ -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;

Loading…
Cancel
Save