Author: markt
Date: Fri Dec 12 15:49:26 2014
New Revision: 1644935

URL: http://svn.apache.org/r1644935
Log:
Provide a better mechanism for the RewriteValve to inject a re-written request 
that avoids:
- NPEs appearing in the log every time the Valve re-writes a request.
- unnecessary duplication of post-processing in the adapter

Modified:
    tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java
    tomcat/trunk/java/org/apache/catalina/valves/rewrite/RewriteValve.java
    tomcat/trunk/java/org/apache/coyote/Adapter.java

Modified: tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java?rev=1644935&r1=1644934&r2=1644935&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/connector/CoyoteAdapter.java Fri Dec 
12 15:49:26 2014
@@ -415,6 +415,15 @@ public class CoyoteAdapter implements Ad
     }
 
 
+    @Override
+    public boolean prepare(org.apache.coyote.Request req, 
org.apache.coyote.Response res)
+            throws IOException, ServletException {
+        Request request = (Request) req.getNote(ADAPTER_NOTES);
+        Response response = (Response) res.getNote(ADAPTER_NOTES);
+
+        return postParseRequest(req, request, res, response);
+    }
+
 
     @Override
     public void errorDispatch(org.apache.coyote.Request req,

Modified: tomcat/trunk/java/org/apache/catalina/valves/rewrite/RewriteValve.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/valves/rewrite/RewriteValve.java?rev=1644935&r1=1644934&r2=1644935&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/valves/rewrite/RewriteValve.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/valves/rewrite/RewriteValve.java Fri 
Dec 12 15:49:26 2014
@@ -41,6 +41,8 @@ import org.apache.catalina.Host;
 import org.apache.catalina.Lifecycle;
 import org.apache.catalina.LifecycleException;
 import org.apache.catalina.LifecycleListener;
+import org.apache.catalina.Pipeline;
+import org.apache.catalina.connector.Connector;
 import org.apache.catalina.connector.Request;
 import org.apache.catalina.connector.Response;
 import org.apache.catalina.util.LifecycleSupport;
@@ -486,8 +488,14 @@ public class RewriteValve extends ValveB
                     request.getMappingData().recycle();
                     // Reinvoke the whole request recursively
                     try {
-                        
request.getConnector().getProtocolHandler().getAdapter().service
-                        (request.getCoyoteRequest(), 
response.getCoyoteResponse());
+                        Connector connector = request.getConnector();
+                        if 
(!connector.getProtocolHandler().getAdapter().prepare(
+                                request.getCoyoteRequest(), 
response.getCoyoteResponse())) {
+                            return;
+                        }
+                        Pipeline pipeline = 
connector.getService().getContainer().getPipeline();
+                        request.setAsyncSupported(pipeline.isAsyncSupported());
+                        pipeline.getFirst().invoke(request, response);
                     } catch (Exception e) {
                         // This doesn't actually happen in the Catalina 
adapter implementation
                     }
@@ -552,7 +560,9 @@ public class RewriteValve extends ValveB
      * Example:
      *  RewriteCond %{REMOTE_HOST}  ^host1.*  [OR]
      *
-     * @param line
+     * @param line A line from the rewrite configuration
+     *
+     * @return The condition, rule or map resulting from parsing the line
      */
     public static Object parse(String line) {
         StringTokenizer tokenizer = new StringTokenizer(line);

Modified: tomcat/trunk/java/org/apache/coyote/Adapter.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/coyote/Adapter.java?rev=1644935&r1=1644934&r2=1644935&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/coyote/Adapter.java (original)
+++ tomcat/trunk/java/org/apache/coyote/Adapter.java Fri Dec 12 15:49:26 2014
@@ -30,6 +30,9 @@ public interface Adapter {
     /**
      * Call the service method, and notify all listeners
      *
+     * @param req The request object
+     * @param res The response object
+     *
      * @exception Exception if an error happens during handling of
      *   the request. Common errors are:
      *   <ul><li>IOException if an input/output error occurs and we are
@@ -42,8 +45,23 @@ public interface Adapter {
      *  Tomcat should be able to handle and log any other exception ( including
      *  runtime exceptions )
      */
-    public void service(Request req, Response res)
-            throws Exception;
+    public void service(Request req, Response res) throws Exception;
+
+    /**
+     * Prepare the given request/response for processing. This method requires
+     * that the request object has been populated with the information 
available
+     * from the HTTP headers.
+     *
+     * @param req The request object
+     * @param res The response object
+     *
+     * @return <code>true</code> if processing can continue, otherwise
+     *         <code>false</code> in which case an appropriate error will have
+     *         been set on the response
+     *
+     * @throws Exception If the processing fails unexpectedly
+     */
+    public boolean prepare(Request req, Response res) throws Exception;
 
     public boolean asyncDispatch(Request req,Response res, SocketStatus status)
             throws Exception;



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

Reply via email to