diff --git a/spring-test/src/main/java/org/springframework/mock/http/server/reactive/MockServerHttpResponse.java b/spring-test/src/main/java/org/springframework/mock/http/server/reactive/MockServerHttpResponse.java index ee040c8085..12163771f5 100644 --- a/spring-test/src/main/java/org/springframework/mock/http/server/reactive/MockServerHttpResponse.java +++ b/spring-test/src/main/java/org/springframework/mock/http/server/reactive/MockServerHttpResponse.java @@ -51,14 +51,14 @@ public class MockServerHttpResponse implements ServerHttpResponse { private final MultiValueMap cookies = new LinkedMultiValueMap<>(); + private Function urlEncoder = url -> url; + private Flux body; private Flux> bodyWithFlushes; private DataBufferFactory bufferFactory = new DefaultDataBufferFactory(); - private Function urlEncoder = url -> url; - @Override public boolean setStatusCode(HttpStatus status) { @@ -66,6 +66,7 @@ public class MockServerHttpResponse implements ServerHttpResponse { return true; } + @Override public HttpStatus getStatusCode() { return this.status; } @@ -80,6 +81,16 @@ public class MockServerHttpResponse implements ServerHttpResponse { return this.cookies; } + @Override + public String encodeUrl(String url) { + return (this.urlEncoder != null ? this.urlEncoder.apply(url) : url); + } + + @Override + public void registerUrlEncoder(Function encoder) { + this.urlEncoder = (this.urlEncoder != null ? this.urlEncoder.andThen(encoder) : encoder); + } + public Publisher getBody() { return this.body; } @@ -96,7 +107,7 @@ public class MockServerHttpResponse implements ServerHttpResponse { @Override public Mono writeAndFlushWith(Publisher> body) { - this.bodyWithFlushes = Flux.from(body).map(p -> Flux.from(p)); + this.bodyWithFlushes = Flux.from(body).map(Flux::from); return this.bodyWithFlushes.then(); } @@ -114,16 +125,6 @@ public class MockServerHttpResponse implements ServerHttpResponse { return this.bufferFactory; } - @Override - public String encodeUrl(String url) { - return (this.urlEncoder != null ? this.urlEncoder.apply(url) : url); - } - - @Override - public void registerUrlEncoder(Function encoder) { - this.urlEncoder = (this.urlEncoder != null ? this.urlEncoder.andThen(encoder) : encoder); - } - /** * Return the body of the response aggregated and converted to a String * using the charset of the Content-Type response or otherwise defaulting @@ -131,35 +132,29 @@ public class MockServerHttpResponse implements ServerHttpResponse { */ public Mono getBodyAsString() { Charset charset = getCharset(); - Charset charsetToUse = (charset != null ? charset : StandardCharsets.UTF_8); - return Flux.from(this.body) - .reduce(this.bufferFactory.allocateBuffer(), (previous, current) -> { + return Flux.from(getBody()) + .reduce(bufferFactory().allocateBuffer(), (previous, current) -> { previous.write(current); DataBufferUtils.release(current); return previous; }) - .map(buffer -> dumpString(buffer, charsetToUse)); + .map(buffer -> dumpString(buffer, charset)); } private static String dumpString(DataBuffer buffer, Charset charset) { Assert.notNull(charset, "'charset' must not be null"); - byte[] bytes = dumpBytes(buffer); + byte[] bytes = new byte[buffer.readableByteCount()]; + buffer.read(bytes); return new String(bytes, charset); } - private static byte[] dumpBytes(DataBuffer buffer) { - Assert.notNull(buffer, "'buffer' must not be null"); - byte[] bytes = new byte[buffer.readableByteCount()]; - buffer.read(bytes); - return bytes; - } - private Charset getCharset() { + Charset charset = null; MediaType contentType = getHeaders().getContentType(); if (contentType != null) { - return contentType.getCharset(); + charset = contentType.getCharset(); } - return null; + return (charset != null ? charset : StandardCharsets.UTF_8); } } diff --git a/spring-web/src/test/java/org/springframework/mock/http/server/reactive/test/MockServerHttpRequest.java b/spring-web/src/test/java/org/springframework/mock/http/server/reactive/test/MockServerHttpRequest.java index a8587c68f5..16a0849dd4 100644 --- a/spring-web/src/test/java/org/springframework/mock/http/server/reactive/test/MockServerHttpRequest.java +++ b/spring-web/src/test/java/org/springframework/mock/http/server/reactive/test/MockServerHttpRequest.java @@ -35,6 +35,7 @@ import org.springframework.util.MultiValueMap; /** * Mock implementation of {@link ServerHttpRequest}. * @author Rossen Stoyanchev + * @since 5.0 */ public class MockServerHttpRequest implements ServerHttpRequest { diff --git a/spring-web/src/test/java/org/springframework/mock/http/server/reactive/test/MockServerHttpResponse.java b/spring-web/src/test/java/org/springframework/mock/http/server/reactive/test/MockServerHttpResponse.java index e7f0984c69..1ebbbec957 100644 --- a/spring-web/src/test/java/org/springframework/mock/http/server/reactive/test/MockServerHttpResponse.java +++ b/spring-web/src/test/java/org/springframework/mock/http/server/reactive/test/MockServerHttpResponse.java @@ -41,6 +41,7 @@ import org.springframework.util.MultiValueMap; /** * Mock implementation of {@link ServerHttpResponse}. * @author Rossen Stoyanchev + * @since 5.0 */ public class MockServerHttpResponse implements ServerHttpResponse { @@ -106,7 +107,7 @@ public class MockServerHttpResponse implements ServerHttpResponse { @Override public Mono writeAndFlushWith(Publisher> body) { - this.bodyWithFlushes = Flux.from(body).map(p -> Flux.from(p)); + this.bodyWithFlushes = Flux.from(body).map(Flux::from); return this.bodyWithFlushes.then(); } @@ -131,22 +132,22 @@ public class MockServerHttpResponse implements ServerHttpResponse { */ public Mono getBodyAsString() { Charset charset = getCharset(); - Charset charsetToUse = (charset != null ? charset : StandardCharsets.UTF_8); - return Flux.from(this.body) - .reduce(this.bufferFactory.allocateBuffer(), (previous, current) -> { + return Flux.from(getBody()) + .reduce(bufferFactory().allocateBuffer(), (previous, current) -> { previous.write(current); DataBufferUtils.release(current); return previous; }) - .map(buffer -> DataBufferTestUtils.dumpString(buffer, charsetToUse)); + .map(buffer -> DataBufferTestUtils.dumpString(buffer, charset)); } private Charset getCharset() { + Charset charset = null; MediaType contentType = getHeaders().getContentType(); if (contentType != null) { - return contentType.getCharset(); + charset = contentType.getCharset(); } - return null; + return (charset != null ? charset : StandardCharsets.UTF_8); } }