Fix URI parsing in Reactor Netty request
Issue: SPR-15560
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user