2009-04-16 10 views
2

Ich tue dies einige Daten zu holen:wie pycurl verwenden, wenn angeforderte Daten manchmal gezippt werden, manchmal nicht?

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() 

Mein Urls typisch dieser Art sind:

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

I 302 Normalerweise zurück zeigt auf:

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

Gegeben dass ich FOLLOWLOCATION und ENCODING gzip eingestellt habe, funktioniert alles super.

Das Problem ist, manchmal habe ich eine URL, die nicht zu einer Umleitung auf eine gezippte Ressource führt. Wenn dies geschieht, wirft c.perform() diesen Fehler:

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

Was mir schlägt vor, dass pycurl versucht, eine Ressource gunzip, die nicht im gzip ist.

Gibt es eine Möglichkeit, wie ich pycurl anweisen kann, die Antwortcodierung herauszufinden, und gunzip oder nicht? Ich habe mit verschiedenen Werten für ENCODING herum gespielt, aber bisher keine Bohnen.

Die pycurl docs scheint ein wenig zu fehlen. :/

thx!

+1

Ist es nicht möglich, den Code automatisch zu codieren? http://Stackoverflow.com/a/6711166/582917 – CMCDragonkai

Antwort

5

Im schlimmsten Fall können Sie ENCODING 'gzip' weglassen, HTTPHEADER auf {'Accept-Encoding': 'gzip'}, check the response headers für "Content-Encoding: gzip" setzen und wenn es vorhanden ist, gunzip antworte dir selbst.

+0

danke @Piskvor! Ich glaube, ich muss Ihre Antwort hier im Jahr 2009 verpasst haben. – billc

Verwandte Themen