diff --git a/spring-cloud-gateway-webflux/src/main/java/org/springframework/cloud/gateway/webflux/ProxyExchange.java b/spring-cloud-gateway-webflux/src/main/java/org/springframework/cloud/gateway/webflux/ProxyExchange.java index 22ea0eb6..2264a30a 100644 --- a/spring-cloud-gateway-webflux/src/main/java/org/springframework/cloud/gateway/webflux/ProxyExchange.java +++ b/spring-cloud-gateway-webflux/src/main/java/org/springframework/cloud/gateway/webflux/ProxyExchange.java @@ -287,8 +287,8 @@ public class ProxyExchange { } public Mono> delete() { - RequestEntity requestEntity = headers( - (BodyBuilder) RequestEntity.delete(uri)).build(); + RequestEntity requestEntity = headers( + (BodyBuilder) RequestEntity.delete(uri)).body(body()); return exchange(requestEntity); } diff --git a/spring-cloud-gateway-webflux/src/test/java/org/springframework/cloud/gateway/webflux/ProductionConfigurationTests.java b/spring-cloud-gateway-webflux/src/test/java/org/springframework/cloud/gateway/webflux/ProductionConfigurationTests.java index 78bedee6..525e4679 100644 --- a/spring-cloud-gateway-webflux/src/test/java/org/springframework/cloud/gateway/webflux/ProductionConfigurationTests.java +++ b/spring-cloud-gateway-webflux/src/test/java/org/springframework/cloud/gateway/webflux/ProductionConfigurationTests.java @@ -39,7 +39,9 @@ import org.springframework.cloud.gateway.webflux.ProductionConfigurationTests.Te import org.springframework.cloud.gateway.webflux.ProductionConfigurationTests.TestApplication.Bar; import org.springframework.cloud.gateway.webflux.ProductionConfigurationTests.TestApplication.Foo; import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.RequestEntity; @@ -47,6 +49,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; @@ -225,6 +228,24 @@ public class ProductionConfigurationTests { assertThat(headers.get("forwarded").get(0)).isEqualTo("host=localhost:" + port); } + @Test + public void deleteWithoutBody() throws Exception { + ResponseEntity deleteResponse = rest.exchange("/proxy/{id}/no-body", HttpMethod.DELETE, null, Void.TYPE, + Collections.singletonMap("id", "123")); + assertThat(deleteResponse.getStatusCode()).isEqualTo(HttpStatus.OK); + } + + @Test + public void deleteWithBody() throws Exception { + Foo foo = new Foo("to-be-deleted"); + ParameterizedTypeReference> returnType = new ParameterizedTypeReference>() { + }; + ResponseEntity> deleteResponse = rest.exchange("/proxy/{id}", HttpMethod.DELETE, + new HttpEntity(foo), returnType, Collections.singletonMap("id", "123")); + assertThat(deleteResponse.getStatusCode()).isEqualTo(HttpStatus.OK); + assertThat(deleteResponse.getBody().get("deleted")).isEqualToComparingFieldByField(foo); + } + @SpringBootApplication static class TestApplication { @@ -360,6 +381,19 @@ public class ProductionConfigurationTests { .forward(this::first); } + @DeleteMapping("/proxy/{id}/no-body") + public Mono> deleteWithoutBody(@PathVariable Integer id, ProxyExchange proxy) + throws Exception { + return proxy.uri(home.toString() + "/foos/" + id + "/no-body").delete(); + } + + @DeleteMapping("/proxy/{id}") + public Mono> deleteWithBody(@PathVariable Integer id, @RequestBody Foo foo, + ProxyExchange proxy) throws Exception { + return proxy.uri(home.toString() + "/foos/" + id).body(foo).delete(response -> ResponseEntity + .status(response.getStatusCode()).headers(response.getHeaders()).body(response.getBody())); + } + } @RestController @@ -391,6 +425,16 @@ public class ProductionConfigurationTests { return headers; } + @DeleteMapping("/foos/{id}/no-body") + public ResponseEntity deleteFoo(@PathVariable Integer id) { + return ResponseEntity.ok().build(); + } + + @DeleteMapping("/foos/{id}") + public ResponseEntity deleteFoo(@PathVariable Integer id, @RequestBody Foo foo) { + return ResponseEntity.ok().body(Collections.singletonMap("deleted", foo)); + } + } @JsonIgnoreProperties(ignoreUnknown = true)