コード例 #1
0
 def _parse_headers(self, data):
     data = native_str(data.decode('latin1'))
     eol = data.find("\r\n")
     start_line = data[:eol]
     try:
         headers = httputil.HTTPHeaders.parse(data[eol:])
     except ValueError:
         # probably form split() if there was no ':' in the line
         raise httputil.HTTPInputException("Malformed HTTP headers: %r" %
                                           data[eol:100])
     return start_line, headers
コード例 #2
0
 def _read_body(self, headers, delegate):
     content_length = headers.get("Content-Length")
     if content_length:
         content_length = int(content_length)
         if content_length > self._max_body_size:
             raise httputil.HTTPInputException("Content-Length too long")
         return self._read_fixed_body(content_length, delegate)
     if headers.get("Transfer-Encoding") == "chunked":
         return self._read_chunked_body(delegate)
     if self.is_client:
         return self._read_body_until_close(delegate)
     return None
コード例 #3
0
 def _read_chunked_body(self, delegate):
     # TODO: "chunk extensions" http://tools.ietf.org/html/rfc2616#section-3.6.1
     total_size = 0
     while True:
         chunk_len = yield self.stream.read_until(b"\r\n", max_bytes=64)
         chunk_len = int(chunk_len.strip(), 16)
         if chunk_len == 0:
             return
         total_size += chunk_len
         if total_size > self._max_body_size:
             raise httputil.HTTPInputException("chunked body too large")
         bytes_to_read = chunk_len
         while bytes_to_read:
             chunk = yield self.stream.read_bytes(min(
                 bytes_to_read, self.params.chunk_size),
                                                  partial=True)
             bytes_to_read -= len(chunk)
             if not self._write_finished or self.is_client:
                 yield gen.maybe_future(delegate.data_received(chunk))
         # chunk ends with \r\n
         crlf = yield self.stream.read_bytes(2)
         assert crlf == b"\r\n"