]> granicus.if.org Git - apache/commitdiff
Merge r1205419 from trunk:
authorJim Jagielski <jim@apache.org>
Wed, 23 Nov 2011 15:02:28 +0000 (15:02 +0000)
committerJim Jagielski <jim@apache.org>
Wed, 23 Nov 2011 15:02:28 +0000 (15:02 +0000)
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

include/util_filter.h
server/util_filter.c

index a09c53257647155170abd10913bfaae6179f3e0a..4b4236529fe15cd08af1c90ab22d1be7a513fc52 100644 (file)
@@ -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
index 27046b330e2470e88bc5bb48265b1dbfb0cc2287..fd07145dbbcc605e740a392b7a17f1a7948e0fae 100644 (file)
@@ -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)