Exemplo n.º 1
0
    def parse(self, unreader):
        buf = BufferIO()

        self._get_data(unreader, buf, stop=True)

        # Request line
        idx = buf.getvalue().find(b("\r\n"))
        while idx < 0:
            self._get_data(unreader, buf)
            idx = buf.getvalue().find(b("\r\n"))
        self.parse_request_line(buf.getvalue()[:idx])
        rest = buf.getvalue()[idx + 2:]  # Skip \r\n
        buf.truncate(0)
        buf.seek(0)
        buf.write(rest)

        # Headers
        idx = buf.getvalue().find(b("\r\n\r\n"))
        done = buf.getvalue()[:2] == b("\r\n")
        while idx < 0 and not done:
            self._get_data(unreader, buf)
            idx = buf.getvalue().find(b("\r\n\r\n"))
            done = buf.getvalue()[:2] == b("\r\n")
        if done:
            self.unreader.unread(buf.getvalue()[2:])
            return b("")
        self.headers = self.parse_headers(buf.getvalue()[:idx])

        ret = buf.getvalue()[idx + 4:]
        buf.truncate(0)
        buf.seek(0)
        return ret
Exemplo n.º 2
0
    def parse_chunk_size(self, unreader, data=None):
        buf = BufferIO()
        if data is not None:
            buf.write(data)

        idx = buf.getvalue().find("\r\n")
        while idx < 0:
            self.get_data(unreader, buf)
            idx = buf.getvalue().find("\r\n")

        data = buf.getvalue()
        line, rest_chunk = data[:idx], data[idx + 2:]

        chunk_size = line.split(";", 1)[0].strip()
        try:
            chunk_size = int(chunk_size, 16)
        except ValueError:
            raise ParseError("Invalid chunk size: %r" % chunk_size)

        if chunk_size == 0:
            try:
                self.parse_trailers(unreader, rest_chunk)
            except NoMoreData:
                pass
            return (0, None)
        return (chunk_size, rest_chunk)
Exemplo n.º 3
0
    def parse_trailers(self, unreader, data):
        buf = BufferIO()
        buf.write(data)

        idx = buf.getvalue().find("\r\n\r\n")
        done = buf.getvalue()[:2] == "\r\n"
        while idx < 0 and not done:
            self.get_data(unreader, buf)
            idx = buf.getvalue().find("\r\n\r\n")
            done = buf.getvalue()[:2] == "\r\n"
        if done:
            unreader.unread(buf.getvalue()[2:])
            return ""
        self.req.trailers = self.req.parse_headers(buf.getvalue()[:idx])
        if self.trailer_handler is not None:
            self.trailer_handler(self.req.trailers)
        unreader.unread(buf.getvalue()[idx + 4:])
Exemplo n.º 4
0
    def read(self, size):
        if not isinstance(size, (int, long)):
            raise TypeError("size must be an integral type")

        size = min(self.length, size)
        if size < 0:
            raise ValueError("Size must be positive.")
        if size == 0:
            return ""

        buf = BufferIO()
        data = self.unreader.read()
        while data:
            buf.write(data)
            if buf.tell() >= size:
                break
            data = self.unreader.read()

        buf = buf.getvalue()
        ret, rest = buf[:size], buf[size:]
        self.unreader.unread(rest)
        self.length -= size
        return ret
Exemplo n.º 5
0
 def __init__(self, sock, max_chunk=8192):
     self.sock = sock
     self.max_chunk = max_chunk
     self.buf = BufferIO()
Exemplo n.º 6
0
 def __init__(self, reader):
     self.reader = reader
     self.buf = BufferIO()
     self.pre_read = None
Exemplo n.º 7
0
 def __init__(self, unreader, req):
     self.parser = self.parse_chunked(unreader)
     self.req = req
     self.buf = BufferIO()
     self.trailer_handler = None