Apache 2.0のfilterを調べる
最終目標
Apacheがクライアントに対して送信(出力)したContentを自作モジュールから参照したい。
filter?
Apache 2.0に実装されたfilterを使用すればこれが実現できそうだ。ということでいろいろ調べています。
まずは公式ドキュメントを読み始めるも意味がよくわからん。
→How filters work in Apache 2.0 - Apache HTTP Server(英語)
filterには protocol filter と resource filter の2種類があるようだ。
んで、多分目的のものは resource filter かな?。
勝手なイメージだが filter関数をフックしておくと何かのタイミングで Apacheの中の人が呼び出してくれるのだろう。
mod_deflateが filter を使っているっぽいのでソースを見てみる(Apache本体のソースに付属しています。)
フィルタ関数?のインターフェース
apr_bucket_brigadeって何???
static apr_status_t deflate_out_filter(ap_filter_t *f, apr_bucket_brigade *bb) { apr_bucket *e; request_rec *r = f->r; deflate_ctx *ctx = f->ctx;
ap_filter_t
struct ap_filter_t { /** The internal representation of this filter. This includes * the filter's name, type, and the actual function pointer. */ ap_filter_rec_t *frec; /** A place to store any data associated with the current filter */ void *ctx; /** The next filter in the chain */ ap_filter_t *next; /** The request_rec associated with the current filter. If a sub-request * adds filters, then the sub-request is the request associated with the * filter. */ request_rec *r; /** The conn_rec associated with the current filter. This is analogous * to the request_rec, except that it is used for input filtering. */ conn_rec *c; ;}
filter chainというのがあるんだな。↑の英語ドキュメントでもstack云々が書かれていたな。
filterの登録
これは予想通り。
static void register_hooks(apr_pool_t *p) { ap_register_output_filter(deflateFilterName, deflate_out_filter, NULL, AP_FTYPE_CONTENT_SET); ap_register_input_filter(deflateFilterName, deflate_in_filter, NULL, AP_FTYPE_CONTENT_SET); }
apr_bucket_brigade
これはなんだろう。継続調査で。
資料になりそうなもの
http://qb5.2ch.net/test/read.cgi/operate/1105909861/
MODULE.JP - POSTされたデータをInput Filterで検査する
というかこの手の話題では、必ず小山さんのサイトが出てくるのがかっこいいな。
実はOSC2005で一度お会いしてお話したのですが、サインもらっておけばよかったかな。。