Polishing
This commit polishes previous one by also accepting generic types explicitly declared with a class that extends DataBuffer allowing to write Flux<DefaultDataBuffer> for example. Issue: SPR-14952
This commit is contained in:
@@ -72,7 +72,7 @@ public class ServerSentEventHttpMessageWriterTests extends AbstractDataBufferAll
|
||||
messageWriter.write(source, ResolvableType.forClass(ServerSentEvent.class),
|
||||
new MediaType("text", "event-stream"), outputMessage, Collections.emptyMap());
|
||||
|
||||
Publisher<? extends Publisher<DataBuffer>> result = Flux.from(outputMessage.getBodyWithFlush());
|
||||
Publisher<? extends Publisher<? extends DataBuffer>> result = Flux.from(outputMessage.getBodyWithFlush());
|
||||
StepVerifier.create(result)
|
||||
.consumeNextWith(sseConsumer("id:c42\n" + "event:foo\n" + "retry:123\n" +
|
||||
":bla\n:bla bla\n:bla bla bla\n" + "data:bar\n"))
|
||||
@@ -87,7 +87,7 @@ public class ServerSentEventHttpMessageWriterTests extends AbstractDataBufferAll
|
||||
messageWriter.write(source, ResolvableType.forClass(String.class),
|
||||
new MediaType("text", "event-stream"), outputMessage, Collections.emptyMap());
|
||||
|
||||
Publisher<? extends Publisher<DataBuffer>> result = outputMessage.getBodyWithFlush();
|
||||
Publisher<? extends Publisher<? extends DataBuffer>> result = outputMessage.getBodyWithFlush();
|
||||
StepVerifier.create(result)
|
||||
.consumeNextWith(sseConsumer("data:foo\n"))
|
||||
.consumeNextWith(sseConsumer("data:bar\n"))
|
||||
@@ -102,7 +102,7 @@ public class ServerSentEventHttpMessageWriterTests extends AbstractDataBufferAll
|
||||
messageWriter.write(source, ResolvableType.forClass(String.class),
|
||||
new MediaType("text", "event-stream"), outputMessage, Collections.emptyMap());
|
||||
|
||||
Publisher<? extends Publisher<DataBuffer>> result = outputMessage.getBodyWithFlush();
|
||||
Publisher<? extends Publisher<? extends DataBuffer>> result = outputMessage.getBodyWithFlush();
|
||||
StepVerifier.create(result)
|
||||
.consumeNextWith(sseConsumer("data:foo\ndata:bar\n"))
|
||||
.consumeNextWith(sseConsumer("data:foo\ndata:baz\n"))
|
||||
@@ -118,7 +118,7 @@ public class ServerSentEventHttpMessageWriterTests extends AbstractDataBufferAll
|
||||
messageWriter.write(source, ResolvableType.forClass(Pojo.class),
|
||||
new MediaType("text", "event-stream"), outputMessage, Collections.emptyMap());
|
||||
|
||||
Publisher<? extends Publisher<DataBuffer>> result = outputMessage.getBodyWithFlush();
|
||||
Publisher<? extends Publisher<? extends DataBuffer>> result = outputMessage.getBodyWithFlush();
|
||||
StepVerifier.create(result)
|
||||
.consumeNextWith(sseConsumer("data:", "{\"foo\":\"foofoo\",\"bar\":\"barbar\"}", "\n"))
|
||||
.consumeNextWith(sseConsumer("data:", "{\"foo\":\"foofoofoo\",\"bar\":\"barbarbar\"}", "\n"))
|
||||
@@ -127,7 +127,7 @@ public class ServerSentEventHttpMessageWriterTests extends AbstractDataBufferAll
|
||||
}
|
||||
|
||||
|
||||
private Consumer<Publisher<DataBuffer>> sseConsumer(String... expected) {
|
||||
private Consumer<Publisher<? extends DataBuffer>> sseConsumer(String... expected) {
|
||||
return publisher -> {
|
||||
StepVerifier.Step<DataBuffer> builder = StepVerifier.create(publisher);
|
||||
for (String value : expected) {
|
||||
|
||||
@@ -27,6 +27,7 @@ import reactor.core.publisher.Flux;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
import org.springframework.core.io.buffer.DataBuffer;
|
||||
import org.springframework.core.io.buffer.DefaultDataBuffer;
|
||||
import org.springframework.core.io.buffer.DefaultDataBufferFactory;
|
||||
import org.springframework.http.ResponseCookie;
|
||||
|
||||
@@ -56,6 +57,20 @@ public class ServerHttpResponseTests {
|
||||
assertEquals("c", new String(response.body.get(2).asByteBuffer().array(), StandardCharsets.UTF_8));
|
||||
}
|
||||
|
||||
@Test // SPR-14952
|
||||
public void writeAndFlushWithFluxOfDefaultDataBuffer() throws Exception {
|
||||
TestServerHttpResponse response = new TestServerHttpResponse();
|
||||
Flux<Flux<DefaultDataBuffer>> flux = Flux.just(Flux.just(wrap("foo")));
|
||||
response.writeAndFlushWith(flux).block();
|
||||
|
||||
assertTrue(response.statusCodeWritten);
|
||||
assertTrue(response.headersWritten);
|
||||
assertTrue(response.cookiesWritten);
|
||||
|
||||
assertEquals(1, response.body.size());
|
||||
assertEquals("foo", new String(response.body.get(0).asByteBuffer().array(), StandardCharsets.UTF_8));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void writeWithError() throws Exception {
|
||||
TestServerHttpResponse response = new TestServerHttpResponse();
|
||||
@@ -119,7 +134,7 @@ public class ServerHttpResponseTests {
|
||||
|
||||
|
||||
|
||||
private DataBuffer wrap(String a) {
|
||||
private DefaultDataBuffer wrap(String a) {
|
||||
return new DefaultDataBufferFactory().wrap(ByteBuffer.wrap(a.getBytes(StandardCharsets.UTF_8)));
|
||||
}
|
||||
|
||||
@@ -157,7 +172,7 @@ public class ServerHttpResponseTests {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Mono<Void> writeWithInternal(Publisher<DataBuffer> body) {
|
||||
protected Mono<Void> writeWithInternal(Publisher<? extends DataBuffer> body) {
|
||||
return Flux.from(body).map(b -> {
|
||||
this.body.add(b);
|
||||
return b;
|
||||
@@ -166,8 +181,13 @@ public class ServerHttpResponseTests {
|
||||
|
||||
@Override
|
||||
protected Mono<Void> writeAndFlushWithInternal(
|
||||
Publisher<? extends Publisher<DataBuffer>> body) {
|
||||
return Mono.error(new UnsupportedOperationException());
|
||||
Publisher<? extends Publisher<? extends DataBuffer>> bodyWithFlush) {
|
||||
return Flux.from(bodyWithFlush).flatMap(body ->
|
||||
Flux.from(body).map(b -> {
|
||||
this.body.add(b);
|
||||
return b;
|
||||
})
|
||||
).then();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -49,9 +49,9 @@ public class MockServerHttpResponse implements ServerHttpResponse {
|
||||
|
||||
private final MultiValueMap<String, ResponseCookie> cookies = new LinkedMultiValueMap<>();
|
||||
|
||||
private Publisher<DataBuffer> body;
|
||||
private Publisher<? extends DataBuffer> body;
|
||||
|
||||
private Publisher<? extends Publisher<DataBuffer>> bodyWithFlushes;
|
||||
private Publisher<? extends Publisher<? extends DataBuffer>> bodyWithFlushes;
|
||||
|
||||
private DataBufferFactory bufferFactory = new DefaultDataBufferFactory();
|
||||
|
||||
@@ -77,22 +77,22 @@ public class MockServerHttpResponse implements ServerHttpResponse {
|
||||
return this.cookies;
|
||||
}
|
||||
|
||||
public Publisher<DataBuffer> getBody() {
|
||||
public Publisher<? extends DataBuffer> getBody() {
|
||||
return this.body;
|
||||
}
|
||||
|
||||
public Publisher<? extends Publisher<DataBuffer>> getBodyWithFlush() {
|
||||
public Publisher<? extends Publisher<? extends DataBuffer>> getBodyWithFlush() {
|
||||
return this.bodyWithFlushes;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Mono<Void> writeWith(Publisher<DataBuffer> body) {
|
||||
public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
|
||||
this.body = body;
|
||||
return Flux.from(this.body).then();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Mono<Void> writeAndFlushWith(Publisher<? extends Publisher<DataBuffer>> body) {
|
||||
public Mono<Void> writeAndFlushWith(Publisher<? extends Publisher<? extends DataBuffer>> body) {
|
||||
this.bodyWithFlushes = body;
|
||||
return Flux.from(this.bodyWithFlushes).then();
|
||||
}
|
||||
|
||||
@@ -41,9 +41,9 @@ public class MockClientHttpRequest extends AbstractClientHttpRequest {
|
||||
|
||||
private final DataBufferFactory bufferFactory = new DefaultDataBufferFactory();
|
||||
|
||||
private Publisher<DataBuffer> body;
|
||||
private Publisher<? extends DataBuffer> body;
|
||||
|
||||
private Publisher<? extends Publisher<DataBuffer>> bodyWithFlushes;
|
||||
private Publisher<? extends Publisher<? extends DataBuffer>> bodyWithFlushes;
|
||||
|
||||
|
||||
public MockClientHttpRequest() {
|
||||
@@ -90,22 +90,22 @@ public class MockClientHttpRequest extends AbstractClientHttpRequest {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Mono<Void> writeWith(Publisher<DataBuffer> body) {
|
||||
public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
|
||||
this.body = body;
|
||||
return applyBeforeCommit().then(Flux.from(this.body).then());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Mono<Void> writeAndFlushWith(Publisher<? extends Publisher<DataBuffer>> body) {
|
||||
public Mono<Void> writeAndFlushWith(Publisher<? extends Publisher<? extends DataBuffer>> body) {
|
||||
this.bodyWithFlushes = body;
|
||||
return applyBeforeCommit().then(Flux.from(this.bodyWithFlushes).then());
|
||||
}
|
||||
|
||||
public Publisher<DataBuffer> getBody() {
|
||||
public Publisher<? extends DataBuffer> getBody() {
|
||||
return body;
|
||||
}
|
||||
|
||||
public Publisher<? extends Publisher<DataBuffer>> getBodyWithFlush() {
|
||||
public Publisher<? extends Publisher<? extends DataBuffer>> getBodyWithFlush() {
|
||||
return bodyWithFlushes;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user