как использовать pycurl, если запрашиваемые данные иногда отправляются, а иногда нет? - PullRequest
2 голосов
/ 17 апреля 2009

Я делаю это для получения некоторых данных:

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, который не приводит к перенаправлению на сжатый ресурс. Когда это происходит, c.perform() выдает эту ошибку:

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

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

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

Документы Pycurl, похоже, немного не хватает. : /

ТНХ!

1 Ответ

5 голосов
/ 17 апреля 2009

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

...