1
0
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:
Luca Toscano
2017-07-16 08:40:46 +00:00
parent 2302082b33
commit aae1c23f32
3 changed files with 26 additions and 1 deletions

View File

@@ -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]

View File

@@ -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>

View File

@@ -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;
}
}
} }
} }