From bab3b6fd1c4946cdba59aca365aba1a7f4ca6033 Mon Sep 17 00:00:00 2001 From: Arjen Poutsma Date: Tue, 13 Oct 2015 12:33:26 +0200 Subject: [PATCH] Introduce HttpMessage hierarchy This commit introduces "reactive" sub-interfaces of the HttpMessage interface found in the Spring Framework. --- .../ReactiveHttpInputMessage.java} | 15 +++-- .../http/ReactiveHttpOutputMessage.java | 41 +++++++++++++ .../client/ReactiveClientHttpRequest.java} | 16 +++-- .../client/ReactiveClientHttpResponse.java | 59 +++++++++++++++++++ .../server/ReactiveServerHttpRequest.java} | 14 +++-- .../server/ReactiveServerHttpResponse.java} | 32 ++++------ .../web/dispatch/DispatcherHandler.java | 20 ++++--- .../reactive/web/dispatch/HandlerAdapter.java | 7 ++- .../reactive/web/dispatch/HandlerMapping.java | 5 +- .../web/dispatch/HandlerResultHandler.java | 7 ++- .../dispatch/SimpleHandlerResultHandler.java | 7 +-- .../dispatch/handler/HttpHandlerAdapter.java | 8 +-- .../handler/SimpleUrlHandlerMapping.java | 6 +- .../method/HandlerMethodArgumentResolver.java | 6 +- .../method/InvocableHandlerMethod.java | 6 +- .../RequestBodyArgumentResolver.java | 34 +++++++---- .../RequestMappingHandlerAdapter.java | 7 ++- .../RequestMappingHandlerMapping.java | 5 +- .../RequestParamArgumentResolver.java | 5 +- .../annotation/ResponseBodyResultHandler.java | 39 +++++++----- .../reactive/web/http/HttpHandler.java | 8 ++- .../reactor/ReactorServerHttpRequest.java | 16 ++++- .../reactor/ReactorServerHttpResponse.java | 4 +- .../rxnetty/RxNettyServerHttpRequest.java | 19 +++--- .../rxnetty/RxNettyServerHttpResponse.java | 13 ++-- .../servlet/ServletServerHttpRequest.java | 6 +- .../servlet/ServletServerHttpResponse.java | 8 +-- ...mpleUrlHandlerMappingIntegrationTests.java | 13 ++-- .../RequestMappingHandlerMappingTests.java | 11 ++-- .../reactive/web/http/EchoHandler.java | 7 ++- .../reactive/web/http/RandomHandler.java | 7 ++- .../reactive/web/http/XmlHandler.java | 12 ++-- 32 files changed, 310 insertions(+), 153 deletions(-) rename spring-web-reactive/src/main/java/org/springframework/{reactive/web/http/ServerHttpRequest.java => http/ReactiveHttpInputMessage.java} (60%) create mode 100644 spring-web-reactive/src/main/java/org/springframework/http/ReactiveHttpOutputMessage.java rename spring-web-reactive/src/main/java/org/springframework/{reactive/web/http/HttpRequest.java => http/client/ReactiveClientHttpRequest.java} (66%) create mode 100644 spring-web-reactive/src/main/java/org/springframework/http/client/ReactiveClientHttpResponse.java rename spring-web-reactive/src/main/java/org/springframework/{reactive/web/http/HttpMessage.java => http/server/ReactiveServerHttpRequest.java} (66%) rename spring-web-reactive/src/main/java/org/springframework/{reactive/web/http/ServerHttpResponse.java => http/server/ReactiveServerHttpResponse.java} (58%) diff --git a/spring-web-reactive/src/main/java/org/springframework/reactive/web/http/ServerHttpRequest.java b/spring-web-reactive/src/main/java/org/springframework/http/ReactiveHttpInputMessage.java similarity index 60% rename from spring-web-reactive/src/main/java/org/springframework/reactive/web/http/ServerHttpRequest.java rename to spring-web-reactive/src/main/java/org/springframework/http/ReactiveHttpInputMessage.java index dca48dee1cb..8cd4535b6bd 100644 --- a/spring-web-reactive/src/main/java/org/springframework/reactive/web/http/ServerHttpRequest.java +++ b/spring-web-reactive/src/main/java/org/springframework/http/ReactiveHttpInputMessage.java @@ -13,21 +13,26 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.reactive.web.http; + +package org.springframework.http; import java.nio.ByteBuffer; import org.reactivestreams.Publisher; /** - * Represent a server-side HTTP request. + * Represents a "reactive" HTTP input message, consisting of {@linkplain #getHeaders() headers} + * and a readable {@linkplain #getBody() streaming body }. + * + *

Typically implemented by an HTTP request on the server-side, or a response on the client-side. * - * @author Rossen Stoyanchev + * @author Arjen Poutsma */ -public interface ServerHttpRequest extends HttpRequest { +public interface ReactiveHttpInputMessage extends HttpMessage { /** - * Return the body of the message as a reactive stream. + * Return the body of the message as an publisher of {@code ByteBuffer}s. + * @return the body */ Publisher getBody(); diff --git a/spring-web-reactive/src/main/java/org/springframework/http/ReactiveHttpOutputMessage.java b/spring-web-reactive/src/main/java/org/springframework/http/ReactiveHttpOutputMessage.java new file mode 100644 index 00000000000..bbd5022a888 --- /dev/null +++ b/spring-web-reactive/src/main/java/org/springframework/http/ReactiveHttpOutputMessage.java @@ -0,0 +1,41 @@ +/* + * Copyright 2002-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.http; + +import java.nio.ByteBuffer; + +import org.reactivestreams.Publisher; + +/** + * Represents a "reactive" HTTP output message, consisting of {@linkplain #getHeaders() headers} + * and the capability to add a {@linkplain #addBody(Publisher) body}. + * + *

Typically implemented by an HTTP request on the client-side, or a response on the server-side. + * + * @author Arjen Poutsma + */ +public interface ReactiveHttpOutputMessage extends HttpMessage { + + /** + * Adds the given publisher of {@link ByteBuffer}s as a body. A HTTP/1.1 message has + * one body, but HTTP/1.2 supports multiple bodies. + * @param body the body to add + * @return a publisher that indicates completion + */ + Publisher addBody(Publisher body); + +} diff --git a/spring-web-reactive/src/main/java/org/springframework/reactive/web/http/HttpRequest.java b/spring-web-reactive/src/main/java/org/springframework/http/client/ReactiveClientHttpRequest.java similarity index 66% rename from spring-web-reactive/src/main/java/org/springframework/reactive/web/http/HttpRequest.java rename to spring-web-reactive/src/main/java/org/springframework/http/client/ReactiveClientHttpRequest.java index 96767fe2fee..591a0177275 100644 --- a/spring-web-reactive/src/main/java/org/springframework/reactive/web/http/HttpRequest.java +++ b/spring-web-reactive/src/main/java/org/springframework/http/client/ReactiveClientHttpRequest.java @@ -13,19 +13,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.reactive.web.http; -import java.net.URI; +package org.springframework.http.client; -import org.springframework.http.HttpMethod; +import org.springframework.http.HttpRequest; +import org.springframework.http.ReactiveHttpOutputMessage; /** - * @author Rossen Stoyanchev + * Represents a "reactive" client-side HTTP request. + * + * @author Arjen Poutsma */ -public interface HttpRequest extends HttpMessage { - - HttpMethod getMethod(); - - URI getURI(); +public interface ReactiveClientHttpRequest extends HttpRequest, ReactiveHttpOutputMessage { } diff --git a/spring-web-reactive/src/main/java/org/springframework/http/client/ReactiveClientHttpResponse.java b/spring-web-reactive/src/main/java/org/springframework/http/client/ReactiveClientHttpResponse.java new file mode 100644 index 00000000000..b5f619bdc92 --- /dev/null +++ b/spring-web-reactive/src/main/java/org/springframework/http/client/ReactiveClientHttpResponse.java @@ -0,0 +1,59 @@ +/* + * Copyright 2002-2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.http.client; + +import java.io.Closeable; +import java.io.IOException; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ReactiveHttpInputMessage; + +/** + * Represents a "reactive" client-side HTTP response. + * + * @author Arjen Poutsma + */ +public interface ReactiveClientHttpResponse extends ReactiveHttpInputMessage, Closeable { + + /** + * Return the HTTP status code of the response. + * @return the HTTP status as an HttpStatus enum value + * @throws IOException in case of I/O errors + */ + HttpStatus getStatusCode() throws IOException; + + /** + * Return the HTTP status code of the response as integer + * @return the HTTP status as an integer + * @throws IOException in case of I/O errors + */ + int getRawStatusCode() throws IOException; + + /** + * Return the HTTP status text of the response. + * @return the HTTP status text + * @throws IOException in case of I/O errors + */ + String getStatusText() throws IOException; + + /** + * Close this response, freeing any resources created. + */ + @Override + void close(); + +} diff --git a/spring-web-reactive/src/main/java/org/springframework/reactive/web/http/HttpMessage.java b/spring-web-reactive/src/main/java/org/springframework/http/server/ReactiveServerHttpRequest.java similarity index 66% rename from spring-web-reactive/src/main/java/org/springframework/reactive/web/http/HttpMessage.java rename to spring-web-reactive/src/main/java/org/springframework/http/server/ReactiveServerHttpRequest.java index a3c6092d312..4b5d0d1fa2c 100644 --- a/spring-web-reactive/src/main/java/org/springframework/reactive/web/http/HttpMessage.java +++ b/spring-web-reactive/src/main/java/org/springframework/http/server/ReactiveServerHttpRequest.java @@ -13,15 +13,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.reactive.web.http; -import org.springframework.http.HttpHeaders; +package org.springframework.http.server; + +import org.springframework.http.HttpRequest; +import org.springframework.http.ReactiveHttpInputMessage; /** - * @author Rossen Stoyanchev + * Represents a "reactive" server-side HTTP request + * + * @author Arjen Poutsma */ -public interface HttpMessage { - - HttpHeaders getHeaders(); +public interface ReactiveServerHttpRequest extends HttpRequest, ReactiveHttpInputMessage { } diff --git a/spring-web-reactive/src/main/java/org/springframework/reactive/web/http/ServerHttpResponse.java b/spring-web-reactive/src/main/java/org/springframework/http/server/ReactiveServerHttpResponse.java similarity index 58% rename from spring-web-reactive/src/main/java/org/springframework/reactive/web/http/ServerHttpResponse.java rename to spring-web-reactive/src/main/java/org/springframework/http/server/ReactiveServerHttpResponse.java index 1f64f2dd6e0..514592df514 100644 --- a/spring-web-reactive/src/main/java/org/springframework/reactive/web/http/ServerHttpResponse.java +++ b/spring-web-reactive/src/main/java/org/springframework/http/server/ReactiveServerHttpResponse.java @@ -13,23 +13,27 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.reactive.web.http; -import java.nio.ByteBuffer; - -import org.reactivestreams.Publisher; +package org.springframework.http.server; import org.springframework.http.HttpStatus; +import org.reactivestreams.Publisher; +import org.springframework.http.ReactiveHttpOutputMessage; /** - * Represent a server-side HTTP response. + * Represents a "reactive" server-side HTTP response. * - * @author Rossen Stoyanchev + * @author Arjen Poutsma */ -public interface ServerHttpResponse extends HttpMessage { +public interface ReactiveServerHttpResponse + extends ReactiveHttpOutputMessage { + /** + * Set the HTTP status code of the response. + * @param status the HTTP status as an HttpStatus enum value + */ void setStatusCode(HttpStatus status); - + /** * Write the response headers. This method must be invoked to send responses without body. * @return A {@code Publisher} used to signal the demand, and receive a notification @@ -37,16 +41,4 @@ public interface ServerHttpResponse extends HttpMessage { * network. */ Publisher writeHeaders(); - - /** - * Write the provided reactive stream of bytes to the response body. Most servers - * support multiple {@code writeWith} calls. Headers are written automatically - * before the body, so not need to call {@link #writeHeaders()} explicitly. - * @param contentPublisher the stream to write in the response body. - * @return A {@code Publisher} used to signal the demand, and receive a notification - * when the handling is complete (success or error) including the flush of the data on the - * network. - */ - Publisher writeWith(Publisher contentPublisher); - } diff --git a/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/DispatcherHandler.java b/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/DispatcherHandler.java index b50aebff180..89c372946ea 100644 --- a/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/DispatcherHandler.java +++ b/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/DispatcherHandler.java @@ -13,25 +13,27 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.reactive.web.dispatch; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.reactivestreams.Publisher; +import reactor.Publishers; + import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactoryUtils; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.core.annotation.AnnotationAwareOrderComparator; import org.springframework.http.HttpStatus; +import org.springframework.http.server.ReactiveServerHttpRequest; +import org.springframework.http.server.ReactiveServerHttpResponse; import org.springframework.reactive.web.http.HttpHandler; -import org.springframework.reactive.web.http.ServerHttpRequest; -import org.springframework.reactive.web.http.ServerHttpResponse; -import reactor.Publishers; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; /** * Central dispatcher for HTTP request handlers/controllers. Dispatches to registered @@ -91,7 +93,7 @@ public class DispatcherHandler implements HttpHandler, ApplicationContextAware { @Override - public Publisher handle(ServerHttpRequest request, ServerHttpResponse response) { + public Publisher handle(ReactiveServerHttpRequest request, ReactiveServerHttpResponse response) { if (logger.isDebugEnabled()) { logger.debug("Processing " + request.getMethod() + " request for [" + request.getURI() + "]"); @@ -123,7 +125,7 @@ public class DispatcherHandler implements HttpHandler, ApplicationContextAware { } - protected Object getHandler(ServerHttpRequest request) { + protected Object getHandler(ReactiveServerHttpRequest request) { Object handler = null; for (HandlerMapping handlerMapping : this.handlerMappings) { handler = handlerMapping.getHandler(request); diff --git a/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/HandlerAdapter.java b/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/HandlerAdapter.java index 01fc9a9f0ef..91d94204127 100644 --- a/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/HandlerAdapter.java +++ b/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/HandlerAdapter.java @@ -13,10 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.reactive.web.dispatch; -import org.springframework.reactive.web.http.ServerHttpRequest; -import org.springframework.reactive.web.http.ServerHttpResponse; +import org.springframework.http.server.ReactiveServerHttpRequest; +import org.springframework.http.server.ReactiveServerHttpResponse; /** * Interface that must be implemented for each handler type to handle an HTTP request. @@ -52,6 +53,6 @@ public interface HandlerAdapter { * @throws Exception in case of errors * @return An {@link HandlerResult} instance */ - HandlerResult handle(ServerHttpRequest request, ServerHttpResponse response, Object handler) throws Exception; + HandlerResult handle(ReactiveServerHttpRequest request, ReactiveServerHttpResponse response, Object handler) throws Exception; } diff --git a/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/HandlerMapping.java b/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/HandlerMapping.java index e3472eba535..2a087989a7c 100644 --- a/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/HandlerMapping.java +++ b/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/HandlerMapping.java @@ -13,15 +13,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.reactive.web.dispatch; -import org.springframework.reactive.web.http.ServerHttpRequest; +import org.springframework.http.server.ReactiveServerHttpRequest; /** * @author Rossen Stoyanchev */ public interface HandlerMapping { - Object getHandler(ServerHttpRequest request); + Object getHandler(ReactiveServerHttpRequest request); } diff --git a/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/HandlerResultHandler.java b/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/HandlerResultHandler.java index 7a4a9cb23bf..aee3d6eab53 100644 --- a/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/HandlerResultHandler.java +++ b/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/HandlerResultHandler.java @@ -13,12 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.reactive.web.dispatch; import org.reactivestreams.Publisher; -import org.springframework.reactive.web.http.ServerHttpRequest; -import org.springframework.reactive.web.http.ServerHttpResponse; +import org.springframework.http.server.ReactiveServerHttpRequest; +import org.springframework.http.server.ReactiveServerHttpResponse; /** * Process the {@link HandlerResult}, usually returned by an {@link HandlerAdapter}. @@ -47,6 +48,6 @@ public interface HandlerResultHandler { * when the handling is complete (success or error) including the flush of the data on the * network. */ - Publisher handleResult(ServerHttpRequest request, ServerHttpResponse response, HandlerResult result); + Publisher handleResult(ReactiveServerHttpRequest request, ReactiveServerHttpResponse response, HandlerResult result); } \ No newline at end of file diff --git a/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/SimpleHandlerResultHandler.java b/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/SimpleHandlerResultHandler.java index 0e9556eb30f..0fe01b02be3 100644 --- a/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/SimpleHandlerResultHandler.java +++ b/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/SimpleHandlerResultHandler.java @@ -22,8 +22,8 @@ import org.reactivestreams.Publisher; import reactor.Publishers; import org.springframework.core.Ordered; -import org.springframework.reactive.web.http.ServerHttpRequest; -import org.springframework.reactive.web.http.ServerHttpResponse; +import org.springframework.http.server.ReactiveServerHttpRequest; +import org.springframework.http.server.ReactiveServerHttpResponse; /** * Supports {@link HandlerResult} with a {@code Publisher} value. @@ -46,9 +46,8 @@ public class SimpleHandlerResultHandler implements Ordered, HandlerResultHandler } @Override - public Publisher handleResult(ServerHttpRequest request, ServerHttpResponse response, HandlerResult result) { + public Publisher handleResult(ReactiveServerHttpRequest request, ReactiveServerHttpResponse response, HandlerResult result) { Publisher handleComplete = Publishers.completable((Publisher)result.getValue()); return Publishers.concat(Publishers.from(Arrays.asList(handleComplete, response.writeHeaders()))); } - } diff --git a/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/handler/HttpHandlerAdapter.java b/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/handler/HttpHandlerAdapter.java index 0dc2e9463d4..67c563355ad 100644 --- a/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/handler/HttpHandlerAdapter.java +++ b/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/handler/HttpHandlerAdapter.java @@ -13,16 +13,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.reactive.web.dispatch.handler; import org.reactivestreams.Publisher; +import org.springframework.http.server.ReactiveServerHttpRequest; +import org.springframework.http.server.ReactiveServerHttpResponse; import org.springframework.reactive.web.dispatch.HandlerAdapter; import org.springframework.reactive.web.dispatch.HandlerResult; import org.springframework.reactive.web.http.HttpHandler; -import org.springframework.reactive.web.http.ServerHttpRequest; -import org.springframework.reactive.web.http.ServerHttpResponse; - /** * Support use of {@link HttpHandler} with @@ -44,7 +44,7 @@ public class HttpHandlerAdapter implements HandlerAdapter { } @Override - public HandlerResult handle(ServerHttpRequest request, ServerHttpResponse response, Object handler) { + public HandlerResult handle(ReactiveServerHttpRequest request, ReactiveServerHttpResponse response, Object handler) { HttpHandler httpHandler = (HttpHandler)handler; Publisher completion = httpHandler.handle(request, response); return new HandlerResult(httpHandler, completion); diff --git a/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/handler/SimpleUrlHandlerMapping.java b/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/handler/SimpleUrlHandlerMapping.java index 64bae7f0ae0..c49f9fa0c5d 100644 --- a/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/handler/SimpleUrlHandlerMapping.java +++ b/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/handler/SimpleUrlHandlerMapping.java @@ -13,14 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.reactive.web.dispatch.handler; import java.util.HashMap; import java.util.Map; +import org.springframework.http.server.ReactiveServerHttpRequest; import org.springframework.reactive.web.dispatch.HandlerMapping; -import org.springframework.reactive.web.http.ServerHttpRequest; - /** * @author Rossen Stoyanchev @@ -39,7 +39,7 @@ public class SimpleUrlHandlerMapping implements HandlerMapping { @Override - public Object getHandler(ServerHttpRequest request) { + public Object getHandler(ReactiveServerHttpRequest request) { return this.handlerMap.get(request.getURI().getPath()); } diff --git a/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/method/HandlerMethodArgumentResolver.java b/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/method/HandlerMethodArgumentResolver.java index e4d77d3dbc8..f09fa428306 100644 --- a/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/method/HandlerMethodArgumentResolver.java +++ b/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/method/HandlerMethodArgumentResolver.java @@ -13,11 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.springframework.reactive.web.dispatch.method; +package org.springframework.reactive.web.dispatch.method; import org.springframework.core.MethodParameter; -import org.springframework.reactive.web.http.ServerHttpRequest; +import org.springframework.http.server.ReactiveServerHttpRequest; /** @@ -27,6 +27,6 @@ public interface HandlerMethodArgumentResolver { boolean supportsParameter(MethodParameter parameter); - Object resolveArgument(MethodParameter parameter, ServerHttpRequest request); + Object resolveArgument(MethodParameter parameter, ReactiveServerHttpRequest request); } diff --git a/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/method/InvocableHandlerMethod.java b/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/method/InvocableHandlerMethod.java index ab49c6b6e14..75076771803 100644 --- a/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/method/InvocableHandlerMethod.java +++ b/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/method/InvocableHandlerMethod.java @@ -26,7 +26,7 @@ import org.springframework.core.DefaultParameterNameDiscoverer; import org.springframework.core.GenericTypeResolver; import org.springframework.core.MethodParameter; import org.springframework.core.ParameterNameDiscoverer; -import org.springframework.reactive.web.http.ServerHttpRequest; +import org.springframework.http.server.ReactiveServerHttpRequest; import org.springframework.util.ReflectionUtils; import org.springframework.web.method.HandlerMethod; @@ -55,7 +55,7 @@ public class InvocableHandlerMethod extends HandlerMethod { } - public Object invokeForRequest(ServerHttpRequest request, Object... providedArgs) throws Exception { + public Object invokeForRequest(ReactiveServerHttpRequest request, Object... providedArgs) throws Exception { Object[] args = getMethodArgumentValues(request, providedArgs); if (logger.isTraceEnabled()) { logger.trace("Invoking [" + getBeanType().getSimpleName() + "." + @@ -68,7 +68,7 @@ public class InvocableHandlerMethod extends HandlerMethod { return returnValue; } - private Object[] getMethodArgumentValues(ServerHttpRequest request, Object... providedArgs) throws Exception { + private Object[] getMethodArgumentValues(ReactiveServerHttpRequest request, Object... providedArgs) throws Exception { MethodParameter[] parameters = getMethodParameters(); Object[] args = new Object[parameters.length]; for (int i = 0; i < parameters.length; i++) { diff --git a/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/method/annotation/RequestBodyArgumentResolver.java b/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/method/annotation/RequestBodyArgumentResolver.java index daf58211687..0dea573a221 100644 --- a/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/method/annotation/RequestBodyArgumentResolver.java +++ b/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/method/annotation/RequestBodyArgumentResolver.java @@ -16,23 +16,35 @@ package org.springframework.reactive.web.dispatch.method.annotation; +import java.nio.ByteBuffer; +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.TimeUnit; + import org.reactivestreams.Publisher; +import reactor.Publishers; +import reactor.core.publisher.convert.CompletableFutureConverter; +import reactor.core.publisher.convert.RxJava1Converter; +import reactor.core.publisher.convert.RxJava1SingleConverter; +import reactor.rx.Promise; +import reactor.rx.Stream; +import reactor.rx.Streams; +import rx.Observable; +import rx.Single; + import org.springframework.core.MethodParameter; import org.springframework.core.ResolvableType; import org.springframework.core.convert.ConversionService; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; +import org.springframework.http.server.ReactiveServerHttpRequest; import org.springframework.reactive.codec.decoder.ByteToMessageDecoder; import org.springframework.reactive.web.dispatch.method.HandlerMethodArgumentResolver; -import org.springframework.reactive.web.http.ServerHttpRequest; import org.springframework.web.bind.annotation.RequestBody; -import java.nio.ByteBuffer; -import java.nio.charset.Charset; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - /** * @author Sebastien Deleuze * @author Stephane Maldini @@ -66,7 +78,7 @@ public class RequestBodyArgumentResolver implements HandlerMethodArgumentResolve @Override @SuppressWarnings("unchecked") - public Object resolveArgument(MethodParameter parameter, ServerHttpRequest request) { + public Object resolveArgument(MethodParameter parameter, ReactiveServerHttpRequest request) { MediaType mediaType = resolveMediaType(request); ResolvableType type = ResolvableType.forMethodParameter(parameter); @@ -92,14 +104,14 @@ public class RequestBodyArgumentResolver implements HandlerMethodArgumentResolve } } - private MediaType resolveMediaType(ServerHttpRequest request) { + private MediaType resolveMediaType(ReactiveServerHttpRequest request) { String acceptHeader = request.getHeaders().getFirst(HttpHeaders.CONTENT_TYPE); List mediaTypes = MediaType.parseMediaTypes(acceptHeader); MediaType.sortBySpecificityAndQuality(mediaTypes); return ( mediaTypes.size() > 0 ? mediaTypes.get(0) : MediaType.TEXT_PLAIN); } - private ByteToMessageDecoder resolveDeserializers(ServerHttpRequest request, ResolvableType type, MediaType mediaType, Object[] hints) { + private ByteToMessageDecoder resolveDeserializers(ReactiveServerHttpRequest request, ResolvableType type, MediaType mediaType, Object[] hints) { for (ByteToMessageDecoder deserializer : this.deserializers) { if (deserializer.canDecode(type, mediaType, hints)) { return deserializer; @@ -108,7 +120,7 @@ public class RequestBodyArgumentResolver implements HandlerMethodArgumentResolve return null; } - private List> resolvePreProcessors(ServerHttpRequest request, ResolvableType type, MediaType mediaType, Object[] hints) { + private List> resolvePreProcessors(ReactiveServerHttpRequest request, ResolvableType type, MediaType mediaType, Object[] hints) { List> preProcessors = new ArrayList<>(); for (ByteToMessageDecoder preProcessor : this.preProcessors) { if (preProcessor.canDecode(type, mediaType, hints)) { diff --git a/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/method/annotation/RequestMappingHandlerAdapter.java b/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/method/annotation/RequestMappingHandlerAdapter.java index 6afcb3d44d9..a24859915bd 100644 --- a/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/method/annotation/RequestMappingHandlerAdapter.java +++ b/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/method/annotation/RequestMappingHandlerAdapter.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.reactive.web.dispatch.method.annotation; import java.nio.ByteBuffer; @@ -23,6 +24,8 @@ import java.util.List; import org.springframework.beans.factory.InitializingBean; import org.springframework.reactive.codec.decoder.ByteBufferDecoder; import org.springframework.reactive.codec.decoder.ByteToMessageDecoder; +import org.springframework.http.server.ReactiveServerHttpRequest; +import org.springframework.http.server.ReactiveServerHttpResponse; import org.springframework.reactive.codec.decoder.JacksonJsonDecoder; import org.springframework.reactive.codec.decoder.JsonObjectDecoder; import org.springframework.reactive.codec.decoder.StringDecoder; @@ -30,8 +33,6 @@ import org.springframework.reactive.web.dispatch.HandlerAdapter; import org.springframework.reactive.web.dispatch.HandlerResult; import org.springframework.reactive.web.dispatch.method.HandlerMethodArgumentResolver; import org.springframework.reactive.web.dispatch.method.InvocableHandlerMethod; -import org.springframework.reactive.web.http.ServerHttpRequest; -import org.springframework.reactive.web.http.ServerHttpResponse; import org.springframework.web.method.HandlerMethod; @@ -68,7 +69,7 @@ public class RequestMappingHandlerAdapter implements HandlerAdapter, Initializin } @Override - public HandlerResult handle(ServerHttpRequest request, ServerHttpResponse response, + public HandlerResult handle(ReactiveServerHttpRequest request, ReactiveServerHttpResponse response, Object handler) throws Exception { final InvocableHandlerMethod invocable = new InvocableHandlerMethod((HandlerMethod) handler); diff --git a/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/method/annotation/RequestMappingHandlerMapping.java b/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/method/annotation/RequestMappingHandlerMapping.java index 17df6ff8192..3dd42b38316 100644 --- a/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/method/annotation/RequestMappingHandlerMapping.java +++ b/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/method/annotation/RequestMappingHandlerMapping.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.reactive.web.dispatch.method.annotation; import java.util.Arrays; @@ -32,8 +33,8 @@ import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.core.annotation.AnnotationUtils; import org.springframework.http.HttpMethod; +import org.springframework.http.server.ReactiveServerHttpRequest; import org.springframework.reactive.web.dispatch.HandlerMapping; -import org.springframework.reactive.web.http.ServerHttpRequest; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -92,7 +93,7 @@ public class RequestMappingHandlerMapping implements HandlerMapping, } @Override - public Object getHandler(ServerHttpRequest request) { + public Object getHandler(ReactiveServerHttpRequest request) { String path = request.getURI().getPath(); HttpMethod method = request.getMethod(); for (Map.Entry entry : this.methodMap.entrySet()) { diff --git a/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/method/annotation/RequestParamArgumentResolver.java b/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/method/annotation/RequestParamArgumentResolver.java index e3aaed22384..ab7fa92d857 100644 --- a/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/method/annotation/RequestParamArgumentResolver.java +++ b/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/method/annotation/RequestParamArgumentResolver.java @@ -13,12 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.reactive.web.dispatch.method.annotation; import org.springframework.core.MethodParameter; +import org.springframework.http.server.ReactiveServerHttpRequest; import org.springframework.reactive.web.dispatch.method.HandlerMethodArgumentResolver; -import org.springframework.reactive.web.http.ServerHttpRequest; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -39,7 +40,7 @@ public class RequestParamArgumentResolver implements HandlerMethodArgumentResolv @Override - public Object resolveArgument(MethodParameter param, ServerHttpRequest request) { + public Object resolveArgument(MethodParameter param, ReactiveServerHttpRequest request) { RequestParam annotation = param.getParameterAnnotation(RequestParam.class); String name = (annotation.value().length() != 0 ? annotation.value() : param.getParameterName()); UriComponents uriComponents = UriComponentsBuilder.fromUri(request.getURI()).build(); diff --git a/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/method/annotation/ResponseBodyResultHandler.java b/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/method/annotation/ResponseBodyResultHandler.java index bfd39cdbfff..221b0cbd61e 100644 --- a/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/method/annotation/ResponseBodyResultHandler.java +++ b/spring-web-reactive/src/main/java/org/springframework/reactive/web/dispatch/method/annotation/ResponseBodyResultHandler.java @@ -13,9 +13,26 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.reactive.web.dispatch.method.annotation; +import java.lang.reflect.Type; +import java.nio.ByteBuffer; +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.CompletableFuture; + import org.reactivestreams.Publisher; +import reactor.Publishers; +import reactor.core.publisher.convert.CompletableFutureConverter; +import reactor.core.publisher.convert.RxJava1Converter; +import reactor.core.publisher.convert.RxJava1SingleConverter; +import reactor.rx.Promise; +import rx.Observable; +import rx.Single; + import org.springframework.core.MethodParameter; import org.springframework.core.Ordered; import org.springframework.core.ResolvableType; @@ -23,20 +40,13 @@ import org.springframework.core.annotation.AnnotatedElementUtils; import org.springframework.core.convert.ConversionService; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; +import org.springframework.http.server.ReactiveServerHttpRequest; +import org.springframework.http.server.ReactiveServerHttpResponse; import org.springframework.reactive.codec.encoder.MessageToByteEncoder; import org.springframework.reactive.web.dispatch.HandlerResult; import org.springframework.reactive.web.dispatch.HandlerResultHandler; -import org.springframework.reactive.web.http.ServerHttpRequest; -import org.springframework.reactive.web.http.ServerHttpResponse; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.method.HandlerMethod; -import reactor.Publishers; - -import java.nio.ByteBuffer; -import java.nio.charset.Charset; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; /** @@ -95,7 +105,8 @@ public class ResponseBodyResultHandler implements HandlerResultHandler, Ordered @Override @SuppressWarnings("unchecked") - public Publisher handleResult(ServerHttpRequest request, ServerHttpResponse response, + public Publisher handleResult(ReactiveServerHttpRequest request, + ReactiveServerHttpResponse response, HandlerResult result) { Object value = result.getValue(); @@ -129,20 +140,20 @@ public class ResponseBodyResultHandler implements HandlerResultHandler, Ordered outputStream = postProcessor.encode(outputStream, elementType, mediaType, hints.toArray()); } response.getHeaders().setContentType(mediaType); - return response.writeWith(outputStream); + return response.addBody(outputStream); } return Publishers.error(new IllegalStateException( "Return value type '" + returnType.getParameterType().getName() + "' with media type '" + mediaType + "' not supported" )); } - private MediaType resolveMediaType(ServerHttpRequest request) { + private MediaType resolveMediaType(ReactiveServerHttpRequest request) { String acceptHeader = request.getHeaders().getFirst(HttpHeaders.ACCEPT); List mediaTypes = MediaType.parseMediaTypes(acceptHeader); MediaType.sortBySpecificityAndQuality(mediaTypes); return ( mediaTypes.size() > 0 ? mediaTypes.get(0) : MediaType.TEXT_PLAIN); } - private MessageToByteEncoder resolveSerializer(ServerHttpRequest request, ResolvableType type, MediaType mediaType, Object[] hints) { + private MessageToByteEncoder resolveSerializer(ReactiveServerHttpRequest request, ResolvableType type, MediaType mediaType, Object[] hints) { for (MessageToByteEncoder codec : this.serializers) { if (codec.canEncode(type, mediaType, hints)) { return codec; @@ -151,7 +162,7 @@ public class ResponseBodyResultHandler implements HandlerResultHandler, Ordered return null; } - private List> resolvePostProcessors(ServerHttpRequest request, ResolvableType type, MediaType mediaType, Object[] hints) { + private List> resolvePostProcessors(ReactiveServerHttpRequest request, ResolvableType type, MediaType mediaType, Object[] hints) { List> postProcessors = new ArrayList<>(); for (MessageToByteEncoder postProcessor : this.postProcessors) { if (postProcessor.canEncode(type, mediaType, hints)) { diff --git a/spring-web-reactive/src/main/java/org/springframework/reactive/web/http/HttpHandler.java b/spring-web-reactive/src/main/java/org/springframework/reactive/web/http/HttpHandler.java index 4158526da8d..87076451b6b 100644 --- a/spring-web-reactive/src/main/java/org/springframework/reactive/web/http/HttpHandler.java +++ b/spring-web-reactive/src/main/java/org/springframework/reactive/web/http/HttpHandler.java @@ -18,6 +18,8 @@ package org.springframework.reactive.web.http; import org.reactivestreams.Publisher; +import org.springframework.http.server.ReactiveServerHttpRequest; +import org.springframework.http.server.ReactiveServerHttpResponse; /** * Interface for handlers that process HTTP requests and generate an HTTP response. @@ -28,8 +30,8 @@ import org.reactivestreams.Publisher; * @author Arjen Poutsma * @author Rossen Stoyanchev * @author Sebastien Deleuze - * @see ServerHttpRequest#getBody() - * @see ServerHttpResponse#writeWith(Publisher) + * @see ReactiveServerHttpRequest#getBody() + * @see ReactiveServerHttpResponse#addBody(Publisher) */ public interface HttpHandler { @@ -44,6 +46,6 @@ public interface HttpHandler { * when the handling is complete (success or error) including the flush of the data on the * network. */ - Publisher handle(ServerHttpRequest request, ServerHttpResponse response); + Publisher handle(ReactiveServerHttpRequest request, ReactiveServerHttpResponse response); } diff --git a/spring-web-reactive/src/main/java/org/springframework/reactive/web/http/reactor/ReactorServerHttpRequest.java b/spring-web-reactive/src/main/java/org/springframework/reactive/web/http/reactor/ReactorServerHttpRequest.java index 75b22152d72..b79763bd332 100644 --- a/spring-web-reactive/src/main/java/org/springframework/reactive/web/http/reactor/ReactorServerHttpRequest.java +++ b/spring-web-reactive/src/main/java/org/springframework/reactive/web/http/reactor/ReactorServerHttpRequest.java @@ -1,11 +1,11 @@ /* - * Copyright (c) 2011-2015 Pivotal Software Inc, All Rights Reserved. + * Copyright 2002-2015 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -21,6 +21,18 @@ import reactor.io.buffer.Buffer; import reactor.io.net.http.HttpChannel; import reactor.rx.Stream; import reactor.rx.Streams; +import java.net.URI; +import java.net.URISyntaxException; +import java.nio.ByteBuffer; + +import org.reactivestreams.Publisher; +import reactor.io.buffer.Buffer; +import reactor.io.net.http.HttpChannel; + +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.server.ReactiveServerHttpRequest; +import org.springframework.util.Assert; /** * @author Stephane Maldini diff --git a/spring-web-reactive/src/main/java/org/springframework/reactive/web/http/reactor/ReactorServerHttpResponse.java b/spring-web-reactive/src/main/java/org/springframework/reactive/web/http/reactor/ReactorServerHttpResponse.java index eec16e85214..12426ba5c16 100644 --- a/spring-web-reactive/src/main/java/org/springframework/reactive/web/http/reactor/ReactorServerHttpResponse.java +++ b/spring-web-reactive/src/main/java/org/springframework/reactive/web/http/reactor/ReactorServerHttpResponse.java @@ -1,11 +1,11 @@ /* - * Copyright (c) 2011-2015 Pivotal Software Inc, All Rights Reserved. + * Copyright 2002-2015 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/spring-web-reactive/src/main/java/org/springframework/reactive/web/http/rxnetty/RxNettyServerHttpRequest.java b/spring-web-reactive/src/main/java/org/springframework/reactive/web/http/rxnetty/RxNettyServerHttpRequest.java index 7aa05a50cd5..5f3be593e65 100644 --- a/spring-web-reactive/src/main/java/org/springframework/reactive/web/http/rxnetty/RxNettyServerHttpRequest.java +++ b/spring-web-reactive/src/main/java/org/springframework/reactive/web/http/rxnetty/RxNettyServerHttpRequest.java @@ -13,28 +13,29 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.reactive.web.http.rxnetty; +import java.net.URI; +import java.net.URISyntaxException; +import java.nio.ByteBuffer; + import io.netty.buffer.ByteBuf; import io.reactivex.netty.protocol.http.server.HttpServerRequest; import org.reactivestreams.Publisher; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpMethod; -import org.springframework.reactive.web.http.ServerHttpRequest; -import org.springframework.util.Assert; - import reactor.core.publisher.convert.RxJava1Converter; import rx.Observable; -import java.net.URI; -import java.net.URISyntaxException; -import java.nio.ByteBuffer; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.server.ReactiveServerHttpRequest; +import org.springframework.util.Assert; /** * @author Rossen Stoyanchev * @author Stephane Maldini */ -public class RxNettyServerHttpRequest implements ServerHttpRequest { +public class RxNettyServerHttpRequest implements ReactiveServerHttpRequest { private final HttpServerRequest request; diff --git a/spring-web-reactive/src/main/java/org/springframework/reactive/web/http/rxnetty/RxNettyServerHttpResponse.java b/spring-web-reactive/src/main/java/org/springframework/reactive/web/http/rxnetty/RxNettyServerHttpResponse.java index 1143663e66f..91989ec9c2b 100644 --- a/spring-web-reactive/src/main/java/org/springframework/reactive/web/http/rxnetty/RxNettyServerHttpResponse.java +++ b/spring-web-reactive/src/main/java/org/springframework/reactive/web/http/rxnetty/RxNettyServerHttpResponse.java @@ -13,14 +13,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.reactive.web.http.rxnetty; +import java.nio.ByteBuffer; + import io.netty.handler.codec.http.HttpResponseStatus; import io.reactivex.netty.protocol.http.server.HttpServerResponse; import org.reactivestreams.Publisher; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; -import org.springframework.reactive.web.http.ServerHttpResponse; import org.springframework.util.Assert; import reactor.Publishers; @@ -28,13 +30,16 @@ import reactor.core.publisher.convert.RxJava1Converter; import reactor.io.buffer.Buffer; import rx.Observable; -import java.nio.ByteBuffer; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.server.ReactiveServerHttpResponse; +import org.springframework.util.Assert; /** * @author Rossen Stoyanchev * @author Stephane Maldini */ -public class RxNettyServerHttpResponse implements ServerHttpResponse { +public class RxNettyServerHttpResponse implements ReactiveServerHttpResponse { private final HttpServerResponse response; @@ -70,7 +75,7 @@ public class RxNettyServerHttpResponse implements ServerHttpResponse { } @Override - public Publisher writeWith(Publisher contentPublisher) { + public Publisher addBody(Publisher contentPublisher) { applyHeaders(); Observable contentObservable = RxJava1Converter.from(contentPublisher).map(content -> new Buffer(content).asBytes()); return RxJava1Converter.from(this.response.writeBytes(contentObservable)); diff --git a/spring-web-reactive/src/main/java/org/springframework/reactive/web/http/servlet/ServletServerHttpRequest.java b/spring-web-reactive/src/main/java/org/springframework/reactive/web/http/servlet/ServletServerHttpRequest.java index b6aaea8fb76..80a14063519 100644 --- a/spring-web-reactive/src/main/java/org/springframework/reactive/web/http/servlet/ServletServerHttpRequest.java +++ b/spring-web-reactive/src/main/java/org/springframework/reactive/web/http/servlet/ServletServerHttpRequest.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.reactive.web.http.servlet; import java.net.URI; @@ -21,7 +22,6 @@ import java.nio.ByteBuffer; import java.nio.charset.Charset; import java.util.Enumeration; import java.util.Map; - import javax.servlet.http.HttpServletRequest; import org.reactivestreams.Publisher; @@ -29,7 +29,7 @@ import org.reactivestreams.Publisher; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; -import org.springframework.reactive.web.http.ServerHttpRequest; +import org.springframework.http.server.ReactiveServerHttpRequest; import org.springframework.util.Assert; import org.springframework.util.LinkedCaseInsensitiveMap; import org.springframework.util.StringUtils; @@ -37,7 +37,7 @@ import org.springframework.util.StringUtils; /** * @author Rossen Stoyanchev */ -public class ServletServerHttpRequest implements ServerHttpRequest { +public class ServletServerHttpRequest implements ReactiveServerHttpRequest { private final HttpServletRequest servletRequest; diff --git a/spring-web-reactive/src/main/java/org/springframework/reactive/web/http/servlet/ServletServerHttpResponse.java b/spring-web-reactive/src/main/java/org/springframework/reactive/web/http/servlet/ServletServerHttpResponse.java index ff462ec1583..614942283a0 100644 --- a/spring-web-reactive/src/main/java/org/springframework/reactive/web/http/servlet/ServletServerHttpResponse.java +++ b/spring-web-reactive/src/main/java/org/springframework/reactive/web/http/servlet/ServletServerHttpResponse.java @@ -13,12 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.reactive.web.http.servlet; import java.nio.ByteBuffer; import java.util.List; import java.util.Map; - import javax.servlet.http.HttpServletResponse; import org.reactivestreams.Publisher; @@ -26,13 +26,13 @@ import reactor.Publishers; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; -import org.springframework.reactive.web.http.ServerHttpResponse; +import org.springframework.http.server.ReactiveServerHttpResponse; import org.springframework.util.Assert; /** * @author Rossen Stoyanchev */ -public class ServletServerHttpResponse implements ServerHttpResponse { +public class ServletServerHttpResponse implements ReactiveServerHttpResponse { private final HttpServletResponse servletResponse; @@ -69,7 +69,7 @@ public class ServletServerHttpResponse implements ServerHttpResponse { } @Override - public Publisher writeWith(final Publisher contentPublisher) { + public Publisher addBody(final Publisher contentPublisher) { applyHeaders(); return (s -> contentPublisher.subscribe(responseSubscriber)); } diff --git a/spring-web-reactive/src/test/java/org/springframework/reactive/web/dispatch/handler/SimpleUrlHandlerMappingIntegrationTests.java b/spring-web-reactive/src/test/java/org/springframework/reactive/web/dispatch/handler/SimpleUrlHandlerMappingIntegrationTests.java index de986c811ff..764a66ce564 100644 --- a/spring-web-reactive/src/test/java/org/springframework/reactive/web/dispatch/handler/SimpleUrlHandlerMappingIntegrationTests.java +++ b/spring-web-reactive/src/test/java/org/springframework/reactive/web/dispatch/handler/SimpleUrlHandlerMappingIntegrationTests.java @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + package org.springframework.reactive.web.dispatch.handler; import java.net.URI; @@ -27,12 +28,12 @@ import reactor.rx.Streams; import org.springframework.http.RequestEntity; import org.springframework.http.ResponseEntity; +import org.springframework.http.server.ReactiveServerHttpRequest; +import org.springframework.http.server.ReactiveServerHttpResponse; import org.springframework.reactive.web.dispatch.DispatcherHandler; import org.springframework.reactive.web.dispatch.SimpleHandlerResultHandler; import org.springframework.reactive.web.http.AbstractHttpHandlerIntegrationTests; import org.springframework.reactive.web.http.HttpHandler; -import org.springframework.reactive.web.http.ServerHttpRequest; -import org.springframework.reactive.web.http.ServerHttpResponse; import org.springframework.web.client.RestTemplate; import org.springframework.web.context.support.StaticWebApplicationContext; @@ -99,16 +100,16 @@ public class SimpleUrlHandlerMappingIntegrationTests extends AbstractHttpHandler private static class FooHandler implements HttpHandler { @Override - public Publisher handle(ServerHttpRequest request, ServerHttpResponse response) { - return response.writeWith(Streams.just(Buffer.wrap("foo").byteBuffer())); + public Publisher handle(ReactiveServerHttpRequest request, ReactiveServerHttpResponse response) { + return response.addBody(Streams.just(Buffer.wrap("foo").byteBuffer())); } } private static class BarHandler implements HttpHandler { @Override - public Publisher handle(ServerHttpRequest request, ServerHttpResponse response) { - return response.writeWith(Streams.just(Buffer.wrap("bar").byteBuffer())); + public Publisher handle(ReactiveServerHttpRequest request, ReactiveServerHttpResponse response) { + return response.addBody(Streams.just(Buffer.wrap("bar").byteBuffer())); } } diff --git a/spring-web-reactive/src/test/java/org/springframework/reactive/web/dispatch/method/annotation/RequestMappingHandlerMappingTests.java b/spring-web-reactive/src/test/java/org/springframework/reactive/web/dispatch/method/annotation/RequestMappingHandlerMappingTests.java index 9bb4a02aede..0d53aac9bf4 100644 --- a/spring-web-reactive/src/test/java/org/springframework/reactive/web/dispatch/method/annotation/RequestMappingHandlerMappingTests.java +++ b/spring-web-reactive/src/test/java/org/springframework/reactive/web/dispatch/method/annotation/RequestMappingHandlerMappingTests.java @@ -20,20 +20,21 @@ import java.net.URI; import java.net.URISyntaxException; import java.nio.ByteBuffer; -import static org.junit.Assert.assertEquals; import org.junit.Before; import org.junit.Test; import org.reactivestreams.Publisher; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; -import org.springframework.reactive.web.http.ServerHttpRequest; +import org.springframework.http.server.ReactiveServerHttpRequest; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.context.support.StaticWebApplicationContext; import org.springframework.web.method.HandlerMethod; +import static org.junit.Assert.assertEquals; + /** * @author Sebastien Deleuze */ @@ -52,14 +53,14 @@ public class RequestMappingHandlerMappingTests { @Test public void path() throws NoSuchMethodException { - ServerHttpRequest request = new MockServerHttpRequest(HttpMethod.GET, "boo"); + ReactiveServerHttpRequest request = new MockServerHttpRequest(HttpMethod.GET, "boo"); HandlerMethod handler = (HandlerMethod) this.mapping.getHandler(request); assertEquals(TestController.class.getMethod("boo"), handler.getMethod()); } @Test public void method() throws NoSuchMethodException { - ServerHttpRequest request = new MockServerHttpRequest(HttpMethod.POST, "foo"); + ReactiveServerHttpRequest request = new MockServerHttpRequest(HttpMethod.POST, "foo"); HandlerMethod handler = (HandlerMethod) this.mapping.getHandler(request); assertEquals(TestController.class.getMethod("postFoo"), handler.getMethod()); @@ -104,7 +105,7 @@ public class RequestMappingHandlerMappingTests { } - private static class MockServerHttpRequest implements ServerHttpRequest{ + private static class MockServerHttpRequest implements ReactiveServerHttpRequest{ private HttpMethod method; diff --git a/spring-web-reactive/src/test/java/org/springframework/reactive/web/http/EchoHandler.java b/spring-web-reactive/src/test/java/org/springframework/reactive/web/http/EchoHandler.java index a5241cc9343..62a29932fcf 100644 --- a/spring-web-reactive/src/test/java/org/springframework/reactive/web/http/EchoHandler.java +++ b/spring-web-reactive/src/test/java/org/springframework/reactive/web/http/EchoHandler.java @@ -18,13 +18,16 @@ package org.springframework.reactive.web.http; import org.reactivestreams.Publisher; +import org.springframework.http.server.ReactiveServerHttpRequest; +import org.springframework.http.server.ReactiveServerHttpResponse; + /** * @author Arjen Poutsma */ public class EchoHandler implements HttpHandler { @Override - public Publisher handle(ServerHttpRequest request, ServerHttpResponse response) { - return response.writeWith(request.getBody()); + public Publisher handle(ReactiveServerHttpRequest request, ReactiveServerHttpResponse response) { + return response.addBody(request.getBody()); } } diff --git a/spring-web-reactive/src/test/java/org/springframework/reactive/web/http/RandomHandler.java b/spring-web-reactive/src/test/java/org/springframework/reactive/web/http/RandomHandler.java index 69244b098c3..592b510c386 100644 --- a/spring-web-reactive/src/test/java/org/springframework/reactive/web/http/RandomHandler.java +++ b/spring-web-reactive/src/test/java/org/springframework/reactive/web/http/RandomHandler.java @@ -27,6 +27,9 @@ import org.reactivestreams.Subscription; import reactor.io.buffer.Buffer; import reactor.rx.Streams; +import org.springframework.http.server.ReactiveServerHttpRequest; +import org.springframework.http.server.ReactiveServerHttpResponse; + import static org.junit.Assert.assertEquals; /** @@ -41,7 +44,7 @@ public class RandomHandler implements HttpHandler { private final Random rnd = new Random(); @Override - public Publisher handle(ServerHttpRequest request, ServerHttpResponse response) { + public Publisher handle(ReactiveServerHttpRequest request, ReactiveServerHttpResponse response) { request.getBody().subscribe(new Subscriber() { private Subscription s; @@ -73,7 +76,7 @@ public class RandomHandler implements HttpHandler { }); response.getHeaders().setContentLength(RESPONSE_SIZE); - return response.writeWith(Streams.just(ByteBuffer.wrap(randomBytes()))); + return response.addBody(Streams.just(ByteBuffer.wrap(randomBytes()))); } private byte[] randomBytes() { diff --git a/spring-web-reactive/src/test/java/org/springframework/reactive/web/http/XmlHandler.java b/spring-web-reactive/src/test/java/org/springframework/reactive/web/http/XmlHandler.java index dcf95a8dc2a..fc18ec885f3 100644 --- a/spring-web-reactive/src/test/java/org/springframework/reactive/web/http/XmlHandler.java +++ b/spring-web-reactive/src/test/java/org/springframework/reactive/web/http/XmlHandler.java @@ -23,14 +23,16 @@ import javax.xml.bind.Unmarshaller; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.reactivestreams.Publisher; +import reactor.io.buffer.Buffer; +import reactor.rx.Streams; import org.springframework.http.MediaType; +import org.springframework.http.server.ReactiveServerHttpRequest; +import org.springframework.http.server.ReactiveServerHttpResponse; import org.springframework.reactive.io.BufferOutputStream; import org.springframework.reactive.io.ByteBufferPublisherInputStream; import static org.junit.Assert.fail; -import reactor.io.buffer.Buffer; -import reactor.rx.Streams; /** * @author Arjen Poutsma @@ -40,8 +42,8 @@ public class XmlHandler implements HttpHandler { private static final Log logger = LogFactory.getLog(XmlHandler.class); @Override - public Publisher handle(ServerHttpRequest request, - ServerHttpResponse response) { + public Publisher handle(ReactiveServerHttpRequest request, + ReactiveServerHttpResponse response) { try { JAXBContext jaxbContext = JAXBContext.newInstance(XmlHandlerIntegrationTests.Person.class); Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); @@ -73,7 +75,7 @@ public class XmlHandler implements HttpHandler { bos.close(); buffer.flip(); - return response.writeWith(Streams.just(buffer.byteBuffer())); + return response.addBody(Streams.just(buffer.byteBuffer())); } catch (Exception ex) { logger.error(ex, ex);