BaseHTTPServer blocks while waiting for a connection. This means that a script will not respond to anything until it receives a network connection, which may never come. By adding a timeout to the listening socket, the script will regain control every so often.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
import socket import BaseHTTPServer class Server(BaseHTTPServer.HTTPServer): """HTTPServer class with timeout.""" def get_request(self): """Get the request and client address from the socket.""" # 10 second timeout self.socket.settimeout(10.0) result = None while result is None: try: result = self.socket.accept() except socket.timeout: pass # Reset timeout on the new socket result.settimeout(None) return result if __name__ == '__main__': from SimpleHTTPServer import SimpleHTTPRequestHandler server = Server(('', 80), SimpleHTTPRequestHandler) server.serve_forever()
I use a small http server like this to quickly transfer files between computers without all the overhead of more advanced filesharing programs.
After starting a BaseHTTPServer with serve_forever(), I cannot use a KeyboardInterrupt to quit the server, unless I request another page. With a timeout I may only have to wait up to 10 seconds.
The timeout on the new socket must be reset, because the request handlers use socket operations that do not work on a non-blocking socket.