Author: markt
Date: Tue Aug 26 13:32:45 2014
New Revision: 1620596

URL: http://svn.apache.org/r1620596
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=56568
Enable any HTTP method to be used to request a JSP page that has the 
isErrorPage page directive set to true.

Added:
    tomcat/trunk/test/webapp/jsp/error.jsp   (with props)
Modified:
    tomcat/trunk/java/org/apache/jasper/compiler/Compiler.java
    tomcat/trunk/java/org/apache/jasper/servlet/JspServlet.java
    tomcat/trunk/java/org/apache/jasper/servlet/JspServletWrapper.java
    tomcat/trunk/test/org/apache/jasper/servlet/TestJspServlet.java
    tomcat/trunk/webapps/docs/changelog.xml

Modified: tomcat/trunk/java/org/apache/jasper/compiler/Compiler.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/jasper/compiler/Compiler.java?rev=1620596&r1=1620595&r2=1620596&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/jasper/compiler/Compiler.java (original)
+++ tomcat/trunk/java/org/apache/jasper/compiler/Compiler.java Tue Aug 26 
13:32:45 2014
@@ -255,6 +255,11 @@ public abstract class Compiler {
             // to be GC'd and save memory.
             ctxt.setWriter(null);
 
+            // Need to know if the JSP is an error page at runtime to determine
+            // which HTTP methods are permitted. Error pages permit any. Normal
+            // pages only permit GET, POST or HEAD.
+            jsw.setErrorPage(pageInfo.isErrorPage());
+
             if (log.isDebugEnabled()) {
                 t4 = System.currentTimeMillis();
                 log.debug("Generated " + javaFileName + " total=" + (t4 - t1)

Modified: tomcat/trunk/java/org/apache/jasper/servlet/JspServlet.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/jasper/servlet/JspServlet.java?rev=1620596&r1=1620595&r2=1620596&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/jasper/servlet/JspServlet.java (original)
+++ tomcat/trunk/java/org/apache/jasper/servlet/JspServlet.java Tue Aug 26 
13:32:45 2014
@@ -25,7 +25,6 @@ import java.security.AccessController;
 import java.security.PrivilegedActionException;
 import java.security.PrivilegedExceptionAction;
 
-import javax.servlet.DispatcherType;
 import javax.servlet.RequestDispatcher;
 import javax.servlet.ServletConfig;
 import javax.servlet.ServletContext;
@@ -282,19 +281,6 @@ public class JspServlet extends HttpServ
                              HttpServletResponse response)
                 throws ServletException, IOException {
 
-        String method = request.getMethod();
-
-        if (!"GET".equals(method) && !"POST".equals(method) && 
!"HEAD".equals(method) &&
-                !DispatcherType.ERROR.equals(request.getDispatcherType())) {
-            // Specification states behaviour is undefined
-            // Jasper opts to reject any other verbs, partly as they are
-            // unlikely to make sense in a JSP context and partly to protect
-            // against verb tampering
-            response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED,
-                    Localizer.getMessage("jsp.error.servlet.invalid.method"));
-            return;
-        }
-
         //jspFile may be configured as an init-param for this servlet instance
         String jspUri = jspFile;
 

Modified: tomcat/trunk/java/org/apache/jasper/servlet/JspServletWrapper.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/jasper/servlet/JspServletWrapper.java?rev=1620596&r1=1620595&r2=1620596&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/jasper/servlet/JspServletWrapper.java 
(original)
+++ tomcat/trunk/java/org/apache/jasper/servlet/JspServletWrapper.java Tue Aug 
26 13:32:45 2014
@@ -22,6 +22,7 @@ import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;
 
+import javax.servlet.DispatcherType;
 import javax.servlet.RequestDispatcher;
 import javax.servlet.Servlet;
 import javax.servlet.ServletConfig;
@@ -103,6 +104,7 @@ public class JspServletWrapper {
     private final boolean unloadAllowed;
     private final boolean unloadByCount;
     private final boolean unloadByIdle;
+    private boolean errorPage;
 
     /*
      * JspServletWrapper for JSP pages.
@@ -399,7 +401,6 @@ public class JspServletWrapper {
         }
 
         try {
-
             /*
              * (3) Handle limitation of number of loaded Jsps
              */
@@ -419,6 +420,21 @@ public class JspServletWrapper {
                     }
                 }
             }
+
+            String method = request.getMethod();
+
+            if (!"GET".equals(method) && !"POST".equals(method) && 
!"HEAD".equals(method) &&
+                    !DispatcherType.ERROR.equals(request.getDispatcherType()) 
&&
+                    !isErrorPage()) {
+                // Specification states behaviour is undefined
+                // Jasper opts to reject any other verbs, partly as they are
+                // unlikely to make sense in a JSP context and partly to 
protect
+                // against verb tampering
+                response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED,
+                        
Localizer.getMessage("jsp.error.servlet.invalid.method"));
+                return;
+            }
+
             /*
              * (4) Service request
              */
