From d7ee504ee0f7e47635282bd97e2976979a002683 Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Mon, 29 Jul 2019 14:42:34 +0100 Subject: [PATCH 1/2] Only include our own mime mappings in Undertow Update `UndertowServletWebServerFactory` so that only our own mime type mappings are included. Prior to this commit both our mime mappings and Undertow's default mime mappings would always be included. Fixes gh-17687 --- .../UndertowServletWebServerFactory.java | 17 +++++++++++++++++ .../UndertowServletWebServerFactoryTests.java | 13 ------------- .../AbstractServletWebServerFactoryTests.java | 6 +----- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/embedded/undertow/UndertowServletWebServerFactory.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/embedded/undertow/UndertowServletWebServerFactory.java index 3e17e4fe6cf..39f043d7443 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/embedded/undertow/UndertowServletWebServerFactory.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/embedded/undertow/UndertowServletWebServerFactory.java @@ -26,7 +26,10 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.EventListener; +import java.util.HashMap; import java.util.List; +import java.util.Locale; +import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; @@ -56,6 +59,7 @@ import io.undertow.servlet.api.ListenerInfo; import io.undertow.servlet.api.MimeMapping; import io.undertow.servlet.api.ServletContainerInitializerInfo; import io.undertow.servlet.api.ServletStackTraces; +import io.undertow.servlet.core.DeploymentImpl; import io.undertow.servlet.handlers.DefaultServlet; import io.undertow.servlet.util.ImmediateInstanceFactory; import org.xnio.OptionMap; @@ -277,6 +281,9 @@ public class UndertowServletWebServerFactory extends AbstractServletWebServerFac addLocaleMappings(deployment); DeploymentManager manager = Servlets.newContainer().addDeployment(deployment); manager.deploy(); + if (manager.getDeployment() instanceof DeploymentImpl) { + removeSuperfluousMimeMappings((DeploymentImpl) manager.getDeployment(), deployment); + } SessionManager sessionManager = manager.getDeployment().getSessionManager(); Duration timeoutDuration = getSession().getTimeout(); int sessionTimeout = (isZeroOrLess(timeoutDuration) ? -1 : (int) timeoutDuration.getSeconds()); @@ -411,6 +418,16 @@ public class UndertowServletWebServerFactory extends AbstractServletWebServerFac } } + private void removeSuperfluousMimeMappings(DeploymentImpl deployment, DeploymentInfo deploymentInfo) { + // DeploymentManagerImpl will always add MimeMappings.DEFAULT_MIME_MAPPINGS + // but we only want ours + Map mappings = new HashMap<>(); + for (MimeMapping mapping : deploymentInfo.getMimeMappings()) { + mappings.put(mapping.getExtension().toLowerCase(Locale.ENGLISH), mapping.getMimeType()); + } + deployment.setMimeExtensionMappings(mappings); + } + /** * Factory method called to create the {@link UndertowServletWebServer}. Subclasses * can override this method to return a different {@link UndertowServletWebServer} or diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/undertow/UndertowServletWebServerFactoryTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/undertow/UndertowServletWebServerFactoryTests.java index 951db0f1078..ca9fd777526 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/undertow/UndertowServletWebServerFactoryTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/embedded/undertow/UndertowServletWebServerFactoryTests.java @@ -22,11 +22,8 @@ import java.net.SocketException; import java.net.URISyntaxException; import java.nio.charset.Charset; import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; import java.util.Locale; import java.util.Map; -import java.util.Set; import java.util.concurrent.atomic.AtomicReference; import javax.net.ssl.SSLException; @@ -42,7 +39,6 @@ import org.mockito.InOrder; import org.springframework.boot.testsupport.web.servlet.ExampleServlet; import org.springframework.boot.web.server.ErrorPage; -import org.springframework.boot.web.server.MimeMappings.Mapping; import org.springframework.boot.web.server.PortInUseException; import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.boot.web.servlet.server.AbstractServletWebServerFactory; @@ -261,15 +257,6 @@ public class UndertowServletWebServerFactoryTests extends AbstractServletWebServ .getMimeExtensionMappings(); } - @Override - protected Collection getExpectedMimeMappings() { - // Unlike Tomcat and Jetty, Undertow performs a case-sensitive match on file - // extension so it has a mapping for "z" and "Z". - Set expectedMappings = new HashSet<>(super.getExpectedMimeMappings()); - expectedMappings.add(new Mapping("Z", "application/x-compress")); - return expectedMappings; - } - @Override protected Charset getCharset(Locale locale) { DeploymentInfo info = ((UndertowServletWebServer) this.webServer).getDeploymentManager().getDeployment() diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/servlet/server/AbstractServletWebServerFactoryTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/servlet/server/AbstractServletWebServerFactoryTests.java index c23820e512d..dbc0723e30b 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/servlet/server/AbstractServletWebServerFactoryTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/servlet/server/AbstractServletWebServerFactoryTests.java @@ -800,7 +800,7 @@ public abstract class AbstractServletWebServerFactoryTests { AbstractServletWebServerFactory factory = getFactory(); this.webServer = factory.getWebServer(); Map configuredMimeMappings = getActualMimeMappings(); - Collection expectedMimeMappings = getExpectedMimeMappings(); + Collection expectedMimeMappings = MimeMappings.DEFAULT.getAll(); configuredMimeMappings.forEach( (key, value) -> assertThat(expectedMimeMappings).contains(new MimeMappings.Mapping(key, value))); for (MimeMappings.Mapping mapping : expectedMimeMappings) { @@ -1034,10 +1034,6 @@ public abstract class AbstractServletWebServerFactoryTests { protected abstract Map getActualMimeMappings(); - protected Collection getExpectedMimeMappings() { - return MimeMappings.DEFAULT.getAll(); - } - protected abstract Charset getCharset(Locale locale); private void addTestTxtFile(AbstractServletWebServerFactory factory) throws IOException { From 73efce6306d6df7169cd02370eba55874c7ad9c3 Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Mon, 29 Jul 2019 14:46:16 +0100 Subject: [PATCH 2/2] Upgrade to Undertow 2.0.22.Final Closes gh-17676 --- spring-boot-project/spring-boot-dependencies/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-boot-project/spring-boot-dependencies/pom.xml b/spring-boot-project/spring-boot-dependencies/pom.xml index 7d186c3b4a9..a6fd38fb7ed 100644 --- a/spring-boot-project/spring-boot-dependencies/pom.xml +++ b/spring-boot-project/spring-boot-dependencies/pom.xml @@ -189,7 +189,7 @@ 3.0.4.RELEASE 9.0.22 4.0.11 - 2.0.21.Final + 2.0.22.Final 3325375 0.35 5.0.3