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: [email protected]
For additional commands, e-mail: [email protected]