prosource

컬을 사용할 때 지퍼가 달린 페이지를 적절하게 처리하는 방법

probook 2023. 4. 18. 23:04
반응형

컬을 사용할 때 지퍼가 달린 페이지를 적절하게 처리하는 방법

웹 사이트에서 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이 반환되기 때문에 gzipped임을 알고 있습니다.

$ curl "http://example.com" | gunzip

gunzip을 통한 출력 파이프 접속은 원치 않습니다.다른 사이트에서는 스크립트가 그대로 동작하고 gzip을 통한 파이핑은 해당 기능을 손상시킬 수 있기 때문입니다.

내가 시도한 것

  1. user-agent 변경(브라우저에서 보내는 문자열과 동일한 문자열 "Mozilla/4.0" 등)
  2. 맨컬
  3. 구글 검색
  4. 검색, stackoverflow

모든 것이 빈털터리가 되었다.

좋은 생각 있어요?

curl를 설정하면 응답이 자동으로 압축 해제됩니다.--compressed플래그:

curl --compressed "http://example.com"

--compressed (HTTP) libcurl이 지원하는 알고리즘 중 하나를 사용하여 압축된 응답을 요청하고 압축되지 않은 문서를 저장합니다.이 옵션을 사용하여 서버가 지원되지 않는 인코딩을 전송하면 컬이 오류를 보고합니다.

대부분의 경우 gzip이 지원되지만 실행함으로써 이를 확인할 수 있습니다.curl -V"Features" 행에서 libz를 찾습니다.

$ curl -V
...
Protocols: ...
Features: GSS-Negotiate IDN IPv6 Largefile NTLM SSL libz 

여기서 문제가 있는 것은 문제의 웹 사이트입니다.한다면curl1도 통과하지 못했다Accept-Encoding: gzip서버가 압축 응답을 전송하지 않아야 합니다.

관련 버그 리포트 Raw compressed output when not compressed but server returns gzip data #2836에서 개발자는 다음과 같이 말합니다.

서버는 클라이언트가 허용 가능한 신호를 보내지 않은 상태에서 content-encoding: gzip을 전송해서는 안 됩니다.

또한 --compressed with curl을 사용하지 않을 때는 명령줄 도구에 정확한 스트림을 저장하도록 지시합니다(압축 여부에 관계없이).여기 컬 벌레는 안 보이는데...

따라서 서버가 gzipped 콘텐츠를 전송할 수 있는 경우--compressed컬이 자동으로 압축 해제되도록 합니다.

언급URL : https://stackoverflow.com/questions/8364640/how-to-properly-handle-a-gzipped-page-when-using-curl

반응형