curl을 사용할 때 gzipped 페이지를 올바르게 처리하는 방법은 무엇입니까?


139

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을 통해 출력을 파이프하고 싶지 않습니다.

내가 시도한 것

  1. 사용자 에이전트 변경 (브라우저가 보내는 동일한 문자열, "Mozilla / 4.0"등을 시도했습니다)
  2. 남자 컬
  3. 구글 검색
  4. stackoverflow 검색

모든 것이 비워졌습니다

어떤 아이디어?


나에게 문제는 cURL이 Brotli ( curl 7.54.0 (x86_64-apple-darwin17.0) libcurl/7.54.0 LibreSSL/2.0.20 zlib/1.2.11 nghttp2/1.24.0)의 압축을 풀 수 없어서 br에서 제거하여 문제를 해결 했다는 것 Accept-Encoding입니다. 참조 stackoverflow.com/questions/18983719/...
니노 Škopac

답변:


260

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서버는 압축 된 응답을 보내지 않아야합니다.


24
이것은 요청이 아닌 응답에 따라 디코딩을 트리거해야하기 때문에 컬 버그 인 것처럼 보입니다 (gzip을 지원한다는 점에서). HTTP 1.1을 인용하려면 : "요청에 Accept-Encoding 필드가 없으면 서버는 클라이언트가 모든 컨텐츠 코딩을 수락한다고 가정 할 수 있습니다." 그러나 서버는 콘텐츠를 인코딩해서는 안된다고 말해야합니다.
George Lund

실제로 내 버전에 --comp --compress --compressed 일
라두 Toader

3
이것은 또한 요청 헤더를 설정합니다 : "Accept-Encoding : deflate, gzip"서버가 gzip을 제공하고 gzip을 제공하지 않는 경우
압축

1 분 안에이 솔루션으로 QA를 도와주세요! 감사합니다 ! 즉, 내 응용 프로그램은 실제로 gzip으로 Content-Encoding으로 gzip 응답을 보냅니다. 브라우저 및 최신 도구 (예 : httpie)가 자동으로 처리합니다. 컬은 단지 "힌트"가 필요하다고 생각합니다.
Faraway

놀랍게도 설정 Accept-Encoding: deflate, gzip이 충분하지 않습니다. 서버가로 gzip 응답을 반환하더라도 Content-Encoding: gzipcurl은 자동으로 압축 해제하지 않습니다. --compressed플래그가 필요합니다.
rjh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.