summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuediger Pluem <rpluem@apache.org>2005-12-11 00:15:27 +0000
committerRuediger Pluem <rpluem@apache.org>2005-12-11 00:15:27 +0000
commit614df45f1e658368c3bb112433e9f306b70ab94f (patch)
treeb9a2db4a7a19d53ff05385f8072c89804e273876
parent49e1abbb25895516c1059c749f507acc1cbca38b (diff)
downloadhttpd-614df45f1e658368c3bb112433e9f306b70ab94f.tar.gz
* Move handling of backends that broke after the headers have been sent
into the proxy handler of mod_proxy. This patch still sets r->connection->aborted to 1 which is currently vetoed by Roy. Moving it from the scheme handler to the proxy handler should ease the reimplementation of this, as the scheme handlers only needs to return PROXY_BACKEND_BROKEN to signal the above situation to the proxy handler. mod_proxy.h: Add define for PROXY_BACKEND_BROKEN mod_proxy.c: Handle PROXY_BACKEND_BROKEN in proxy handler mod_proxy_http.c: Sent back PROXY_BACKEND_BROKEN if backend broke after we sent the headers. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@355823 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--modules/proxy/mod_proxy.c14
-rw-r--r--modules/proxy/mod_proxy.h6
-rw-r--r--modules/proxy/mod_proxy_http.c9
3 files changed, 25 insertions, 4 deletions
diff --git a/modules/proxy/mod_proxy.c b/modules/proxy/mod_proxy.c
index 4eab150829..0101c5ff14 100644
--- a/modules/proxy/mod_proxy.c
+++ b/modules/proxy/mod_proxy.c
@@ -758,6 +758,20 @@ static int proxy_handler(request_rec *r)
worker->s->status |= PROXY_WORKER_IN_ERROR;
}
}
+ else if (access_status == PROXY_BACKEND_BROKEN) {
+ /*
+ * If the backend broke after the headers had been sent do not
+ * try another worker, but leave. Do not mark the worker as
+ * unsuable as this problem may not reoccur on the next request.
+ *
+ * TODO: Currently we abort the connection and notify all parties
+ * on the upstream that something went wrong by setting c->aborted
+ * to 1. This idea is currently vetoed and should be replaced with
+ * other methods
+ */
+ r->connection->aborted = 1;
+ break;
+ }
else {
/* Unrecoverable error.
* Return the origin status code to the client.
diff --git a/modules/proxy/mod_proxy.h b/modules/proxy/mod_proxy.h
index 63ed1afe2c..f84cc254f5 100644
--- a/modules/proxy/mod_proxy.h
+++ b/modules/proxy/mod_proxy.h
@@ -238,6 +238,12 @@ struct proxy_conn_pool {
proxy_conn_rec *conn; /* Single connection for prefork mpm's */
};
+/*
+ * Return code that scheme handlers should return if the backend connection
+ * broke after they have sent the headers
+ */
+#define PROXY_BACKEND_BROKEN -10
+
/* woker status flags */
#define PROXY_WORKER_INITIALIZED 0x0001
#define PROXY_WORKER_IGNORE_ERRORS 0x0002
diff --git a/modules/proxy/mod_proxy_http.c b/modules/proxy/mod_proxy_http.c
index 250b7601d0..b751efadc4 100644
--- a/modules/proxy/mod_proxy_http.c
+++ b/modules/proxy/mod_proxy_http.c
@@ -1199,6 +1199,7 @@ apr_status_t ap_proxy_http_process_response(apr_pool_t * p, request_rec *r,
* are being read. */
int pread_len = 0;
apr_table_t *save_table;
+ int backend_broken = 0;
bb = apr_brigade_create(p, c->bucket_alloc);
@@ -1486,7 +1487,7 @@ apr_status_t ap_proxy_http_process_response(apr_pool_t * p, request_rec *r,
*/
ap_log_cerror(APLOG_MARK, APLOG_ERR, rv, c,
"proxy: error reading response");
- c->aborted = 1;
+ backend_broken = 1;
break;
}
/* next time try a non-blocking read */
@@ -1552,9 +1553,9 @@ apr_status_t ap_proxy_http_process_response(apr_pool_t * p, request_rec *r,
}
} while (interim_response);
- /* If our connection with the client is to be aborted, return DONE. */
- if (c->aborted) {
- return DONE;
+ /* Signal back that the backend broke after we sent the headers. */
+ if (backend_broken) {
+ return PROXY_BACKEND_BROKEN;
}
if (conf->error_override) {