Я использую API Harvest (http://www.getharvest.com/api). Когда клиент переходит к этой квоте, возвращается ответ 503. В этом ответе должен быть заголовок "Retry-After", который говорит мне, как долго ждать, прежде чем повторять попытку.
Как получить доступ к заголовкам ответов при сбое вызова? Я хватаю исключение HTTPError, но не могу понять, как получить из него заголовки.
Я могу получить тело ответа с exception.read(), но это просто тело без заголовков.
Некоторые соответствующие коды:
try:
request = urllib2.Request( url=self.uri+url, headers=self.headers )
r = urllib2.urlopen(request)
xml = r.read()
return parseString( xml )
except urllib2.HTTPError as err:
logger.debug("EXCEPTION: %s" % err.read() )
Попробуйте следующее:
logger.debug(err.headers)
Это словарь, поэтому используйте err.headers['Retry-After']
(Pdb) pp err.__dict__
{'__iter__': <bound method _fileobject.__iter__ of <socket._fileobject object at 0x2b9a8e923950>>,
'code': 404,
'fileno': <bound method _fileobject.fileno of <socket._fileobject object at 0x2b9a8e923950>>,
'fp': <addinfourl at 47942867504160 whose fp = <socket._fileobject object at 0x2b9a8e923950>>,
'hdrs': <httplib.HTTPMessage instance at 0x2b9a91964a70>,
'headers': <httplib.HTTPMessage instance at 0x2b9a91964a70>,
'msg': 'Not Found',
'next': <bound method _fileobject.next of <socket._fileobject object at 0x2b9a8e923950>>,
'read': <bound method _fileobject.read of <socket._fileobject object at 0x2b9a8e923950>>,
'readline': <bound method _fileobject.readline of <socket._fileobject object at 0x2b9a8e923950>>,
'readlines': <bound method _fileobject.readlines of <socket._fileobject object at 0x2b9a8e923950>>,
'url': 'http://www.heise.de/fo'}
Вся связанная информация об ответе доступна из исключенного пойма.
err.read() возвращает тело, а err.info() возвращает заголовки