Changes with Apache 2.0.33-dev
+ *) ap_get_*_filter_handle() functions to allow 3rd party modules
+ to lookup filter handles so they can bypass the filter name
+ lookup when adding filters to a request (via ap_add_*_filter_handle())
+ [Ryan Morgan <rmorgan@covalent.net>]
+
*) Fix for multiple file buckets on Win32, where the first file
bucket would cause the immediate closure of the socket on any
non-keepalive requests. [Ryan Morgan <rmorgan@covalent.net>]
request_rec *r,
conn_rec *c);
+/**
+ * Returns the filter handle for use with ap_add_input_filter_handle.
+ *
+ * @param name The filter name to look up
+ */
+AP_DECLARE(ap_filter_rec_t *) ap_get_input_filter_handle(const char *name);
+
/**
* Add a filter to the current request. Filters are added in a FIFO manner.
* The first filter added will be the first filter called.
void *ctx,
request_rec *r,
conn_rec *c);
+/**
+ * Returns the filter handle for use with ap_add_output_filter_handle.
+ *
+ * @param name The filter name to look up
+ */
+AP_DECLARE(ap_filter_rec_t *) ap_get_output_filter_handle(const char *name);
/**
* Remove an input filter from either the request or connection stack
return APR_SUCCESS;
}
+static ap_filter_rec_t *get_filter_handle(const char *name,
+ const filter_trie_node *filter_set)
+{
+ if (filter_set) {
+ const char *n;
+ const filter_trie_node *node;
+
+ node = filter_set;
+ for (n = name; *n; n++) {
+ int start, end;
+ start = 0;
+ end = node->nchildren - 1;
+ while (end >= start) {
+ int middle = (end + start) / 2;
+ char ch = node->children[middle].c;
+ if (*n == ch) {
+ node = node->children[middle].child;
+ break;
+ }
+ else if (*n < ch) {
+ end = middle - 1;
+ }
+ else {
+ start = middle + 1;
+ }
+ }
+ if (end < start) {
+ node = NULL;
+ break;
+ }
+ }
+
+ if (node && node->frec) {
+ return node->frec;
+ }
+ }
+ return NULL;
+}
+
+ap_filter_rec_t *ap_get_output_filter_handle(const char *name)
+{
+ return get_filter_handle(name, registered_output_filters);
+}
+
+ap_filter_rec_t *ap_get_input_filter_handle(const char *name)
+{
+ return get_filter_handle(name, registered_input_filters);
+}
+
static ap_filter_rec_t *register_filter(const char *name,
ap_filter_func filter_func,
ap_filter_type ftype,