From: Mladen Turk Date: Mon, 27 Nov 2006 15:14:07 +0000 (+0000) Subject: Backport explicit flushing feature. X-Git-Tag: 2.2.4~76 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=aa32330c918563a804a758a3562b614fdb58ddc2;p=thirdparty%2Fapache%2Fhttpd.git Backport explicit flushing feature. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.2.x@479655 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index ce036380d58..4ff7a57d193 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,13 @@ -*- coding: utf-8 -*- Changes with Apache 2.2.4 + * mod_proxy: Add explicit flushing feature. + When Servlet container sends AJP body message with size 0, + this means that Servlet container has asked for an explicit flush. + Create flush bucket in that case. This feature has been added + to the recent Tomcat versions without breaking the AJP protocol. + [Mladen Turk] + *) mod_proxy_balancer: Set the new environment variable BALANCER_ROUTE_CHANGED if a worker with a route different from the one supplied by the client had been chosen or if the client supplied no routing information for diff --git a/STATUS b/STATUS index 4a64359aa6e..ee76123e01a 100644 --- a/STATUS +++ b/STATUS @@ -80,14 +80,6 @@ PATCHES ACCEPTED TO BACKPORT FROM TRUNK: PATCHES PROPOSED TO BACKPORT FROM TRUNK: - * mod_proxy: Add explicit flushing feature. - When Servlet container sends AJP body message with size 0, - this means that Servlet container has asked for an explicit flush. - Create flush bucket in that case. This feature has been added - to the recent Tomcat versions without breaking the AJP protocol. - Trunk:http://svn.apache.org/viewvc?view=rev&revision=468941 - +1: mturk, rpluem, jfclere - * mpm_winnt: Fix return values from wait_for_many_objects. Trunk version of patch: http://svn.apache.org/viewvc?view=rev&revision=428029 diff --git a/modules/proxy/mod_proxy_ajp.c b/modules/proxy/mod_proxy_ajp.c index 75ea68befc8..d5aa87e7849 100644 --- a/modules/proxy/mod_proxy_ajp.c +++ b/modules/proxy/mod_proxy_ajp.c @@ -315,21 +315,30 @@ static int ap_proxy_ajp_request(apr_pool_t *p, request_rec *r, /* AJP13_SEND_BODY_CHUNK: piece of data */ status = ajp_parse_data(r, conn->data, &size, &buff); if (status == APR_SUCCESS) { - e = apr_bucket_transient_create(buff, size, - r->connection->bucket_alloc); - APR_BRIGADE_INSERT_TAIL(output_brigade, e); - - if ( (conn->worker->flush_packets == flush_on) || - ( (conn->worker->flush_packets == flush_auto) && - (apr_poll(conn_poll, 1, &conn_poll_fd, - conn->worker->flush_wait) - == APR_TIMEUP) ) ) { + if (size == 0) { + /* AJP13_SEND_BODY_CHUNK with zero length + * is explicit flush message + */ e = apr_bucket_flush_create(r->connection->bucket_alloc); APR_BRIGADE_INSERT_TAIL(output_brigade, e); } - apr_brigade_length(output_brigade, 0, &bb_len); - if (bb_len != -1) - conn->worker->s->read += bb_len; + else { + e = apr_bucket_transient_create(buff, size, + r->connection->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(output_brigade, e); + + if ((conn->worker->flush_packets == flush_on) || + ((conn->worker->flush_packets == flush_auto) && + (apr_poll(conn_poll, 1, &conn_poll_fd, + conn->worker->flush_wait) + == APR_TIMEUP) ) ) { + e = apr_bucket_flush_create(r->connection->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(output_brigade, e); + } + apr_brigade_length(output_brigade, 0, &bb_len); + if (bb_len != -1) + conn->worker->s->read += bb_len; + } if (ap_pass_brigade(r->output_filters, output_brigade) != APR_SUCCESS) { ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,