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