2009-04-16 14 views
2

Je fais cela pour aller chercher des données:comment utiliser pycurl si les données demandées sont parfois gzippées, parfois non?

c = pycurl.Curl() 
c.setopt(pycurl.ENCODING, 'gzip') 
c.setopt(pycurl.URL, url) 
c.setopt(pycurl.TIMEOUT, 10) 
c.setopt(pycurl.FOLLOWLOCATION, True) 

xml = StringIO() 

c.setopt(pycurl.WRITEFUNCTION, xml.write) 

c.perform() 
c.close() 

Mes urls sont généralement de ce genre:

http://host/path/to/resource-foo.xml 

Habituellement je reviens 302 pointant vers:

http://archive-host/path/to/resource-foo.xml.gz 

Compte tenu que j'ai mis FOLLOWLOCATION, et ENCODING gzip, tout fonctionne très bien. Le problème est, parfois j'ai une URL qui n'aboutit pas à une redirection vers une ressource gzippée. Lorsque cela se produit, c.perform() jette cette erreur:

pycurl.error: (61, 'Error while processing content unencoding: invalid block type') 

Ce qui me porte à croire que pycurl tente de gunzip une ressource qui ne gzip.

Y a-t-il un moyen de demander à pycurl de comprendre le codage de la réponse, et gunzip ou non, selon le cas? J'ai joué avec l'utilisation de différentes valeurs pour ENCODING, mais jusqu'à présent, aucun haricot.

La documentation de pycurl semble faire un peu défaut. :/

thx!

+1

Le curling automatique n'est-il pas possible? http://stackoverflow.com/a/6711166/582917 – CMCDragonkai

Répondre

5

Si le pire arrive au pire, vous pouvez omettre le encoding 'gzip', mis HTTPHeader à { 'Accept-Encoding': 'gzip'}, check the response headers pour "Content-Encoding: gzip" et si elle est présente, dézipper réponse vous-même.

+0

merci @Piskvor! Je pense que j'ai dû manquer votre réponse ici en '09. – billc