This patch adds a couple of functions that 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). A patch is in-line, as well as
attached.
Thanks,
-Ryan
Index: include/util_filter.h
===================================================================
RCS file: /home/cvspublic/httpd-2.0/include/util_filter.h,v
retrieving revision 1.64
diff -u -r1.64 util_filter.h
--- include/util_filter.h 27 Jan 2002 01:54:54 -0000 1.64
+++ include/util_filter.h 23 Feb 2002 01:41:43 -0000
@@ -366,6 +366,13 @@
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.
* @param name The name of the filter to add
@@ -388,6 +395,12 @@
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
Index: server/util_filter.c
===================================================================
RCS file: /home/cvspublic/httpd-2.0/server/util_filter.c,v
retrieving revision 1.76
diff -u -r1.76 util_filter.c
--- server/util_filter.c 27 Jan 2002 01:54:54 -0000 1.76
+++ server/util_filter.c 23 Feb 2002 01:41:47 -0000
@@ -183,6 +183,55 @@
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,
Index: include/util_filter.h
===================================================================
RCS file: /home/cvspublic/httpd-2.0/include/util_filter.h,v
retrieving revision 1.64
diff -u -r1.64 util_filter.h
--- include/util_filter.h 27 Jan 2002 01:54:54 -0000 1.64
+++ include/util_filter.h 23 Feb 2002 01:41:43 -0000
@@ -366,6 +366,13 @@
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.
* @param name The name of the filter to add
@@ -388,6 +395,12 @@
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
Index: server/util_filter.c
===================================================================
RCS file: /home/cvspublic/httpd-2.0/server/util_filter.c,v
retrieving revision 1.76
diff -u -r1.76 util_filter.c
--- server/util_filter.c 27 Jan 2002 01:54:54 -0000 1.76
+++ server/util_filter.c 23 Feb 2002 01:41:47 -0000
@@ -183,6 +183,55 @@
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,