You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by rg...@apache.org on 2008/10/27 22:46:05 UTC

svn commit: r708334 - in /struts/struts2/branches/STRUTS_2_0_X/core/src: main/java/org/apache/struts2/dispatcher/FilterDispatcher.java test/java/org/apache/struts2/dispatcher/FilterDispatcherTest.java

Author: rgielen
Date: Mon Oct 27 14:46:04 2008
New Revision: 708334

URL: http://svn.apache.org/viewvc?rev=708334&view=rev
Log:
WW-2849:
Refatoring to provide better testability for static resource resolution

Modified:
    struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/dispatcher/FilterDispatcher.java
    struts/struts2/branches/STRUTS_2_0_X/core/src/test/java/org/apache/struts2/dispatcher/FilterDispatcherTest.java

Modified: struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/dispatcher/FilterDispatcher.java
URL: http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/dispatcher/FilterDispatcher.java?rev=708334&r1=708333&r2=708334&view=diff
==============================================================================
--- struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/dispatcher/FilterDispatcher.java (original)
+++ struts/struts2/branches/STRUTS_2_0_X/core/src/main/java/org/apache/struts2/dispatcher/FilterDispatcher.java Mon Oct 27 14:46:04 2008
@@ -150,10 +150,12 @@
      */
     private static final Log LOG = LogFactory.getLog(FilterDispatcher.class);
 
+    static final String DEFAULT_STATIC_PACKAGES = "org.apache.struts2.static template org.apache.struts2.interceptor.debugging";
+
     /**
      * Store set of path prefixes to use with static resources.
      */
-    private String[] pathPrefixes;
+    String[] pathPrefixes;
 
     /**
      * Provide a formatted date for setting heading information when caching static content.
@@ -203,7 +205,7 @@
         dispatcher.init();
        
         String param = filterConfig.getInitParameter("packages");
-        String packages = "org.apache.struts2.static template org.apache.struts2.interceptor.debugging";
+        String packages = DEFAULT_STATIC_PACKAGES;
         if (param != null) {
             packages = param + " " + packages;
         }
@@ -408,7 +410,7 @@
                 }
 
                 if (serveStatic && resourcePath.startsWith("/struts")) {
-                    findStaticResource(resourcePath, request, response);
+                    findStaticResource(resourcePath, findAndCheckResources(resourcePath), request, response);
                 } else {
                     // this is a normal request, let it pass through
                     chain.doFilter(request, response);
@@ -430,35 +432,29 @@
 
     /**
      * Locate a static resource and copy directly to the response,
-     * setting the appropriate caching headers. 
+     * setting the appropriate caching headers.
      *
      * @param path The resource path
+     * @param resourceUrls List of matching resource URLs
      * @param request The request
      * @param response The response
      * @throws IOException If anything goes wrong
      */
-    public void findStaticResource(String path, HttpServletRequest request, HttpServletResponse response)
+    public void findStaticResource(String path, List<URL> resourceUrls, HttpServletRequest request, HttpServletResponse response)
             throws IOException {
-        String name = cleanupPath(path);
-        for (String pathPrefix : pathPrefixes) {
-            URL resourceUrl = findResource(buildPath(name, pathPrefix));
-            if (resourceUrl != null) {
-                InputStream is = null;
-                try {
-                    //check that the resource path is under the pathPrefix path
-                    String pathEnding = buildPath(name, pathPrefix);
-                    if (resourceUrl.getFile().endsWith(pathEnding))
-                        is = resourceUrl.openStream();
-                } catch (Exception ex) {
-                    // just ignore it
-                    continue;
-                }
+        for (URL resourceUrl : resourceUrls) {
+            InputStream is;
+            try {
+                is = resourceUrl.openStream();
+            } catch (Exception ex) {
+                // just ignore it
+                continue;
+            }
 
-                //not inside the try block, as this could throw IOExceptions also
-                if (is != null) {
-                    process(is, path, request, response);
-                    return;
-                }
+            //not inside the try block, as this could throw IOExceptions also
+            if (is != null) {
+                process(is, path, request, response);
+                return;
             }
         }
 
@@ -466,6 +462,27 @@
     }
 
     /**
+     * Locate a static classpath resource and check for safety constraints.
+     *
+     * @param path The resource path to check for available resources
+     * @return verified classpath resource URLs
+     * @throws IOException If anything goes wrong
+     */
+    protected List<URL> findAndCheckResources(String path) throws IOException {
+        String name = cleanupPath(path);
+        List<URL> resourceUrls = new ArrayList<URL>(pathPrefixes.length);
+        for (String pathPrefix : pathPrefixes) {
+            URL resourceUrl = findResource(buildPath(name, pathPrefix));
+            String pathEnding = buildPath(name, pathPrefix);
+            //check that the resource path is under the pathPrefix path
+            if (resourceUrl != null && resourceUrl.getFile().endsWith(pathEnding)) {
+                resourceUrls.add(resourceUrl);
+            }
+        }
+        return resourceUrls;
+    }
+
+    /**
      * Look for a static resource in the classpath.
      *
      * @param path The resource path

Modified: struts/struts2/branches/STRUTS_2_0_X/core/src/test/java/org/apache/struts2/dispatcher/FilterDispatcherTest.java
URL: http://svn.apache.org/viewvc/struts/struts2/branches/STRUTS_2_0_X/core/src/test/java/org/apache/struts2/dispatcher/FilterDispatcherTest.java?rev=708334&r1=708333&r2=708334&view=diff
==============================================================================
--- struts/struts2/branches/STRUTS_2_0_X/core/src/test/java/org/apache/struts2/dispatcher/FilterDispatcherTest.java (original)
+++ struts/struts2/branches/STRUTS_2_0_X/core/src/test/java/org/apache/struts2/dispatcher/FilterDispatcherTest.java Mon Oct 27 14:46:04 2008
@@ -21,8 +21,11 @@
 package org.apache.struts2.dispatcher;
 
 import java.io.IOException;
+import java.io.InputStream;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.List;
+import java.net.URL;
 
 import javax.servlet.FilterConfig;
 import javax.servlet.ServletContext;
@@ -177,6 +180,37 @@
         assertTrue(_dispatcher.serviceRequest);
     }
 
+    public void testFindAndCheckResourcesWithDojoJs() throws Exception  {
+        FilterDispatcher filterDispatcher = new FilterDispatcher();
+        filterDispatcher.pathPrefixes = filterDispatcher.parse(FilterDispatcher.DEFAULT_STATIC_PACKAGES);
+        List<URL> result = filterDispatcher.findAndCheckResources("/struts/dojo/dojo.js");
+        assertTrue(result.size()>=1);
+        for (URL url : result) {
+            try {
+                InputStream is = url.openStream();
+                is.close();
+            } catch (IOException e) {
+                fail("Resource could not be opened");
+            }
+
+        }
+    }
+
+    public void testFindAndCheckResourcesWithValidationClientJs() throws Exception  {
+        FilterDispatcher filterDispatcher = new FilterDispatcher();
+        filterDispatcher.pathPrefixes = filterDispatcher.parse(FilterDispatcher.DEFAULT_STATIC_PACKAGES);
+        List<URL> result = filterDispatcher.findAndCheckResources("/struts/validationClient.js");
+        assertTrue(result.size()>=1);
+        for (URL url : result) {
+            try {
+                InputStream is = url.openStream();
+                is.close();
+            } catch (IOException e) {
+                fail("Resource could not be opened");
+            }
+
+        }
+    }
 
     // === inner class ========
     public static class InnerObjectFactory extends ObjectFactory {