Author: markt
Date: Wed Aug 12 09:27:29 2015
New Revision: 1695459
URL: http://svn.apache.org/r1695459
Log:
Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=58228
Make behaviour of ServletContext.getResource() and
ServletContext.getResourceAsStream() consistent with each other and the
expected behaviour of the GET_RESOURCE_REQUIRE_SLASH system property.
Modified:
tomcat/trunk/java/org/apache/catalina/core/ApplicationContext.java
tomcat/trunk/webapps/docs/config/systemprops.xml
Modified: tomcat/trunk/java/org/apache/catalina/core/ApplicationContext.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/ApplicationContext.java?rev=1695459&r1=1695458&r2=1695459&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/ApplicationContext.java
(original)
+++ tomcat/trunk/java/org/apache/catalina/core/ApplicationContext.java Wed Aug
12 09:27:29 2015
@@ -539,17 +539,18 @@ public class ApplicationContext
* in the correct form
*/
@Override
- public URL getResource(String path)
- throws MalformedURLException {
+ public URL getResource(String path) throws MalformedURLException {
- if (path == null ||
- !path.startsWith("/") && GET_RESOURCE_REQUIRE_SLASH)
- throw new MalformedURLException(sm.getString(
- "applicationContext.requestDispatcher.iae", path));
+ String validatedPath = validateResourcePath(path);
+
+ if (validatedPath == null) {
+ throw new MalformedURLException(
+ sm.getString("applicationContext.requestDispatcher.iae",
path));
+ }
WebResourceRoot resources = context.getResources();
if (resources != null) {
- return resources.getResource(path).getURL();
+ return resources.getResource(validatedPath).getURL();
}
return null;
@@ -567,21 +568,42 @@ public class ApplicationContext
@Override
public InputStream getResourceAsStream(String path) {
- if (path == null)
- return (null);
+ String validatedPath = validateResourcePath(path);
- if (!path.startsWith("/") && GET_RESOURCE_REQUIRE_SLASH)
+ if (validatedPath == null) {
return null;
+ }
WebResourceRoot resources = context.getResources();
if (resources != null) {
- return resources.getResource(path).getInputStream();
+ return resources.getResource(validatedPath).getInputStream();
}
return null;
}
+ /*
+ * Returns null if the input path is not valid or a path that will be
+ * acceptable to resoucres.getResource().
+ */
+ private String validateResourcePath(String path) {
+ if (path == null) {
+ return null;
+ }
+
+ if (!path.startsWith("/")) {
+ if (GET_RESOURCE_REQUIRE_SLASH) {
+ return null;
+ } else {
+ return "/" + path;
+ }
+ }
+
+ return path;
+ }
+
+
/**
* Return a Set containing the resource paths of resources member of the
* specified collection. Each path will be a String starting with
Modified: tomcat/trunk/webapps/docs/config/systemprops.xml
URL:
http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/config/systemprops.xml?rev=1695459&r1=1695458&r2=1695459&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/config/systemprops.xml (original)
+++ tomcat/trunk/webapps/docs/config/systemprops.xml Wed Aug 12 09:27:29 2015
@@ -331,7 +331,8 @@
<code>ServletContext.getResource()</code> or
<code>ServletContext.getResourceAsStream()</code> must start with
"/". If <code>false</code>, code like
- <code>getResource("myfolder/myresource.txt")</code> will work.</p>
+ <code>getResource("myfolder/myresource.txt")</code> will work as Tomcat
+ will prepend "/" to the provided path.</p>
<p>If <code>org.apache.catalina.STRICT_SERVLET_COMPLIANCE</code> is set
to
<code>true</code>, the default of this setting will be <code>true</code>,
else the default value will be <code>false</code>.</p>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]