From d850be383e3fff2d964b9b15fe0f2ea8ae05fa29 Mon Sep 17 00:00:00 2001 From: spring-builds Date: Thu, 7 Nov 2024 18:08:21 +0000 Subject: [PATCH] Bumping versions --- .../mvc/filter/BodyFilterFunctions.java | 30 ++++++++---- .../mvc/filter/BodyFilterFunctionsTests.java | 46 ++++++++++--------- 2 files changed, 46 insertions(+), 30 deletions(-) diff --git a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/BodyFilterFunctions.java b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/BodyFilterFunctions.java index 1aff5f61..6c50f63d 100644 --- a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/BodyFilterFunctions.java +++ b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/BodyFilterFunctions.java @@ -144,32 +144,39 @@ public abstract class BodyFilterFunctions { }).orElse(request); } - @SuppressWarnings({"unchecked", "rawtypes"}) - public static BiFunction modifyResponseBody(Class inClass, Class outClass, - String newContentType, RewriteResponseFunction rewriteFunction) { + @SuppressWarnings({ "unchecked", "rawtypes" }) + public static BiFunction modifyResponseBody(Class inClass, + Class outClass, String newContentType, RewriteResponseFunction rewriteFunction) { return (request, response) -> { Object o = request.attributes().get(MvcUtils.CLIENT_RESPONSE_INPUT_STREAM_ATTR); if (o instanceof InputStream inputStream) { try { List> converters = request.messageConverters(); - Optional> inConverter = converters.stream().filter(c -> c.canRead(inClass, response.headers().getContentType())).findFirst(); + Optional> inConverter = converters.stream() + .filter(c -> c.canRead(inClass, response.headers().getContentType())) + .findFirst(); if (inConverter.isEmpty()) { - //TODO: throw exception? + // TODO: throw exception? return response; } HttpMessageConverter inputConverter = inConverter.get(); - T input = (T) inputConverter.read((Class)inClass, new SimpleInputMessage(inputStream, response.headers())); + T input = (T) inputConverter.read((Class) inClass, + new SimpleInputMessage(inputStream, response.headers())); R output = rewriteFunction.apply(request, response, input); - Optional> outConverter = converters.stream().filter(c -> c.canWrite(outClass, null)).findFirst(); + Optional> outConverter = converters.stream() + .filter(c -> c.canWrite(outClass, null)) + .findFirst(); if (outConverter.isEmpty()) { - //TODO: throw exception? + // TODO: throw exception? return response; } HttpMessageConverter byteConverter = (HttpMessageConverter) outConverter.get(); ByteArrayHttpOutputMessage outputMessage = new ByteArrayHttpOutputMessage(response.headers()); byteConverter.write(output, null, outputMessage); - request.attributes().put(MvcUtils.CLIENT_RESPONSE_INPUT_STREAM_ATTR, new ByteArrayInputStream(outputMessage.body.toByteArray())); + request.attributes() + .put(MvcUtils.CLIENT_RESPONSE_INPUT_STREAM_ATTR, + new ByteArrayInputStream(outputMessage.body.toByteArray())); if (StringUtils.hasText(newContentType)) { response.headers().setContentType(MediaType.parseMediaType(newContentType)); } @@ -184,7 +191,9 @@ public abstract class BodyFilterFunctions { } private final static class SimpleInputMessage implements HttpInputMessage { + private final InputStream inputStream; + private final HttpHeaders headers; private SimpleInputMessage(InputStream inputStream, HttpHeaders headers) { @@ -201,6 +210,7 @@ public abstract class BodyFilterFunctions { public HttpHeaders getHeaders() { return this.headers; } + } private final static class ByteArrayHttpOutputMessage implements HttpOutputMessage { @@ -235,7 +245,9 @@ public abstract class BodyFilterFunctions { } public interface RewriteResponseFunction { + R apply(ServerRequest request, ServerResponse response, T t); + } private static class ByteArrayServletInputStream extends ServletInputStream { diff --git a/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/filter/BodyFilterFunctionsTests.java b/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/filter/BodyFilterFunctionsTests.java index cbed1be3..9479d7fc 100644 --- a/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/filter/BodyFilterFunctionsTests.java +++ b/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/filter/BodyFilterFunctionsTests.java @@ -52,38 +52,40 @@ public class BodyFilterFunctionsTests { @Test public void modifyResponseBodySimple() { restClient.get() - .uri("/anything/modifyresponsebodysimple") - .header("X-Foo", "fooval") - .exchange() - .expectStatus() - .isOk() - .expectBody(Map.class) - .consumeWith(res -> { - Map headers = getMap(res.getResponseBody(), "headers"); - assertThat(headers).containsEntry("X-Foo", "FOOVAL"); - }); + .uri("/anything/modifyresponsebodysimple") + .header("X-Foo", "fooval") + .exchange() + .expectStatus() + .isOk() + .expectBody(Map.class) + .consumeWith(res -> { + Map headers = getMap(res.getResponseBody(), "headers"); + assertThat(headers).containsEntry("X-Foo", "FOOVAL"); + }); } @Test public void modifyResponseBodyComplex() { restClient.get() - .uri("/deny") - .header("X-Foo", "fooval") - .exchange() - .expectStatus() - .isOk() - // deny returns text/plain - .expectHeader().contentType(MediaType.APPLICATION_JSON) - .expectBody(Message.class) - .consumeWith(res -> { - assertThat(res.getResponseBody().message()).isNotEmpty(); - }); + .uri("/deny") + .header("X-Foo", "fooval") + .exchange() + .expectStatus() + .isOk() + // deny returns text/plain + .expectHeader() + .contentType(MediaType.APPLICATION_JSON) + .expectBody(Message.class) + .consumeWith(res -> { + assertThat(res.getResponseBody().message()).isNotEmpty(); + }); } @SpringBootConfiguration @EnableAutoConfiguration @LoadBalancerClient(name = "httpbin", configuration = TestLoadBalancerConfig.Httpbin.class) protected static class TestConfiguration { + @Bean public RouterFunction gatewayRouterFunctionsModifyResponseBodySimple() { // @formatter:off @@ -107,9 +109,11 @@ public class BodyFilterFunctionsTests { .build(); // @formatter:on } + } record Message(String message) { } + }