Polish AbstractServerHttpResponse
This commit is contained in:
@@ -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<String, ResponseCookie> cookies;
|
||||
|
||||
private final AtomicInteger state = new AtomicInteger(STATE_NEW);
|
||||
|
||||
private final List<Supplier<? extends Mono<Void>>> 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<String, ResponseCookie>();
|
||||
}
|
||||
|
||||
|
||||
@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<? extends Mono<Void>> action) {
|
||||
Assert.notNull(action);
|
||||
this.beforeCommitActions.add(action);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Mono<Void> writeWith(Publisher<DataBuffer> 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<Void> writeWithInternal(Publisher<DataBuffer> 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<Void> writeWithInternal(Publisher<DataBuffer> body);
|
||||
|
||||
@Override
|
||||
public void beforeCommit(Supplier<? extends Mono<Void>> action) {
|
||||
Assert.notNull(action);
|
||||
this.beforeCommitActions.add(action);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Mono<Void> 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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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<Void> writeWithInternal(Publisher<DataBuffer> 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);
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -46,6 +46,7 @@ public class RxNettyServerHttpResponse extends AbstractServerHttpResponse {
|
||||
|
||||
private final HttpServerResponse<ByteBuf> response;
|
||||
|
||||
|
||||
public RxNettyServerHttpResponse(HttpServerResponse<ByteBuf> 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<Void> writeWithInternal(Publisher<DataBuffer> body) {
|
||||
Observable<ByteBuf> 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()) {
|
||||
|
||||
@@ -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<Publisher<DataBuffer>, Mono<Void>> responseBodyWriter;
|
||||
|
||||
|
||||
public ServletServerHttpResponse(HttpServletResponse response,
|
||||
DataBufferFactory dataBufferFactory,
|
||||
Function<Publisher<DataBuffer>, Mono<Void>> responseBodyWriter) {
|
||||
@@ -58,14 +55,11 @@ public class ServletServerHttpResponse extends AbstractServerHttpResponse {
|
||||
this.responseBodyWriter = responseBodyWriter;
|
||||
}
|
||||
|
||||
|
||||
public HttpServletResponse getServletResponse() {
|
||||
return this.response;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Mono<Void> writeWithInternal(Publisher<DataBuffer> publisher) {
|
||||
return this.responseBodyWriter.apply(publisher);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void writeStatusCode() {
|
||||
@@ -75,6 +69,11 @@ public class ServletServerHttpResponse extends AbstractServerHttpResponse {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Mono<Void> writeWithInternal(Publisher<DataBuffer> publisher) {
|
||||
return this.responseBodyWriter.apply(publisher);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void writeHeaders() {
|
||||
for (Map.Entry<String, List<String>> entry : getHeaders().entrySet()) {
|
||||
|
||||
@@ -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<Void> writeWithInternal(Publisher<DataBuffer> 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<String, List<String>> entry : getHeaders().entrySet()) {
|
||||
|
||||
Reference in New Issue
Block a user