From d181890d03468facc9249b79afeb1de743f1fa24 Mon Sep 17 00:00:00 2001 From: George Gastaldi Date: Mon, 17 Aug 2020 11:23:39 -0300 Subject: [PATCH] URL patterns for WebFilters are optional According to the spec, servlet names can be specified instead Fixes #11417 --- .../deployment/UndertowBuildStep.java | 40 ++++++++++++++----- .../quarkus/undertow/test/NamedServlet.java | 19 +++++++++ .../undertow/test/NoUrlPatternWebFilter.java | 20 ++++++++++ .../WebFilterWithNoUrlPatternTestCase.java | 26 ++++++++++++ 4 files changed, 94 insertions(+), 11 deletions(-) create mode 100644 extensions/undertow/deployment/src/test/java/io/quarkus/undertow/test/NamedServlet.java create mode 100644 extensions/undertow/deployment/src/test/java/io/quarkus/undertow/test/NoUrlPatternWebFilter.java create mode 100644 extensions/undertow/deployment/src/test/java/io/quarkus/undertow/test/WebFilterWithNoUrlPatternTestCase.java diff --git a/extensions/undertow/deployment/src/main/java/io/quarkus/undertow/deployment/UndertowBuildStep.java b/extensions/undertow/deployment/src/main/java/io/quarkus/undertow/deployment/UndertowBuildStep.java index 787b05c6ae33c..8d85da9adbfd8 100644 --- a/extensions/undertow/deployment/src/main/java/io/quarkus/undertow/deployment/UndertowBuildStep.java +++ b/extensions/undertow/deployment/src/main/java/io/quarkus/undertow/deployment/UndertowBuildStep.java @@ -431,14 +431,29 @@ public ServletDeploymentManagerBuildItem build(List servlets, } if (webMetaData.getFilterMappings() != null) { for (FilterMappingMetaData mapping : webMetaData.getFilterMappings()) { - for (String m : mapping.getUrlPatterns()) { - if (mapping.getDispatchers() == null || mapping.getDispatchers().isEmpty()) { - recorder.addFilterURLMapping(deployment, mapping.getFilterName(), m, REQUEST); - } else { - - for (DispatcherType dispatcher : mapping.getDispatchers()) { - recorder.addFilterURLMapping(deployment, mapping.getFilterName(), m, - javax.servlet.DispatcherType.valueOf(dispatcher.name())); + List urlPatterns = mapping.getUrlPatterns(); + List servletNames = mapping.getServletNames(); + if (urlPatterns != null && !urlPatterns.isEmpty()) { + for (String m : urlPatterns) { + if (mapping.getDispatchers() == null || mapping.getDispatchers().isEmpty()) { + recorder.addFilterURLMapping(deployment, mapping.getFilterName(), m, REQUEST); + } else { + for (DispatcherType dispatcher : mapping.getDispatchers()) { + recorder.addFilterURLMapping(deployment, mapping.getFilterName(), m, + javax.servlet.DispatcherType.valueOf(dispatcher.name())); + } + } + } + } else if (servletNames != null && !servletNames.isEmpty()) { + // No URL Patterns found, map to servlet name instead + for (String name : servletNames) { + if (mapping.getDispatchers() == null || mapping.getDispatchers().isEmpty()) { + recorder.addFilterServletNameMapping(deployment, mapping.getFilterName(), name, REQUEST); + } else { + for (DispatcherType dispatcher : mapping.getDispatchers()) { + recorder.addFilterServletNameMapping(deployment, mapping.getFilterName(), name, + javax.servlet.DispatcherType.valueOf(dispatcher.name())); + } } } } @@ -1005,14 +1020,17 @@ protected DescriptionGroupMetaData getDescriptionGroup(String description, Strin if (description.length() > 0 || displayName.length() > 0 || smallIcon.length() > 0 || largeIcon.length() > 0) { dg = new DescriptionGroupMetaData(); Descriptions descriptions = getDescription(description); - if (descriptions != null) + if (descriptions != null) { dg.setDescriptions(descriptions); + } DisplayNames displayNames = getDisplayName(displayName); - if (displayNames != null) + if (displayNames != null) { dg.setDisplayNames(displayNames); + } Icons icons = getIcons(smallIcon, largeIcon); - if (icons != null) + if (icons != null) { dg.setIcons(icons); + } } return dg; } diff --git a/extensions/undertow/deployment/src/test/java/io/quarkus/undertow/test/NamedServlet.java b/extensions/undertow/deployment/src/test/java/io/quarkus/undertow/test/NamedServlet.java new file mode 100644 index 0000000000000..dcec0f2b11c20 --- /dev/null +++ b/extensions/undertow/deployment/src/test/java/io/quarkus/undertow/test/NamedServlet.java @@ -0,0 +1,19 @@ +package io.quarkus.undertow.test; + +import java.io.IOException; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +@WebServlet(name = "named", urlPatterns = "/named") +public class NamedServlet extends HttpServlet { + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + resp.getWriter().write("Hello World"); + } + +} \ No newline at end of file diff --git a/extensions/undertow/deployment/src/test/java/io/quarkus/undertow/test/NoUrlPatternWebFilter.java b/extensions/undertow/deployment/src/test/java/io/quarkus/undertow/test/NoUrlPatternWebFilter.java new file mode 100644 index 0000000000000..9fc3ebb813533 --- /dev/null +++ b/extensions/undertow/deployment/src/test/java/io/quarkus/undertow/test/NoUrlPatternWebFilter.java @@ -0,0 +1,20 @@ +package io.quarkus.undertow.test; + +import java.io.IOException; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.annotation.WebFilter; + +@WebFilter(filterName = "MyFilter", servletNames = "named", asyncSupported = true) +public class NoUrlPatternWebFilter implements Filter { + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + response.getWriter().write("Goodbye"); + } +} diff --git a/extensions/undertow/deployment/src/test/java/io/quarkus/undertow/test/WebFilterWithNoUrlPatternTestCase.java b/extensions/undertow/deployment/src/test/java/io/quarkus/undertow/test/WebFilterWithNoUrlPatternTestCase.java new file mode 100644 index 0000000000000..6e837e3b0144f --- /dev/null +++ b/extensions/undertow/deployment/src/test/java/io/quarkus/undertow/test/WebFilterWithNoUrlPatternTestCase.java @@ -0,0 +1,26 @@ +package io.quarkus.undertow.test; + +import static io.restassured.RestAssured.when; +import static org.hamcrest.Matchers.is; + +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.spec.JavaArchive; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import io.quarkus.test.QuarkusUnitTest; + +public class WebFilterWithNoUrlPatternTestCase { + + @RegisterExtension + static QuarkusUnitTest runner = new QuarkusUnitTest() + .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class) + .addClasses(NoUrlPatternWebFilter.class, NamedServlet.class)); + + @Test + public void testFilterWithNoUrlPattern() { + when().get("/named").then() + .statusCode(200) + .body(is("Goodbye")); + } +}