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