2016-10-18 2 views
0

TIdHTTPTIdCompressorZLib을 사용하여 gzip 압축이 활성화 된 페이지를 가져 오려고합니다. Windows에서 코드는 올바르게 작동하고 데이터의 압축이 풀립니다. 그러나 OSX에서 똑같은 코드가 아직 압축 된 것처럼 보이는 가비지 데이터를 반환하고 있습니다. 어디서 잘못되었는지 보지 못 하겠어? 이 윈도우에 일반 압축 해제 HTML 인 반면OSX에서 TIdHTTP 및 TIdCompressorZLib와 함께 gzip 압축 풀기 문제가 발생했습니다.

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 실제로를 처리 할 준비가되지 않은 경우에도 압축 된 응답 를 보내도록 확인되는 웹 서버를 이야기하는 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를 설치하고 문제가 계속되는지 확인하십시오 (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을 비워두고이 할당 된 Compressor 압축 된 응답을 처리하기 위해 실제로 준비가 내부적 경우 TIdHTTP 업데이 트를하자 . TIdHTTP.Get() 실패에 예외가 발생하는 경우


BTW, 당신은 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에 소개 된 버그입니다. Uses 목록에'IdZlibHeaders' 유닛을 추가하고 'TIdCompressorZLib' 객체를 생성 한 후에'IdZlibHeaders.Load'라고 불리는데, 이제는 IsReady가 true를 반환하고 gzip 콘텐츠가 압축 해제됩니다. –

+0

예, 원래의 버그는'TIdCompressorZLib'가'IdZLibHeaders.Load()'가 이미 그래서'IsReady'는 단순히'IdZLibHeaders.Loaded()'의 값을 반환했습니다. 수정 프로그램은'IsReady'가 아직 호출되지 않았 으면 대신'Load()'를 호출하도록했습니다. –

+0

Nick C 해결 방법으로도 10.1 베를린에서 해결되었습니다. – Olecramoak