Introduce HttpMessage hierarchy

This commit introduces "reactive" sub-interfaces of the HttpMessage
interface found in the Spring Framework.
This commit is contained in:
Arjen Poutsma
2015-10-13 12:33:26 +02:00
parent 3864fc24ff
commit bab3b6fd1c
32 changed files with 317 additions and 160 deletions

View File

@@ -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<Void> handle(ServerHttpRequest request, ServerHttpResponse response) {
return response.writeWith(Streams.just(Buffer.wrap("foo").byteBuffer()));
public Publisher<Void> handle(ReactiveServerHttpRequest request, ReactiveServerHttpResponse response) {
return response.addBody(Streams.just(Buffer.wrap("foo").byteBuffer()));
}
}
private static class BarHandler implements HttpHandler {
@Override
public Publisher<Void> handle(ServerHttpRequest request, ServerHttpResponse response) {
return response.writeWith(Streams.just(Buffer.wrap("bar").byteBuffer()));
public Publisher<Void> handle(ReactiveServerHttpRequest request, ReactiveServerHttpResponse response) {
return response.addBody(Streams.just(Buffer.wrap("bar").byteBuffer()));
}
}

View File

@@ -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;

View File

@@ -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<Void> handle(ServerHttpRequest request, ServerHttpResponse response) {
return response.writeWith(request.getBody());
public Publisher<Void> handle(ReactiveServerHttpRequest request, ReactiveServerHttpResponse response) {
return response.addBody(request.getBody());
}
}

View File

@@ -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<Void> handle(ServerHttpRequest request, ServerHttpResponse response) {
public Publisher<Void> handle(ReactiveServerHttpRequest request, ReactiveServerHttpResponse response) {
request.getBody().subscribe(new Subscriber<ByteBuffer>() {
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() {

View File

@@ -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<Void> handle(ServerHttpRequest request,
ServerHttpResponse response) {
public Publisher<Void> 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);