# Python HTTP Python CGI server # py_cgi_srv.py # my.opera.com/devloop - 09/2010 import time import BaseHTTPServer import os import cgi import urlparse import sys # path to the python interpreter #python_path = "python" python_path = "D:\\Python\\App\\python.exe" # path where your web files are #wwwroot = "/tmp/www" wwwroot = "D:\\www" # Hostname. If empty will use any interfaces HOST_NAME = '' # TCP port number PORT_NUMBER = 8888 # Handler used to manage the HTTP methods class MyHandler(BaseHTTPServer.BaseHTTPRequestHandler): # directory listing def generate_index(s): link = "%s
\n" for x in os.listdir(wwwroot + os.sep + s.path): if os.path.isdir(wwwroot + os.sep + s.path + os.sep + x): s.wfile.write(link % ((x + '/'), x)) else: s.wfile.write(link % (x, x)) # return 404 error code def file_not_found(s): s.send_response(404) s.send_header("Content-type", "text/html") s.end_headers() s.wfile.write("Not found") # process GET requests def do_GET(s): fpath = s.path if s.path.find("?") != -1: fpath = s.path.split("?", 1)[0] os.environ["REQUEST_METHOD"] = "GET" if os.path.isdir(wwwroot + os.sep + fpath): if not fpath.endswith('/'): s.send_response(301) s.send_header("Location", fpath + '/') s.end_headers() return else: s.send_response(200) s.send_header("Content-type", "text/html") s.end_headers() s.generate_index() elif os.path.isfile(wwwroot + os.sep + fpath): s.process_request() else: s.file_not_found() # process HEAD requests def do_HEAD(s): s.send_response(200) s.send_header("Content-type", "text/html") s.end_headers() # do the main job def process_request(s): qs = "" fpath = s.path if s.path.find("?") != -1: fpath , qs = s.path.split("?", 1) s.send_response(200) s.send_header("Content-type", "text/html") s.end_headers() # Fill the environment variables if s.headers.get("user-agent") != None: os.environ["HTTP_USER_AGENT"] = s.headers.get("user-agent") if s.headers.get("referer") != None: os.environ["HTTP_REFERER"] = s.headers.get("referer") if s.headers.get("content-type") != None: os.environ["CONTENT_TYPE"] = s.headers.get("content-type") if os.environ["CONTENT_TYPE"] == "application/x-www-form-urlencoded": if s.headers.get("content-length") != None: os.environ["CONTENT_LENGTH"] = s.headers.get("content-length") if os.environ["CONTENT_LENGTH"].isdigit(): qs = s.rfile.read(int(os.environ["CONTENT_LENGTH"])) os.environ["SCRIPT_NAME"] = fpath os.environ["QUERY_STRING"] = qs ext = "" if fpath.find(".") != -1: ext = fpath.rsplit(".", 1)[1] sys.stderr = sys.stdout # If it's a python file, execute it if ext == "py": if os.path.isfile(wwwroot + os.sep + fpath): cmd = python_path + " " + wwwroot + os.sep + fpath s.wfile.write(os.popen(cmd).read()) # else just dump the content else: if os.path.isfile(wwwroot + os.sep + fpath): s.wfile.write(open(wwwroot + os.sep + fpath, 'r').read()) # process POST requests def do_POST(s): os.environ["REQUEST_METHOD"] = "POST" s.process_request() # main loop if __name__ == '__main__': print "Python HTTP CGI server - devloop" server_class = BaseHTTPServer.HTTPServer httpd = server_class((HOST_NAME, PORT_NUMBER), MyHandler) print time.asctime(), "Server Starts - %s:%s" % (HOST_NAME, PORT_NUMBER) try: httpd.serve_forever() except KeyboardInterrupt: pass httpd.server_close() print time.asctime(), "Server Stops - %s:%s" % (HOST_NAME, PORT_NUMBER)