Skip to content

Commit bbec7b0

Browse files
committed
Merge branch '2.1.x'
Closes gh-17994
2 parents b57db50 + 9961647 commit bbec7b0

File tree

6 files changed

+49
-3
lines changed

6 files changed

+49
-3
lines changed

spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/embedded/undertow/UndertowServletWebServerFactory.java

+7-3
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@
1818

1919
import java.io.File;
2020
import java.io.IOException;
21-
import java.net.MalformedURLException;
2221
import java.net.URL;
22+
import java.net.URLEncoder;
2323
import java.time.Duration;
2424
import java.util.ArrayList;
2525
import java.util.Arrays;
@@ -33,6 +33,7 @@
3333
import java.util.Map;
3434
import java.util.Set;
3535
import java.util.concurrent.TimeUnit;
36+
import java.util.regex.Pattern;
3637

3738
import javax.servlet.ServletContainerInitializer;
3839
import javax.servlet.ServletContext;
@@ -95,6 +96,8 @@
9596
public class UndertowServletWebServerFactory extends AbstractServletWebServerFactory
9697
implements ConfigurableUndertowWebServerFactory, ResourceLoaderAware {
9798

99+
private static final Pattern ENCODED_SLASH = Pattern.compile("%2F", Pattern.LITERAL);
100+
98101
private static final Set<Class<?>> NO_CLASSES = Collections.emptySet();
99102

100103
private Set<UndertowBuilderCustomizer> builderCustomizers = new LinkedHashSet<>();
@@ -583,14 +586,15 @@ public void removeResourceChangeListener(ResourceChangeListener listener) {
583586

584587
private URLResource getMetaInfResource(URL resourceJar, String path) {
585588
try {
586-
URL resourceUrl = new URL(resourceJar + "META-INF/resources" + path);
589+
String urlPath = URLEncoder.encode(ENCODED_SLASH.matcher(path).replaceAll("/"), "UTF-8");
590+
URL resourceUrl = new URL(resourceJar + "META-INF/resources" + urlPath);
587591
URLResource resource = new URLResource(resourceUrl, path);
588592
if (resource.getContentLength() < 0) {
589593
return null;
590594
}
591595
return resource;
592596
}
593-
catch (MalformedURLException ex) {
597+
catch (Exception ex) {
594598
return null;
595599
}
596600
}

spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/ApplicationBuilder.java

+4
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,10 @@ private File createResourcesJar() throws IOException {
9898
resourcesJarStream.putNextEntry(new ZipEntry("META-INF/resources/nested-meta-inf-resource.txt"));
9999
resourcesJarStream.write("nested".getBytes());
100100
resourcesJarStream.closeEntry();
101+
resourcesJarStream.putNextEntry(
102+
new ZipEntry("META-INF/resources/nested-reserved-!#$%&()*+,:=?@[]-meta-inf-resource.txt"));
103+
resourcesJarStream.write("encoded-name".getBytes());
104+
resourcesJarStream.closeEntry();
101105
return resourcesJar;
102106
}
103107
}

spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/EmbeddedServletContainerJarDevelopmentIntegrationTests.java

+10
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,16 @@ public void metaInfResourceFromDependencyIsAvailableViaHttp(RestTemplate rest) {
4040
assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK);
4141
}
4242

43+
@TestTemplate
44+
public void metaInfResourceFromDependencyWithNameThatContainsReservedCharactersIsAvailableViaHttp(
45+
RestTemplate rest) {
46+
ResponseEntity<String> entity = rest.getForEntity(
47+
"/nested-reserved-%21%23%24%25%26%28%29%2A%2B%2C%3A%3D%3F%40%5B%5D-meta-inf-resource.txt",
48+
String.class);
49+
assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK);
50+
assertThat(entity.getBody()).isEqualTo("encoded-name");
51+
}
52+
4353
@TestTemplate
4454
public void metaInfResourceFromDependencyIsAvailableViaServletContext(RestTemplate rest) {
4555
ResponseEntity<String> entity = rest.getForEntity("/servletContext?/nested-meta-inf-resource.txt",

spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/EmbeddedServletContainerJarPackagingIntegrationTests.java

+9
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,15 @@ public void nestedMetaInfResourceIsAvailableViaHttp(RestTemplate rest) {
4040
assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK);
4141
}
4242

43+
@TestTemplate
44+
public void nestedMetaInfResourceWithNameThatContainsReservedCharactersIsAvailableViaHttp(RestTemplate rest) {
45+
ResponseEntity<String> entity = rest.getForEntity(
46+
"/nested-reserved-%21%23%24%25%26%28%29%2A%2B%2C%3A%3D%3F%40%5B%5D-meta-inf-resource.txt",
47+
String.class);
48+
assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK);
49+
assertThat(entity.getBody()).isEqualTo("encoded-name");
50+
}
51+
4352
@TestTemplate
4453
public void nestedMetaInfResourceIsAvailableViaServletContext(RestTemplate rest) {
4554
ResponseEntity<String> entity = rest.getForEntity("/servletContext?/nested-meta-inf-resource.txt",

spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/EmbeddedServletContainerWarDevelopmentIntegrationTests.java

+10
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,16 @@ public void metaInfResourceFromDependencyIsAvailableViaHttp(RestTemplate rest) {
4747
assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK);
4848
}
4949

50+
@TestTemplate
51+
public void metaInfResourceFromDependencyWithNameThatContainsReservedCharactersIsAvailableViaHttp(
52+
RestTemplate rest) {
53+
ResponseEntity<String> entity = rest.getForEntity(
54+
"/nested-reserved-%21%23%24%25%26%28%29%2A%2B%2C%3A%3D%3F%40%5B%5D-meta-inf-resource.txt",
55+
String.class);
56+
assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK);
57+
assertThat(entity.getBody()).isEqualTo("encoded-name");
58+
}
59+
5060
@TestTemplate
5161
public void metaInfResourceFromDependencyIsAvailableViaServletContext(RestTemplate rest) {
5262
ResponseEntity<String> entity = rest.getForEntity("/servletContext?/nested-meta-inf-resource.txt",

spring-boot-tests/spring-boot-integration-tests/spring-boot-server-tests/src/test/java/org/springframework/boot/context/embedded/EmbeddedServletContainerWarPackagingIntegrationTests.java

+9
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,15 @@ public void nestedMetaInfResourceIsAvailableViaHttp(RestTemplate rest) {
4747
assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK);
4848
}
4949

50+
@TestTemplate
51+
public void nestedMetaInfResourceWithNameThatContainsReservedCharactersIsAvailableViaHttp(RestTemplate rest) {
52+
ResponseEntity<String> entity = rest.getForEntity(
53+
"/nested-reserved-%21%23%24%25%26%28%29%2A%2B%2C%3A%3D%3F%40%5B%5D-meta-inf-resource.txt",
54+
String.class);
55+
assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK);
56+
assertThat(entity.getBody()).isEqualTo("encoded-name");
57+
}
58+
5059
@TestTemplate
5160
public void nestedMetaInfResourceIsAvailableViaServletContext(RestTemplate rest) {
5261
ResponseEntity<String> entity = rest.getForEntity("/servletContext?/nested-meta-inf-resource.txt",

0 commit comments

Comments
 (0)