Consistent handling of URISyntaxException

Issue: SPR-16778
This commit is contained in:
Rossen Stoyanchev 2018-04-30 21:02:36 -04:00
parent 85ee36b385
commit 8d157cb5b5
5 changed files with 48 additions and 21 deletions

View File

@ -17,6 +17,7 @@
package org.springframework.http.server.reactive;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.Collection;
import java.util.concurrent.atomic.AtomicBoolean;
import javax.servlet.AsyncContext;
@ -155,6 +156,7 @@ public class ServletHttpHandlerAdapter implements Servlet {
@Override
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
if (DispatcherType.ASYNC.equals(request.getDispatcherType())) {
Throwable ex = (Throwable) request.getAttribute(WRITE_ERROR_ATTRIBUTE_NAME);
throw new ServletException("Write publisher error", ex);
@ -164,7 +166,18 @@ public class ServletHttpHandlerAdapter implements Servlet {
AsyncContext asyncContext = request.startAsync();
asyncContext.setTimeout(-1);
ServerHttpRequest httpRequest = createRequest(((HttpServletRequest) request), asyncContext);
ServerHttpRequest httpRequest;
try {
httpRequest = createRequest(((HttpServletRequest) request), asyncContext);
}
catch (URISyntaxException ex) {
if (logger.isWarnEnabled()) {
logger.warn("Invalid URL for incoming request: " + ex.getMessage());
}
((HttpServletResponse) response).setStatus(400);
asyncContext.complete();
return;
}
ServerHttpResponse httpResponse = createResponse(((HttpServletResponse) response), asyncContext);
if (httpRequest.getMethod() == HttpMethod.HEAD) {
@ -179,7 +192,9 @@ public class ServletHttpHandlerAdapter implements Servlet {
this.httpHandler.handle(httpRequest, httpResponse).subscribe(subscriber);
}
protected ServerHttpRequest createRequest(HttpServletRequest request, AsyncContext context) throws IOException {
protected ServerHttpRequest createRequest(HttpServletRequest request, AsyncContext context)
throws IOException, URISyntaxException {
Assert.notNull(this.servletPath, "Servlet path is not initialized");
return new ServletServerHttpRequest(
request, context, this.servletPath, getDataBufferFactory(), getBufferSize());

View File

@ -79,7 +79,8 @@ class ServletServerHttpRequest extends AbstractServerHttpRequest {
public ServletServerHttpRequest(HttpServletRequest request, AsyncContext asyncContext,
String servletPath, DataBufferFactory bufferFactory, int bufferSize) throws IOException {
String servletPath, DataBufferFactory bufferFactory, int bufferSize)
throws IOException, URISyntaxException {
super(initUri(request), request.getContextPath() + servletPath, initHeaders(request));
@ -98,19 +99,14 @@ class ServletServerHttpRequest extends AbstractServerHttpRequest {
this.bodyPublisher.registerReadListener();
}
private static URI initUri(HttpServletRequest request) {
private static URI initUri(HttpServletRequest request) throws URISyntaxException {
Assert.notNull(request, "'request' must not be null");
try {
StringBuffer url = request.getRequestURL();
String query = request.getQueryString();
if (StringUtils.hasText(query)) {
url.append('?').append(query);
}
return new URI(url.toString());
}
catch (URISyntaxException ex) {
throw new IllegalStateException("Could not get URI: " + ex.getMessage(), ex);
StringBuffer url = request.getRequestURL();
String query = request.getQueryString();
if (StringUtils.hasText(query)) {
url.append('?').append(query);
}
return new URI(url.toString());
}
private static HttpHeaders initHeaders(HttpServletRequest request) {

View File

@ -17,6 +17,7 @@
package org.springframework.http.server.reactive;
import java.io.IOException;
import java.net.URISyntaxException;
import java.nio.ByteBuffer;
import javax.servlet.AsyncContext;
import javax.servlet.ServletRequest;
@ -50,7 +51,7 @@ public class TomcatHttpHandlerAdapter extends ServletHttpHandlerAdapter {
@Override
protected ServerHttpRequest createRequest(HttpServletRequest request, AsyncContext asyncContext)
throws IOException {
throws IOException, URISyntaxException {
Assert.notNull(getServletPath(), "servletPath is not initialized.");
return new TomcatServerHttpRequest(request, asyncContext, getServletPath(),
@ -68,7 +69,8 @@ public class TomcatHttpHandlerAdapter extends ServletHttpHandlerAdapter {
private final class TomcatServerHttpRequest extends ServletServerHttpRequest {
public TomcatServerHttpRequest(HttpServletRequest request, AsyncContext context,
String servletPath, DataBufferFactory factory, int bufferSize) throws IOException {
String servletPath, DataBufferFactory factory, int bufferSize)
throws IOException, URISyntaxException {
super(request, context, servletPath, factory, bufferSize);
}

View File

@ -17,6 +17,7 @@
package org.springframework.http.server.reactive;
import java.io.IOException;
import java.net.URISyntaxException;
import io.undertow.server.HttpServerExchange;
import org.apache.commons.logging.Log;
@ -64,8 +65,18 @@ public class UndertowHttpHandlerAdapter implements io.undertow.server.HttpHandle
@Override
public void handleRequest(HttpServerExchange exchange) throws Exception {
ServerHttpRequest request = new UndertowServerHttpRequest(exchange, getDataBufferFactory());
public void handleRequest(HttpServerExchange exchange) {
ServerHttpRequest request = null;
try {
request = new UndertowServerHttpRequest(exchange, getDataBufferFactory());
}
catch (URISyntaxException ex) {
if (logger.isWarnEnabled()) {
logger.warn("Invalid URL for incoming request: " + ex.getMessage());
}
exchange.setStatusCode(400);
return;
}
ServerHttpResponse response = new UndertowServerHttpResponse(exchange, getDataBufferFactory());
if (request.getMethod() == HttpMethod.HEAD) {

View File

@ -21,6 +21,7 @@ import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.ByteBuffer;
import java.util.function.IntPredicate;
import javax.net.ssl.SSLSession;
@ -59,19 +60,21 @@ class UndertowServerHttpRequest extends AbstractServerHttpRequest {
private final RequestBodyPublisher body;
public UndertowServerHttpRequest(HttpServerExchange exchange, DataBufferFactory bufferFactory) {
public UndertowServerHttpRequest(HttpServerExchange exchange, DataBufferFactory bufferFactory)
throws URISyntaxException {
super(initUri(exchange), "", initHeaders(exchange));
this.exchange = exchange;
this.body = new RequestBodyPublisher(exchange, bufferFactory);
this.body.registerListeners(exchange);
}
private static URI initUri(HttpServerExchange exchange) {
private static URI initUri(HttpServerExchange exchange) throws URISyntaxException {
Assert.notNull(exchange, "HttpServerExchange is required.");
String requestURL = exchange.getRequestURL();
String query = exchange.getQueryString();
String requestUriAndQuery = StringUtils.isEmpty(query) ? requestURL : requestURL + "?" + query;
return URI.create(requestUriAndQuery);
return new URI(requestUriAndQuery);
}
private static HttpHeaders initHeaders(HttpServerExchange exchange) {