An input filter is called when input
is required. It is handed a brigade to
fill, a mode parameter (the mode can either be blocking, nonblocking,
or peek), and a number of bytes to read —
means "read a line." Most input
filters will, of course, call the filter below them to get data,
process it in some way, then fill the brigade with the resulting
As with output filters, the filter must be registered:
ap_register_input_filter("filter name", filter_function, AP_FTYPE_CONTENT);
where the parameters are as described earlier for output filters. Note that there is currently no attempt to avoid collisions in filter names, which is probably a mistake. As with output filters, you have to insert the filter at the right moment — all is the same as earlier, except the functions say "input" instead of "output," of course.
Naturally, input filters are similar to but not the same as output filters. It is probably simplest to illustrate the differences with an example. The following filter converts the case of request data (note, just the data, not the headers — so to see anything happen, you need to do a POST request). It should be available in modules/experimental/mod_case_filter_in.c. (Note the comments follow the line(s) of code to which they refer.)
#include "httpd.h" #include "http_config.h" #include "apr_general.h" #include "util_filter.h" #include "apr_buckets.h" #include "http_request.h" #include <ctype.h>
As always, we start with the headers we need.
static const ...