diff --git a/spring-test/src/main/java/org/springframework/mock/http/server/reactive/MockServerHttpRequest.java b/spring-test/src/main/java/org/springframework/mock/http/server/reactive/MockServerHttpRequest.java index 548023d2ec..faedbf4339 100644 --- a/spring-test/src/main/java/org/springframework/mock/http/server/reactive/MockServerHttpRequest.java +++ b/spring-test/src/main/java/org/springframework/mock/http/server/reactive/MockServerHttpRequest.java @@ -103,6 +103,10 @@ public class MockServerHttpRequest extends AbstractServerHttpRequest { return this.cookies; } + @Override + public T getNativeRequest() { + throw new IllegalStateException("This is a mock. No running server, no native request."); + } /** * Shortcut to wrap the request with a {@code MockServerWebExchange}. 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 29eb02b1ae..14665c9c93 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 @@ -76,6 +76,11 @@ public class MockServerHttpResponse extends AbstractServerHttpResponse { this.writeHandler = writeHandler; } + @Override + public T getNativeResponse() { + throw new IllegalStateException("This is a mock. No running server, no native response."); + } + @Override protected void applyStatusCode() { diff --git a/spring-web/src/main/java/org/springframework/http/client/reactive/ReactorClientHttpRequest.java b/spring-web/src/main/java/org/springframework/http/client/reactive/ReactorClientHttpRequest.java index aa20db21b1..3302bc79ab 100644 --- a/spring-web/src/main/java/org/springframework/http/client/reactive/ReactorClientHttpRequest.java +++ b/spring-web/src/main/java/org/springframework/http/client/reactive/ReactorClientHttpRequest.java @@ -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; diff --git a/spring-web/src/main/java/org/springframework/http/client/reactive/ReactorClientHttpResponse.java b/spring-web/src/main/java/org/springframework/http/client/reactive/ReactorClientHttpResponse.java index 312432f346..f1151b21f0 100644 --- a/spring-web/src/main/java/org/springframework/http/client/reactive/ReactorClientHttpResponse.java +++ b/spring-web/src/main/java/org/springframework/http/client/reactive/ReactorClientHttpResponse.java @@ -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; diff --git a/spring-web/src/main/java/org/springframework/http/server/reactive/AbstractServerHttpRequest.java b/spring-web/src/main/java/org/springframework/http/server/reactive/AbstractServerHttpRequest.java index 25f24d2892..163d260f1c 100644 --- a/spring-web/src/main/java/org/springframework/http/server/reactive/AbstractServerHttpRequest.java +++ b/spring-web/src/main/java/org/springframework/http/server/reactive/AbstractServerHttpRequest.java @@ -152,4 +152,11 @@ public abstract class AbstractServerHttpRequest implements ServerHttpRequest { */ protected abstract MultiValueMap initCookies(); + /** + * Return the underlying server response. + *

Note: This is exposed mainly for internal framework + * use such as WebSocket upgrades in the spring-webflux module. + */ + public abstract T getNativeRequest(); + } diff --git a/spring-web/src/main/java/org/springframework/http/server/reactive/AbstractServerHttpResponse.java b/spring-web/src/main/java/org/springframework/http/server/reactive/AbstractServerHttpResponse.java index c786c198f2..359c1de48a 100644 --- a/spring-web/src/main/java/org/springframework/http/server/reactive/AbstractServerHttpResponse.java +++ b/spring-web/src/main/java/org/springframework/http/server/reactive/AbstractServerHttpResponse.java @@ -132,6 +132,14 @@ public abstract class AbstractServerHttpResponse implements ServerHttpResponse { } } + /** + * Return the underlying server response. + *

Note: This is exposed mainly for internal framework + * use such as WebSocket upgrades in the spring-webflux module. + */ + public abstract T getNativeResponse(); + + @Override public void beforeCommit(Supplier> action) { this.commitActions.add(action); diff --git a/spring-web/src/main/java/org/springframework/http/server/reactive/DefaultServerHttpRequestBuilder.java b/spring-web/src/main/java/org/springframework/http/server/reactive/DefaultServerHttpRequestBuilder.java index 75e247d418..8de8d44300 100644 --- a/spring-web/src/main/java/org/springframework/http/server/reactive/DefaultServerHttpRequestBuilder.java +++ b/spring-web/src/main/java/org/springframework/http/server/reactive/DefaultServerHttpRequestBuilder.java @@ -63,6 +63,9 @@ class DefaultServerHttpRequestBuilder implements ServerHttpRequest.Builder { private Flux 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 void copyMultiValueMap(MultiValueMap 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 body; + private final ServerHttpRequest originalRequest; + + public DefaultServerHttpRequest(URI uri, @Nullable String contextPath, - HttpHeaders headers, String methodValue, - MultiValueMap cookies, @Nullable InetSocketAddress remoteAddress, - Flux body) { + HttpHeaders headers, String methodValue, MultiValueMap cookies, + @Nullable InetSocketAddress remoteAddress, + Flux 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 getBody() { return this.body; } + + @SuppressWarnings("unchecked") + @Override + public T getNativeRequest() { + return (T) this.originalRequest; + } } } diff --git a/spring-web/src/main/java/org/springframework/http/server/reactive/JettyHttpHandlerAdapter.java b/spring-web/src/main/java/org/springframework/http/server/reactive/JettyHttpHandlerAdapter.java index 239fed0983..f08231cee7 100644 --- a/spring-web/src/main/java/org/springframework/http/server/reactive/JettyHttpHandlerAdapter.java +++ b/spring-web/src/main/java/org/springframework/http/server/reactive/JettyHttpHandlerAdapter.java @@ -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; } } diff --git a/spring-web/src/main/java/org/springframework/http/server/reactive/ReactorServerHttpRequest.java b/spring-web/src/main/java/org/springframework/http/server/reactive/ReactorServerHttpRequest.java index fecf6d1795..9fe5813a14 100644 --- a/spring-web/src/main/java/org/springframework/http/server/reactive/ReactorServerHttpRequest.java +++ b/spring-web/src/main/java/org/springframework/http/server/reactive/ReactorServerHttpRequest.java @@ -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 getNativeRequest() { + return (T) this.request; + } + } diff --git a/spring-web/src/main/java/org/springframework/http/server/reactive/ReactorServerHttpResponse.java b/spring-web/src/main/java/org/springframework/http/server/reactive/ReactorServerHttpResponse.java index 801035ce9e..b3379e29f6 100644 --- a/spring-web/src/main/java/org/springframework/http/server/reactive/ReactorServerHttpResponse.java +++ b/spring-web/src/main/java/org/springframework/http/server/reactive/ReactorServerHttpResponse.java @@ -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 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())); } } diff --git a/spring-web/src/main/java/org/springframework/http/server/reactive/ServletServerHttpRequest.java b/spring-web/src/main/java/org/springframework/http/server/reactive/ServletServerHttpRequest.java index 3a984ed9ab..e230f203fe 100644 --- a/spring-web/src/main/java/org/springframework/http/server/reactive/ServletServerHttpRequest.java +++ b/spring-web/src/main/java/org/springframework/http/server/reactive/ServletServerHttpRequest.java @@ -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 getNativeRequest() { + return (T) this.request; + } + private final class RequestAsyncListener implements AsyncListener { diff --git a/spring-web/src/main/java/org/springframework/http/server/reactive/ServletServerHttpResponse.java b/spring-web/src/main/java/org/springframework/http/server/reactive/ServletServerHttpResponse.java index 05af6af643..e628383db1 100644 --- a/spring-web/src/main/java/org/springframework/http/server/reactive/ServletServerHttpResponse.java +++ b/spring-web/src/main/java/org/springframework/http/server/reactive/ServletServerHttpResponse.java @@ -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 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()); } } diff --git a/spring-web/src/main/java/org/springframework/http/server/reactive/TomcatHttpHandlerAdapter.java b/spring-web/src/main/java/org/springframework/http/server/reactive/TomcatHttpHandlerAdapter.java index 14bddfe4cd..a42e9f02b1 100644 --- a/spring-web/src/main/java/org/springframework/http/server/reactive/TomcatHttpHandlerAdapter.java +++ b/spring-web/src/main/java/org/springframework/http/server/reactive/TomcatHttpHandlerAdapter.java @@ -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; } } diff --git a/spring-web/src/main/java/org/springframework/http/server/reactive/UndertowServerHttpRequest.java b/spring-web/src/main/java/org/springframework/http/server/reactive/UndertowServerHttpRequest.java index 1fd119d6de..a12146c364 100644 --- a/spring-web/src/main/java/org/springframework/http/server/reactive/UndertowServerHttpRequest.java +++ b/spring-web/src/main/java/org/springframework/http/server/reactive/UndertowServerHttpRequest.java @@ -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 getNativeRequest() { + return (T) this.exchange; + } + private static class RequestBodyPublisher extends AbstractListenerReadPublisher { diff --git a/spring-web/src/main/java/org/springframework/http/server/reactive/UndertowServerHttpResponse.java b/spring-web/src/main/java/org/springframework/http/server/reactive/UndertowServerHttpResponse.java index 854fa4c5a8..69dedd8557 100644 --- a/spring-web/src/main/java/org/springframework/http/server/reactive/UndertowServerHttpResponse.java +++ b/spring-web/src/main/java/org/springframework/http/server/reactive/UndertowServerHttpResponse.java @@ -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 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(); } diff --git a/spring-web/src/test/java/org/springframework/http/server/reactive/RxNettyServerHttpRequest.java b/spring-web/src/test/java/org/springframework/http/server/reactive/RxNettyServerHttpRequest.java index 8388279a4a..d71bea1e38 100644 --- a/spring-web/src/test/java/org/springframework/http/server/reactive/RxNettyServerHttpRequest.java +++ b/spring-web/src/test/java/org/springframework/http/server/reactive/RxNettyServerHttpRequest.java @@ -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 request; @@ -88,10 +88,6 @@ public class RxNettyServerHttpRequest extends AbstractServerHttpRequest { } - public HttpServerRequest 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 getNativeRequest() { + return (T) this.request; + } } diff --git a/spring-web/src/test/java/org/springframework/http/server/reactive/RxNettyServerHttpResponse.java b/spring-web/src/test/java/org/springframework/http/server/reactive/RxNettyServerHttpResponse.java index 020e0fa495..cb188af77b 100644 --- a/spring-web/src/test/java/org/springframework/http/server/reactive/RxNettyServerHttpResponse.java +++ b/spring-web/src/test/java/org/springframework/http/server/reactive/RxNettyServerHttpResponse.java @@ -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 getNativeResponse() { + return (T) this.response; } diff --git a/spring-web/src/test/java/org/springframework/http/server/reactive/ServerHttpResponseTests.java b/spring-web/src/test/java/org/springframework/http/server/reactive/ServerHttpResponseTests.java index acf0b364d9..fb3c6ab512 100644 --- a/spring-web/src/test/java/org/springframework/http/server/reactive/ServerHttpResponseTests.java +++ b/spring-web/src/test/java/org/springframework/http/server/reactive/ServerHttpResponseTests.java @@ -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 getNativeResponse() { + throw new IllegalStateException("This is a mock. No running server, no native response."); + } + @Override public void applyStatusCode() { assertFalse(this.statusCodeWritten); 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 591381b329..7abeef325e 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 @@ -102,6 +102,11 @@ public class MockServerHttpRequest extends AbstractServerHttpRequest { return this.cookies; } + @Override + public T getNativeRequest() { + throw new IllegalStateException("This is a mock. No running server, no native request."); + } + /** * Shortcut to wrap the request with a {@code MockServerWebExchange}. 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 77efa5c48f..4aee940e78 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 @@ -76,6 +76,11 @@ public class MockServerHttpResponse extends AbstractServerHttpResponse { this.writeHandler = writeHandler; } + @Override + public T getNativeResponse() { + throw new IllegalStateException("This is a mock. No running server, no native response."); + } + @Override protected void applyStatusCode() { diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/socket/server/upgrade/JettyRequestUpgradeStrategy.java b/spring-webflux/src/main/java/org/springframework/web/reactive/socket/server/upgrade/JettyRequestUpgradeStrategy.java index 93ec04797c..b073a1861d 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/socket/server/upgrade/JettyRequestUpgradeStrategy.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/socket/server/upgrade/JettyRequestUpgradeStrategy.java @@ -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) { diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/socket/server/upgrade/ReactorNettyRequestUpgradeStrategy.java b/spring-webflux/src/main/java/org/springframework/web/reactive/socket/server/upgrade/ReactorNettyRequestUpgradeStrategy.java index 76502cca0d..556abfe359 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/socket/server/upgrade/ReactorNettyRequestUpgradeStrategy.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/socket/server/upgrade/ReactorNettyRequestUpgradeStrategy.java @@ -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 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))); } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/socket/server/upgrade/TomcatRequestUpgradeStrategy.java b/spring-webflux/src/main/java/org/springframework/web/reactive/socket/server/upgrade/TomcatRequestUpgradeStrategy.java index 541ae7df51..030ee334ee 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/socket/server/upgrade/TomcatRequestUpgradeStrategy.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/socket/server/upgrade/TomcatRequestUpgradeStrategy.java @@ -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) { diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/socket/server/upgrade/UndertowRequestUpgradeStrategy.java b/spring-webflux/src/main/java/org/springframework/web/reactive/socket/server/upgrade/UndertowRequestUpgradeStrategy.java index 06aa90a97d..663cabf038 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/socket/server/upgrade/UndertowRequestUpgradeStrategy.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/socket/server/upgrade/UndertowRequestUpgradeStrategy.java @@ -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 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 protocols = (subProtocol != null ? Collections.singleton(subProtocol) : Collections.emptySet()); Hybi13Handshake handshake = new Hybi13Handshake(protocols, false); diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/socket/server/upgrade/RxNettyRequestUpgradeStrategy.java b/spring-webflux/src/test/java/org/springframework/web/reactive/socket/server/upgrade/RxNettyRequestUpgradeStrategy.java index a147dd195b..4276e38204 100644 --- a/spring-webflux/src/test/java/org/springframework/web/reactive/socket/server/upgrade/RxNettyRequestUpgradeStrategy.java +++ b/spring-webflux/src/test/java/org/springframework/web/reactive/socket/server/upgrade/RxNettyRequestUpgradeStrategy.java @@ -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 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();