]> granicus.if.org Git - apache/commitdiff
If the client disconnects and the backend continues to send data fast, forcibly
authorStefan Fritsch <sf@apache.org>
Wed, 17 Mar 2010 20:08:42 +0000 (20:08 +0000)
committerStefan Fritsch <sf@apache.org>
Wed, 17 Mar 2010 20:08:42 +0000 (20:08 +0000)
close the backend connection.

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@924455 13f79535-47bb-0310-9956-ffa450edef68

modules/proxy/mod_proxy_connect.c

index 48d1d5218d3b4098da63b02fad0de839039eddd1..ab8c34d169d99aec30ddcc3c9f1bd05c51935d57 100644 (file)
@@ -135,6 +135,8 @@ static int proxy_connect_transfer(request_rec *r, conn_rec *c_i, conn_rec *c_o,
         rv = ap_get_brigade(c_i->input_filters, bb, AP_MODE_READBYTES,
                             APR_NONBLOCK_READ, CONN_BLKSZ);
         if (rv == APR_SUCCESS) {
+            if (c_o->aborted)
+                return APR_EPIPE;
             if (APR_BRIGADE_EMPTY(bb))
                 break;
 #ifdef DEBUGGING
@@ -186,6 +188,7 @@ static int proxy_connect_handler(request_rec *r, proxy_worker *worker,
     char buffer[HUGE_STRING_LEN];
     apr_socket_t *client_socket = ap_get_module_config(c->conn_config, &core_module);
     int failed, rc;
+    int client_error = 0;
     apr_pollset_t *pollset;
     apr_pollfd_t pollfd;
     const apr_pollfd_t *signalled;
@@ -440,6 +443,8 @@ static int proxy_connect_handler(request_rec *r, proxy_worker *worker,
                          ap_log_rerror(APLOG_MARK, APLOG_NOTICE, 0, r,
                                        "proxy: CONNECT: err/hup on backconn");
                 }
+                if (rv != APR_SUCCESS)
+                    client_error = 1;
             }
             else if (cur->desc.s == client_socket) {
                 pollevent = cur->rtnevents;
@@ -472,7 +477,10 @@ static int proxy_connect_handler(request_rec *r, proxy_worker *worker,
      * Close the socket and clean up
      */
 
-    ap_lingering_close(backconn);
+    if (client_error)
+        apr_socket_close(sock);
+    else
+        ap_lingering_close(backconn);
 
     c->aborted = 1;