from wsgiref.simple_server import make_server from signal import * from os import kill, getpid import threading, socket from sys import stdout from time import * try: # Python 3 stdout = stdout.buffer.raw except AttributeError: # Python < 3 pass def app(environ, start_response): start_response("200 OK", []) return [b"3" * int(20e6)] server = make_server("0", 0, app) received = 0 def run_client(): global received sock = socket.create_connection(server.server_address) reader = sock.makefile("rb") try: sock.sendall(b"GET / HTTP/1.0\r\n\r\n") for _ in range(30): line = reader.readline(100) if not line.rstrip(b"\r\n"): break stdout.write("header line {!r}\n".format(line).encode()) chunk = len(reader.read(100)) stdout.write("1st read -> {}\n".format(chunk).encode()) received += chunk sleep(1) kill(getpid(), SIGALRM) sleep(1) chunk = len(reader.read()) stdout.write("2nd read -> {}\n".format(chunk).encode()) received += chunk finally: reader.close() sock.close() def sighandler(signum, frame): stdout.write(b"# signal\n") signal(SIGALRM, sighandler) background = threading.Thread(target=run_client) background.start() try: server.handle_request() finally: background.join() server.server_close() assert received == 20e6