On 02/14/2006 01:51 PM, Jim Jagielski wrote:
> since it really does help track some things down... In the
> meantime, if you can send the latest patch, I'll test
> it here.
Please find attached....
Changes to the previous one:
1. Diff against r377821.
2. I removed the !backend check also.
I am curious about the test results.
Regards
RĂ¼diger
Index: modules/proxy/proxy_util.c
===================================================================
--- modules/proxy/proxy_util.c (Revision 377821)
+++ modules/proxy/proxy_util.c (Arbeitskopie)
@@ -1868,16 +1868,6 @@
conn->hostname = apr_pstrdup(conn->pool, uri->hostname);
conn->port = uri->port;
}
- }
- /*
- * TODO: add address cache for generic forward proxies.
- * At least level 0 -> compare with previous hostname:port
- */
- if (r->proxyreq == PROXYREQ_PROXY || r->proxyreq == PROXYREQ_REVERSE ||
- !worker->is_address_reusable) {
- /*
- * TODO: Check if the connection can be reused
- */
if (conn->connection) {
if (conn->sock) {
apr_socket_close(conn->sock);
Index: modules/proxy/mod_proxy_http.c
===================================================================
--- modules/proxy/mod_proxy_http.c (Revision 377821)
+++ modules/proxy/mod_proxy_http.c (Arbeitskopie)
@@ -981,9 +981,18 @@
/* Yes I hate gotos. This is the subrequest shortcut */
skip_body:
- /* Handle Connection: header */
- if (!force10 && p_conn->close) {
- buf = apr_pstrdup(p, "Connection: close" CRLF);
+ /*
+ * Handle Connection: header if we do HTTP/1.1 request:
+ * If we plan to close the backend connection sent Connection: close
+ * otherwise sent Connection: Keep-Alive.
+ */
+ if (!force10) {
+ if (p_conn->close) {
+ buf = apr_pstrdup(p, "Connection: close" CRLF);
+ }
+ else {
+ buf = apr_pstrdup(p, "Connection: Keep-Alive" CRLF);
+ }
ap_xlate_proto_to_ascii(buf, strlen(buf));
e = apr_bucket_pool_create(buf, strlen(buf), p, c->bucket_alloc);
APR_BRIGADE_INSERT_TAIL(header_brigade, e);
@@ -1510,12 +1519,6 @@
/* found the last brigade? */
if (APR_BUCKET_IS_EOS(APR_BRIGADE_LAST(bb))) {
- /* if this is the last brigade, cleanup the
- * backend connection first to prevent the
- * backend server from hanging around waiting
- * for a slow client to eat these bytes
- */
- backend->close = 1;
/* signal that we must leave */
finish = TRUE;
}
@@ -1584,18 +1587,7 @@
apr_status_t ap_proxy_http_cleanup(const char *scheme, request_rec *r,
proxy_conn_rec *backend)
{
- /* If there are no KeepAlives, or if the connection has been signalled
- * to close, close the socket and clean up
- */
-
- /* if the connection is < HTTP/1.1, or Connection: close,
- * we close the socket, otherwise we leave it open for KeepAlive support
- */
- if (backend->close || (r->proto_num < HTTP_VERSION(1,1))) {
- backend->close_on_recycle = 1;
- ap_set_module_config(r->connection->conn_config, &proxy_http_module,
NULL);
- ap_proxy_release_connection(scheme, backend, r->server);
- }
+ ap_proxy_release_connection(scheme, backend, r->server);
return OK;
}
@@ -1673,26 +1665,13 @@
"proxy: HTTP: serving URL %s", url);
- /* only use stored info for top-level pages. Sub requests don't share
- * in keepalives
- */
- if (!r->main) {
- backend = (proxy_conn_rec *) ap_get_module_config(c->conn_config,
- &proxy_http_module);
- }
/* create space for state information */
- if (!backend) {
- if ((status = ap_proxy_acquire_connection(proxy_function, &backend,
- worker, r->server)) != OK)
- goto cleanup;
+ if ((status = ap_proxy_acquire_connection(proxy_function, &backend,
+ worker, r->server)) != OK)
+ goto cleanup;
- if (!r->main) {
- ap_set_module_config(c->conn_config, &proxy_http_module, backend);
- }
- }
backend->is_ssl = is_ssl;
- backend->close_on_recycle = 1;
/* Step One: Determine Who To Connect To */
if ((status = ap_proxy_determine_connection(p, r, conf, worker, backend,
@@ -1732,10 +1711,8 @@
cleanup:
if (backend) {
- if (status != OK) {
+ if (status != OK)
backend->close = 1;
- backend->close_on_recycle = 1;
- }
ap_proxy_http_cleanup(proxy_function, r, backend);
}
return status;