From: Yann Ylavic Date: Fri, 15 Oct 2021 11:09:32 +0000 (+0000) Subject: mod_proxy_connect: Honor the smallest of the backend or client timeout. X-Git-Tag: 2.5.0-alpha2-ci-test-only~728 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=dcbf44fb14497add211020ef3629f1f12daac6e1;p=thirdparty%2Fapache%2Fhttpd.git mod_proxy_connect: Honor the smallest of the backend or client timeout. It seems that mod_proxy_connect has never applied any timeout in its tunneling loop. Address this by setting a default timeout in ap_proxy_tunnel_create() since mod_proxy_connect does not overwrite tunnel->timeout (while proxy_http and proxy_wstunnel do). This default timeout is set to the smallest of the backend side or the client side timeout. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1894290 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/changes-entries/proxy_connect_timeout.txt b/changes-entries/proxy_connect_timeout.txt new file mode 100644 index 00000000000..f3ef01580bc --- /dev/null +++ b/changes-entries/proxy_connect_timeout.txt @@ -0,0 +1,2 @@ + *) mod_proxy_connect: Honor the smallest of the backend or client timeout + while tunneling. [Yann Ylavic] diff --git a/modules/proxy/proxy_util.c b/modules/proxy/proxy_util.c index e620ee88ed5..00492d77392 100644 --- a/modules/proxy/proxy_util.c +++ b/modules/proxy/proxy_util.c @@ -4756,6 +4756,7 @@ PROXY_DECLARE(apr_status_t) ap_proxy_tunnel_create(proxy_tunnel_rec **ptunnel, { apr_status_t rv; conn_rec *c_i = r->connection; + apr_interval_time_t timeout = -1; proxy_tunnel_rec *tunnel; *ptunnel = NULL; @@ -4795,6 +4796,13 @@ PROXY_DECLARE(apr_status_t) ap_proxy_tunnel_create(proxy_tunnel_rec **ptunnel, tunnel->origin->pfd->desc.s = ap_get_conn_socket(c_o); tunnel->origin->pfd->client_data = tunnel->origin; + /* Defaults to the smallest timeout of both connections */ + apr_socket_timeout_get(tunnel->client->pfd->desc.s, &timeout); + apr_socket_timeout_get(tunnel->origin->pfd->desc.s, &tunnel->timeout); + if (timeout >= 0 && (tunnel->timeout < 0 || tunnel->timeout > timeout)) { + tunnel->timeout = timeout; + } + /* We should be nonblocking from now on the sockets */ apr_socket_opt_set(tunnel->client->pfd->desc.s, APR_SO_NONBLOCK, 1); apr_socket_opt_set(tunnel->origin->pfd->desc.s, APR_SO_NONBLOCK, 1);