diff --git a/spring-cloud-gateway-proxyexchange-webflux/src/main/java/org/springframework/cloud/gateway/webflux/ProxyExchange.java b/spring-cloud-gateway-proxyexchange-webflux/src/main/java/org/springframework/cloud/gateway/webflux/ProxyExchange.java index da21176ec..88f3bf5a2 100644 --- a/spring-cloud-gateway-proxyexchange-webflux/src/main/java/org/springframework/cloud/gateway/webflux/ProxyExchange.java +++ b/spring-cloud-gateway-proxyexchange-webflux/src/main/java/org/springframework/cloud/gateway/webflux/ProxyExchange.java @@ -372,7 +372,8 @@ private Mono> exchange(RequestEntity requestEntity) { Objects.requireNonNull(requestEntity.getMethod(), "Method must not be null"); RequestBodySpec builder = rest.method(requestEntity.getMethod()) .uri(requestEntity.getUrl()) - .headers(headers -> addHeaders(headers, requestEntity.getHeaders())); + .headers(headers -> addHeaders(headers, requestEntity.getHeaders())) + .headers(headers -> addHeaders(headers, exchange.getRequest().getHeaders())); WebClient.ResponseSpec result; if (requestEntity.getBody() instanceof Publisher) { @SuppressWarnings("unchecked") @@ -384,12 +385,10 @@ else if (requestEntity.getBody() != null) { } else { if (hasBody) { - result = builder.headers(headers -> addHeaders(headers, exchange.getRequest().getHeaders())) - .body(exchange.getRequest().getBody(), DataBuffer.class) - .retrieve(); + result = builder.body(exchange.getRequest().getBody(), DataBuffer.class).retrieve(); } else { - result = builder.headers(headers -> addHeaders(headers, exchange.getRequest().getHeaders())).retrieve(); + result = builder.retrieve(); } } return result.onStatus(HttpStatusCode::isError, t -> Mono.empty()) diff --git a/spring-cloud-gateway-proxyexchange-webflux/src/test/java/org/springframework/cloud/gateway/webflux/ProductionConfigurationTests.java b/spring-cloud-gateway-proxyexchange-webflux/src/test/java/org/springframework/cloud/gateway/webflux/ProductionConfigurationTests.java index 73eb60cc8..fb6894821 100644 --- a/spring-cloud-gateway-proxyexchange-webflux/src/test/java/org/springframework/cloud/gateway/webflux/ProductionConfigurationTests.java +++ b/spring-cloud-gateway-proxyexchange-webflux/src/test/java/org/springframework/cloud/gateway/webflux/ProductionConfigurationTests.java @@ -123,6 +123,16 @@ public void post() throws Exception { .isEqualTo("host=localhost:" + port + ";foo"); } + @Test + public void postWithBodyForwardsIncomingHeaders() throws Exception { + ResponseEntity response = rest + .exchange(RequestEntity.post(rest.getRestTemplate().getUriTemplateHandler().expand("/proxy/0")) + .header("X-Custom", "incoming-header-value") + .contentType(MediaType.APPLICATION_JSON) + .body(Collections.singletonMap("name", "foo")), Bar.class); + assertThat(response.getBody().getName()).contains("incoming-header-value"); + } + @Test public void postJsonWithWhitespace() { var json = """