Fix URI parsing in Reactor Netty request

Issue: SPR-15560
This commit is contained in:
Rossen Stoyanchev
2017-05-19 21:46:06 -04:00
parent c59e192b0f
commit 11075f12bc
5 changed files with 71 additions and 48 deletions

View File

@@ -16,6 +16,7 @@
package org.springframework.http.server.reactive;
import java.net.URISyntaxException;
import java.util.function.BiFunction;
import io.netty.handler.codec.http.HttpResponseStatus;
@@ -53,10 +54,19 @@ public class ReactorHttpHandlerAdapter
public Mono<Void> apply(HttpServerRequest request, HttpServerResponse response) {
NettyDataBufferFactory bufferFactory = new NettyDataBufferFactory(response.alloc());
ReactorServerHttpRequest req = new ReactorServerHttpRequest(request, bufferFactory);
ReactorServerHttpResponse resp = new ReactorServerHttpResponse(response, bufferFactory);
ReactorServerHttpRequest adaptedRequest;
ReactorServerHttpResponse adaptedResponse;
try {
adaptedRequest = new ReactorServerHttpRequest(request, bufferFactory);
adaptedResponse = new ReactorServerHttpResponse(response, bufferFactory);
}
catch (URISyntaxException ex) {
logger.error("Invalid URL " + ex.getMessage(), ex);
response.status(HttpResponseStatus.BAD_REQUEST);
return Mono.empty();
}
return this.httpHandler.handle(req, resp)
return this.httpHandler.handle(adaptedRequest, adaptedResponse)
.onErrorResume(ex -> {
logger.error("Could not complete request", ex);
response.status(HttpResponseStatus.INTERNAL_SERVER_ERROR);

View File

@@ -48,28 +48,25 @@ public class ReactorServerHttpRequest extends AbstractServerHttpRequest {
private final NettyDataBufferFactory bufferFactory;
public ReactorServerHttpRequest(HttpServerRequest request, NettyDataBufferFactory bufferFactory) {
public ReactorServerHttpRequest(HttpServerRequest request, NettyDataBufferFactory bufferFactory)
throws URISyntaxException {
super(initUri(request), initHeaders(request));
Assert.notNull(bufferFactory, "'bufferFactory' must not be null");
this.request = request;
this.bufferFactory = bufferFactory;
}
private static URI initUri(HttpServerRequest channel) {
private static URI initUri(HttpServerRequest channel) throws URISyntaxException {
Assert.notNull(channel, "'channel' must not be null");
InetSocketAddress address = channel.remoteAddress();
String requestUri = channel.uri();
return (address != null ? getBaseUrl(address).resolve(requestUri) : URI.create(requestUri));
return (address != null ? createUrl(address, requestUri) : new URI(requestUri));
}
private static URI getBaseUrl(InetSocketAddress address) {
try {
return new URI(null, null, address.getHostString(), address.getPort(), null, null, null);
}
catch (URISyntaxException ex) {
// Should not happen...
throw new IllegalStateException(ex);
}
private static URI createUrl(InetSocketAddress address, String requestUri) throws URISyntaxException {
URI baseUrl = new URI(null, null, address.getHostString(), address.getPort(), null, null, null);
return new URI(baseUrl.toString() + requestUri);
}
private static HttpHeaders initHeaders(HttpServerRequest channel) {