2016-10-18 34 views
0

TIdHTTPTIdCompressorZLibを使用して、gzip圧縮を有効にしたページを取得しようとしています。 Windowsでは、コードは正常に動作し、データは解凍されます。しかし、OSX上の全く同じコードはまだ圧縮されているようなガベージデータを返す。どこが間違っているのか分かりません。OSXでTIdHTTPとTIdCompressorZLibを使ってgzipを解凍する問題

これは私がテストしていたコードされています。それはWindows上で、プレーン、解凍HTMLである一方、

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上の元の圧縮されたゴミのように見えます。

私はDelphi 10.1 Berlin Update 1とOSX 10.11を使用しています。

答えて

1

あなたはTIdCompressorZLibが実際にそれを処理する準備ができていない場合でも、圧縮された応答を送信するために、それはOKであるWebサーバに伝えるためにTIdHTTP.Request.AcceptEncodingプロパティを設定手動です。あなたの場合、TIdCompressorZLib.IsReadyプロパティはOSXではFalseを、WindowsではTrueを報告する可能性があります。

2016年1月、ZLibが初めて使用されたときにZLibライブラリを動的にロードするようにIndyが更新されました(SVN rev 5330)。この変更により、TIdCompressorZLibが壊れましたが、これは後で2016年2月に修正されました(SVN rev 5343)。その修正がベルリンにあるかどうかわかりません。最新のSVN revをインストールして、問題が継続するかどうかを確認してください(instructionsおよびdownload)。

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は空白のままにして、割り当てられCompressorが圧縮された応答を処理するために、実際に準備ができている内部場合TIdHTTP更新してみましょう。 TIdHTTP.Get()が失敗した場合に例外が発生した場合


ところで、あなたはTIdHTTPTIdCompressorZLibオブジェクトをリークしています。 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); 
+1

ありがとうございました。 'IsReady'プロパティがfalseを返すということは間違いありません。これはzlibライブラリがまったく読み込まれていないように見えるので、いくつかのhttpリクエストの後では常にfalseを返します。これはJan-2016 SVN rev 5330で導入されたバグです。私は 'IdZlibHeaders'ユニットをUsesリストに追加しました。 'TIdCompressorZLib'オブジェクトを作成した後に' IdZlibHeaders.Load'と呼ばれ、 'IsReady'がtrueを返し、gzipの内容が解凍されています –

+0

はい、元のバグは' TIdCompressorZLib'がIdZLibHeaders.Load() 'IsReady'は単に' IdZLibHeaders.Loaded() 'から値を返しただけです。修正は 'IsReady'がまだ呼び出されていない場合に備えて、' Load() 'を代わりに呼び出すことでした。 –

+0

Nick Cの回避策も、10.1 Berlinで私のために修正しました。 – Olecramoak

関連する問題