import os
from wptserve import pipes

def run_other(request, response, path):
    #This is a terrible hack
    environ = {"__file__": path}
    execfile(path, environ, environ)
    rv = environ["main"](request, response)
    return rv

def main(request, response):
    origin = request.GET.first("origin", request.headers["origin"])
    credentials = request.GET.first("credentials", "true")

    response.headers.update([("Access-Control-Allow-Origin", origin),
                             ("Access-Control-Allow-Credentials", credentials)])

    handler = request.GET.first('run')
    if handler in ["status-reconnect",
                   "message",
                   "redirect",
                   "cache-control"]:
        if handler == "cache-control":
            response.headers.set("Content-Type", "text/event-stream")
            rv = open(os.path.join(request.doc_root, "eventsource", "resources", "cache-control.event_stream")).read()
            response.content = rv
            pipes.sub(request, response)
            return
        elif handler == "redirect":
            return run_other(request, response, os.path.join(request.doc_root, "common", "redirect.py"))
        else:
            return run_other(request, response, os.path.join(os.path.split(__file__)[0], handler + ".py"))
    else:
        return
