from socketserver import TCPServer, StreamRequestHandler from threading import Thread from http.client import HTTPConnection from http.client import OK import errno from platform import platform def main(): print("Platform:", platform()) server = TCPServer(("", 0), RequestHandler) thread = Thread(target=server.serve_forever) thread.start() try: demo_request(server, "Normal request", "GET", "/") demo_request(server, "2 MB request", "POST", "/", body=bytes(int(2e6))) finally: server.shutdown() server.server_close() def demo_request(server, desc, *pos, **kw): client = HTTPConnection(*server.server_address) try: client.request("GET", "/drop-connection") response = client.getresponse() assert response.status == OK response.read() try: stage = "request()" client.request(*pos, **kw) stage = "getresponse()" response = client.getresponse() except Exception as exception: code = "" if isinstance(exception, EnvironmentError): code = "; errno=" + errno.errorcode[exception.errno] msg = "{}: {} raised {!r}{}" print(msg.format(desc, stage, exception, code)) else: msg = "{}: Got response: {} {}" print(msg.format(desc, response.status, response.reason)) response.read() finally: client.close() class RequestHandler(StreamRequestHandler): def handle(self): assert self.rfile.readline().startswith(b"GET ") while self.rfile.readline().rstrip(b"\r\n"): pass self.wfile.write( b"HTTP/1.1 200 Dropping connection\r\n" b"Content-Length: 0\r\n" b"\r\n" ) if __name__ == "__main__": main()