From: Jim Jagielski Date: Mon, 15 Apr 2013 12:37:59 +0000 (+0000) Subject: Merge r1458456 from trunk: X-Git-Tag: 2.4.5~435 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d0972e06a26042dd653cbfca672df089220a5d2c;p=apache Merge r1458456 from trunk: Useful extensions... Reviewed/backported by: jim git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1467975 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/STATUS b/STATUS index 11da99eb52..a1d4fe5d45 100644 --- a/STATUS +++ b/STATUS @@ -90,11 +90,6 @@ RELEASE SHOWSTOPPERS: PATCHES ACCEPTED TO BACKPORT FROM TRUNK: [ start all new proposals below, under PATCHES PROPOSED. ] - * util_filter: Add in ap_remove_input|output_filter_byhandle() - trunk patch: http://svn.apache.org/viewvc?view=revision&revision=1458456 - 2.4.x patch: trunk patch works modulo ap_mmn.h - +1: jim, rjung, covener - * cache_storage: remove useless test + update function name in debug log + skip as soon as we know headers do not match trunk patch: http://svn.apache.org/viewvc?view=revision&revision=1452281 diff --git a/include/ap_mmn.h b/include/ap_mmn.h index 63d0995287..351808ac47 100644 --- a/include/ap_mmn.h +++ b/include/ap_mmn.h @@ -401,6 +401,7 @@ * 20120211.9 (2.4.4-dev) Add fgrab() to ap_slotmem_provider_t. * 20120211.10 (2.4.4-dev) Add in bal_persist field to proxy_server_conf * 20120211.11 (2.4.4-dev) Add ap_bin2hex() + * 20120211.12 (2.4.5-dev) Add ap_remove_input|output_filter_byhandle() */ #define MODULE_MAGIC_COOKIE 0x41503234UL /* "AP24" */ @@ -408,7 +409,7 @@ #ifndef MODULE_MAGIC_NUMBER_MAJOR #define MODULE_MAGIC_NUMBER_MAJOR 20120211 #endif -#define MODULE_MAGIC_NUMBER_MINOR 11 /* 0...n */ +#define MODULE_MAGIC_NUMBER_MINOR 12 /* 0...n */ /** * Determine if the server's current MODULE_MAGIC_NUMBER is at least a diff --git a/include/util_filter.h b/include/util_filter.h index 8b3c7a8487..5a966074ff 100644 --- a/include/util_filter.h +++ b/include/util_filter.h @@ -486,6 +486,25 @@ AP_DECLARE(void) ap_remove_input_filter(ap_filter_t *f); AP_DECLARE(void) ap_remove_output_filter(ap_filter_t *f); +/** + * Remove an input filter from either the request or connection stack + * it is associated with. + * @param next The filter stack to search + * @param handle The filter handle (name) to remove + * @return APR_SUCCESS on removal or error + */ +AP_DECLARE(apr_status_t) ap_remove_input_filter_byhandle(ap_filter_t *next, + const char *handle); +/** + * Remove an output filter from either the request or connection stack + * it is associated with. + * @param next The filter stack to search + * @param handle The filter handle (name) to remove + * @return APR_SUCCESS on removal or error + */ +AP_DECLARE(apr_status_t) ap_remove_output_filter_byhandle(ap_filter_t *next, + const char *handle); + /* The next two filters are for abstraction purposes only. They could be * done away with, but that would require that we break modules if we ever * want to change our filter registration method. The basic idea, is that diff --git a/server/util_filter.c b/server/util_filter.c index 7121eced9e..01eb533520 100644 --- a/server/util_filter.c +++ b/server/util_filter.c @@ -479,6 +479,63 @@ AP_DECLARE(void) ap_remove_output_filter(ap_filter_t *f) &f->c->output_filters); } +AP_DECLARE(apr_status_t) ap_remove_input_filter_byhandle(ap_filter_t *next, + const char *handle) +{ + ap_filter_t *found = NULL; + ap_filter_rec_t *filter; + + if (!handle) { + return APR_EINVAL; + } + filter = ap_get_input_filter_handle(handle); + if (!filter) { + return APR_NOTFOUND; + } + + while (next) { + if (next->frec == filter) { + found = next; + break; + } + next = next->next; + } + if (found) { + ap_remove_input_filter(found); + return APR_SUCCESS; + } + return APR_NOTFOUND; +} + +AP_DECLARE(apr_status_t) ap_remove_output_filter_byhandle(ap_filter_t *next, + const char *handle) +{ + ap_filter_t *found = NULL; + ap_filter_rec_t *filter; + + if (!handle) { + return APR_EINVAL; + } + filter = ap_get_output_filter_handle(handle); + if (!filter) { + return APR_NOTFOUND; + } + + while (next) { + if (next->frec == filter) { + found = next; + break; + } + next = next->next; + } + if (found) { + ap_remove_output_filter(found); + return APR_SUCCESS; + } + return APR_NOTFOUND; +} + + /* * Read data from the next filter in the filter stack. Data should be * modified in the bucket brigade that is passed in. The core allocates the