class StrestResponseReader(object): def __init__(self, asynch_buffer, response_callback): self.response = None self._decompressor = None self.asynch_buffer = asynch_buffer self.asynch_buffer.read_until('\r\n\r\n', self._header_callback) self.respose_callback = response_callback def _header_callback(self, bytes): # print "****** RECEIVED HEADER" # print str(bytes) self.response = STRESTResponse() self.response.parse_headers(bytes) self.read_content() def read_content(self): self._decompressor = None if (self.response.headers.get("Content-Encoding") == "gzip"): # Magic parameter makes zlib module understand gzip header # http://stackoverflow.com/questions/1838699/how-can-i-decompress-a-gzip-stream-with-zlib self._decompressor = zlib.decompressobj(16+zlib.MAX_WBITS) if self.response.headers.get("Transfer-Encoding") == "chunked": raise Exception("CHUNKED ENCODING not supported!") elif "Content-Length" in self.response.headers: num_bytes = int(self.response.headers["Content-Length"]) self.asynch_buffer.read_bytes(num_bytes, self._content_callback) else: raise Exception("No Content-length or chunked encoding, " "don't know how to read") def _content_callback(self, bytes): if self._decompressor : bytes = self._decompressor.decompress(bytes) # print "******* CONTENT" # print str(bytes) self.response.content = bytes self.respose_callback(self.response) self.asynch_buffer.read_until('\r\n\r\n', self._header_callback)
def _header_callback(self, bytes): # print "****** RECEIVED HEADER" # print str(bytes) self.response = STRESTResponse() self.response.parse_headers(bytes) self.read_content()