解压缩gzip压缩的HTTP响应(分块编码)

时间:2012-12-14 13:48:28

标签: http gzip compression chunked-encoding

就像在标题中描述的那样,我想解压缩HTTP-Resonse。 这是我的工作:

  1. 收到http-response
  2. 检查内容编码(让我们假设它的gzip)
  3. 从http响应中提取内容(此点的结果是包含HTTP消息内容的字节数组)
  4. 尝试解压缩content-byte-array
  5. Last Point不起作用。我收到此错误:“GZip标头中的幻数不正确。请确保传入GZip流。”

    你能告诉我我做错了什么吗?

    编辑:由于还没有答案,我在这里发布我的解压缩代码:

        public static byte[] Decompress_GZip(byte[] gzip)
        {
            using (GZipStream stream = new GZipStream(new MemoryStream(gzip),
                                       CompressionMode.Decompress))
            {
                byte[] buffer = new byte[size];
                using (MemoryStream memory = new MemoryStream())
                {
                    int count = 0;
                    do
                    {
                        count = stream.Read(buffer, 0, size);
                        if(count>0)
                        {
                            memory.Write(buffer, 0, count);
                        }
                    }
                    while (count > 0);
                    return memory.ToArray();
                }
            }
        }
    

    我还想到了什么:结束可能有任何问题吗?也许GZip流不能处理网络字节顺序。

    编辑: 至少我注意到,这个错误只是在收到chunked-messages时才会发生。让我们假设一个分块的消息看起来像这样:

    STATUS-LINE
    HEADER_1 /cr/n
    ...
    HEADER_n /cr/n
    /cr/n
    CHUNK1_SIZE /cr/n
    CHUNK1_DATA /cr/n
    ...
    CHUNKn_SIZE /cr/n
    CHUNKn_DATA /cr/n
    0 /cr/n
    

    这就是我的想法,我要做的就是解压缩消息:

    1. CHUNK1_DATA提取为CHUNKn_DATA(不包含/cr/n且不包含0,最后一个块
    2. Concat CHUNK1_DATA ... CHUNKn_DATAbyte-array
    3. 使用上面的代码解压缩byte-array
    4. 我真的很感激答案。

1 个答案:

答案 0 :(得分:0)

好吧,我只是尝试了自己,它就像我在我的问题中描述的那样有效。如果您对我的代码感兴趣,只需推荐或给我写一条消息。