You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by ju...@apache.org on 2024/09/27 13:04:23 UTC

(tomee) branch TOMEE-4406 created (now 3cde48e475)

This is an automated email from the ASF dual-hosted git repository.

jungm pushed a change to branch TOMEE-4406
in repository https://gitbox.apache.org/repos/asf/tomee.git


      at 3cde48e475 improved request request matching in CXFJAXRSFilter

This branch includes the following new commits:

     new 7102ea5b3f close InputStream
     new 3cde48e475 improved request request matching in CXFJAXRSFilter

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



(tomee) 01/02: close InputStream

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

jungm pushed a commit to branch TOMEE-4406
in repository https://gitbox.apache.org/repos/asf/tomee.git

commit 7102ea5b3fa0d771a70f0220997e871d1ccd7eba
Author: Markus Jung <ju...@apache.org>
AuthorDate: Fri Sep 27 13:46:43 2024 +0200

    close InputStream
---
 .../main/java/org/apache/tomee/webservices/CXFJAXRSFilter.java | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/tomee/tomee-jaxrs/src/main/java/org/apache/tomee/webservices/CXFJAXRSFilter.java b/tomee/tomee-jaxrs/src/main/java/org/apache/tomee/webservices/CXFJAXRSFilter.java
index b70fc2e399..4c7b8f98ec 100644
--- a/tomee/tomee-jaxrs/src/main/java/org/apache/tomee/webservices/CXFJAXRSFilter.java
+++ b/tomee/tomee-jaxrs/src/main/java/org/apache/tomee/webservices/CXFJAXRSFilter.java
@@ -88,10 +88,12 @@ public class CXFJAXRSFilter implements Filter {
                 chain.doFilter(request, response);
                 return;
             }
-            final InputStream staticContent = delegate.findStaticContent(httpServletRequest, welcomeFiles);
-            if (staticContent != null) {
-                chain.doFilter(request, response);
-                return;
+
+            try (final InputStream staticContent = delegate.findStaticContent(httpServletRequest, welcomeFiles)) {
+                if (staticContent != null) {
+                    chain.doFilter(request, response);
+                    return;
+                }
             }
         }
 


(tomee) 02/02: improved request request matching in CXFJAXRSFilter

Posted by ju...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

jungm pushed a commit to branch TOMEE-4406
in repository https://gitbox.apache.org/repos/asf/tomee.git

commit 3cde48e4758da8c995827a0011b9bf7aacaf152a
Author: Markus Jung <ju...@apache.org>
AuthorDate: Fri Sep 27 14:58:22 2024 +0200

    improved request request matching in CXFJAXRSFilter
---
 .../openejb/server/cxf/rs/CxfRsHttpListener.java   |  49 +++++-----
 .../apache/tomee/webservices/CXFJAXRSFilter.java   | 103 ++++-----------------
 .../apache/tomee/webservices/TomcatRsRegistry.java |   1 -
 3 files changed, 41 insertions(+), 112 deletions(-)

