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()