3

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 を変更せずにクライアントに送信するので、問題ありません。

4

0 に答える 0