import os
import sys
from socketserver import ThreadingTCPServer, StreamRequestHandler
class GopherHandler(StreamRequestHandler):
def handle(self):
request = self.rfile.readline().strip().decode('utf-8')
path = self.server.root + '/' + request.lstrip('/')
print('{}: {} => {}'.format(self.client_address[0], request, path))
if os.path.isfile(path):
with open(path, 'rb') as resource:
self.wfile.write(resource.read())
elif os.path.isdir(path):
if os.path.isfile(path + '/index.gph'):
with open(path + '/index.gph', 'rb') as resource:
self.wfile.write(resource.read())
else:
response = ''
for item in os.listdir(path):
if os.path.isdir(os.path.join(path, item)):
response += '1{1}\t{0}/{1}\t{2}\t{3}\r\n'.format(request, item, self.server.hostname, self.server.server_address[1])
else:
response += '0{1}\t{0}/{1}\t{2}\t{3}\r\n'.format(request, item, self.server.hostname, self.server.server_address[1])
self.wfile.write(response.encode('utf-8'))
self.wfile.write(b'.\r\n')
else:
self.wfile.write(b'3Not found\t\tlocalhost\t7000\r\n.\r\n')
class GopherServer(ThreadingTCPServer):
allow_reuse_address = True
def __init__(self, host, port, root, hostname=None):
super().__init__((host, port), GopherHandler)
self.root = root
self.hostname = host if hostname is None else hostname
if __name__ == '__main__':
args = sys.argv[1:]
host = '127.0.0.1'
name = None
port = 7000
root = '.'
while len(args) > 0:
option = args.pop(0)
if option == '-h':
host = args.pop(0)
elif option == '-n':
name = args.pop(0)
elif option == '-p':
port = int(args.pop(0))
elif option == '-d':
root = args.pop(0)
with GopherServer(host, port, root, name) as server:
server.serve_forever()