[Twisted-web] Gzipped Response with web.client.Agent
Vokdin Sergei
sergei.vokdin at yandex.ru
Mon Aug 9 07:34:34 EDT 2010
Hello,
I've putted together examples from the web (see below) to replace getPage with web.client.Agent and it works fine. Now, I'd like to get gzipped response, but I can't get gunzipping to work before returning result.
Thanks for help!
class StringGzipReceiver(Protocol):
def __init__(self):
self.string = None
self.deferred = defer.Deferred()
def dataReceived(self, bytes):
print "dataReceived"
print type(bytes)
if self.string:
self.string += bytes
else:
self.string = bytes
def connectionLost(self, reason):
if reason.check(ResponseDone) or reason.check(PotentialDataLoss):
gzipper = gzip.GzipFile(fileobj=self.string)
gz = gzipper.read()
result = unicode(gz, 'UTF-8')
self.deferred.callback(result)
else:
self.deferred.errback(reason)
class StringReceiver(Protocol):
def __init__(self):
self.string_io = codecs.getwriter('utf_8')(StringIO())
self.deferred = defer.Deferred()
def dataReceived(self, bytes):
self.string_io.write(bytes)
def connectionLost(self, reason):
if reason.check(ResponseDone) or reason.check(PotentialDataLoss):
self.deferred.callback(self.string_io.getvalue())
else:
self.deferred.errback(reason)
class StringProducer(object):
implements(IBodyProducer)
def __init__(self, body):
self.body = body
self.length = len(body)
def startProducing(self, consumer):
consumer.write(self.body)
return succeed(None)
def pauseProducing(self):
pass
def stopProducing(self):
pass
def SearchHotelsByID():
host = 'demo.com'
postdata = 'some data'
headers = {
'Host' : [host],
'Accept-Encoding' : ['gzip']
}
def cbRequest(response):
stringReceiver = StringGzipReceiver()
response.deliverBody(stringReceiver)
return stringReceiver.deferred
def _noPage(failure):
print "Error: %s" % failure.getErrorMessage()
print failure.getTraceback()
return failure
agent = Agent(reactor)
d = agent.request(
'POST',
url,
headers=Headers(headers),
bodyProducer=StringProducer(postdata)
)
d.addCallback(cbRequest)
d.addErrback(_noPage)
d.addBoth(finish)
return d
More information about the Twisted-web
mailing list