httpserver.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #!/bin/env python3
  2. import os
  3. import sys
  4. import argparse
  5. import random
  6. import http.server
  7. import socket
  8. if __name__ == '__main__':
  9. parser = argparse.ArgumentParser(description="Open http server on selected directory")
  10. parser.add_argument('--directory', '-d', default=os.getcwd(),
  11. help='specify alternate directory (default: current directory)')
  12. parser.add_argument('--port', help="port to listen to, default random port")
  13. args = parser.parse_args()
  14. lisport = random.randint(10000, 65000)
  15. httpdirectory = args.directory
  16. if os.path.isdir(args.directory) == False:
  17. print("ERROR: Directory %s not exist, please check!" % (args.directory))
  18. sys.exit(1)
  19. print("HTTP Served for directory %s" % (httpdirectory))
  20. if args.port:
  21. lisport = int(args.port)
  22. print("Listen to port %d(specified by --port)" % (lisport))
  23. else:
  24. print("Listen to port %d(random generated)" % (lisport))
  25. # changed based on https://docs.python.org/3/library/http.server.html
  26. class myHandler(http.server.SimpleHTTPRequestHandler):
  27. # https://gist.github.com/scottj/a510d6bd96941901fb99554566ee226d
  28. extensions_map = {
  29. '': 'application/octet-stream',
  30. '.manifest': 'text/cache-manifest',
  31. '.html': 'text/html',
  32. '.txt': 'text/plain',
  33. '.rst': 'text/plain',
  34. '.md': 'text/plain',
  35. '.map': 'text/plain',
  36. ".mk": 'text/plain',
  37. ".yaml": 'text/plain',
  38. ".yml": 'text/plain',
  39. '.text': 'text/plain',
  40. '.log': 'text/plain',
  41. '.csv': 'text/plain',
  42. '.png': 'image/png',
  43. '.jpg': 'image/jpg',
  44. '.svg': 'image/svg+xml',
  45. '.css': 'text/css',
  46. '.pdf': 'application/pdf',
  47. '.js':'application/x-javascript',
  48. '.wasm': 'application/wasm',
  49. '.json': 'application/json',
  50. '.xml': 'application/xml',
  51. '.xls': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
  52. '.xlsx': 'application/vnd.ms-excel'
  53. }
  54. def __init__(self, *args, **kwargs):
  55. super().__init__(*args, directory=httpdirectory, **kwargs)
  56. httpd = http.server.HTTPServer(("", lisport), myHandler)
  57. try:
  58. print("Please open http://%s:%d" % (socket.gethostname(), lisport))
  59. httpd.serve_forever()
  60. except:
  61. print("http server closed!")
  62. pass
  63. sys.exit(0)