def recv_entity(sock, env): if 'HTTP_TRANSFER_ENCODING' in env: if 'CONTENT_LENGTH' in env: raise BadRequestError() if env['HTTP_TRANSFER_ENCODING'].lower() != 'chunked': raise UnimplementedError() return recv_chunked(sock) else: try: clen = int(env.get('CONTENT_LENGTH', 0)) except ValueError: raise BadRequestError() return greennet.recv_bytes(sock, clen)
def recv_chunked(sock): while True: chunk_size = '\r\n' while chunk_size == '\r\n': chunk_size = ''.join( greennet.recv_until_maxlen(sock, '\r\n\r\n', 258, ChunkTooLargeError)) m = http_grammar.chunk_size.match(chunk_size) if not m: raise BadChunkSizeError() chunk_size = int(chunk_size, 16) if chunk_size == 0: break for data in greennet.recv_bytes(sock, chunk_size): yield data raise StopIteration(recv_headers(sock))