Author: timw
Date: Sat May 21 10:00:54 2011
New Revision: 1125656

URL: http://svn.apache.org/viewvc?rev=1125656&view=rev
Log:
https://issues.apache.org/bugzilla/show_bug.cgi?id=41923

Propagate client abort to Tomcat by hard closing the AJP connection on an 
client write error, which will abort the AJP response write.

Modified:
    tomcat/jk/trunk/native/common/jk_ajp_common.c
    tomcat/jk/trunk/native/common/jk_ajp_common.h

Modified: tomcat/jk/trunk/native/common/jk_ajp_common.c
URL: 
http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_ajp_common.c?rev=1125656&r1=1125655&r2=1125656&view=diff
==============================================================================
--- tomcat/jk/trunk/native/common/jk_ajp_common.c (original)
+++ tomcat/jk/trunk/native/common/jk_ajp_common.c Sat May 21 10:00:54 2011
@@ -780,7 +780,15 @@ static void ajp_abort_endpoint(ajp_endpo
 {
     JK_TRACE_ENTER(l);
     if (shutdown == JK_TRUE && IS_VALID_SOCKET(ae->sd)) {
-        jk_shutdown_socket(ae->sd, l);
+        if (ae->hard_close) {
+            /* Force unclean connection close to communicate client write 
errors
+             * back to Tomcat by aborting AJP response writes.
+             */
+            jk_close_socket(ae->sd, l);
+        }
+        else {
+            jk_shutdown_socket(ae->sd, l);
+        }
     }
     ae->worker->s->connected--;
     ae->sd = JK_INVALID_SOCKET;
@@ -2403,6 +2411,7 @@ static int JK_METHOD ajp_service(jk_endp
 
     p->left_bytes_to_send = s->content_length;
     p->reuse = JK_FALSE;
+    p->hard_close = JK_FALSE;
 
     s->secret = aw->secret;
 
@@ -2479,6 +2488,7 @@ static int JK_METHOD ajp_service(jk_endp
             if (aw->recovery_opts & RECOVER_ABORT_IF_CLIENTERROR) {
                 /* Mark the endpoint for shutdown */
                 p->reuse = JK_FALSE;
+                p->hard_close = JK_TRUE;
             }
         }
         else if (err == JK_FATAL_ERROR) {
@@ -2514,6 +2524,7 @@ static int JK_METHOD ajp_service(jk_endp
                 if (aw->recovery_opts & RECOVER_ABORT_IF_CLIENTERROR) {
                     /* Mark the endpoint for shutdown */
                     p->reuse = JK_FALSE;
+                    p->hard_close = JK_TRUE;
                 }
             }
             else if (err == JK_CLIENT_WR_ERROR) {
@@ -2528,6 +2539,7 @@ static int JK_METHOD ajp_service(jk_endp
                 if (aw->recovery_opts & RECOVER_ABORT_IF_CLIENTERROR) {
                     /* Mark the endpoint for shutdown */
                     p->reuse = JK_FALSE;
+                    p->hard_close = JK_TRUE;
                 }
             }
             else if (err == JK_FATAL_ERROR) {
@@ -2720,6 +2732,7 @@ static int ajp_create_endpoint_cache(ajp
         }
         p->ep_cache[i]->sd = JK_INVALID_SOCKET;
         p->ep_cache[i]->reuse = JK_FALSE;
+        p->ep_cache[i]->hard_close = JK_FALSE;
         p->ep_cache[i]->last_access = now;
         jk_open_pool(&(p->ep_cache[i]->pool), p->ep_cache[i]->buf,
                      sizeof(p->ep_cache[i]->buf));

Modified: tomcat/jk/trunk/native/common/jk_ajp_common.h
URL: 
http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_ajp_common.h?rev=1125656&r1=1125655&r2=1125656&view=diff
==============================================================================
--- tomcat/jk/trunk/native/common/jk_ajp_common.h (original)
+++ tomcat/jk/trunk/native/common/jk_ajp_common.h Sat May 21 10:00:54 2011
@@ -382,6 +382,10 @@ struct ajp_endpoint
     jk_sock_t sd;
     int reuse;
 
+    /* Used with RECOVER_ABORT_IF_CLIENTERROR to hard abort
+       write of AJP response on client write errors */
+    int hard_close;
+
     jk_endpoint_t endpoint;
 
     jk_uint64_t left_bytes_to_send;



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

Reply via email to