Example #1
0
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)
Example #2
0
    def _header_callback(self, bytes):
#        print "****** RECEIVED HEADER"
#        print str(bytes)
        self.response = STRESTResponse()
        self.response.parse_headers(bytes)
        self.read_content()