【问题标题】:How to decode gzip encoded html?如何解码gzip编码的html?
【发布时间】:2011-12-21 22:04:33
【问题描述】:

我从网络服务器获取数据:

data := '
HTTP/1.1 200 OK
Content-Encoding: gzip
Vary: Accept-Encoding
Content-type: text/html
Transfer-Encoding: chunked
Server: Apache

3d5
????????????????????????????????????
????????????????????????????????????
????????????????????????????????????
';

数据大小为:3d5(十六进制) 全部存储到 TIdBytes 变量“数据”中。

如何解码 gziped 数据,更改其中的内容,然后编码回并将长度 3d5 编辑为新的。

【问题讨论】:

    标签: http delphi gzip indy


    【解决方案1】:

    Transfer-Encoding 响应标头设置为 chunked。这意味着服务器以块的形式发送正文数据,其中每个块表示其自己的大小,其中长度为 0 的块表示数据的结尾。 3d5 指的是第一个块的大小。仅当响应中只有 1 块数据时,这将是 HTML 的完整大小。

    TIdHTTP 在内部为您处理分块数据。如果去分块的数据已经被gzip'ped,那么TIdHTTP可以为你解压,前提是你事先给TIdHTTP.Compressor属性分配了一个TIdZLibCompressorBase派生的组件,例如TIdCompressorZLib

    【讨论】:

    • 所以我认为在获得所有块之前无法解码块?
    • 如果HTTP数据存储在内存中,如StringTIdBytes,则可以使用TIdHTTP进行解码。将TIdIOHandlerStream 组件分配给TIdHTTP.IOHandler 属性,给IOHandler 一个从内存读取的TStream(你可以使用Indy 的TIdMemoryBufferStream 类)和一个nil TStream 来写入。然后使用虚假 URL 调用 TIdHTTP 的任何请求方法,例如 Get()。生成的 HTTP 请求将被TIdIOHandlerStream 丢弃,TIdHTTP 将按原样解析TStream 数据。然后你可以对解码后的数据做任何你想做的事情。
    • 一个小例子将不胜感激。不明白这部分“给 IOHandler 一个从内存中读取的 TStream(你可以使用 Indy 的 TIdMemoryBufferStream 类)和一个 nil TStream 来写入。”
    • TIdIOHandlerStream 有一个带有AReceiveStreamASendStream 参数的构造函数,以及一个带有VReceiveStreamVSendStream 参数的OnGetStreams 事件。其中任何一个都可用于向 IOHandler 提供您的数据 TStream 作为 ReceiveStreamnil 作为 SendStream。对于 ReceiveStream,请使用 TIdMemoryBufferStreamTMemoryStreamTBytesStream 或您想用来保存 HTTP 数据的任何其他 TStream 类型。
    • 喜欢吗? ss := TStringStream.Create; ss.Write(data[0], Length(data)); h := TIdIOHandlerStream.Create(Self, ss, nil); IdHTTP1.IOHandler := h; str := IdHTTP1.Get('http://nothing');
    【解决方案2】:

    您可以使用ZlibExGz 单元的GZDecompressStr() 函数解压http gzipped body。只需将数据(与您从 http 响应消息中获取数据的方式完全相同)作为参数传递,它将返回解压缩后的数据。

    uses ZlibExGz;
    
    var s:string;
    
    begin
     // read the gzipped data in "s"
     s:=GZDecompressStr(s);
     // now "s" contains uncompressed data
    end;
    

    【讨论】:

      猜你喜欢
      • 2015-01-17
      • 2011-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-13
      • 2018-02-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多