Example #1
0
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)
Example #2
0
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))