@@ -586,4 +602,13 @@ public class JspServletWrapper {
         }
     }
 
+
+    public void setErrorPage(boolean errorPage) {
+        this.errorPage = errorPage;
+    }
+
+
+    public boolean isErrorPage() {
+        return errorPage;
+    }
 }

Modified: tomcat/trunk/test/org/apache/jasper/servlet/TestJspServlet.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/jasper/servlet/TestJspServlet.java?rev=1620596&r1=1620595&r2=1620596&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/jasper/servlet/TestJspServlet.java (original)
+++ tomcat/trunk/test/org/apache/jasper/servlet/TestJspServlet.java Tue Aug 26 
13:32:45 2014
@@ -36,7 +36,7 @@ import org.apache.tomcat.util.descriptor
 public class TestJspServlet  extends TomcatBaseTest {
 
     @Test
-    public void testBug56568() throws Exception {
+    public void testBug56568a() throws Exception {
         Tomcat tomcat = getTomcatInstance();
 
         // Use the test web application so JSP support is available and the
@@ -45,7 +45,7 @@ public class TestJspServlet  extends Tom
         Context context = tomcat.addWebapp(null, "/test", 
appDir.getAbsolutePath());
 
         // Create a servlet that always throws an exception for a PUT request
-        Tomcat.addServlet(context, "Bug56568Servlet", new Bug56568Servlet());
+        Tomcat.addServlet(context, "Bug56568Servlet", new Bug56568aServlet());
         context.addServletMapping("/bug56568", "Bug56568Servlet");
 
         // Configure a JSP page to handle the 500 error response
@@ -67,7 +67,27 @@ public class TestJspServlet  extends Tom
         Assert.assertEquals(500, rc);
     }
 
-    private static class Bug56568Servlet extends HttpServlet {
+    @Test
+    public void testBug56568b() throws Exception {
+        Tomcat tomcat = getTomcatInstance();
+
+        // Use the test web application so JSP support is available and the
+        // default JSP error page can be used.
+        File appDir = new File("test/webapp");
+        tomcat.addWebapp(null, "/test", appDir.getAbsolutePath());
+
+        tomcat.start();
+
+        int rc = methodUrl("http://localhost:"; + getPort() + 
"/test/jsp/error.jsp",
+                new ByteChunk(), 500000, null, null, "PUT");
+
+        // Make sure we get a 200 response and not a 405 response
+        // which would indicate that error.jsp is complaining about being 
called
+        // with the PUT method.
+        Assert.assertEquals(200, rc);
+    }
+
+    private static class Bug56568aServlet extends HttpServlet {
 
         private static final long serialVersionUID = 1L;
 

Added: tomcat/trunk/test/webapp/jsp/error.jsp
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/test/webapp/jsp/error.jsp?rev=1620596&view=auto
==============================================================================
--- tomcat/trunk/test/webapp/jsp/error.jsp (added)
+++ tomcat/trunk/test/webapp/jsp/error.jsp Tue Aug 26 13:32:45 2014
@@ -0,0 +1,22 @@
+<%--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+--%>
+<%@page session="false" isErrorPage="true" %>
+<html>
+  <body>
+    <p>ERROR</p>
+  </body>
+</html>
\ No newline at end of file

Propchange: tomcat/trunk/test/webapp/jsp/error.jsp
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: tomcat/trunk/webapps/docs/changelog.xml
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1620596&r1=1620595&r2=1620596&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/trunk/webapps/docs/changelog.xml Tue Aug 26 13:32:45 2014
@@ -79,6 +79,11 @@
         functional impact but the code was less efficient as a result of the
         error. Based on a patch by martinschaef. (markt)
       </fix>
+      <fix>
+        <bug>56568</bug>: Enable any HTTP method to be used to request a JSP
+        page that has the <code>isErrorPage</code> page directive set to
+        <code>true</code>. (markt)
+      </fix>
     </changelog>
   </subsection>
   <subsection name="WebSocket">



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

Reply via email to