From d2342460fd03844f6f73670bb4ac25b77ee599b6 Mon Sep 17 00:00:00 2001 From: Jim Jagielski Date: Wed, 23 Nov 2011 14:52:43 +0000 Subject: [PATCH] Add ap_pass_brigade_fchk() which does a Filter CHecK on the brigade pass. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1205419 13f79535-47bb-0310-9956-ffa450edef68 --- include/util_filter.h | 20 ++++++++++++++++++++ server/util_filter.c | 27 +++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/include/util_filter.h b/include/util_filter.h index a09c532576..4b4236529f 100644 --- a/include/util_filter.h +++ b/include/util_filter.h @@ -314,6 +314,26 @@ AP_DECLARE(apr_status_t) ap_get_brigade(ap_filter_t *filter, AP_DECLARE(apr_status_t) ap_pass_brigade(ap_filter_t *filter, apr_bucket_brigade *bucket); +/** + * Pass the current bucket brigade down to the next filter on the filter + * stack checking for filter errors. The filter returns an apr_status_t value. + * Returns ::OK if the brigade is successfully passed + * ::AP_FILTER_ERROR on a filter error + * ::HTTP_INTERNAL_SERVER_ERROR on all other errors + * @param r The request rec + * @param bucket The current bucket brigade + * @param msg Optional error msg; if NULL defaults to "ap_pass_brigade returned" + * + * @remark Ownership of the brigade is retained by the caller. On return, + * the contents of the brigade are UNDEFINED, and the caller must + * either call apr_brigade_cleanup or apr_brigade_destroy on + * the brigade. + */ +AP_DECLARE(apr_status_t) ap_pass_brigade_fchk(request_rec *r, + apr_bucket_brigade *bucket, + const char *msg); + + /** * This function is used to register an input filter with the system. * After this registration is performed, then a filter may be added diff --git a/server/util_filter.c b/server/util_filter.c index 27046b330e..fd07145dbb 100644 --- a/server/util_filter.c +++ b/server/util_filter.c @@ -535,6 +535,33 @@ AP_DECLARE(apr_status_t) ap_pass_brigade(ap_filter_t *next, return AP_NOBODY_WROTE; } +/* Pass the buckets to the next filter in the filter stack + * checking return status for filter errors. + * returns: OK if ap_pass_brigade returns APR_SUCCESS + * AP_FILTER_ERROR if filter error exists + * HTTP_INTERNAL_SERVER_ERROR for all other cases + * logged with optional errmsg + */ +AP_DECLARE(apr_status_t) ap_pass_brigade_fchk(request_rec *r, + apr_bucket_brigade *bb, + const char *errmsg) +{ + apr_status_t rv; + if (!errmsg) + errmsg = "ap_pass_brigade returned"; + + rv = ap_pass_brigade(r->output_filters, bb); + if (rv != APR_SUCCESS) { + if (rv != AP_FILTER_ERROR) { + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, rv, r, + "%s %d", errmsg, rv); + return HTTP_INTERNAL_SERVER_ERROR; + } + return AP_FILTER_ERROR; + } + return OK; +} + AP_DECLARE(apr_status_t) ap_save_brigade(ap_filter_t *f, apr_bucket_brigade **saveto, apr_bucket_brigade **b, apr_pool_t *p) -- 2.40.0