From 223e27d53d72af3f639f0718a9d1f2e4608e0d14 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Fri, 29 Sep 2017 12:46:32 -0400 Subject: [PATCH] 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. --- .../reactive/MockServerHttpRequest.java | 4 +++ .../reactive/MockServerHttpResponse.java | 5 ++++ .../reactive/ReactorClientHttpRequest.java | 2 +- .../reactive/ReactorClientHttpResponse.java | 2 +- .../reactive/AbstractServerHttpRequest.java | 7 +++++ .../reactive/AbstractServerHttpResponse.java | 8 ++++++ .../DefaultServerHttpRequestBuilder.java | 26 ++++++++++++++++--- .../reactive/JettyHttpHandlerAdapter.java | 4 ++- .../reactive/ReactorServerHttpRequest.java | 13 +++++----- .../reactive/ReactorServerHttpResponse.java | 10 ++++--- .../reactive/ServletServerHttpRequest.java | 14 +++++----- .../reactive/ServletServerHttpResponse.java | 10 ++++--- .../reactive/TomcatHttpHandlerAdapter.java | 8 ++++-- .../reactive/UndertowServerHttpRequest.java | 15 ++++++----- .../reactive/UndertowServerHttpResponse.java | 13 +++++----- .../reactive/RxNettyServerHttpRequest.java | 11 ++++---- .../reactive/RxNettyServerHttpResponse.java | 8 +++--- .../reactive/ServerHttpResponseTests.java | 9 ++++++- .../reactive/test/MockServerHttpRequest.java | 5 ++++ .../reactive/test/MockServerHttpResponse.java | 5 ++++ .../upgrade/JettyRequestUpgradeStrategy.java | 12 ++++----- .../ReactorNettyRequestUpgradeStrategy.java | 9 ++++--- .../upgrade/TomcatRequestUpgradeStrategy.java | 12 ++++----- .../UndertowRequestUpgradeStrategy.java | 6 ++--- .../RxNettyRequestUpgradeStrategy.java | 7 ++--- 25 files changed, 153 insertions(+), 72 deletions(-) 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 548023d2ec2..faedbf4339e 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 29eb02b1ae4..14665c9c93a 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 aa20db21b12..3302bc79abc 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 312432f3468..f1151b21f0d 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 25f24d28928..163d260f1cb 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 c786c198f25..359c1de48ab 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 75e247d418a..8de8d443007 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 239fed09838..f08231cee7e 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 fecf6d1795c..9fe5813a14a 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 801035ce9e3..b3379e29f65 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 3a984ed9ab0..e230f203fe1 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 05af6af643c..e628383db1f 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 14bddfe4cdd..a42e9f02b17 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 1fd119d6de1..a12146c364f 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 854fa4c5a8b..69dedd8557e 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 8388279a4a4..d71bea1e38b 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 020e0fa4950..cb188af77b9 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 acf0b364d90..fb3c6ab5125 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 591381b329d..7abeef325e7 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 77efa5c48fd..4aee940e787 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 93ec04797cb..b073a1861d8 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 76502cca0d7..556abfe3592 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 541ae7df51b..030ee334ee2 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 06aa90a97d6..663cabf0385 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 a147dd195bd..4276e38204e 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();