diff --git a/spring-web-reactive/src/main/java/org/springframework/http/server/reactive/AbstractServerHttpResponse.java b/spring-web-reactive/src/main/java/org/springframework/http/server/reactive/AbstractServerHttpResponse.java index a1132ef6a98..2aafef5d7a5 100644 --- a/spring-web-reactive/src/main/java/org/springframework/http/server/reactive/AbstractServerHttpResponse.java +++ b/spring-web-reactive/src/main/java/org/springframework/http/server/reactive/AbstractServerHttpResponse.java @@ -45,7 +45,7 @@ import org.springframework.util.MultiValueMap; */ public abstract class AbstractServerHttpResponse implements ServerHttpResponse { - private static Log logger = LogFactory.getLog(AbstractServerHttpResponse.class); + private Log logger = LogFactory.getLog(getClass()); private static final int STATE_NEW = 1; @@ -53,17 +53,20 @@ public abstract class AbstractServerHttpResponse implements ServerHttpResponse { private static final int STATE_COMMITTED = 3; + + private final DataBufferFactory dataBufferFactory; + + private HttpStatus statusCode; private final HttpHeaders headers; private final MultiValueMap cookies; - private final AtomicInteger state = new AtomicInteger(STATE_NEW); - private final List>> beforeCommitActions = new ArrayList<>(4); - private final DataBufferFactory dataBufferFactory; + private final AtomicInteger state = new AtomicInteger(STATE_NEW); + public AbstractServerHttpResponse(DataBufferFactory dataBufferFactory) { Assert.notNull(dataBufferFactory, "'dataBufferFactory' must not be null"); @@ -73,13 +76,29 @@ public abstract class AbstractServerHttpResponse implements ServerHttpResponse { this.cookies = new LinkedMultiValueMap(); } + @Override public final DataBufferFactory bufferFactory() { return this.dataBufferFactory; } + + @Override + public boolean setStatusCode(HttpStatus statusCode) { + Assert.notNull(statusCode); + if (STATE_NEW == this.state.get()) { + this.statusCode = statusCode; + return true; + } + else if (logger.isDebugEnabled()) { + logger.debug("Can't set the status " + statusCode.toString() + + " because the HTTP response has already been committed"); + } + return false; + } + protected HttpStatus getStatusCode() { - return statusCode; + return this.statusCode; } @Override @@ -100,6 +119,12 @@ public abstract class AbstractServerHttpResponse implements ServerHttpResponse { return this.cookies; } + @Override + public void beforeCommit(Supplier> action) { + Assert.notNull(action); + this.beforeCommitActions.add(action); + } + @Override public Mono writeWith(Publisher publisher) { return new ChannelSendOperator<>(publisher, writePublisher -> @@ -127,6 +152,12 @@ public abstract class AbstractServerHttpResponse implements ServerHttpResponse { return mono; } + /** + * Implement this method to write to the underlying the response. + * @param body the publisher to write with + */ + protected abstract Mono writeWithInternal(Publisher body); + /** * Implement this method to write the status code to the underlying response. * This method is called once only. @@ -145,35 +176,10 @@ public abstract class AbstractServerHttpResponse implements ServerHttpResponse { */ protected abstract void writeCookies(); - /** - * Implement this method to write to the underlying the response. - * @param body the publisher to write with - */ - protected abstract Mono writeWithInternal(Publisher body); - - @Override - public void beforeCommit(Supplier> action) { - Assert.notNull(action); - this.beforeCommitActions.add(action); - } @Override public Mono setComplete() { return applyBeforeCommit(); } - @Override - public boolean setStatusCode(HttpStatus statusCode) { - Assert.notNull(statusCode); - if (STATE_NEW == this.state.get()) { - this.statusCode = statusCode; - return true; - } - else if (logger.isDebugEnabled()) { - logger.debug("Can't set the status " + statusCode.toString() + - " because the HTTP response has already been committed"); - } - return false; - } - } diff --git a/spring-web-reactive/src/main/java/org/springframework/http/server/reactive/ReactorServerHttpResponse.java b/spring-web-reactive/src/main/java/org/springframework/http/server/reactive/ReactorServerHttpResponse.java index 5ca6ca3bc87..55d1a262657 100644 --- a/spring-web-reactive/src/main/java/org/springframework/http/server/reactive/ReactorServerHttpResponse.java +++ b/spring-web-reactive/src/main/java/org/springframework/http/server/reactive/ReactorServerHttpResponse.java @@ -48,6 +48,7 @@ public class ReactorServerHttpResponse extends AbstractServerHttpResponse private final HttpChannel channel; + public ReactorServerHttpResponse(HttpChannel response, DataBufferFactory dataBufferFactory) { super(dataBufferFactory); @@ -60,6 +61,15 @@ public class ReactorServerHttpResponse extends AbstractServerHttpResponse return this.channel; } + + @Override + protected void writeStatusCode() { + HttpStatus statusCode = this.getStatusCode(); + if (statusCode != null) { + getReactorChannel().status(HttpResponseStatus.valueOf(statusCode.value())); + } + } + @Override protected Mono writeWithInternal(Publisher publisher) { return Flux.from(publisher) @@ -70,14 +80,6 @@ public class ReactorServerHttpResponse extends AbstractServerHttpResponse .then(); } - @Override - protected void writeStatusCode() { - HttpStatus statusCode = this.getStatusCode(); - if (statusCode != null) { - getReactorChannel().status(HttpResponseStatus.valueOf(statusCode.value())); - } - } - @Override protected void writeHeaders() { for (String name : getHeaders().keySet()) { @@ -119,4 +121,5 @@ public class ReactorServerHttpResponse extends AbstractServerHttpResponse return this.channel.sendFile(file, position, count); }); } + } diff --git a/spring-web-reactive/src/main/java/org/springframework/http/server/reactive/RxNettyServerHttpResponse.java b/spring-web-reactive/src/main/java/org/springframework/http/server/reactive/RxNettyServerHttpResponse.java index 80aadad4577..9d50f4d337f 100644 --- a/spring-web-reactive/src/main/java/org/springframework/http/server/reactive/RxNettyServerHttpResponse.java +++ b/spring-web-reactive/src/main/java/org/springframework/http/server/reactive/RxNettyServerHttpResponse.java @@ -46,6 +46,7 @@ public class RxNettyServerHttpResponse extends AbstractServerHttpResponse { private final HttpServerResponse response; + public RxNettyServerHttpResponse(HttpServerResponse response, NettyDataBufferFactory dataBufferFactory) { super(dataBufferFactory); @@ -59,6 +60,15 @@ public class RxNettyServerHttpResponse extends AbstractServerHttpResponse { return this.response; } + + @Override + protected void writeStatusCode() { + HttpStatus statusCode = this.getStatusCode(); + if (statusCode != null) { + this.response.setStatus(HttpResponseStatus.valueOf(statusCode.value())); + } + } + @Override protected Mono writeWithInternal(Publisher body) { Observable content = RxJava1ObservableConverter.from(body).map(this::toByteBuf); @@ -70,14 +80,6 @@ public class RxNettyServerHttpResponse extends AbstractServerHttpResponse { return (buffer instanceof FlushingDataBuffer ? new FlushingByteBuf(byteBuf) : byteBuf); } - @Override - protected void writeStatusCode() { - HttpStatus statusCode = this.getStatusCode(); - if (statusCode != null) { - this.response.setStatus(HttpResponseStatus.valueOf(statusCode.value())); - } - } - @Override protected void writeHeaders() { for (String name : getHeaders().keySet()) { diff --git a/spring-web-reactive/src/main/java/org/springframework/http/server/reactive/ServletServerHttpResponse.java b/spring-web-reactive/src/main/java/org/springframework/http/server/reactive/ServletServerHttpResponse.java index 60cca26f236..9b84f5082e7 100644 --- a/spring-web-reactive/src/main/java/org/springframework/http/server/reactive/ServletServerHttpResponse.java +++ b/spring-web-reactive/src/main/java/org/springframework/http/server/reactive/ServletServerHttpResponse.java @@ -23,8 +23,6 @@ import java.util.function.Function; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletResponse; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; import org.reactivestreams.Publisher; import reactor.core.publisher.Mono; @@ -42,12 +40,11 @@ import org.springframework.util.Assert; */ public class ServletServerHttpResponse extends AbstractServerHttpResponse { - private static final Log logger = LogFactory.getLog(ServletServerHttpResponse.class); - private final HttpServletResponse response; private final Function, Mono> responseBodyWriter; + public ServletServerHttpResponse(HttpServletResponse response, DataBufferFactory dataBufferFactory, Function, Mono> responseBodyWriter) { @@ -58,14 +55,11 @@ public class ServletServerHttpResponse extends AbstractServerHttpResponse { this.responseBodyWriter = responseBodyWriter; } + public HttpServletResponse getServletResponse() { return this.response; } - @Override - protected Mono writeWithInternal(Publisher publisher) { - return this.responseBodyWriter.apply(publisher); - } @Override protected void writeStatusCode() { @@ -75,6 +69,11 @@ public class ServletServerHttpResponse extends AbstractServerHttpResponse { } } + @Override + protected Mono writeWithInternal(Publisher publisher) { + return this.responseBodyWriter.apply(publisher); + } + @Override protected void writeHeaders() { for (Map.Entry> entry : getHeaders().entrySet()) { diff --git a/spring-web-reactive/src/main/java/org/springframework/http/server/reactive/UndertowServerHttpResponse.java b/spring-web-reactive/src/main/java/org/springframework/http/server/reactive/UndertowServerHttpResponse.java index 73fba1d28ac..3dc11cf3954 100644 --- a/spring-web-reactive/src/main/java/org/springframework/http/server/reactive/UndertowServerHttpResponse.java +++ b/spring-web-reactive/src/main/java/org/springframework/http/server/reactive/UndertowServerHttpResponse.java @@ -54,6 +54,7 @@ public class UndertowServerHttpResponse extends AbstractServerHttpResponse private final HttpServerExchange exchange; + public UndertowServerHttpResponse(HttpServerExchange exchange, DataBufferFactory dataBufferFactory) { super(dataBufferFactory); @@ -66,6 +67,16 @@ public class UndertowServerHttpResponse extends AbstractServerHttpResponse return this.exchange; } + + @Override + protected void writeStatusCode() { + HttpStatus statusCode = this.getStatusCode(); + if (statusCode != null) { + getUndertowExchange().setStatusCode(statusCode.value()); + } + } + + @Override protected Mono writeWithInternal(Publisher publisher) { return Mono.from(s -> { @@ -101,14 +112,6 @@ public class UndertowServerHttpResponse extends AbstractServerHttpResponse } } - @Override - protected void writeStatusCode() { - HttpStatus statusCode = this.getStatusCode(); - if (statusCode != null) { - getUndertowExchange().setStatusCode(statusCode.value()); - } - } - @Override protected void writeHeaders() { for (Map.Entry> entry : getHeaders().entrySet()) {