diff --git a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/handler/RestClientProxyExchange.java b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/handler/RestClientProxyExchange.java index 37493b6b..006905b9 100644 --- a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/handler/RestClientProxyExchange.java +++ b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/handler/RestClientProxyExchange.java @@ -19,6 +19,7 @@ package org.springframework.cloud.gateway.server.mvc.handler; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.io.UncheckedIOException; import org.springframework.cloud.gateway.server.mvc.common.MvcUtils; import org.springframework.http.client.ClientHttpResponse; @@ -36,11 +37,22 @@ public class RestClientProxyExchange implements ProxyExchange { @Override public ServerResponse exchange(Request request) { - return restClient.method(request.getMethod()) - .uri(request.getUri()) - .headers(httpHeaders -> httpHeaders.putAll(request.getHeaders())) - .body(outputStream -> copyBody(request, outputStream)) - .exchange((clientRequest, clientResponse) -> doExchange(request, clientResponse), false); + var requestSpec = restClient.method(request.getMethod()) + .uri(request.getUri()) + .headers(httpHeaders -> httpHeaders.putAll(request.getHeaders())); + if (isBodyPresent(request)) { + requestSpec.body(outputStream -> copyBody(request, outputStream)); + } + return requestSpec.exchange((clientRequest, clientResponse) -> doExchange(request, clientResponse), false); + } + + private static boolean isBodyPresent(Request request) { + try { + return !request.getServerRequest().servletRequest().getInputStream().isFinished(); + } + catch (IOException e) { + throw new UncheckedIOException(e); + } } private static int copyBody(Request request, OutputStream outputStream) throws IOException {