From 5b4728f0bf06b61ca609c9ad2e207c5f71618e24 Mon Sep 17 00:00:00 2001 From: rstoyanchev Date: Tue, 2 Dec 2025 19:05:16 +0000 Subject: [PATCH] Avoid http - web.utils package cycle Closes gh-35952 --- .../http/server/ServletServerHttpRequest.java | 14 ++++++++----- .../reactive/ServletServerHttpRequest.java | 20 +++++++++++-------- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/http/server/ServletServerHttpRequest.java b/spring-web/src/main/java/org/springframework/http/server/ServletServerHttpRequest.java index 314d6af0a1c..a31bdad11a4 100644 --- a/spring-web/src/main/java/org/springframework/http/server/ServletServerHttpRequest.java +++ b/spring-web/src/main/java/org/springframework/http/server/ServletServerHttpRequest.java @@ -50,7 +50,6 @@ import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.LinkedCaseInsensitiveMap; import org.springframework.util.StringUtils; -import org.springframework.web.util.UriComponentsBuilder; /** * {@link ServerHttpRequest} implementation that is based on a {@link HttpServletRequest}. @@ -133,15 +132,15 @@ public class ServletServerHttpRequest implements ServerHttpRequest { } catch (URISyntaxException ex) { if (hasQuery) { + String requestURL = servletRequest.getRequestURL().toString(); try { - // Maybe malformed query, try to parse and encode it - query = UriComponentsBuilder.fromUriString("?" + query).build().toUri().getRawQuery(); - return new URI(servletRequest.getRequestURL().toString() + "?" + query); + // Maybe malformed query, try to encode it + return new URI(requestURL + "?" + encodeQuery(query)); } catch (URISyntaxException ex2) { try { // Try leaving it out - return new URI(servletRequest.getRequestURL().toString()); + return new URI(requestURL); } catch (URISyntaxException ex3) { // ignore @@ -153,6 +152,11 @@ public class ServletServerHttpRequest implements ServerHttpRequest { } } + private static String encodeQuery(String query) throws URISyntaxException { + // Avoid package cycle with web.utils + return new URI(null, null, "", query, null).getRawQuery(); + } + @Override public HttpHeaders getHeaders() { if (this.headers == null) { diff --git a/spring-web/src/main/java/org/springframework/http/server/reactive/ServletServerHttpRequest.java b/spring-web/src/main/java/org/springframework/http/server/reactive/ServletServerHttpRequest.java index 0d135df92ab..87230f91720 100644 --- a/spring-web/src/main/java/org/springframework/http/server/reactive/ServletServerHttpRequest.java +++ b/spring-web/src/main/java/org/springframework/http/server/reactive/ServletServerHttpRequest.java @@ -51,7 +51,6 @@ import org.springframework.util.LinkedCaseInsensitiveMap; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.util.StringUtils; -import org.springframework.web.util.UriComponentsBuilder; /** * Adapt {@link ServerHttpRequest} to the Servlet {@link HttpServletRequest}. @@ -140,15 +139,15 @@ class ServletServerHttpRequest extends AbstractServerHttpRequest { } catch (URISyntaxException ex) { if (hasQuery) { + String requestURL = servletRequest.getRequestURL().toString(); try { - // Maybe malformed query, try to parse and encode it - query = UriComponentsBuilder.fromUriString("?" + query).build().toUri().getRawQuery(); - return new URI(servletRequest.getRequestURL().toString() + "?" + query); + // Maybe malformed query, try to encode it + return new URI(requestURL + "?" + encodeQuery(query)); } catch (URISyntaxException ex2) { try { // Try leaving it out - return new URI(servletRequest.getRequestURL().toString()); + return new URI(requestURL); } catch (URISyntaxException ex3) { // ignore @@ -160,9 +159,14 @@ class ServletServerHttpRequest extends AbstractServerHttpRequest { } } - @SuppressWarnings("NullAway") - private static MultiValueMap initHeaders( - MultiValueMap headerValues, HttpServletRequest request) { + private static String encodeQuery(String query) throws URISyntaxException { + // Avoid package cycle with web.utils + return new URI(null, null, "", query, null).getRawQuery(); + } + + @SuppressWarnings("NullAway") // Dataflow analysis limitation + private static MultiValueMap initHeaders( + MultiValueMap headerValues, HttpServletRequest request) { HttpHeaders headers = null; MediaType contentType = null;