使用TIdHTTP和TIdCompressorZLib在OSX上进行gzip解压缩问题

时间:2016-10-18 05:10:04

标签: delphi indy delphi-10.1-berlin

我尝试使用TIdHTTPTIdCompressorZLib获取启用了gzip压缩的页面。 在Windows上,代码工作正常,数据解压缩。但OSX上完全相同的代码返回的垃圾数据看起来仍然是压缩的。我无法真正看出它出了什么问题?

这是我测试的代码:

with TIdHTTP.Create(nil) do begin
  HandleRedirects := true;
  Compressor := TIdCompressorZLib.Create(nil);
  Request.AcceptEncoding := 'gzip, deflate';
  Data := Get('http://google.com.au');
  Compressor.Free;
  Free;
  WriteLn(Data);
end;

Data看起来像OSX上的原始压缩垃圾,而它是Windows上的普通解压缩HTML。

我正在使用Delphi 10.1 Berlin Update 1和OSX 10.11。

1 个答案:

答案 0 :(得分:1)

手动设置TIdHTTP.Request.AcceptEncoding属性,告诉网络服务器发送压缩响应即使TIdCompressorZLib实际上尚未准备好处理也可以它即可。在您的情况下,TIdCompressorZLib.IsReady属性可能在OSX上报告为False,在Windows上报告为True。

2016年1月,Indy更新为在第一次使用ZLib时按需动态加载ZLib库(SVN rev 5330)。这一变化打破了TIdCompressorZLib,后来于2016年2月修订(SVN rev 5343)。我不知道这个修复是否在柏林。尝试安装最新的SVN rev并查看问题是否仍然存在(instructionsdownload)。

使用TIdHTTP.Compressor属性时,不要手动设置Request.AcceptEncoding属性:

with TIdHTTP.Create(nil) do begin
  HandleRedirects := true;
  Compressor := TIdCompressorZLib.Create(nil);
  // Request.AcceptEncoding := 'gzip, deflate'; // <-- here
  Data := Get('http://google.com.au');
  Compressor.Free;
  Free;
  WriteLn(Data);
end;

Request.AcceptEncoding留空,如果指定的TIdHTTP实际上已准备好处理压缩响应,请让Compressor在内部更新。

顺便说一句,如果TIdHTTP在失败时引发异常,则会泄露TIdCompressorZLibTIdHTTP.Get()个对象。您应该使用try/finally块:

with TIdHTTP.Create(nil) do
try
  HandleRedirects := true;
  Compressor := TIdCompressorZLib.Create(nil);
  try
    // Request.AcceptEncoding := 'gzip, deflate';
    Data := Get('http://google.com.au');
  finally
    Compressor.Free;
  end;
finally
  Free;
end;
WriteLn(Data);