[bash] curl을 사용할 때 gzipped 페이지를 올바르게 처리하는 방법은 무엇입니까?
curl을 사용하여 웹 사이트에서 출력을 얻고 html 출력에서 많은 문자열 조작을 수행하는 bash 스크립트를 작성했습니다. 문제는 출력 결과를 반환하는 사이트에 대해 실행할 때입니다. 브라우저에서 사이트로 이동하면 제대로 작동합니다.
손으로 컬을 실행하면 gzipped 출력이 나타납니다.
$ curl "http://example.com"
특정 사이트의 헤더는 다음과 같습니다.
HTTP/1.1 200 OK
Server: nginx
Content-Type: text/html; charset=utf-8
X-Powered-By: PHP/5.2.17
Last-Modified: Sat, 03 Dec 2011 00:07:57 GMT
ETag: "6c38e1154f32dbd9ba211db8ad189b27"
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Cache-Control: must-revalidate
Content-Encoding: gzip
Content-Length: 7796
Date: Sat, 03 Dec 2011 00:46:22 GMT
X-Varnish: 1509870407 1509810501
Age: 504
Via: 1.1 varnish
Connection: keep-alive
X-Cache-Svr: p2137050.pubip.peer1.net
X-Cache: HIT
X-Cache-Hits: 425
예상대로 HTML이 반환되므로 반환 된 데이터가 압축 된 것을 알고 있습니다.
$ curl "http://example.com" | gunzip
스크립트는 다른 사이트에서 그대로 작동하고 gzip을 통한 파이프 연결은 해당 기능을 중단하기 때문에 gunzip을 통해 출력을 파이프하고 싶지 않습니다.
내가 시도한 것
- 사용자 에이전트 변경 (브라우저가 보내는 동일한 문자열, “Mozilla / 4.0″등을 시도했습니다)
- 남자 컬
- 구글 검색
- stackoverflow 검색
모든 것이 비워졌습니다
어떤 아이디어?
답변
curl
--compressed
플래그 를 설정하면 응답이 자동으로 압축 해제됩니다 .
curl --compressed "http://example.com"
–compressed
(HTTP) libcurl이 지원하는 알고리즘 중 하나를 사용하여 압축 된 응답을 요청하고 압축되지 않은 문서를 저장하십시오. 이 옵션을 사용하고 서버에서 지원되지 않는 인코딩을 보내면 curl에서 오류를보고합니다.
gzip이 지원 될 가능성이 가장 높지만 “Features”행에서 libz 를 실행 curl -V
하고 찾아서 이를 확인할 수 있습니다 .
$ curl -V
...
Protocols: ...
Features: GSS-Negotiate IDN IPv6 Largefile NTLM SSL libz
이 사이트는 실제로 문제가있는 웹 사이트입니다. 요청 헤더를 curl
전달하지 않은 경우 Accept-Encoding: gzip
서버는 압축 된 응답을 보내지 않아야합니다.