Konstantin, On 4/27/16 7:27 AM, Konstantin Kolinko wrote: > 2016-04-27 14:00 GMT+03:00 Violeta Georgieva <miles...@gmail.com>: >> Hi, >> >> I have a question about difference in the behaviour of >> org.apache.catalina.loader.WebappClassLoaderBase.getResource(String). >> I'm investigating the issue reported here [1]. >> >> In Tomcat 8+ when WebappClassLoaderBase.getResource is invoked with a path >> that represents a jar resource and starts with a slash >> (classpath:/schema/shibboleth-2.0-services.xsd) this resource will be >> served. >> In >> org.apache.catalina.webresources.AbstractArchiveResourceSet.getResource(String) >> it is clearly stated that when the path starts with a slash then this >> leading slash will be removed. >> >> In Tomcat 7 WebappClassLoaderBase.getResource, such resource will not be >> found. If I remove the leading slash everything is OK. >> >> Is that difference intentional or I can apply a change for removing the >> leading slash in Tomcat 7 WebappClassLoaderBase? >> >> Thanks a lot, >> Violeta >> >> [1] http://marc.info/?t=146170035100001&r=1&w=2 > > > 1.) webresources API is a one thing. It should perform consistently > across all webresource implementation. > > (IIRC in Tomcat 7 JNDI resources API was too forgiving of leading > slashes, leading to some inconsistencies such as duplicate entries in > resource cache. I think that that has already been fixed in TC7 by > doing normalization before looking up into file system & caching. A > discussion was ~2 years ago) > > 2.) webresources API is also used by Servet API calls. Here we have > org.apache.catalina.core.ApplicationContext GET_RESOURCE_REQUIRE_SLASH > > http://tomcat.apache.org/tomcat-7.0-doc/config/systemprops.html#Specification > http://tomcat.apache.org/tomcat-8.0-doc/config/systemprops.html#Specification > > 3.) WebappClassLoader.getResource() shall be consistent with Java API > of java.lang.ClassLoader.getResource() > > http://docs.oracle.com/javase/8/docs/api/java/lang/ClassLoader.html#getResource-java.lang.String- > > It just says: > [q] > The name of a resource is a '/'-separated path name that identifies > the resource. > [/q] > > Unfortunately, this is unclear about leading slashes. (Maybe some > experimenting with classloaders provided by JRE, or reading the Java > Lang Spec clarifies this.) This likely was also discussed 2-3 years > ago. > > 4. Beware of similar-named method Class.getResource() > > http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getResource%28java.lang.String%29 > > This method differentiates names starting with '/' or without it as > absolute vs relative resource names. > > [q] > If the name begins with a '/' ('\u002f'), then the absolute name of > the resource is the portion of the name following the '/'. > [/q] > > I think that the above fragment hints that the resource name in > ClassLoader,getResource() should not start with '/'. > > > I think that changing WebappClassLoader.getResource() to accept > resource names starting with '/' might be wrong.
I almost always use resource paths with a leading slash. For Tomcat to explicitly NOT support them would be very strange indeed. -chris --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org