You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by rp...@apache.org on 2005/12/18 23:09:11 UTC
svn commit: r357519 - in /httpd/httpd/trunk: modules/http/http_core.c
modules/http/http_filters.c modules/http/mod_core.h server/core_filters.c
Author: rpluem
Date: Sun Dec 18 14:09:05 2005
New Revision: 357519
URL: http://svn.apache.org/viewcvs?rev=357519&view=rev
Log:
* Move code for broken backend detection out of core filter into a new http
protocol filter (ap_http_broken_backend_filter) that is only run in the
proxy case.
Modified:
httpd/httpd/trunk/modules/http/http_core.c
httpd/httpd/trunk/modules/http/http_filters.c
httpd/httpd/trunk/modules/http/mod_core.h
httpd/httpd/trunk/server/core_filters.c
Modified: httpd/httpd/trunk/modules/http/http_core.c
URL: http://svn.apache.org/viewcvs/httpd/httpd/trunk/modules/http/http_core.c?rev=357519&r1=357518&r2=357519&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/http/http_core.c (original)
+++ httpd/httpd/trunk/modules/http/http_core.c Sun Dec 18 14:09:05 2005
@@ -39,6 +39,7 @@
AP_DECLARE_DATA ap_filter_rec_t *ap_http_input_filter_handle;
AP_DECLARE_DATA ap_filter_rec_t *ap_http_header_filter_handle;
AP_DECLARE_DATA ap_filter_rec_t *ap_chunk_filter_handle;
+AP_DECLARE_DATA ap_filter_rec_t *ap_broken_backend_filter_handle;
AP_DECLARE_DATA ap_filter_rec_t *ap_byterange_filter_handle;
static const char *set_keep_alive_timeout(cmd_parms *cmd, void *dummy,
@@ -242,6 +243,10 @@
ap_chunk_filter_handle =
ap_register_output_filter("CHUNK", ap_http_chunk_filter,
NULL, AP_FTYPE_TRANSCODE);
+ ap_broken_backend_filter_handle =
+ ap_register_output_filter("BROKEN_BACKEND",
+ ap_http_broken_backend_filter,
+ NULL, AP_FTYPE_PROTOCOL);
ap_byterange_filter_handle =
ap_register_output_filter("BYTERANGE", ap_byterange_filter,
NULL, AP_FTYPE_PROTOCOL);
Modified: httpd/httpd/trunk/modules/http/http_filters.c
URL: http://svn.apache.org/viewcvs/httpd/httpd/trunk/modules/http/http_filters.c?rev=357519&r1=357518&r2=357519&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/http/http_filters.c (original)
+++ httpd/httpd/trunk/modules/http/http_filters.c Sun Dec 18 14:09:05 2005
@@ -1055,6 +1055,9 @@
*/
ap_add_output_filter("CHUNK", NULL, r, r->connection);
}
+ /* If we have a Proxy request, add the BROKEN_BACKEND filter now */
+ if (r->proxyreq != PROXYREQ_NONE)
+ ap_add_output_filter("BROKEN_BACKEND", NULL, r, r->connection);
/* Don't remove this filter until after we have added the CHUNK filter.
* Otherwise, f->next won't be the CHUNK filter and thus the first
@@ -1328,5 +1331,25 @@
apr_brigade_destroy(bb);
return bufsiz;
+}
+
+apr_status_t ap_http_broken_backend_filter(ap_filter_t *f,
+ apr_bucket_brigade *b)
+{
+ request_rec *r = f->r;
+ apr_bucket *e;
+
+ for (e = APR_BRIGADE_FIRST(b);
+ e != APR_BRIGADE_SENTINEL(b);
+ e = APR_BUCKET_NEXT(e))
+ {
+ if (AP_BUCKET_IS_ERROR(e)
+ && (((ap_bucket_error *)(e->data))->status == HTTP_BAD_GATEWAY)) {
+ /* stream aborted and we have not ended it yet */
+ r->connection->keepalive = AP_CONN_CLOSE;
+ }
+ }
+
+ return ap_pass_brigade(f->next, b);
}
Modified: httpd/httpd/trunk/modules/http/mod_core.h
URL: http://svn.apache.org/viewcvs/httpd/httpd/trunk/modules/http/mod_core.h?rev=357519&r1=357518&r2=357519&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/http/mod_core.h (original)
+++ httpd/httpd/trunk/modules/http/mod_core.h Sun Dec 18 14:09:05 2005
@@ -42,6 +42,7 @@
extern AP_DECLARE_DATA ap_filter_rec_t *ap_http_input_filter_handle;
extern AP_DECLARE_DATA ap_filter_rec_t *ap_http_header_filter_handle;
extern AP_DECLARE_DATA ap_filter_rec_t *ap_chunk_filter_handle;
+extern AP_DECLARE_DATA ap_filter_rec_t *ap_broken_backend_filter_handle;
extern AP_DECLARE_DATA ap_filter_rec_t *ap_byterange_filter_handle;
/*
@@ -53,6 +54,10 @@
/* HTTP/1.1 chunked transfer encoding filter. */
apr_status_t ap_http_chunk_filter(ap_filter_t *f, apr_bucket_brigade *b);
+
+/* Filter to close the connection to the client if backend broke */
+apr_status_t ap_http_broken_backend_filter(ap_filter_t *f,
+ apr_bucket_brigade *b);
char *ap_response_code_string(request_rec *r, int error_index);
Modified: httpd/httpd/trunk/server/core_filters.c
URL: http://svn.apache.org/viewcvs/httpd/httpd/trunk/server/core_filters.c?rev=357519&r1=357518&r2=357519&view=diff
==============================================================================
--- httpd/httpd/trunk/server/core_filters.c (original)
+++ httpd/httpd/trunk/server/core_filters.c Sun Dec 18 14:09:05 2005
@@ -315,9 +315,7 @@
apr_size_t *bytes_written,
conn_rec *c);
-static void detect_error_bucket(apr_bucket *bucket, conn_rec *c);
-
-static void remove_empty_buckets(apr_bucket_brigade *bb, conn_rec *c);
+static void remove_empty_buckets(apr_bucket_brigade *bb);
static apr_status_t send_brigade_blocking(apr_socket_t *s,
apr_bucket_brigade *bb,
@@ -489,7 +487,7 @@
if (bb == NULL) {
return;
}
- remove_empty_buckets(bb, c);
+ remove_empty_buckets(bb);
if (!APR_BRIGADE_EMPTY(bb)) {
c->data_in_output_filters = 1;
if (make_a_copy) {
@@ -528,7 +526,7 @@
struct iovec vec[MAX_IOVEC_TO_WRITE];
apr_size_t nvec = 0;
- remove_empty_buckets(bb, c);
+ remove_empty_buckets(bb);
for (bucket = APR_BRIGADE_FIRST(bb);
bucket != APR_BRIGADE_SENTINEL(bb);
@@ -598,26 +596,16 @@
}
}
- remove_empty_buckets(bb, c);
+ remove_empty_buckets(bb);
return APR_SUCCESS;
}
-static void detect_error_bucket(apr_bucket *bucket, conn_rec *c)
-{
- if (AP_BUCKET_IS_ERROR(bucket)
- && (((ap_bucket_error *)(bucket->data))->status == HTTP_BAD_GATEWAY)) {
- /* stream aborted and we have not ended it yet */
- c->keepalive = AP_CONN_CLOSE;
- }
-}
-
-static void remove_empty_buckets(apr_bucket_brigade *bb, conn_rec *c)
+static void remove_empty_buckets(apr_bucket_brigade *bb)
{
apr_bucket *bucket;
while (((bucket = APR_BRIGADE_FIRST(bb)) != APR_BRIGADE_SENTINEL(bb)) &&
(APR_BUCKET_IS_METADATA(bucket) || (bucket->length == 0))) {
- detect_error_bucket(bucket, c);
APR_BUCKET_REMOVE(bucket);
apr_bucket_destroy(bucket);
}
@@ -690,7 +678,6 @@
for (i = offset; i < nvec; ) {
apr_bucket *bucket = APR_BRIGADE_FIRST(bb);
if (APR_BUCKET_IS_METADATA(bucket)) {
- detect_error_bucket(bucket, c);
APR_BUCKET_REMOVE(bucket);
apr_bucket_destroy(bucket);
}