[Apache][C言語] コンテンツをcallback_filterでゲット

小山さんのアドバイスにより、callback_filterの仕組みをApache 1.3で試してみました。
この仕組みはどうやらundocumentedなもので、正式サポートされていない予感。
技術的に、かなりマニアックな部分なので需要は少ないと思うのですが今後同じ場所ではまる人が少なくなるように、メモを残しておきます。



Apacheの出力は ap_rxxxx を介して行われます。
その際に、r->client->connectionというBUFFオブジェクトに関連付けて出力が行われる仕組みなっています。
そこで、BUFFのメンバである callback_filterに関数を登録しておくと、BUFFオブジェクトへの書き込みのたび(?)にApacheが、その関数を読んでくれるというわけです。


これを利用すると以下のように、Apacheが出力したものをすべてログに吐くことが出来ます。

static void mylog(BUFF* b, const void* data, int len)
{
  // ログ出力
}


//どこかのフェーズでコールバックされるように登録しておく
r->connection->client->filter_callback = mylog;


さて実際にやってみたところHTTPのヘッダは問題なく出力されていますが、Contentはバイナリっぽいものが入っているようです。圧縮されているのかな?
というわけでもう少し調べてみます。
Apacheモジュール プログラミングガイド (Advanced Server‐side programmingシリーズ)