Hi,
While arranging the code of the recent 2.1-dev proxy enhancements to get CONNECT working I have noted that CONNECT loops endless when the client closes the connection. Find enclosed a patch than fixes the problem.
Cheers
Jean-Frederic
Index: proxy_connect.c =================================================================== RCS file: /home/cvspublic/httpd-2.0/modules/proxy/proxy_connect.c,v retrieving revision 1.68 diff -u -r1.68 proxy_connect.c --- proxy_connect.c 13 Aug 2004 23:16:50 -0000 1.68 +++ proxy_connect.c 16 Aug 2004 12:05:38 -0000 @@ -292,8 +292,10 @@ ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, "proxy: CONNECT: error apr_poll()"); return HTTP_INTERNAL_SERVER_ERROR; } -/* ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, - "proxy: CONNECT: woke from select(), i=%d", pollcnt);*/ +#ifdef DEBUGGING + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: CONNECT: woke from select(), i=%d", pollcnt); +#endif for (i = 0; i < pollcnt; i++) { const apr_pollfd_t *cur = &signalled[i]; @@ -301,10 +303,13 @@ if (cur->desc.s == sock) { pollevent = cur->rtnevents; if (pollevent & APR_POLLIN) { -/* ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, - "proxy: CONNECT: sock was set");*/ +#ifdef DEBUGGING + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: CONNECT: sock was set"); +#endif nbytes = sizeof(buffer); - if (apr_socket_recv(sock, buffer, &nbytes) == APR_SUCCESS) { + rv = apr_socket_recv(sock, buffer, &nbytes); + if (rv == APR_SUCCESS) { o = 0; i = nbytes; while(i > 0) @@ -316,7 +321,8 @@ * if ((nbytes = ap_rwrite(buffer + o, nbytes, r)) < 0) * rbb */ - if (apr_socket_send(client_socket, buffer + o, &nbytes) != APR_SUCCESS) + rv = apr_socket_send(client_socket, buffer + o, &nbytes); + if (rv != APR_SUCCESS) break; o += nbytes; i -= nbytes; @@ -331,16 +337,24 @@ else if (cur->desc.s == client_socket) { pollevent = cur->rtnevents; if (pollevent & APR_POLLIN) { -/* ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, - "proxy: CONNECT: client was set");*/ +#ifdef DEBUGGING + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: CONNECT: client was set"); +#endif nbytes = sizeof(buffer); - if (apr_socket_recv(client_socket, buffer, &nbytes) == APR_SUCCESS) { + rv = apr_socket_recv(client_socket, buffer, &nbytes); + if (rv == APR_SUCCESS) { o = 0; i = nbytes; +#ifdef DEBUGGING + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: CONNECT: read %d from client", i); +#endif while(i > 0) { nbytes = i; - if (apr_socket_send(sock, buffer + o, &nbytes) != APR_SUCCESS) + rv = apr_socket_send(sock, buffer + o, &nbytes); + if (rv != APR_SUCCESS) break; o += nbytes; i -= nbytes; @@ -354,6 +368,9 @@ } else break; + } + if (rv != APR_SUCCESS) { + break; } }