You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2013/12/04 18:18:57 UTC

svn commit: r1547848 - in /tomcat/trunk: java/org/apache/catalina/webresources/ test/org/apache/catalina/webresources/

Author: markt
Date: Wed Dec  4 17:18:57 2013
New Revision: 1547848

URL: http://svn.apache.org/r1547848
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=55837
getRealPath() should return a result for resources that don't exist where possible
Add some unit tests to check this.

Modified:
    tomcat/trunk/java/org/apache/catalina/webresources/DirResourceSet.java
    tomcat/trunk/java/org/apache/catalina/webresources/EmptyResource.java
    tomcat/trunk/java/org/apache/catalina/webresources/StandardRoot.java
    tomcat/trunk/test/org/apache/catalina/webresources/AbstractTestResourceSet.java

Modified: tomcat/trunk/java/org/apache/catalina/webresources/DirResourceSet.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/webresources/DirResourceSet.java?rev=1547848&r1=1547847&r2=1547848&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/webresources/DirResourceSet.java (original)
+++ tomcat/trunk/java/org/apache/catalina/webresources/DirResourceSet.java Wed Dec  4 17:18:57 2013
@@ -92,10 +92,13 @@ public class DirResourceSet extends Abst
         String webAppMount = getWebAppMount();
         WebResourceRoot root = getRoot();
         if (path.startsWith(webAppMount)) {
-            File f = file(path.substring(webAppMount.length()), true);
+            File f = file(path.substring(webAppMount.length()), false);
             if (f == null) {
                 return new EmptyResource(root, path);
             }
+            if (!f.exists()) {
+                return new EmptyResource(root, path, f);
+            }
             if (f.isDirectory() && path.charAt(path.length() - 1) != '/') {
                 path = path += '/';
             }

Modified: tomcat/trunk/java/org/apache/catalina/webresources/EmptyResource.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/webresources/EmptyResource.java?rev=1547848&r1=1547847&r2=1547848&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/webresources/EmptyResource.java (original)
+++ tomcat/trunk/java/org/apache/catalina/webresources/EmptyResource.java Wed Dec  4 17:18:57 2013
@@ -16,6 +16,8 @@
  */
 package org.apache.catalina.webresources;
 
+import java.io.File;
+import java.io.IOException;
 import java.io.InputStream;
 import java.net.URL;
 import java.security.cert.Certificate;
@@ -28,10 +30,16 @@ public class EmptyResource implements We
 
     private final WebResourceRoot root;
     private final String webAppPath;
+    private final File file;
 
     public EmptyResource(WebResourceRoot root, String webAppPath) {
+        this(root, webAppPath, null);
+    }
+
+    public EmptyResource(WebResourceRoot root, String webAppPath, File file) {
         this.root = root;
         this.webAppPath = webAppPath;
+        this.file = file;
     }
 
     @Override
@@ -86,7 +94,15 @@ public class EmptyResource implements We
 
     @Override
     public String getCanonicalPath() {
-        return null;
+        if (file == null) {
+            return null;
+        } else {
+            try {
+                return file.getCanonicalPath();
+            } catch (IOException e) {
+                return null;
+            }
+        }
     }
 
     @Override

Modified: tomcat/trunk/java/org/apache/catalina/webresources/StandardRoot.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/webresources/StandardRoot.java?rev=1547848&r1=1547847&r2=1547848&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/webresources/StandardRoot.java (original)
+++ tomcat/trunk/java/org/apache/catalina/webresources/StandardRoot.java Wed Dec  4 17:18:57 2013
@@ -239,6 +239,7 @@ public class StandardRoot extends Lifecy
             boolean useClassLoaderResources) {
         WebResource result = null;
         WebResource virtual = null;
+        WebResource mainEmpty = null;
         for (ArrayList<WebResourceSet> list : allResources) {
             for (WebResourceSet webResourceSet : list) {
                 if (useClassLoaderResources || !webResourceSet.getClassLoaderOnly()) {
@@ -246,8 +247,12 @@ public class StandardRoot extends Lifecy
                     if (result.exists()) {
                         return result;
                     }
-                    if (virtual == null && result.isVirtual()) {
-                        virtual = result;
+                    if (virtual == null) {
+                        if (result.isVirtual()) {
+                            virtual = result;
+                        } else if (main.equals(webResourceSet)) {
+                            mainEmpty = result;
+                        }
                     }
                 }
             }
@@ -259,7 +264,7 @@ public class StandardRoot extends Lifecy
         }
 
         // Default is empty resource in main resources
-        return new EmptyResource(this, path);
+        return mainEmpty;
     }
 
     @Override

Modified: tomcat/trunk/test/org/apache/catalina/webresources/AbstractTestResourceSet.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/webresources/AbstractTestResourceSet.java?rev=1547848&r1=1547847&r2=1547848&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/catalina/webresources/AbstractTestResourceSet.java (original)
+++ tomcat/trunk/test/org/apache/catalina/webresources/AbstractTestResourceSet.java Wed Dec  4 17:18:57 2013
@@ -19,6 +19,7 @@ package org.apache.catalina.webresources
 import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.io.InputStream;
+import java.net.URL;
 import java.util.HashSet;
 import java.util.Set;
 
@@ -374,6 +375,43 @@ public abstract class AbstractTestResour
         }
     }
 
+    // ------------------------------------------------------ getCanonicalPath()
+
+    @Test
+    public final void testGetCanonicalPathExists() {
+        WebResource exists =
+                resourceRoot.getResource(getMount() + "/d1/d1-f1.txt");
+        String existsCanonicalPath = exists.getCanonicalPath();
+
+        URL existsUrl = exists.getURL();
+        if ("file".equals(existsUrl.getProtocol())) {
+            // Should have a canonical path
+            Assert.assertNotNull(existsCanonicalPath);
+        } else {
+            Assert.assertNull(existsCanonicalPath);
+        }
+    }
+
+    @Test
+    public final void testGetCanonicalPathDoesNotExist() {
+        WebResource exists =
+                resourceRoot.getResource(getMount() + "/d1/d1-f1.txt");
+        WebResource doesNotExist =
+                resourceRoot.getResource(getMount() + "/d1/dummy.txt");
+        String doesNotExistCanonicalPath = doesNotExist.getCanonicalPath();
+
+        URL existsUrl = exists.getURL();
+        if ("file".equals(existsUrl.getProtocol())) {
+            // Should be possible to construct a canonical path for a resource
+            // that doesn't exist given that a resource that does exist in the
+            // same directory has a URL with the file protocol
+            Assert.assertNotNull(doesNotExistCanonicalPath);
+        } else {
+            Assert.assertNull(doesNotExistCanonicalPath);
+        }
+    }
+
+
     // ------------------------------------------------------------ constructors
 
     public abstract void testNoArgConstructor();



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org