ZLIBを使います。gzip.cがファイルのgzipを云々する関数を提供してます。これを基本にしています。
間違いとかあるかもしれませんが、とりあえずgzipを展開できてますので、いいじゃないですか。
gzip.cppを見てください。
構造:httplibはネットワークから読んだデータを、そのままIReciever::recv()でユーザオブジェクトに渡します(http -> user )。GzipFilterはこの間にはいって、 http -> gzip -> user という関係を構築します。いろいろな情報を誤魔化して、ユーザオブジェクトには、生データがhttpから流れてきたかのように思わせます。
gzipはヘッダがついてます。基本的に、ストリームで展開するには、不要な要素なので、gzipの確認をするくらいで、さっさと読み飛ばしてしまいます。
場合によっては、ヘッダの全てがネットワークから送られない場合もあるかもしれませんが、知らないふりしときます。
展開します。ここで、zlibの初期化をinflateInit2(&z, -MAX_WBITS)で行うことを忘れないでください。普通にinflateInit使うと、inflate呼んだ時にエラーがでます
ネットワークから受け取ったデータは、next_in(ptr), avail_in(size)に放り込んで、inflateに引き渡します。ここでは、入力バッファをzlibが全部使い切ってしまうまで、whileで回し続けます。
出力バッファがいっぱいになったら、本来の処理ルーチンに引き渡し、出力バッファを再利用します。
基本的に、全部のデータをzlibに食わせたら、inflateはZ_STREAM_ENDを返してくるので、あとは、最後の展開部分を引き渡し、終わりにします。
最後はinflateEndで締めくくってください。