''' Revised from the code segments: http://stackoverflow.com/questions/23264569/python-3-x-basehttpserver-or-http-server and https://wiki.python.org/moin/BaseHttpServer#Official_Documentation Xiannong Meng 2015-09-12 ''' from http.server import BaseHTTPRequestHandler, HTTPServer import urllib import time import os HOST_NAME = "localhost" #HOST_NAME = "brki164-lnx-20" # any real host name where the server is running HOST_PORT = 9000 server_name = "Python Server" class MyServer(BaseHTTPRequestHandler): """ def __init__(self, server_name, port=HOST_PORT): self.server_name = sever_name self.port = port """ def do_HEAD(self): print("in do_HEAD"); okay = self.check_file(self.path) if okay == True: self.send_response(200) # good file else: self.send_response(404) # bad file, we lump all codes for now cont_type = self.check_type(self.path) self.send_header("Server", server_name) self.send_header("Content-Type", cont_type) self.end_headers() def do_GET(self): print("in do_GET"); if (self.path == "/search"): # send form self.send_response(200) length = self.find_file_length("/form.html") self.send_header("Server", server_name) self.send_header("Content-Length", length) self.send_header("Content-Type", "text/html") self.end_headers() self.send_file("/form.html") return okay = self.check_file(self.path) if okay == True: self.send_response(200) # good file cont_type = self.check_type(self.path) length = self.find_file_length(self.path) self.send_header("Server", server_name) self.send_header("Content-Length", length) self.send_header("Content-Type", cont_type) self.end_headers() self.send_file(self.path) else: self.send_response(404) # bad file self.send_header("Server", server_name) bad_request = "

404: page not found

" length = len(bad_request) self.send_header("Content-Length", length) self.send_header("Content-Type", "text/html") self.end_headers() self.wfile.write(bytes(bad_request.encode("utf8"))) # self.send_response(404) # bad file, we lump all codes for now def do_POST(self): length = int(self.headers['Content-Length']) post_data = urllib.parse.parse_qs(self.rfile.read(length).decode('utf-8')) # You now have a dictionary of the post data print("post data: ", post_data) ret_data = self.build_data(post_data) length = len(ret_data) self.send_response(200) # good request self.send_header("Server", server_name) self.send_header("Content-Length", length) self.send_header("Content-Type", "text/html") self.end_headers() # now you have a dictionary of post data self.wfile.write(bytes(ret_data.encode("utf-8"))) # self.wfile.write(bytes("Lorem Ipsum".encode("utf-8"))) def build_data(self, post_data): """ The post_data is in the form of {'key1': ['val1'], 'key2': ['val2'], 'key3': ['val3']} e.g., {'SecondInput': ['zx z'], 'FirstInput': ['124'], 'Submit': ['Submit']} """ ret_str = "" for k in post_data: ret_str = ret_str + "key : " + str(k) + "\ndata : " + str(post_data[k]) + "\n" ret_str = ret_str + "\n" return ret_str def find_file_length(self, path): first = path.find("/") if first != 0: return 0 # now we know the '/' leads the path, remove it path = path[1:] length = os.path.getsize(path) return length def check_file(self, path): """ Check to see if file or path exists. (for now, we only deal with files, need to handle directories """ first = path.find("/") if first != 0: return False # when we handle directory, this needs change # now we know the '/' leads the path, remove it path = path[1:] okay = False try: # r = open(path, encoding = "utf-8") okay = os.path.exists(path) except OSError: pass return okay def send_file(self, path): f = None data = None path = path[1:] try: # f = open(path, encoding = "utf-8") f = open(path, "rb") data = f.read() f.close() # self.wfile.write(bytes(data, "utf-8")) self.wfile.write(bytes(data)) except OSError: pass def check_type(self, path): file_type = "text/html" # default if path.endswith(".jpg") or \ path.endswith(".jpeg"): file_type = "image/jpeg" # jpeg image elif path.endswith(".png"): file_type = "image/png" # png image elif path.endswith(".js"): file_type = "text/javascript" # javascript return file_type if __name__ == '__main__': httpd = HTTPServer((HOST_NAME, HOST_PORT), MyServer) print(time.asctime(), "Server Starts - %s:%s" % (HOST_NAME, HOST_PORT)) try: httpd.serve_forever() except KeyboardInterrupt: pass httpd.server_close() print(time.asctime(), "Server Stops - %s:%s" % (HOST_NAME, HOST_PORT)) ''' myServer = HTTPServer((hostName, hostPort), MyServer) print(time.asctime(), "Server Starts - %s:%s" % (hostName, hostPort)) try: myServer.serve_forever() except KeyboardInterrupt: pass myServer.server_close() print(time.asctime(), "Server Stops - %s:%s" % (hostName, hostPort)) '''