From 1b36386eaef0514da3bd99f0448d556bba116cbd Mon Sep 17 00:00:00 2001 From: Fierelier Date: Tue, 21 Jun 2022 03:30:34 +0200 Subject: [PATCH] Add support for keep-alive (Doesn't work right now, idk why) --- modules/http/helpers.py | 3 + modules/http/main.py | 129 ++++++++++++++++++++------------------- modules/http/settings.py | 4 +- 3 files changed, 73 insertions(+), 63 deletions(-) diff --git a/modules/http/helpers.py b/modules/http/helpers.py index 4859f5d..e990025 100644 --- a/modules/http/helpers.py +++ b/modules/http/helpers.py @@ -114,6 +114,9 @@ def simpleResponse(connection,status,headers = None,content = None,autolength = if content != None and autolength == True: headers["Content-Length"] = str(len(content)) + if allowKeepAlive and not ("Connection" in headers): + headers["Connection"] = "keep-alive" + headers["Keep-Alive"] = "timeout=" +str(timeout) response = 'HTTP/1.1 ' +status+ '\r\n' for header in headers: response += header + ": " +headers[header] + "\r\n" diff --git a/modules/http/main.py b/modules/http/main.py index 376f5e9..745c345 100644 --- a/modules/http/main.py +++ b/modules/http/main.py @@ -12,74 +12,79 @@ pathHandlers = {} global clientLoopIn def clientLoopIn(self): - 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) + 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"]) - if len(rawArgs) > 1: - newPath += "?" +rawArgs[-1] + env["lPath"] = env["pathFixed"].replace("/",os.path.sep) + env["fPath"] = p(indexPath,env["lPath"]) + env["fileExt"] = "." - 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) + 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 - found = False - for file in indexFiles: - if os.path.isfile(p(env["fPath"],file)): - found = file - break + if env["pathFixed"] in pathHandlers: + pathHandlers[env["pathFixed"]](env) + return - if found == False: - env["fileExt"] = ".d" - env["lPath"] = p(env["lPath"],".") - env["fPath"] = p(indexPath,env["lPath"]) + 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: - 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) - return \ No newline at end of file + + 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 \ No newline at end of file diff --git a/modules/http/settings.py b/modules/http/settings.py index 4f83cea..588e3f8 100644 --- a/modules/http/settings.py +++ b/modules/http/settings.py @@ -3,4 +3,6 @@ maxHeaderLength = 4096 global indexPath indexPath = p(sp,"index") global readBufferSize -readBufferSize = 32768 \ No newline at end of file +readBufferSize = 32768 +global allowKeepAlive +allowKeepAlive = False \ No newline at end of file