www :: mechanize로 GZIP 인코딩 된 콘텐츠를 투명하게 처리합니다
-
22-08-2019 - |
문제
나는 www :: mechanize를 사용하고 있으며 현재 'HTTP 응답을'Content-Encoding: gzip
'응답 헤더를 먼저 확인한 다음 io :: uncompress :: gunzip을 사용하여 압축되지 않은 컨텐츠를 얻음으로써 내 코드의 헤더.
그러나 www :: mechanize worm (), links () 등과 같은 메소드가 작동하고 압축되지 않은 컨텐츠를 구문 분석하도록 투명 하게이 작업을 수행하고 싶습니다. www :: mechanize는 lwp :: useragent의 하위 클래스이므로 lwp :: ua :: 핸들러 이것을하기 위해.
나는 부분적으로 성공했지만 (예를 들어 압축되지 않은 콘텐츠를 인쇄 할 수 있음) 전화 할 수있는 방식으로 투명하게 할 수 없습니다.
$mech->forms();
요약 : $ mech 오브젝트 내부의 내용을 어떻게 "교체"하여 해당 시점에서 모든 www :: Mechanize 메소드가 컨텐츠 인코딩이 발생하지 않는 것처럼 작동합니까?
나는 당신의 관심과 도움에 감사드립니다. 감사
해결책
www :: mechanize :: gzip, 제 생각에는.
다른 팁
$ res-> content ($ bytes) 멤버를 사용하여 대체 할 수있는 것처럼 보입니다.
그건 그렇고, 나는 lwp :: useragent의 출처를보고 http :: 응답을 통해이 것들을 찾았습니다. http :: 메시지.
그것은 userAgent와 함께 내장되어 기계화됩니다. 하나의 주요 경고 머리카락을 구하기 위해
-디버그하려면 오류를 확인하십시오 $@ decoded_content 호출 후.
$html = $r->decoded_content;
die $@ if $@;
더 나은 것은 http :: 메시지의 출처를 살펴보고 모든 지원 패키지가 있는지 확인하십시오.
제 경우에는 Decoded_Content가 undef를 반환했지만 콘텐츠는 Raw Binary이고 야생 거위 추격을했습니다. UserAgent는 디코딩 실패시 에러 플래그를 설정하지만 Mechanize는이를 무시합니다 (발생률을 자체 오류/경고로 점검하거나 기록하지 않음).
내 경우 $@ sez : "io/html.pm을 찾을 수 없습니다 .. 그것은 평가되었습니다.
소스로 뛰어 들면 내장 디코딩 프로세스가 길고 세심하며 힘든 일이라는 것을 알게되며 거의 모든 시나리오를 다루고 많은 추측을합니다 (감사합니다!).
편집증 인 경우 New ()의 모든 요청과 함께 사용할 기본 헤더를 명시 적으로 설정하십시오.
$browser = new WWW::Mechanize('default_headers' => HTTP::Headers->new('Accept-Encoding'
=> scalar HTTP::Message::decodable()));