Skip to content

Commit b0aa08a

Browse files
committed
Consistent handling of URISyntaxException
Issue: SPR-16778
1 parent 9dc7998 commit b0aa08a

File tree

5 files changed

+48
-21
lines changed

5 files changed

+48
-21
lines changed

spring-web/src/main/java/org/springframework/http/server/reactive/ServletHttpHandlerAdapter.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.springframework.http.server.reactive;
1818

1919
import java.io.IOException;
20+
import java.net.URISyntaxException;
2021
import java.util.Collection;
2122
import java.util.concurrent.atomic.AtomicBoolean;
2223
import javax.servlet.AsyncContext;
@@ -155,6 +156,7 @@ private String getServletPath(ServletConfig config) {
155156

156157
@Override
157158
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
159+
158160
if (DispatcherType.ASYNC.equals(request.getDispatcherType())) {
159161
Throwable ex = (Throwable) request.getAttribute(WRITE_ERROR_ATTRIBUTE_NAME);
160162
throw new ServletException("Write publisher error", ex);
@@ -164,7 +166,18 @@ public void service(ServletRequest request, ServletResponse response) throws Ser
164166
AsyncContext asyncContext = request.startAsync();
165167
asyncContext.setTimeout(-1);
166168

167-
ServerHttpRequest httpRequest = createRequest(((HttpServletRequest) request), asyncContext);
169+
ServerHttpRequest httpRequest;
170+
try {
171+
httpRequest = createRequest(((HttpServletRequest) request), asyncContext);
172+
}
173+
catch (URISyntaxException ex) {
174+
if (logger.isWarnEnabled()) {
175+
logger.warn("Invalid URL for incoming request: " + ex.getMessage());
176+
}
177+
((HttpServletResponse) response).setStatus(400);
178+
asyncContext.complete();
179+
return;
180+
}
168181
ServerHttpResponse httpResponse = createResponse(((HttpServletResponse) response), asyncContext);
169182

170183
if (httpRequest.getMethod() == HttpMethod.HEAD) {
@@ -179,7 +192,9 @@ public void service(ServletRequest request, ServletResponse response) throws Ser
179192
this.httpHandler.handle(httpRequest, httpResponse).subscribe(subscriber);
180193
}
181194

182-
protected ServerHttpRequest createRequest(HttpServletRequest request, AsyncContext context) throws IOException {
195+
protected ServerHttpRequest createRequest(HttpServletRequest request, AsyncContext context)
196+
throws IOException, URISyntaxException {
197+
183198
Assert.notNull(this.servletPath, "Servlet path is not initialized");
184199
return new ServletServerHttpRequest(
185200
request, context, this.servletPath, getDataBufferFactory(), getBufferSize());

spring-web/src/main/java/org/springframework/http/server/reactive/ServletServerHttpRequest.java

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,8 @@ class ServletServerHttpRequest extends AbstractServerHttpRequest {
7979

8080

8181
public ServletServerHttpRequest(HttpServletRequest request, AsyncContext asyncContext,
82-
String servletPath, DataBufferFactory bufferFactory, int bufferSize) throws IOException {
82+
String servletPath, DataBufferFactory bufferFactory, int bufferSize)
83+
throws IOException, URISyntaxException {
8384

8485
super(initUri(request), request.getContextPath() + servletPath, initHeaders(request));
8586

@@ -98,19 +99,14 @@ public ServletServerHttpRequest(HttpServletRequest request, AsyncContext asyncCo
9899
this.bodyPublisher.registerReadListener();
99100
}
100101

101-
private static URI initUri(HttpServletRequest request) {
102+
private static URI initUri(HttpServletRequest request) throws URISyntaxException {
102103
Assert.notNull(request, "'request' must not be null");
103-
try {
104-
StringBuffer url = request.getRequestURL();
105-
String query = request.getQueryString();
106-
if (StringUtils.hasText(query)) {
107-
url.append('?').append(query);
108-
}
109-
return new URI(url.toString());
110-
}
111-
catch (URISyntaxException ex) {
112-
throw new IllegalStateException("Could not get URI: " + ex.getMessage(), ex);
104+
StringBuffer url = request.getRequestURL();
105+
String query = request.getQueryString();
106+
if (StringUtils.hasText(query)) {
107+
url.append('?').append(query);
113108
}
109+
return new URI(url.toString());
114110
}
115111

116112
private static HttpHeaders initHeaders(HttpServletRequest request) {

spring-web/src/main/java/org/springframework/http/server/reactive/TomcatHttpHandlerAdapter.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.springframework.http.server.reactive;
1818

1919
import java.io.IOException;
20+
import java.net.URISyntaxException;
2021
import java.nio.ByteBuffer;
2122
import javax.servlet.AsyncContext;
2223
import javax.servlet.ServletRequest;
@@ -50,7 +51,7 @@ public TomcatHttpHandlerAdapter(HttpHandler httpHandler) {
5051

5152
@Override
5253
protected ServerHttpRequest createRequest(HttpServletRequest request, AsyncContext asyncContext)
53-
throws IOException {
54+
throws IOException, URISyntaxException {
5455

5556
Assert.notNull(getServletPath(), "servletPath is not initialized.");
5657
return new TomcatServerHttpRequest(request, asyncContext, getServletPath(),
@@ -68,7 +69,8 @@ protected ServerHttpResponse createResponse(HttpServletResponse response, AsyncC
6869
private final class TomcatServerHttpRequest extends ServletServerHttpRequest {
6970

7071
public TomcatServerHttpRequest(HttpServletRequest request, AsyncContext context,
71-
String servletPath, DataBufferFactory factory, int bufferSize) throws IOException {
72+
String servletPath, DataBufferFactory factory, int bufferSize)
73+
throws IOException, URISyntaxException {
7274

7375
super(request, context, servletPath, factory, bufferSize);
7476
}

spring-web/src/main/java/org/springframework/http/server/reactive/UndertowHttpHandlerAdapter.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.springframework.http.server.reactive;
1818

1919
import java.io.IOException;
20+
import java.net.URISyntaxException;
2021

2122
import io.undertow.server.HttpServerExchange;
2223
import org.apache.commons.logging.Log;
@@ -64,8 +65,18 @@ public DataBufferFactory getDataBufferFactory() {
6465

6566

6667
@Override
67-
public void handleRequest(HttpServerExchange exchange) throws Exception {
68-
ServerHttpRequest request = new UndertowServerHttpRequest(exchange, getDataBufferFactory());
68+
public void handleRequest(HttpServerExchange exchange) {
69+
ServerHttpRequest request = null;
70+
try {
71+
request = new UndertowServerHttpRequest(exchange, getDataBufferFactory());
72+
}
73+
catch (URISyntaxException ex) {
74+
if (logger.isWarnEnabled()) {
75+
logger.warn("Invalid URL for incoming request: " + ex.getMessage());
76+
}
77+
exchange.setStatusCode(400);
78+
return;
79+
}
6980
ServerHttpResponse response = new UndertowServerHttpResponse(exchange, getDataBufferFactory());
7081

7182
if (request.getMethod() == HttpMethod.HEAD) {

spring-web/src/main/java/org/springframework/http/server/reactive/UndertowServerHttpRequest.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.io.OutputStream;
2222
import java.net.InetSocketAddress;
2323
import java.net.URI;
24+
import java.net.URISyntaxException;
2425
import java.nio.ByteBuffer;
2526
import java.util.function.IntPredicate;
2627
import javax.net.ssl.SSLSession;
@@ -59,19 +60,21 @@ class UndertowServerHttpRequest extends AbstractServerHttpRequest {
5960
private final RequestBodyPublisher body;
6061

6162

62-
public UndertowServerHttpRequest(HttpServerExchange exchange, DataBufferFactory bufferFactory) {
63+
public UndertowServerHttpRequest(HttpServerExchange exchange, DataBufferFactory bufferFactory)
64+
throws URISyntaxException {
65+
6366
super(initUri(exchange), "", initHeaders(exchange));
6467
this.exchange = exchange;
6568
this.body = new RequestBodyPublisher(exchange, bufferFactory);
6669
this.body.registerListeners(exchange);
6770
}
6871

69-
private static URI initUri(HttpServerExchange exchange) {
72+
private static URI initUri(HttpServerExchange exchange) throws URISyntaxException {
7073
Assert.notNull(exchange, "HttpServerExchange is required.");
7174
String requestURL = exchange.getRequestURL();
7275
String query = exchange.getQueryString();
7376
String requestUriAndQuery = StringUtils.isEmpty(query) ? requestURL : requestURL + "?" + query;
74-
return URI.create(requestUriAndQuery);
77+
return new URI(requestUriAndQuery);
7578
}
7679

7780
private static HttpHeaders initHeaders(HttpServerExchange exchange) {

0 commit comments

Comments
 (0)