HTTP リクエストを処理するプロキシがあります。
GZipped HTTP レスポンスを取得したら、次のように解凍します。
MemoryStream ms = new MemoryStream();
if (response.ContentLength > 0)
buffer = new Byte[response.ContentLength];
else
buffer = new Byte[BUFFER_SIZE];
int bytesRead;
while ((bytesRead = responseStream.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, bytesRead);
}
string resp = "";
if (response.ContentEncoding == "gzip")
resp = Utilities.GZip.Unzip(ms.ToArray());
else
resp = Encoding.UTF8.GetString(ms.ToArray());
Utilities.GZip.Unzip の場所:
using (var msi = new MemoryStream(bytes))
using (var mso = new MemoryStream())
{
using (var gs = new GZipStream(msi, CompressionMode.Decompress))
{
CopyTo(gs, mso);
}
return Encoding.UTF8.GetString(mso.ToArray());
}
これまでのところ、すべて問題なく、HTML を読み取ることができます。
ここで、要求したクライアントに応答を書き戻さなければなりません。
このような:
byte[] outByte;
if (response.ContentEncoding == "gzip")
outByte = Utilities.GZip.Zip(resp);
else
outByte = Encoding.UTF8.GetBytes(resp);
outStream.Write(outByte, 0, outByte.Length);
Utilities.GZip.Zip の場所:
var bytes = Encoding.UTF8.GetBytes(str);
using (var msi = new MemoryStream(bytes))
using (var mso = new MemoryStream())
{
using (var gs = new GZipStream(mso, CompressionMode.Compress))
{
CopyTo(msi, gs);
}
return mso.ToArray();
}
これは本当に奇妙な動作です。応答バイト配列の長さは 16990 (圧縮) ですが、私自身の圧縮バイト配列の長さは 19379 です。
クライアントは応答を受け取りますが、それは途切れています。
助言がありますか?
編集:
参考までに、元の MemoryStream を変更せずにクライアントに送信するので、問題ありません。