Skip to content

Commit 35e8f1c

Browse files
committed
Support queries in opaque URLs
Closes gh-32920
1 parent 7fc4937 commit 35e8f1c

File tree

3 files changed

+35
-1
lines changed

3 files changed

+35
-1
lines changed

spring-web/src/main/java/org/springframework/web/util/UriComponentsBuilder.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,8 @@ public static UriComponentsBuilder fromUriString(String uri) throws InvalidUrlEx
236236
builder.port(urlRecord.port().toString());
237237
}
238238
if (urlRecord.path().isOpaque()) {
239-
builder.schemeSpecificPart(urlRecord.path().toString());
239+
String ssp = urlRecord.path() + urlRecord.search();
240+
builder.schemeSpecificPart(ssp);
240241
}
241242
else {
242243
builder.path(urlRecord.path().toString());

spring-web/src/test/java/org/springframework/web/util/UriComponentsBuilderTests.java

+10
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,16 @@ void fromUriString() {
196196
assertThat(result.getQuery()).isNull();
197197
assertThat(result.getFragment()).isEqualTo("baz");
198198

199+
result = UriComponentsBuilder.fromUriString("mailto:[email protected]?subject=foo").build();
200+
assertThat(result.getScheme()).isEqualTo("mailto");
201+
assertThat(result.getUserInfo()).isNull();
202+
assertThat(result.getHost()).isNull();
203+
assertThat(result.getPort()).isEqualTo(-1);
204+
assertThat(result.getSchemeSpecificPart()).isEqualTo("[email protected]?subject=foo");
205+
assertThat(result.getPath()).isNull();
206+
assertThat(result.getQuery()).isNull();
207+
assertThat(result.getFragment()).isNull();
208+
199209
result = UriComponentsBuilder.fromUriString("docs/guide/collections/designfaq.html#28").build();
200210
assertThat(result.getScheme()).isNull();
201211
assertThat(result.getUserInfo()).isNull();

spring-web/src/test/java/org/springframework/web/util/UrlParserTests.java

+23
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,31 @@ private void testParse(String input, String scheme, @Nullable String host, @Null
6161
else {
6262
assertThat(result.port()).as("Port is not null").isNull();
6363
}
64+
assertThat(result.hasOpaquePath()).as("Result has opaque path").isFalse();
6465
assertThat(result.path().toString()).as("Invalid path").isEqualTo(path);
6566
assertThat(result.query()).as("Invalid query").isEqualTo(query);
6667
assertThat(result.fragment()).as("Invalid fragment").isEqualTo(fragment);
6768
}
69+
70+
@Test
71+
void parseOpaque() {
72+
testParseOpaque("mailto:[email protected]?subject=foo", "[email protected]", "subject=foo");
73+
74+
}
75+
76+
void testParseOpaque(String input, String path, @Nullable String query) {
77+
UrlParser.UrlRecord result = UrlParser.parse("mailto:[email protected]?subject=foo", EMPTY_URL_RECORD, null, null);
78+
79+
80+
assertThat(result.scheme()).as("Invalid scheme").isEqualTo("mailto");
81+
assertThat(result.hasOpaquePath()).as("Result has no opaque path").isTrue();
82+
assertThat(result.path().toString()).as("Invalid path").isEqualTo(path);
83+
if (query != null) {
84+
assertThat(result.query()).as("Query is null").isNotNull();
85+
assertThat(result.query()).as("Invalid query").isEqualTo(query);
86+
}
87+
else {
88+
assertThat(result.query()).as("Query is not null").isNull();
89+
}
90+
}
6891
}

0 commit comments

Comments
 (0)