diff --git a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/factory/rewrite/ModifyRequestBodyGatewayFilterFactory.java b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/factory/rewrite/ModifyRequestBodyGatewayFilterFactory.java index 2ee1f74a..5dbb9013 100644 --- a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/factory/rewrite/ModifyRequestBodyGatewayFilterFactory.java +++ b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/filter/factory/rewrite/ModifyRequestBodyGatewayFilterFactory.java @@ -63,7 +63,9 @@ public class ModifyRequestBodyGatewayFilterFactory .flatMap(o -> config.rewriteFunction.apply(exchange, o)); BodyInserter bodyInserter = BodyInserters.fromPublisher(modifiedBody, config.getOutClass()); - CachedBodyOutputMessage outputMessage = new CachedBodyOutputMessage(exchange, exchange.getRequest().getHeaders()); + HttpHeaders headers = new HttpHeaders(); + headers.putAll(exchange.getRequest().getHeaders()); + CachedBodyOutputMessage outputMessage = new CachedBodyOutputMessage(exchange, headers); return bodyInserter.insert(outputMessage, new BodyInserterContext()) // .log("modify_request", Level.INFO) .then(Mono.defer(() -> { @@ -71,10 +73,15 @@ public class ModifyRequestBodyGatewayFilterFactory exchange.getRequest()) { @Override public HttpHeaders getHeaders() { + long contentLength = headers.getContentLength(); HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.putAll(super.getHeaders()); - // TODO: this causes a 'HTTP/1.1 411 Length Required' on httpbin.org - httpHeaders.set(HttpHeaders.TRANSFER_ENCODING, "chunked"); + if (contentLength >= 0) { + httpHeaders.setContentLength(contentLength); + } else { + // TODO: this causes a 'HTTP/1.1 411 Length Required' on httpbin.org + httpHeaders.set(HttpHeaders.TRANSFER_ENCODING, "chunked"); + } return httpHeaders; } diff --git a/spring-cloud-gateway-sample/src/main/java/org/springframework/cloud/gateway/sample/GatewaySampleApplication.java b/spring-cloud-gateway-sample/src/main/java/org/springframework/cloud/gateway/sample/GatewaySampleApplication.java index 7af93e97..7901b668 100644 --- a/spring-cloud-gateway-sample/src/main/java/org/springframework/cloud/gateway/sample/GatewaySampleApplication.java +++ b/spring-cloud-gateway-sample/src/main/java/org/springframework/cloud/gateway/sample/GatewaySampleApplication.java @@ -72,6 +72,7 @@ public class GatewaySampleApplication { .filters(f -> f.prefixPath("/httpbin") //TODO: add as configuration to modifyRequestBody .setRequestHeader("Content-Type", MediaType.APPLICATION_JSON_VALUE) + .removeRequestHeader("Content-Length") .addResponseHeader("X-TestHeader", "rewrite_request") .modifyRequestBody(String.class, Hello.class, (exchange, s) -> { @@ -82,9 +83,10 @@ public class GatewaySampleApplication { .route("rewrite_request_upper", r -> r.host("*.rewriterequestupper.org") .filters(f -> f.prefixPath("/httpbin") .addResponseHeader("X-TestHeader", "rewrite_request_upper") + .removeRequestHeader("Content-Length") .modifyRequestBody(String.class, String.class, (exchange, s) -> { - return Mono.just(s.toUpperCase()); + return Mono.just(s.toUpperCase()+s.toUpperCase()); }) ).uri(uri) ) diff --git a/spring-cloud-gateway-sample/src/test/java/org/springframework/cloud/gateway/sample/GatewaySampleApplicationTests.java b/spring-cloud-gateway-sample/src/test/java/org/springframework/cloud/gateway/sample/GatewaySampleApplicationTests.java index 103fd2ec..fa976515 100644 --- a/spring-cloud-gateway-sample/src/test/java/org/springframework/cloud/gateway/sample/GatewaySampleApplicationTests.java +++ b/spring-cloud-gateway-sample/src/test/java/org/springframework/cloud/gateway/sample/GatewaySampleApplicationTests.java @@ -28,7 +28,6 @@ import com.netflix.loadbalancer.ServerList; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; @@ -119,12 +118,11 @@ public class GatewaySampleApplicationTests { .expectHeader().valueEquals("X-TestHeader", "rewrite_request_upper") .expectBody(Map.class) .consumeWith(result -> - assertThat(result.getResponseBody()).containsEntry("data", "HELLO")); + assertThat(result.getResponseBody()).containsEntry("data", "HELLOHELLO")); } @Test @SuppressWarnings("unchecked") - @Ignore //FIXME 2.1.0 public void rewriteRequestBodyObjectWorks() { webClient.post() .uri("/post")