как использовать pycurl, если запрошенные данные иногда сжимаются, а иногда нет?

Я делаю это, чтобы получить некоторые данные:

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

Мои URL-адреса обычно имеют такой вид:

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

Обычно я получаю ответ 302, указывающий на:

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

Учитывая, что я установил FOLLOWLOCATION и ENCODING gzip, все отлично работает.

Проблема в том, что иногда у меня есть URL-адрес, который не приводит к перенаправлению на ресурс, сжатый gzip. Когда это происходит, c.perform() выдает эту ошибку:

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

Что наводит меня на мысль, что pycurl пытается заархивировать ресурс, который не заархивирован.

Есть ли способ, которым я могу поручить pycurl выяснить кодировку ответа, а также gunzip или нет? Я экспериментировал с использованием разных значений для ENCODING, но до сих пор не использовал bean-компоненты.

Документов pycurl, кажется, немного не хватает. :/

Спасибо!


person billc    schedule 16.04.2009    source источник
comment
Разве curl не может автоматически декодировать? stackoverflow.com/a/6711166/582917   -  person CMCDragonkai    schedule 08.03.2014


Ответы (1)


В худшем случае вы можете опустить ENCODING 'gzip', установить для HTTPHEADER значение {'Accept-Encoding': 'gzip'}, проверьте заголовки ответа на наличие "Content-Encoding: gzip" и, если он присутствует, заархивируйте ответ самостоятельно.

person Piskvor left the building    schedule 16.04.2009
comment
спасибо @Piskvor! Я думаю, что я, должно быть, пропустил ваш ответ здесь еще в 2009 году. - person billc; 20.11.2016