]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
mod_proxy_connect: Honor the smallest of the backend or client timeout.
authorYann Ylavic <ylavic@apache.org>
Fri, 15 Oct 2021 11:09:32 +0000 (11:09 +0000)
committerYann Ylavic <ylavic@apache.org>
Fri, 15 Oct 2021 11:09:32 +0000 (11:09 +0000)
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

changes-entries/proxy_connect_timeout.txt [new file with mode: 0644]
modules/proxy/proxy_util.c

diff --git a/changes-entries/proxy_connect_timeout.txt b/changes-entries/proxy_connect_timeout.txt
new file mode 100644 (file)
index 0000000..f3ef015
--- /dev/null
@@ -0,0 +1,2 @@
+  *) mod_proxy_connect: Honor the smallest of the backend or client timeout
+     while tunneling.  [Yann Ylavic]
index e620ee88ed586aebc99aca81f6cfdcbfe5bd700a..00492d77392e3883b62d1c3aaa47c9ed5e7b842a 100644 (file)
@@ -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);