#!/usr/bin/env python3

import os, sys, random, http.server, socketserver

if (len(sys.argv) < 2) or (len(sys.argv) > 3):
    print("Usage: %s <directory> [<id>]" % sys.argv[0])
    sys.exit(1)

HTTP_ROOT = sys.argv[1]
HTTP_SERVER = None
LOGFILE_NAME = HTTP_ROOT + "/minihttpd.log"


class MiniHTTPRequestHandler(http.server.SimpleHTTPRequestHandler):
    def send_head(self):
        path = self.translate_path(self.path)
        f = None
        if os.path.isdir(path):
            for index in "index.html", "index.htm":
                index = os.path.join(path, index)
                if os.path.exists(index):
                    path = index
                    break
            else:
                return self.list_directory(path)
        ctype = self.guess_type(path)
        if ctype.startswith("text/"):
            mode = "r"
        else:
            mode = "rb"

        LOGFILE = open(LOGFILE_NAME, "a")
        LOGFILE.write("Incomming HTTP request: " + path + "\n")
        LOGFILE.close()

        try:
            f = open(path, mode)
        except IOError:
            self.send_error(404, "File not found")
            return None
        self.send_response(200)
        self.send_header("Content-type", ctype)
        if os.path.isfile(path):
            self.send_header("Content-Length", str(os.fstat(f.fileno())[6]))
        self.end_headers()
        return f


class ThreadedWebServer(socketserver.ThreadingMixIn, http.server.HTTPServer):
    pass


# create the http server
def create_server():
    global HTTP_SERVER
    port = 0
    while port == 0:
        try:
            port = random.randint(1025, 65535)
            HTTP_SERVER = ThreadedWebServer(("", port), MiniHTTPRequestHandler)
        except:
            port = 0

    # free port was found, print it
    print(port)
    sys.stdout.flush()

# detach process
def daemonize(logfile=LOGFILE_NAME):
    # Fork once
    if os.fork() != 0:
        os._exit(0)
    # Create new session
    os.setsid()
    if os.fork() != 0:
        os._exit(0)
    os.chdir(HTTP_ROOT)
    fd = os.open("/dev/null", os.O_RDWR)
    os.dup2(fd, sys.__stdin__.fileno())
    if logfile != None:
        fake_stdout = open(logfile, "a", 1)
        sys.stdout = fake_stdout
        sys.stderr = fake_stdout
        fd = fake_stdout.fileno()
    os.dup2(fd, sys.__stdout__.fileno())
    os.dup2(fd, sys.__stderr__.fileno())
    if logfile == None:
        os.close(fd)


# init
create_server()
daemonize()

# start the daemon main loop
try:
    HTTP_SERVER.serve_forever()
except:
    print("\n", sys.argv[0], " stopped.")