diff --git a/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java b/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java
index d8b9c9d4d7..777e86744b 100644
--- a/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java
+++ b/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java
@@ -351,44 +351,37 @@ public class CxfRsHttpListener implements RsHttpListener {
     }
 
     private boolean applicationProvidesResources(final Application application) {
-        try {
-            if (application == null) {
-                return false;
-            }
-            if (InternalApplication.class.isInstance(application) && (InternalApplication.class.cast(application).getOriginal() == null)) {
-                return false;
-            }
-            return !application.getClasses().isEmpty() || !application.getSingletons().isEmpty();
-        } catch (final Exception e) {
+        if (application == null) {
             return false;
         }
+
+        Set<Class<?>> classes = application.getClasses();
+        Set<Object> singletons = application.getSingletons();
+        return classes != null && !classes.isEmpty() || singletons != null && !singletons.isEmpty();
     }
 
     public boolean isCXFResource(final HttpServletRequest request) {
         try {
-            Application application = findApplication();
-            if (!applicationProvidesResources(application)) {
-                JAXRSServiceImpl service = (JAXRSServiceImpl) server.getEndpoint().getService();
-
-                if (service == null) {
-                    return false;
-                }
+            if (!applicationProvidesResources(findApplication())) { // nothing is registered in JAX-RS
+                return false;
+            }
 
-                String pathToMatch = HttpUtils.getPathToMatch(request.getServletPath(), pattern, true);
+            JAXRSServiceImpl service = (JAXRSServiceImpl) server.getEndpoint().getService();
+            if (service == null) {
+                return false;
+            }
 
-                final List<ClassResourceInfo> resources = service.getClassResourceInfos();
-                for (final ClassResourceInfo info : resources) {
-                    if (info.getResourceClass() == null || info.getURITemplate() == null) { // possible?
-                        continue;
-                    }
+            String pathToMatch = HttpUtils.getPathToMatch(request.getServletPath(), pattern, true);
+            final List<ClassResourceInfo> resources = service.getClassResourceInfos();
+            for (final ClassResourceInfo info : resources) {
+                if (info.getResourceClass() == null || info.getURITemplate() == null) { // possible?
+                    continue;
+                }
 
-                    final MultivaluedMap<String, String> parameters = new MultivaluedHashMap<>();
-                    if (info.getURITemplate().match(pathToMatch, parameters)) {
-                        return true;
-                    }
+                final MultivaluedMap<String, String> parameters = new MultivaluedHashMap<>();
+                if (info.getURITemplate().match(pathToMatch, parameters)) {
+                    return true;
                 }
-            } else {
-                return true;
             }
         } catch (final Exception e) {
             LOGGER.info("No JAX-RS service");
diff --git a/tomee/tomee-jaxrs/src/main/java/org/apache/tomee/webservices/CXFJAXRSFilter.java b/tomee/tomee-jaxrs/src/main/java/org/apache/tomee/webservices/CXFJAXRSFilter.java
index 4c7b8f98ec..6254e8ab17 100644
--- a/tomee/tomee-jaxrs/src/main/java/org/apache/tomee/webservices/CXFJAXRSFilter.java
+++ b/tomee/tomee-jaxrs/src/main/java/org/apache/tomee/webservices/CXFJAXRSFilter.java
@@ -16,43 +16,28 @@
  */
 package org.apache.tomee.webservices;
 
+import jakarta.servlet.ServletRegistration;
 import org.apache.catalina.Wrapper;
-import org.apache.catalina.connector.Request;
-import org.apache.catalina.connector.RequestFacade;
 import org.apache.openejb.server.cxf.rs.CxfRsHttpListener;
 import org.apache.openejb.server.httpd.ServletRequestAdapter;
 import org.apache.openejb.server.httpd.ServletResponseAdapter;
 
 import jakarta.servlet.Filter;
 import jakarta.servlet.FilterChain;
-import jakarta.servlet.FilterConfig;
 import jakarta.servlet.ServletException;
 import jakarta.servlet.ServletRequest;
 import jakarta.servlet.ServletResponse;
 import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletRequestWrapper;
 import jakarta.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.io.InputStream;
-import java.lang.reflect.Field;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 
 public class CXFJAXRSFilter implements Filter {
-    private static final Field REQUEST;
-    static {
-        try {
-            REQUEST = RequestFacade.class.getDeclaredField("request");
-        } catch (final NoSuchFieldException e) {
-            throw new IllegalStateException(e);
-        }
-        REQUEST.setAccessible(true);
-    }
-
     private final CxfRsHttpListener delegate;
     private final ConcurrentMap<Wrapper, Boolean> mappingByServlet = new ConcurrentHashMap<>();
     private final String[] welcomeFiles;
-    private String mapping;
 
     public CXFJAXRSFilter(final CxfRsHttpListener delegate, final String[] welcomeFiles) {
         this.delegate = delegate;
@@ -63,11 +48,6 @@ public class CXFJAXRSFilter implements Filter {
         }
     }
 
-    @Override
-    public void init(final FilterConfig filterConfig) throws ServletException {
-        mapping = filterConfig.getInitParameter("mapping");
-    }
-
     @Override
     public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException, ServletException {
         if (!HttpServletRequest.class.isInstance(request)) {
@@ -83,12 +63,14 @@ public class CXFJAXRSFilter implements Filter {
             return;
         }
 
-        if (CxfRsHttpListener.TRY_STATIC_RESOURCES) { // else 100% JAXRS
-            if (servletMappingIsUnderRestPath(httpServletRequest)) {
-                chain.doFilter(request, response);
-                return;
-            }
+        // if a servlet matched it always has priority over JAX-RS endpoints, see TOMEE-4406
+        if (nonDefaultServletMatches(httpServletRequest)) {
+            chain.doFilter(request, response);
+            return;
+        }
 
+        // Try to figure out if Tomcat DefaultServlet would handle this request
+        if (CxfRsHttpListener.TRY_STATIC_RESOURCES) {
             try (final InputStream staticContent = delegate.findStaticContent(httpServletRequest, welcomeFiles)) {
                 if (staticContent != null) {
                     chain.doFilter(request, response);
@@ -97,6 +79,7 @@ public class CXFJAXRSFilter implements Filter {
             }
         }
 
+        // else 100% JAXRS
         try {
             delegate.doInvoke(
                     new ServletRequestAdapter(httpServletRequest, httpServletResponse, request.getServletContext()),
@@ -106,63 +89,17 @@ public class CXFJAXRSFilter implements Filter {
         }
     }
 
-    private boolean servletMappingIsUnderRestPath(final HttpServletRequest request) {
-        final HttpServletRequest unwrapped = unwrap(request);
-        if (!RequestFacade.class.isInstance(unwrapped)) {
-            return false;
-        }
-
-        final Request tr;
-        try {
-            tr = Request.class.cast(REQUEST.get(unwrapped));
-        } catch (final IllegalAccessException e) {
-            return false;
-        }
-        final Wrapper wrapper = tr.getWrapper();
-        if (wrapper == null || mapping == null) {
-            return false;
-        }
-
-        Boolean accept = mappingByServlet.get(wrapper);
-        if (accept == null) {
-            accept = false;
-            if (!"org.apache.catalina.servlets.DefaultServlet".equals(wrapper.getServletClass())) {
-                for (final String mapping : wrapper.findMappings()) {
-                    if (!mapping.isEmpty() && !"/*".equals(mapping) && !"/".equals(mapping) && !mapping.startsWith("*")
-                            && mapping.startsWith(this.mapping)) {
-                        accept = true;
-                        break;
-                    }
-                }
-            } // else will be handed by getResourceAsStream()
-            mappingByServlet.putIfAbsent(wrapper, accept);
-            return accept;
-        }
-
-        return accept;
-    }
-
-    private HttpServletRequest unwrap(final HttpServletRequest request) {
-        HttpServletRequest unwrapped = request;
-        boolean changed;
-        do {
-            changed = false;
-            while (HttpServletRequestWrapper.class.isInstance(unwrapped)) {
-                final HttpServletRequest tmp = HttpServletRequest.class.cast(HttpServletRequestWrapper.class.cast(unwrapped).getRequest());
-                if (tmp != unwrapped) {
-                    unwrapped = tmp;
-                } else {
-                    changed = false; // quit
-                    break;
-                }
-                changed = true;
-            }
-            while (ServletRequestAdapter.class.isInstance(unwrapped)) {
-                unwrapped = ServletRequestAdapter.class.cast(unwrapped).getRequest();
-                changed = true;
-            }
-        } while (changed);
-        return unwrapped;
+    /**
+     * Checks if the request matched a defined servlet mapping matches the given request
+     *
+     * @param request the HttpServletRequest to check
+     * @return if the servlet mapping matches and is not the tomcat DefaultServlet
+     */
+    private boolean nonDefaultServletMatches(final HttpServletRequest request) {
+        ServletRegistration servletRegistration = request.getServletContext().getServletRegistration(
+                request.getHttpServletMapping().getServletName());
+
+        return !"org.apache.catalina.servlets.DefaultServlet".equals(servletRegistration.getClassName());
     }
 
     @Override
diff --git a/tomee/tomee-jaxrs/src/main/java/org/apache/tomee/webservices/TomcatRsRegistry.java b/tomee/tomee-jaxrs/src/main/java/org/apache/tomee/webservices/TomcatRsRegistry.java
index 904c600d49..a8be769e71 100644
--- a/tomee/tomee-jaxrs/src/main/java/org/apache/tomee/webservices/TomcatRsRegistry.java
+++ b/tomee/tomee-jaxrs/src/main/java/org/apache/tomee/webservices/TomcatRsRegistry.java
@@ -123,7 +123,6 @@ public class TomcatRsRegistry implements RsRegistry {
         filterDef.setDisplayName(description);
         filterDef.setFilter(new CXFJAXRSFilter(cxfRsHttpListener, context.findWelcomeFiles()));
         filterDef.setFilterClass(CXFJAXRSFilter.class.getName());
-        filterDef.addInitParameter("mapping", urlPattern.substring(0, urlPattern.length() - "/*".length())); // just keep base path
         context.addFilterDef(filterDef);
 
         final FilterMap filterMap = new FilterMap();