mirror of
https://github.com/apache/httpd.git
synced 2025-08-08 15:02:10 +03:00
mod_proxy_fcgi: Add the support for mod_proxy's
flushpackets and flushwait params This change was requested on the development mailing list in order to fill another gap between mod_fcgi and mod_proxy_fcgi, namely the -flush funtionality. The more evolved core trunk code would not need this feature becuse of the non-blocking writes, but it is be needed in 2.4.x. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1802040 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
3
CHANGES
3
CHANGES
@@ -1,6 +1,9 @@
|
|||||||
-*- coding: utf-8 -*-
|
-*- coding: utf-8 -*-
|
||||||
Changes with Apache 2.5.0
|
Changes with Apache 2.5.0
|
||||||
|
|
||||||
|
*) mod_proxy_fcgi: Add the support for mod_proxy's flushpackets and flushwait
|
||||||
|
parameters. [Luca Toscano, Ruediger Pluem, Yann Ylavic]
|
||||||
|
|
||||||
*) mod_proxy_wstunnel: Fix detection of unresponded request which could have
|
*) mod_proxy_wstunnel: Fix detection of unresponded request which could have
|
||||||
led to spurious HTTP 502 error messages sent on upgrade connections.
|
led to spurious HTTP 502 error messages sent on upgrade connections.
|
||||||
PR 61283. [Yann Ylavic]
|
PR 61283. [Yann Ylavic]
|
||||||
|
@@ -1089,7 +1089,7 @@ ProxyPass "/example" "http://backend.example.com" max=20 ttl=120 retry=300
|
|||||||
only when needed; 'on' means after each chunk is sent; and
|
only when needed; 'on' means after each chunk is sent; and
|
||||||
'auto' means poll/wait for a period of time and flush if
|
'auto' means poll/wait for a period of time and flush if
|
||||||
no input has been received for 'flushwait' milliseconds.
|
no input has been received for 'flushwait' milliseconds.
|
||||||
Currently, this is in effect only for AJP.
|
Currently, this is in effect only for mod_proxy_ajp and mod_proxy_fcgi.
|
||||||
</td></tr>
|
</td></tr>
|
||||||
<tr><td>flushwait</td>
|
<tr><td>flushwait</td>
|
||||||
<td>10</td>
|
<td>10</td>
|
||||||
|
@@ -532,6 +532,8 @@ static apr_status_t dispatch(proxy_conn_rec *conn, proxy_dir_conf *conf,
|
|||||||
ap_fcgi_header header;
|
ap_fcgi_header header;
|
||||||
unsigned char farray[AP_FCGI_HEADER_LEN];
|
unsigned char farray[AP_FCGI_HEADER_LEN];
|
||||||
apr_pollfd_t pfd;
|
apr_pollfd_t pfd;
|
||||||
|
apr_pollfd_t *flushpoll;
|
||||||
|
apr_int32_t flushpoll_fd;
|
||||||
int header_state = HDR_STATE_READING_HEADERS;
|
int header_state = HDR_STATE_READING_HEADERS;
|
||||||
char stack_iobuf[AP_IOBUFSIZE];
|
char stack_iobuf[AP_IOBUFSIZE];
|
||||||
apr_size_t iobuf_size = AP_IOBUFSIZE;
|
apr_size_t iobuf_size = AP_IOBUFSIZE;
|
||||||
@@ -548,6 +550,13 @@ static apr_status_t dispatch(proxy_conn_rec *conn, proxy_dir_conf *conf,
|
|||||||
pfd.p = r->pool;
|
pfd.p = r->pool;
|
||||||
pfd.reqevents = APR_POLLIN | APR_POLLOUT;
|
pfd.reqevents = APR_POLLIN | APR_POLLOUT;
|
||||||
|
|
||||||
|
if (conn->worker->s->flush_packets == flush_auto) {
|
||||||
|
flushpoll = apr_pcalloc(r->pool, sizeof(apr_pollfd_t));
|
||||||
|
flushpoll->reqevents = APR_POLLIN;
|
||||||
|
flushpoll->desc_type = APR_POLL_SOCKET;
|
||||||
|
flushpoll->desc.s = conn->sock;
|
||||||
|
}
|
||||||
|
|
||||||
ib = apr_brigade_create(r->pool, c->bucket_alloc);
|
ib = apr_brigade_create(r->pool, c->bucket_alloc);
|
||||||
ob = apr_brigade_create(r->pool, c->bucket_alloc);
|
ob = apr_brigade_create(r->pool, c->bucket_alloc);
|
||||||
|
|
||||||
@@ -876,6 +885,19 @@ recv_again:
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((conn->worker->s->flush_packets == flush_on) ||
|
||||||
|
((conn->worker->s->flush_packets == flush_auto) &&
|
||||||
|
(apr_poll(flushpoll, 1, &flushpoll_fd,
|
||||||
|
conn->worker->s->flush_wait) == APR_TIMEUP))) {
|
||||||
|
apr_bucket* flush_b = apr_bucket_flush_create(r->connection->bucket_alloc);
|
||||||
|
APR_BRIGADE_INSERT_TAIL(ob, flush_b);
|
||||||
|
rv = ap_pass_brigade(r->output_filters, ob);
|
||||||
|
if (rv != APR_SUCCESS) {
|
||||||
|
*err = "passing headers brigade to output filters";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user