From: Victor J. Orlikowski Date: Fri, 17 Aug 2001 01:38:16 +0000 (+0000) Subject: Fix behavior in the event that a socket is closed. X-Git-Tag: 2.0.24~30 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=923914d96950b02fb603e2b15972daab47d14ddb;p=apache Fix behavior in the event that a socket is closed. Submitted by: barbee@veribox.net Reviewed by: orlikowski@apache.org git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@90264 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/modules/proxy/proxy_http.c b/modules/proxy/proxy_http.c index 2c6b33aaf3..935e2f0d47 100644 --- a/modules/proxy/proxy_http.c +++ b/modules/proxy/proxy_http.c @@ -309,6 +309,10 @@ apr_status_t ap_proxy_http_create_connection(apr_pool_t *p, request_rec *r, /* get a socket - either a keepalive one, or a new one */ new = 1; if ((backend->connection) && (backend->connection->id == c->id)) { + int buffer_len = 1; + char test_buffer[buffer_len]; + apr_status_t socket_status; + apr_int32_t current_timeout; /* use previous keepalive socket */ *origin = backend->connection; @@ -318,8 +322,18 @@ apr_status_t ap_proxy_http_create_connection(apr_pool_t *p, request_rec *r, /* reset the connection filters */ ap_proxy_reset_output_filters(*origin); - /* XXX FIXME: If the socket has since closed, change new to 1 so - * a new socket is opened */ + /* save timeout */ + apr_getsocketopt(p_conn->sock, APR_SO_TIMEOUT, ¤t_timeout); + /* set no timeout */ + apr_setsocketopt(p_conn->sock, APR_SO_TIMEOUT, 0); + socket_status = apr_recv(p_conn->sock, test_buffer, &buffer_len); + /* put back old timeout */ + apr_setsocketopt(p_conn->sock, APR_SO_TIMEOUT, current_timeout); + if ( APR_STATUS_IS_EOF(socket_status) ) { + ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, NULL, + "proxy: HTTP: previous connection is closed"); + new = 1; + } } if (new) {