Example #1
0
    def parse_chunked_payload(self, out, buf):
        """Chunked transfer encoding parser."""
        try:
            while True:
                # read next chunk size
                line = yield from buf.readuntil(b'\r\n', 8196)

                i = line.find(b';')
                if i >= 0:
                    line = line[:i]  # strip chunk-extensions
                else:
                    line = line.strip()
                try:
                    size = int(line, 16)
                except ValueError:
                    raise errors.IncompleteRead(b'') from None

                if size == 0:  # eof marker
                    break

                # read chunk and feed buffer
                while size:
                    chunk = yield from buf.readsome(size)
                    out.feed_data(chunk)
                    size = size - len(chunk)

                # toss the CRLF at the end of the chunk
                yield from buf.skip(2)

            # read and discard trailer up to the CRLF terminator
            yield from buf.skipuntil(b'\r\n')

        except aiohttp.EofStream:
            raise errors.IncompleteRead(b'') from None
Example #2
0
    def feed_data(self, chunk):
        try:
            chunk = self.zlib.decompress(chunk)
        except Exception:
            raise errors.IncompleteRead(0) from None

        if chunk:
            self.out.feed_data(chunk)
Example #3
0
 def parse_length_payload(self, out, buf, length):
     """Read specified amount of bytes."""
     try:
         while length:
             chunk = yield from buf.readsome(length)
             out.feed_data(chunk)
             length -= len(chunk)
     except aiohttp.EofStream:
         raise errors.IncompleteRead(b'') from None
Example #4
0
 def parse_length_payload(self, out, buf, length=0):
     """Read specified amount of bytes."""
     required = length
     try:
         while required:
             chunk = yield from buf.readsome(required)
             out.feed_data(chunk)
             required -= len(chunk)
     except aiohttp.EofStream:
         raise errors.IncompleteRead(length - required, required)
Example #5
0
    def feed_eof(self):
        self.out.feed_data(self.zlib.flush())
        if not self.zlib.eof:
            raise errors.IncompleteRead(0)

        self.out.feed_eof()