1

応答から特定のコンテンツを取り除く ISAPI フィルターに取り組んでいます。処理を行う前に、応答の本文をすべて収集する必要があります。これは、削除するコンテンツが送信バッファーとオーバーラップする可能性があるためです。

これを行うにはSF_NOTIFY_SEND_RAW_DATA、最後の通知に到達するまで各通知で応答コンテンツをバッファリングしてから、翻訳されたデータを送信します。SF_NOTIFY_SEND_RAW_DATAどちらが実際に最後かを判断する最良の方法を知りたいです。通知を待つとSF_NOTIFY_END_OF_REQUEST、バッファリングしたデータを送信する方法がわかりません。

1 つのアプローチは、コンテンツの長さを使用することです。これには、ヘッダーの終わりを検出する必要があります。content-length ヘッダーが正しいと仮定する必要もあります (それは保証されていますか?)。HTTP は content-length ヘッダーさえも必要としないため、それが常に存在するかどうかさえわかりません。もっと簡単な方法があるはずです。

応答がチャンクされていないと想定しているため、応答を変更する前にデチャンクを処理していません。また、レスポンス ボディに変更を加えても、レスポンス ボディのサイズは変更されないため、戻ってコンテンツの長さを更新する必要はありません。

4

1 に答える 1

1

最終的に、グーグル経由でいくつかの良い議論を見つけました。

この投稿は私の質問に答えるだけでなく、より複雑なフィルターが対処しなければならない問題を提起します: http://groups.google.com/group/microsoft.public.platformsdk.internet.server.isapi-dev/browse_thread/thread/ 85a5e75f342fad2b/cbb638f9a85c9e03?q=HTTP_FILTER_RAW_DATA&_done=%2Fgroups%3Fq%3DHTTP_FILTER_RAW_DATA%26start%3D20%26&_doneTitle=Back+to+Search&&d&pli=1

私が持っているフィルターは、完全なリクエストを独自のバッファーにバッファリングし、SF_NOTIFY_END_OF_REQUEST を使用してコンテンツを送信します。それが行う変更はサイズを変更せず、応答がチャンクされる可能性を排除するため、私の場合、フィルターは比較的単純です。

于 2009-03-06T17:23:11.587 に答える