fhttpy/modules/http/main.py

90 lines
2.6 KiB
Python

global email
import email.utils
global fileHandlers
fileHandlers = {}
global indexFiles
indexFiles = []
global pathHandlers
pathHandlers = {}
global clientLoopIn
def clientLoopIn(self):
while True:
env = {}
env["self"] = self
env["requestTime"] = time.time()
env["header"] = getHeaderFromConnection(self.connection)
env["protocolHeaderList"],env["headerList"] = parseHeader(env["header"])
env["cmd"] = env["protocolHeaderList"][0]
env["path"],env["args"] = parseHeaderPath(env["protocolHeaderList"][1])
env["pathFixed"] = fixUserPath(env["path"])
env["lPath"] = env["pathFixed"].replace("/",os.path.sep)
env["fPath"] = p(indexPath,env["lPath"])
env["fileExt"] = "."
if not env["pathFixed"] == "" and not os.path.isfile(env["fPath"]) and os.path.isdir(env["fPath"]) and env["pathFixed"][-1] != "/": env["pathFixed"] += "/" # This is dirty, since it possibly circumvents .fhtpyaccess (You can see if a folder exists or not by probing)
if "/" + env["pathFixed"] != env["path"]:
newPath = "/" + pathToURL(env["pathFixed"])
rawArgs = env["protocolHeaderList"][1].split("?",1)
if len(rawArgs) > 1:
newPath += "?" +rawArgs[-1]
refer(self.connection,newPath)
return
if env["pathFixed"] in pathHandlers:
pathHandlers[env["pathFixed"]](env)
return
if not os.path.isfile(env["fPath"]):
if not os.path.isdir(env["fPath"]):
handle404(env)
return
found = False
for file in indexFiles:
if os.path.isfile(p(env["fPath"],file)):
found = file
break
if found == False:
env["fileExt"] = ".d"
env["lPath"] = p(env["lPath"],".")
env["fPath"] = p(indexPath,env["lPath"])
else:
env["lPath"] = p(env["lPath"],found)
env["fPath"] = p(indexPath,env["lPath"])
lPathSplit = env["lPath"].rsplit(os.path.sep,1)[-1].rsplit(".",1)
if len(lPathSplit) > 1:
env["fileExt"] = lPathSplit[-1].lower()
else:
lPathSplit = env["lPath"].rsplit(os.path.sep,1)[-1].rsplit(".",1)
if len(lPathSplit) > 1:
env["fileExt"] = lPathSplit[-1].lower()
env["fPathDir"] = pUp(env["fPath"])
env["requestTimeFormatted"] = email.utils.formatdate(int(env["requestTime"])).replace("-0000","GMT")
env["handler"] = False
if env["fileExt"] in fileHandlers:
env["handler"] = fileHandlers[env["fileExt"]]
elif ".*" in fileHandlers:
env["handler"] = fileHandlers[".*"]
if triggerEvent("handleHTTP",env) == False: return
if env["handler"]:
env["handler"](env)
else:
handle404(env)
if allowKeepAlive:
if "connection" in env["headerList"] and env["headerList"]["connection"] == "keep-alive":
continue
break