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