Compare commits
4 Commits
c194b01731
...
d35296ef16
Author | SHA1 | Date |
---|---|---|
randomuser | d35296ef16 | |
randomuser | b3a665448a | |
randomuser | c9f0dce189 | |
randomuser | 08588b967f |
46
esgd.py
46
esgd.py
|
@ -1,9 +1,7 @@
|
|||
import socketserver
|
||||
import subprocess
|
||||
import os
|
||||
|
||||
host = "localhost"
|
||||
port = 77
|
||||
import time
|
||||
|
||||
class GopherError(BaseException): pass
|
||||
class RequestError(GopherError): pass
|
||||
|
@ -42,6 +40,7 @@ class GopherLine:
|
|||
try: self.port = split[3]
|
||||
except IndexError:
|
||||
if location == True: self.port = str(port)
|
||||
|
||||
def render(self):
|
||||
return "{}{}\t{}\t{}\t{}".format(
|
||||
self.item,
|
||||
|
@ -51,6 +50,31 @@ class GopherLine:
|
|||
self.port
|
||||
)
|
||||
|
||||
class Logger:
|
||||
def __init__(self, file=None):
|
||||
if file != None: self.fd = open(file, "a+")
|
||||
else: self.fd = False
|
||||
def time(self):
|
||||
return int(time.time())
|
||||
def write(self, msg):
|
||||
if self.fd: self.fd.write("{}\n")
|
||||
def log(self, msg):
|
||||
ct = self.time()
|
||||
self.write("[{}] {}".format(str(ct), msg))
|
||||
print("[{}] {}".format(str(ct), msg))
|
||||
def warn(self, msg):
|
||||
ct = self.time()
|
||||
self.write("! [{}] {}".format(str(ct), msg))
|
||||
print("! [{}] {}".format(str(ct), msg))
|
||||
def error(self, msg):
|
||||
ct = self.time()
|
||||
self.write("!! [{}] {}".format(str(ct), msg))
|
||||
print("!! [{}] {}".format(str(ct), msg))
|
||||
self.close()
|
||||
raise SystemExit
|
||||
def close(self):
|
||||
self.fd.close()
|
||||
|
||||
class GopherServerLogic:
|
||||
def recieveRequest(self):
|
||||
data = b""
|
||||
|
@ -97,10 +121,10 @@ class GopherServerLogic:
|
|||
fd.close()
|
||||
return ret
|
||||
|
||||
def sendFileArray(self, arr):
|
||||
def sendFileArray(self, fileArray):
|
||||
[self.request.sendall(
|
||||
(i.rstrip() + "\r\n").encode("utf-8")
|
||||
) for i in arr]
|
||||
) for i in fileArray]
|
||||
self.request.sendall(b".\r\n")
|
||||
|
||||
def cgi(self, file, query):
|
||||
|
@ -135,6 +159,7 @@ class GopherServerLogic:
|
|||
if self.fileCGI(file): fa = self.cgi(file, query)
|
||||
elif self.fileSendable(file): fa = self.fileToFileArray(file)
|
||||
else:
|
||||
log.log("selector not found")
|
||||
self.notFound()
|
||||
return
|
||||
if gph: fa = self.gopherRenderer(fa)
|
||||
|
@ -142,19 +167,26 @@ class GopherServerLogic:
|
|||
|
||||
class GopherHandler(socketserver.BaseRequestHandler, GopherServerLogic):
|
||||
def handle(self):
|
||||
log.log("request from {}".format(self.client_address[0]))
|
||||
decoded = self.recieveRequest()
|
||||
try:
|
||||
parsed = self.requestParser(decoded)
|
||||
try: parsed = self.requestParser(decoded)
|
||||
except RequestError:
|
||||
log.log("request was invalid")
|
||||
self.invalid()
|
||||
return
|
||||
|
||||
try: file = self.returnRelative(parsed[0])
|
||||
except RequestError:
|
||||
log.log("selector not found")
|
||||
self.notFound()
|
||||
return
|
||||
log.log("serving {}".format(file[0]))
|
||||
self.serveFile(file[0], parsed[1], file[1])
|
||||
|
||||
log = Logger()
|
||||
host = "localhost"
|
||||
port = 77
|
||||
|
||||
if __name__ == "__main__":
|
||||
with socketserver.TCPServer((host, port), GopherHandler) as server:
|
||||
server.serve_forever()
|
||||
|
|
Loading…
Reference in New Issue