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
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)
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:])
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
def __init__(self, sock, max_chunk=8192): self.sock = sock self.max_chunk = max_chunk self.buf = BufferIO()
def __init__(self, reader): self.reader = reader self.buf = BufferIO() self.pre_read = None
def __init__(self, unreader, req): self.parser = self.parse_chunked(unreader) self.req = req self.buf = BufferIO() self.trailer_handler = None