Package private request and response implementations
Concrete server and client, reactive request and response implementations should not have to be accessed outside their package. They could be seen as private to their HttpHandler adapters and ClientHttpConnector's respectively. The one exception, WebSocket upgrades in spring-webflux, is an internal framework use case, accommodated via downcast + accessors in the abstract base classes.
This commit is contained in:
@@ -103,6 +103,10 @@ public class MockServerHttpRequest extends AbstractServerHttpRequest {
|
||||
return this.cookies;
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> T getNativeRequest() {
|
||||
throw new IllegalStateException("This is a mock. No running server, no native request.");
|
||||
}
|
||||
|
||||
/**
|
||||
* Shortcut to wrap the request with a {@code MockServerWebExchange}.
|
||||
|
||||
@@ -76,6 +76,11 @@ public class MockServerHttpResponse extends AbstractServerHttpResponse {
|
||||
this.writeHandler = writeHandler;
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> T getNativeResponse() {
|
||||
throw new IllegalStateException("This is a mock. No running server, no native response.");
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void applyStatusCode() {
|
||||
|
||||
@@ -40,7 +40,7 @@ import org.springframework.http.ZeroCopyHttpOutputMessage;
|
||||
* @since 5.0
|
||||
* @see reactor.ipc.netty.http.client.HttpClient
|
||||
*/
|
||||
public class ReactorClientHttpRequest extends AbstractClientHttpRequest implements ZeroCopyHttpOutputMessage {
|
||||
class ReactorClientHttpRequest extends AbstractClientHttpRequest implements ZeroCopyHttpOutputMessage {
|
||||
|
||||
private final HttpMethod httpMethod;
|
||||
|
||||
|
||||
@@ -37,7 +37,7 @@ import org.springframework.util.MultiValueMap;
|
||||
* @since 5.0
|
||||
* @see reactor.ipc.netty.http.client.HttpClient
|
||||
*/
|
||||
public class ReactorClientHttpResponse implements ClientHttpResponse {
|
||||
class ReactorClientHttpResponse implements ClientHttpResponse {
|
||||
|
||||
private final NettyDataBufferFactory dataBufferFactory;
|
||||
|
||||
|
||||
@@ -152,4 +152,11 @@ public abstract class AbstractServerHttpRequest implements ServerHttpRequest {
|
||||
*/
|
||||
protected abstract MultiValueMap<String, HttpCookie> initCookies();
|
||||
|
||||
/**
|
||||
* Return the underlying server response.
|
||||
* <p><strong>Note:</strong> This is exposed mainly for internal framework
|
||||
* use such as WebSocket upgrades in the spring-webflux module.
|
||||
*/
|
||||
public abstract <T> T getNativeRequest();
|
||||
|
||||
}
|
||||
|
||||
@@ -132,6 +132,14 @@ public abstract class AbstractServerHttpResponse implements ServerHttpResponse {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the underlying server response.
|
||||
* <p><strong>Note:</strong> This is exposed mainly for internal framework
|
||||
* use such as WebSocket upgrades in the spring-webflux module.
|
||||
*/
|
||||
public abstract <T> T getNativeResponse();
|
||||
|
||||
|
||||
@Override
|
||||
public void beforeCommit(Supplier<? extends Mono<Void>> action) {
|
||||
this.commitActions.add(action);
|
||||
|
||||
@@ -63,6 +63,9 @@ class DefaultServerHttpRequestBuilder implements ServerHttpRequest.Builder {
|
||||
|
||||
private Flux<DataBuffer> body;
|
||||
|
||||
private final ServerHttpRequest originalRequest;
|
||||
|
||||
|
||||
public DefaultServerHttpRequestBuilder(ServerHttpRequest original) {
|
||||
Assert.notNull(original, "ServerHttpRequest is required");
|
||||
|
||||
@@ -76,6 +79,8 @@ class DefaultServerHttpRequestBuilder implements ServerHttpRequest.Builder {
|
||||
|
||||
this.cookies = new LinkedMultiValueMap<>(original.getCookies().size());
|
||||
copyMultiValueMap(original.getCookies(), this.cookies);
|
||||
|
||||
this.originalRequest = original;
|
||||
}
|
||||
|
||||
private static <K, V> void copyMultiValueMap(MultiValueMap<K,V> source,
|
||||
@@ -130,7 +135,8 @@ class DefaultServerHttpRequestBuilder implements ServerHttpRequest.Builder {
|
||||
public ServerHttpRequest build() {
|
||||
URI uriToUse = getUriToUse();
|
||||
return new DefaultServerHttpRequest(uriToUse, this.contextPath, this.httpHeaders,
|
||||
this.httpMethodValue, this.cookies, this.remoteAddress, this.body);
|
||||
this.httpMethodValue, this.cookies, this.remoteAddress, this.body,
|
||||
this.originalRequest);
|
||||
|
||||
}
|
||||
|
||||
@@ -158,17 +164,23 @@ class DefaultServerHttpRequestBuilder implements ServerHttpRequest.Builder {
|
||||
|
||||
private final Flux<DataBuffer> body;
|
||||
|
||||
private final ServerHttpRequest originalRequest;
|
||||
|
||||
|
||||
public DefaultServerHttpRequest(URI uri, @Nullable String contextPath,
|
||||
HttpHeaders headers, String methodValue,
|
||||
MultiValueMap<String, HttpCookie> cookies, @Nullable InetSocketAddress remoteAddress,
|
||||
Flux<DataBuffer> body) {
|
||||
HttpHeaders headers, String methodValue, MultiValueMap<String, HttpCookie> cookies,
|
||||
@Nullable InetSocketAddress remoteAddress,
|
||||
Flux<DataBuffer> body, ServerHttpRequest originalRequest) {
|
||||
|
||||
super(uri, contextPath, headers);
|
||||
this.methodValue = methodValue;
|
||||
this.cookies = cookies;
|
||||
this.remoteAddress = remoteAddress;
|
||||
this.body = body;
|
||||
this.originalRequest = originalRequest;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String getMethodValue() {
|
||||
return this.methodValue;
|
||||
@@ -189,6 +201,12 @@ class DefaultServerHttpRequestBuilder implements ServerHttpRequest.Builder {
|
||||
public Flux<DataBuffer> getBody() {
|
||||
return this.body;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public <T> T getNativeRequest() {
|
||||
return (T) this.originalRequest;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@ package org.springframework.http.server.reactive;
|
||||
import java.io.IOException;
|
||||
import java.nio.ByteBuffer;
|
||||
import javax.servlet.AsyncContext;
|
||||
import javax.servlet.ServletResponse;
|
||||
import javax.servlet.annotation.WebServlet;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
@@ -62,7 +63,8 @@ public class JettyHttpHandlerAdapter extends ServletHttpHandlerAdapter {
|
||||
protected int writeToOutputStream(DataBuffer dataBuffer) throws IOException {
|
||||
ByteBuffer input = dataBuffer.asByteBuffer();
|
||||
int len = input.remaining();
|
||||
((HttpOutput) getServletResponse().getOutputStream()).write(input);
|
||||
ServletResponse response = getNativeResponse();
|
||||
((HttpOutput) response.getOutputStream()).write(input);
|
||||
return len;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,7 +42,7 @@ import org.springframework.util.MultiValueMap;
|
||||
* @author Rossen Stoyanchev
|
||||
* @since 5.0
|
||||
*/
|
||||
public class ReactorServerHttpRequest extends AbstractServerHttpRequest {
|
||||
class ReactorServerHttpRequest extends AbstractServerHttpRequest {
|
||||
|
||||
private final HttpServerRequest request;
|
||||
|
||||
@@ -108,11 +108,6 @@ public class ReactorServerHttpRequest extends AbstractServerHttpRequest {
|
||||
return headers;
|
||||
}
|
||||
|
||||
|
||||
public HttpServerRequest getReactorRequest() {
|
||||
return this.request;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMethodValue() {
|
||||
return this.request.method().name();
|
||||
@@ -140,4 +135,10 @@ public class ReactorServerHttpRequest extends AbstractServerHttpRequest {
|
||||
return this.request.receive().retain().map(this.bufferFactory::wrap);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public <T> T getNativeRequest() {
|
||||
return (T) this.request;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -44,7 +44,7 @@ import org.springframework.util.Assert;
|
||||
* @author Rossen Stoyanchev
|
||||
* @since 5.0
|
||||
*/
|
||||
public class ReactorServerHttpResponse extends AbstractServerHttpResponse implements ZeroCopyHttpOutputMessage {
|
||||
class ReactorServerHttpResponse extends AbstractServerHttpResponse implements ZeroCopyHttpOutputMessage {
|
||||
|
||||
private final HttpServerResponse response;
|
||||
|
||||
@@ -56,8 +56,10 @@ public class ReactorServerHttpResponse extends AbstractServerHttpResponse implem
|
||||
}
|
||||
|
||||
|
||||
public HttpServerResponse getReactorResponse() {
|
||||
return this.response;
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public <T> T getNativeResponse() {
|
||||
return (T) this.response;
|
||||
}
|
||||
|
||||
|
||||
@@ -65,7 +67,7 @@ public class ReactorServerHttpResponse extends AbstractServerHttpResponse implem
|
||||
protected void applyStatusCode() {
|
||||
HttpStatus statusCode = this.getStatusCode();
|
||||
if (statusCode != null) {
|
||||
getReactorResponse().status(HttpResponseStatus.valueOf(statusCode.value()));
|
||||
this.response.status(HttpResponseStatus.valueOf(statusCode.value()));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -53,7 +53,7 @@ import org.springframework.util.StringUtils;
|
||||
* @author Rossen Stoyanchev
|
||||
* @since 5.0
|
||||
*/
|
||||
public class ServletServerHttpRequest extends AbstractServerHttpRequest {
|
||||
class ServletServerHttpRequest extends AbstractServerHttpRequest {
|
||||
|
||||
protected final Log logger = LogFactory.getLog(getClass());
|
||||
|
||||
@@ -145,13 +145,9 @@ public class ServletServerHttpRequest extends AbstractServerHttpRequest {
|
||||
}
|
||||
|
||||
|
||||
public HttpServletRequest getServletRequest() {
|
||||
return this.request;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMethodValue() {
|
||||
return getServletRequest().getMethod();
|
||||
return this.request.getMethod();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -201,6 +197,12 @@ public class ServletServerHttpRequest extends AbstractServerHttpRequest {
|
||||
return null;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public <T> T getNativeRequest() {
|
||||
return (T) this.request;
|
||||
}
|
||||
|
||||
|
||||
private final class RequestAsyncListener implements AsyncListener {
|
||||
|
||||
|
||||
@@ -47,7 +47,7 @@ import org.springframework.util.Assert;
|
||||
* @author Rossen Stoyanchev
|
||||
* @since 5.0
|
||||
*/
|
||||
public class ServletServerHttpResponse extends AbstractListenerServerHttpResponse {
|
||||
class ServletServerHttpResponse extends AbstractListenerServerHttpResponse {
|
||||
|
||||
private final HttpServletResponse response;
|
||||
|
||||
@@ -84,15 +84,17 @@ public class ServletServerHttpResponse extends AbstractListenerServerHttpRespons
|
||||
}
|
||||
|
||||
|
||||
public HttpServletResponse getServletResponse() {
|
||||
return this.response;
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public <T> T getNativeResponse() {
|
||||
return (T) this.response;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void applyStatusCode() {
|
||||
HttpStatus statusCode = this.getStatusCode();
|
||||
if (statusCode != null) {
|
||||
getServletResponse().setStatus(statusCode.value());
|
||||
this.response.setStatus(statusCode.value());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -19,6 +19,8 @@ package org.springframework.http.server.reactive;
|
||||
import java.io.IOException;
|
||||
import java.nio.ByteBuffer;
|
||||
import javax.servlet.AsyncContext;
|
||||
import javax.servlet.ServletRequest;
|
||||
import javax.servlet.ServletResponse;
|
||||
import javax.servlet.annotation.WebServlet;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
@@ -69,7 +71,8 @@ public class TomcatHttpHandlerAdapter extends ServletHttpHandlerAdapter {
|
||||
ByteBuffer byteBuffer = buffer.asByteBuffer();
|
||||
byteBuffer.limit(byteBuffer.capacity());
|
||||
|
||||
int read = ((CoyoteInputStream) getServletRequest().getInputStream()).read(byteBuffer);
|
||||
ServletRequest request = getNativeRequest();
|
||||
int read = ((CoyoteInputStream) request.getInputStream()).read(byteBuffer);
|
||||
if (logger.isTraceEnabled()) {
|
||||
logger.trace("read:" + read);
|
||||
}
|
||||
@@ -95,7 +98,8 @@ public class TomcatHttpHandlerAdapter extends ServletHttpHandlerAdapter {
|
||||
protected int writeToOutputStream(DataBuffer dataBuffer) throws IOException {
|
||||
ByteBuffer input = dataBuffer.asByteBuffer();
|
||||
int len = input.remaining();
|
||||
((CoyoteOutputStream) getServletResponse().getOutputStream()).write(input);
|
||||
ServletResponse response = getNativeResponse();
|
||||
((CoyoteOutputStream) response.getOutputStream()).write(input);
|
||||
return len;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,7 +46,7 @@ import org.springframework.util.StringUtils;
|
||||
* @author Rossen Stoyanchev
|
||||
* @since 5.0
|
||||
*/
|
||||
public class UndertowServerHttpRequest extends AbstractServerHttpRequest {
|
||||
class UndertowServerHttpRequest extends AbstractServerHttpRequest {
|
||||
|
||||
private final HttpServerExchange exchange;
|
||||
|
||||
@@ -76,14 +76,9 @@ public class UndertowServerHttpRequest extends AbstractServerHttpRequest {
|
||||
return headers;
|
||||
}
|
||||
|
||||
|
||||
public HttpServerExchange getUndertowExchange() {
|
||||
return this.exchange;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMethodValue() {
|
||||
return this.getUndertowExchange().getRequestMethod().toString();
|
||||
return this.exchange.getRequestMethod().toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -107,6 +102,12 @@ public class UndertowServerHttpRequest extends AbstractServerHttpRequest {
|
||||
return Flux.from(this.body);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public <T> T getNativeRequest() {
|
||||
return (T) this.exchange;
|
||||
}
|
||||
|
||||
|
||||
private static class RequestBodyPublisher extends AbstractListenerReadPublisher<DataBuffer> {
|
||||
|
||||
|
||||
@@ -51,8 +51,7 @@ import org.springframework.util.Assert;
|
||||
* @author Arjen Poutsma
|
||||
* @since 5.0
|
||||
*/
|
||||
public class UndertowServerHttpResponse extends AbstractListenerServerHttpResponse
|
||||
implements ZeroCopyHttpOutputMessage {
|
||||
class UndertowServerHttpResponse extends AbstractListenerServerHttpResponse implements ZeroCopyHttpOutputMessage {
|
||||
|
||||
private final HttpServerExchange exchange;
|
||||
|
||||
@@ -67,8 +66,10 @@ public class UndertowServerHttpResponse extends AbstractListenerServerHttpRespon
|
||||
}
|
||||
|
||||
|
||||
public HttpServerExchange getUndertowExchange() {
|
||||
return this.exchange;
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public <T> T getNativeResponse() {
|
||||
return (T) this.exchange;
|
||||
}
|
||||
|
||||
|
||||
@@ -76,7 +77,7 @@ public class UndertowServerHttpResponse extends AbstractListenerServerHttpRespon
|
||||
protected void applyStatusCode() {
|
||||
HttpStatus statusCode = this.getStatusCode();
|
||||
if (statusCode != null) {
|
||||
getUndertowExchange().setStatusCode(statusCode.value());
|
||||
this.exchange.setStatusCode(statusCode.value());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -115,7 +116,7 @@ public class UndertowServerHttpResponse extends AbstractListenerServerHttpRespon
|
||||
FileChannel source = null;
|
||||
try {
|
||||
source = FileChannel.open(file.toPath(), StandardOpenOption.READ);
|
||||
StreamSinkChannel destination = getUndertowExchange().getResponseChannel();
|
||||
StreamSinkChannel destination = this.exchange.getResponseChannel();
|
||||
Channels.transferBlocking(destination, source, position, count);
|
||||
return Mono.empty();
|
||||
}
|
||||
|
||||
@@ -43,7 +43,7 @@ import org.springframework.util.MultiValueMap;
|
||||
* @author Stephane Maldini
|
||||
* @since 5.0
|
||||
*/
|
||||
public class RxNettyServerHttpRequest extends AbstractServerHttpRequest {
|
||||
class RxNettyServerHttpRequest extends AbstractServerHttpRequest {
|
||||
|
||||
private final HttpServerRequest<ByteBuf> request;
|
||||
|
||||
@@ -88,10 +88,6 @@ public class RxNettyServerHttpRequest extends AbstractServerHttpRequest {
|
||||
}
|
||||
|
||||
|
||||
public HttpServerRequest<ByteBuf> getRxNettyRequest() {
|
||||
return this.request;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMethodValue() {
|
||||
return this.request.getHttpMethod().name();
|
||||
@@ -120,4 +116,9 @@ public class RxNettyServerHttpRequest extends AbstractServerHttpRequest {
|
||||
return Flux.from(RxReactiveStreams.toPublisher(content));
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public <T> T getNativeRequest() {
|
||||
return (T) this.request;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -45,7 +45,7 @@ import org.springframework.util.Assert;
|
||||
* @author Sebastien Deleuze
|
||||
* @since 5.0
|
||||
*/
|
||||
public class RxNettyServerHttpResponse extends AbstractServerHttpResponse {
|
||||
class RxNettyServerHttpResponse extends AbstractServerHttpResponse {
|
||||
|
||||
private static final ByteBuf FLUSH_SIGNAL = Unpooled.buffer(0, 0);
|
||||
|
||||
@@ -63,8 +63,10 @@ public class RxNettyServerHttpResponse extends AbstractServerHttpResponse {
|
||||
}
|
||||
|
||||
|
||||
public HttpServerResponse<?> getRxNettyResponse() {
|
||||
return this.response;
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public <T> T getNativeResponse() {
|
||||
return (T) this.response;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -32,7 +32,9 @@ import org.springframework.core.io.buffer.DefaultDataBufferFactory;
|
||||
import org.springframework.http.ResponseCookie;
|
||||
|
||||
import static junit.framework.TestCase.assertTrue;
|
||||
import static org.junit.Assert.*;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertSame;
|
||||
|
||||
/**
|
||||
* @author Rossen Stoyanchev
|
||||
@@ -152,6 +154,11 @@ public class ServerHttpResponseTests {
|
||||
super(new DefaultDataBufferFactory());
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> T getNativeResponse() {
|
||||
throw new IllegalStateException("This is a mock. No running server, no native response.");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void applyStatusCode() {
|
||||
assertFalse(this.statusCodeWritten);
|
||||
|
||||
@@ -102,6 +102,11 @@ public class MockServerHttpRequest extends AbstractServerHttpRequest {
|
||||
return this.cookies;
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> T getNativeRequest() {
|
||||
throw new IllegalStateException("This is a mock. No running server, no native request.");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Shortcut to wrap the request with a {@code MockServerWebExchange}.
|
||||
|
||||
@@ -76,6 +76,11 @@ public class MockServerHttpResponse extends AbstractServerHttpResponse {
|
||||
this.writeHandler = writeHandler;
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> T getNativeResponse() {
|
||||
throw new IllegalStateException("This is a mock. No running server, no native response.");
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void applyStatusCode() {
|
||||
|
||||
@@ -28,10 +28,10 @@ import reactor.core.publisher.Mono;
|
||||
import org.springframework.context.Lifecycle;
|
||||
import org.springframework.core.NamedThreadLocal;
|
||||
import org.springframework.core.io.buffer.DataBufferFactory;
|
||||
import org.springframework.http.server.reactive.AbstractServerHttpRequest;
|
||||
import org.springframework.http.server.reactive.AbstractServerHttpResponse;
|
||||
import org.springframework.http.server.reactive.ServerHttpRequest;
|
||||
import org.springframework.http.server.reactive.ServerHttpResponse;
|
||||
import org.springframework.http.server.reactive.ServletServerHttpRequest;
|
||||
import org.springframework.http.server.reactive.ServletServerHttpResponse;
|
||||
import org.springframework.lang.Nullable;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.web.reactive.socket.HandshakeInfo;
|
||||
@@ -149,13 +149,13 @@ public class JettyRequestUpgradeStrategy implements RequestUpgradeStrategy, Life
|
||||
}
|
||||
|
||||
private HttpServletRequest getHttpServletRequest(ServerHttpRequest request) {
|
||||
Assert.isInstanceOf(ServletServerHttpRequest.class, request, "ServletServerHttpRequest required");
|
||||
return ((ServletServerHttpRequest) request).getServletRequest();
|
||||
Assert.isInstanceOf(AbstractServerHttpRequest.class, request, "ServletServerHttpRequest required");
|
||||
return ((AbstractServerHttpRequest) request).getNativeRequest();
|
||||
}
|
||||
|
||||
private HttpServletResponse getHttpServletResponse(ServerHttpResponse response) {
|
||||
Assert.isInstanceOf(ServletServerHttpResponse.class, response, "ServletServerHttpResponse required");
|
||||
return ((ServletServerHttpResponse) response).getServletResponse();
|
||||
Assert.isInstanceOf(AbstractServerHttpResponse.class, response, "ServletServerHttpResponse required");
|
||||
return ((AbstractServerHttpResponse) response).getNativeResponse();
|
||||
}
|
||||
|
||||
private HandshakeInfo getHandshakeInfo(ServerWebExchange exchange, @Nullable String protocol) {
|
||||
|
||||
@@ -19,10 +19,12 @@ package org.springframework.web.reactive.socket.server.upgrade;
|
||||
import java.security.Principal;
|
||||
|
||||
import reactor.core.publisher.Mono;
|
||||
import reactor.ipc.netty.http.server.HttpServerResponse;
|
||||
|
||||
import org.springframework.core.io.buffer.NettyDataBufferFactory;
|
||||
import org.springframework.http.server.reactive.ReactorServerHttpResponse;
|
||||
import org.springframework.http.server.reactive.AbstractServerHttpResponse;
|
||||
import org.springframework.http.server.reactive.ServerHttpRequest;
|
||||
import org.springframework.http.server.reactive.ServerHttpResponse;
|
||||
import org.springframework.lang.Nullable;
|
||||
import org.springframework.web.reactive.socket.HandshakeInfo;
|
||||
import org.springframework.web.reactive.socket.WebSocketHandler;
|
||||
@@ -40,11 +42,12 @@ public class ReactorNettyRequestUpgradeStrategy implements RequestUpgradeStrateg
|
||||
|
||||
@Override
|
||||
public Mono<Void> upgrade(ServerWebExchange exchange, WebSocketHandler handler, @Nullable String subProtocol) {
|
||||
ReactorServerHttpResponse response = (ReactorServerHttpResponse) exchange.getResponse();
|
||||
ServerHttpResponse response = exchange.getResponse();
|
||||
HttpServerResponse nativeResponse = ((AbstractServerHttpResponse) response).getNativeResponse();
|
||||
HandshakeInfo info = getHandshakeInfo(exchange, subProtocol);
|
||||
NettyDataBufferFactory bufferFactory = (NettyDataBufferFactory) response.bufferFactory();
|
||||
|
||||
return response.getReactorResponse().sendWebsocket(subProtocol,
|
||||
return nativeResponse.sendWebsocket(subProtocol,
|
||||
(in, out) -> handler.handle(new ReactorNettyWebSocketSession(in, out, info, bufferFactory)));
|
||||
}
|
||||
|
||||
|
||||
@@ -28,10 +28,10 @@ import org.apache.tomcat.websocket.server.WsServerContainer;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
import org.springframework.core.io.buffer.DataBufferFactory;
|
||||
import org.springframework.http.server.reactive.AbstractServerHttpRequest;
|
||||
import org.springframework.http.server.reactive.AbstractServerHttpResponse;
|
||||
import org.springframework.http.server.reactive.ServerHttpRequest;
|
||||
import org.springframework.http.server.reactive.ServerHttpResponse;
|
||||
import org.springframework.http.server.reactive.ServletServerHttpRequest;
|
||||
import org.springframework.http.server.reactive.ServletServerHttpResponse;
|
||||
import org.springframework.lang.Nullable;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.web.reactive.socket.HandshakeInfo;
|
||||
@@ -83,13 +83,13 @@ public class TomcatRequestUpgradeStrategy implements RequestUpgradeStrategy {
|
||||
}
|
||||
|
||||
private HttpServletRequest getHttpServletRequest(ServerHttpRequest request) {
|
||||
Assert.isInstanceOf(ServletServerHttpRequest.class, request, "ServletServerHttpRequest required");
|
||||
return ((ServletServerHttpRequest) request).getServletRequest();
|
||||
Assert.isInstanceOf(AbstractServerHttpRequest.class, request, "ServletServerHttpRequest required");
|
||||
return ((AbstractServerHttpRequest) request).getNativeRequest();
|
||||
}
|
||||
|
||||
private HttpServletResponse getHttpServletResponse(ServerHttpResponse response) {
|
||||
Assert.isInstanceOf(ServletServerHttpResponse.class, response, "ServletServerHttpResponse required");
|
||||
return ((ServletServerHttpResponse) response).getServletResponse();
|
||||
Assert.isInstanceOf(AbstractServerHttpResponse.class, response, "ServletServerHttpResponse required");
|
||||
return ((AbstractServerHttpResponse) response).getNativeResponse();
|
||||
}
|
||||
|
||||
private HandshakeInfo getHandshakeInfo(ServerWebExchange exchange, @Nullable String protocol) {
|
||||
|
||||
@@ -33,8 +33,8 @@ import reactor.core.publisher.Mono;
|
||||
|
||||
import org.springframework.core.io.buffer.DataBufferFactory;
|
||||
import org.springframework.http.HttpHeaders;
|
||||
import org.springframework.http.server.reactive.AbstractServerHttpRequest;
|
||||
import org.springframework.http.server.reactive.ServerHttpRequest;
|
||||
import org.springframework.http.server.reactive.UndertowServerHttpRequest;
|
||||
import org.springframework.lang.Nullable;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.web.reactive.socket.HandshakeInfo;
|
||||
@@ -55,8 +55,8 @@ public class UndertowRequestUpgradeStrategy implements RequestUpgradeStrategy {
|
||||
@Override
|
||||
public Mono<Void> upgrade(ServerWebExchange exchange, WebSocketHandler handler, @Nullable String subProtocol) {
|
||||
ServerHttpRequest request = exchange.getRequest();
|
||||
Assert.isInstanceOf(UndertowServerHttpRequest.class, request, "UndertowServerHttpRequest required");
|
||||
HttpServerExchange httpExchange = ((UndertowServerHttpRequest) request).getUndertowExchange();
|
||||
Assert.isInstanceOf(AbstractServerHttpRequest.class, request);
|
||||
HttpServerExchange httpExchange = ((AbstractServerHttpRequest) request).getNativeRequest();
|
||||
|
||||
Set<String> protocols = (subProtocol != null ? Collections.singleton(subProtocol) : Collections.emptySet());
|
||||
Hybi13Handshake handshake = new Hybi13Handshake(protocols, false);
|
||||
|
||||
@@ -25,8 +25,9 @@ import reactor.core.publisher.Mono;
|
||||
import rx.RxReactiveStreams;
|
||||
|
||||
import org.springframework.core.io.buffer.NettyDataBufferFactory;
|
||||
import org.springframework.http.server.reactive.RxNettyServerHttpResponse;
|
||||
import org.springframework.http.server.reactive.AbstractServerHttpResponse;
|
||||
import org.springframework.http.server.reactive.ServerHttpRequest;
|
||||
import org.springframework.http.server.reactive.ServerHttpResponse;
|
||||
import org.springframework.lang.Nullable;
|
||||
import org.springframework.web.reactive.socket.HandshakeInfo;
|
||||
import org.springframework.web.reactive.socket.WebSocketHandler;
|
||||
@@ -45,8 +46,8 @@ public class RxNettyRequestUpgradeStrategy implements RequestUpgradeStrategy {
|
||||
|
||||
@Override
|
||||
public Mono<Void> upgrade(ServerWebExchange exchange, WebSocketHandler handler, @Nullable String subProtocol) {
|
||||
RxNettyServerHttpResponse response = (RxNettyServerHttpResponse) exchange.getResponse();
|
||||
HttpServerResponse<?> rxNettyResponse = response.getRxNettyResponse();
|
||||
ServerHttpResponse response = exchange.getResponse();
|
||||
HttpServerResponse<?> rxNettyResponse = ((AbstractServerHttpResponse) response).getNativeResponse();
|
||||
|
||||
HandshakeInfo info = getHandshakeInfo(exchange, subProtocol);
|
||||
NettyDataBufferFactory factory = (NettyDataBufferFactory) response.bufferFactory();
|
||||
|
||||
Reference in New Issue
Block a user