Shammer's Philosophy

My private adversaria

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()