2011-12-03 11 views
91

Ho scritto uno script bash che viene emesso da un sito Web utilizzando curl e crea un manipolo di manipolazione delle stringhe sull'output html. Il problema è quando lo eseguo contro un sito che sta restituendo il suo output gzippato. Andare al sito in un browser funziona bene.Come gestire correttamente una pagina con gzip quando si utilizza l'arricciatura?

Quando eseguo ricciolo mano, ottengo uscita compresso con gzip:

$ curl "http://example.com" 

Ecco il colpo di testa di quel particolare sito:

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 

So che i dati restituiti è compresso con gzip, perché questo ritorna html , come previsto:

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

non voglio inviare l'output attraverso gunzip, perché il lavoro di script s as-is su altri siti, e il piping attraverso gzip interromperà tale funzionalità.

Quello che ho provato

  1. cambiando l'user-agent (ho provato la stessa stringa il mio browser invia, "Mozilla/4.0", ecc)
  2. uomo arricciare
  3. google search
  4. ricerca StackOverflow

Tutto è venuto a mani vuote

012.351.641,061 mila

Qualche idea?

risposta

181

curl decomprimerà automaticamente la risposta se si imposta il flag --compressed:

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

--compressed (HTTP) Richiesta di una risposta compressa utilizzando uno degli algoritmi libcurl supporti, e salvare il documento non compresso. Se questa opzione viene utilizzata e il server invia una codifica non supportata, arricciatura segnalerà un errore.

gzip è molto probabilmente supportato, ma è possibile controllare questo eseguendo curl -V e alla ricerca di libz da qualche parte nella riga "Funzioni":

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

Nota che è davvero il sito web in questione che è colpa qui. Se curl non ha superato un'intestazione di richiesta Accept-Encoding: gzip, il server non avrebbe dovuto inviare una risposta compressa.

+0

Bello! Funziona come un campione. Grazie. – BryanH

+3

+1 finalmente una ricerca di 4 ore è terminata con --compressa. grazie! – Eugene

+17

Questo sembra essere un bug di curl, perché dovrebbe attivare la sua decodifica in base alla risposta, non su quello che ha richiesto (dato che supporta gzip). Per citare HTTP 1.1: "Se non è presente alcun campo Accept-Encoding in una richiesta, il server PU assume presumere che il client accetterà qualsiasi codifica del contenuto." Ma continua dicendo che i server DOVREBBE in quel caso non codificare il contenuto, hmm, vai a capire. –

Problemi correlati