Multi Thread Infinite KeepAlive Simple HTTP Server with python socket library
This is an update of Infinite KeepAlive Simple HTTP Server with python socket library - Shammerism with conbined the content of Using Python Thread - Shammerism.
#!/usr/bin/env python import argparse import socket import threading from socket import gethostname from time import gmtime, strftime parser = argparse.ArgumentParser() parser.add_argument('-host', dest = 'dest_ip', default = 'localhost') parser.add_argument('-port', dest = 'dest_port', default = '8000') parser.add_argument('-debug', dest = 'debug', default = False) param = vars(parser.parse_args()) listen_addr = param['dest_ip'] listen_port = param['dest_port'] debug = param['debug'] class KeepAliveServer(threading.Thread): def __init__(self, socket): super(KeepAliveServer, self).__init__() self.socket = socket def run(self): request = [] while True: char = self.socket.recv(1) try: if char == '': print 'FIN received from client.' self.socket.close() break byte = ord(char) request.append(byte) if 2 < len(request) and request[-2] == 13 and request[-1] == 10: if request[-4] == 13 and request[-3] == 10: if debug: print '##########' print '#' print '# Finished HTTP REQUEST Header parsing!!!' print '#' print '##########' body = strftime("%b %d %Y %H:%M:%S", gmtime()) + " " + gethostname() + '\n' response = '\r\n'.join([ "HTTP/1.1 200 OK", "Server: SimpleWebServer", "Content-Type: text/plain;charset=UTF-8", "Content-Length: " + str(len(body)), "" ]); response = response + '\r\n' + body self.socket.send(response) except error, e: print 'Closing a client socket because unexpected error happened, ' + e.args[1] self.socket.close() break server = socket.socket(socket.AF_INET) try: print 'Listening on ' + listen_addr + ':' + listen_port server.bind((listen_addr,int(listen_port))) server.listen(1) while True: try: client, addr= server.accept() thread_for_client = KeepAliveServer(client) thread_for_client.start() except socket.error, se: print 'Error : ' + str(se.args[0]) + ':' + se.args[1] finally: server.close()