httpserver.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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. ".mk": 'text/plain',
  36. ".yaml": 'text/plain',
  37. ".yml": 'text/plain',
  38. '.text': 'text/plain',
  39. '.log': 'text/plain',
  40. '.csv': 'text/csv',
  41. '.png': 'image/png',
  42. '.jpg': 'image/jpg',
  43. '.svg': 'image/svg+xml',
  44. '.css': 'text/css',
  45. '.pdf': 'application/pdf',
  46. '.js':'application/x-javascript',
  47. '.wasm': 'application/wasm',
  48. '.json': 'application/json',
  49. '.xml': 'application/xml',
  50. '.xls': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
  51. '.xlsx': 'application/vnd.ms-excel'
  52. }
  53. def __init__(self, *args, **kwargs):
  54. super().__init__(*args, directory=httpdirectory, **kwargs)
  55. httpd = http.server.HTTPServer(("", lisport), myHandler)
  56. try:
  57. print("Please open http://%s:%d" % (socket.gethostname(), lisport))
  58. httpd.serve_forever()
  59. except:
  60. print("http server closed!")
  61. pass
  62. sys.exit(0)