From: Jim Jagielski Date: Wed, 23 Nov 2011 15:02:28 +0000 (+0000) Subject: Merge r1205419 from trunk: X-Git-Tag: 2.3.16~113 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8773bbffcd4c8c1c935641237b433f7ec8c6e1a8;p=apache Merge r1205419 from trunk: Add ap_pass_brigade_fchk() which does a Filter CHecK on the brigade pass. Reviewed/backported by: jim git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1205424 13f79535-47bb-0310-9956-ffa450edef68 --- 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)