Jeff Gilbert | ecdb40d | 2019-02-14 15:40:15 -0800 | [diff] [blame] | 1 | #! /usr/bin/env python3 |
| 2 | |
| 3 | # Invoke http.server to host a basic webserver on localhost /without/ caching. |
| 4 | # Files served by http.server are usually cached by browsers, which makes testing and debugging |
| 5 | # buggy. |
| 6 | |
| 7 | import http.server |
| 8 | import os |
| 9 | |
| 10 | from functools import partial |
| 11 | |
| 12 | |
| 13 | class NoCacheRequestHandler(http.server.SimpleHTTPRequestHandler): |
| 14 | def end_headers(self): |
| 15 | self.send_header("Cache-Control", "no-cache, no-store, must-revalidate") |
| 16 | self.send_header("Pragma", "no-cache") |
| 17 | self.send_header("Expires", "0") |
| 18 | super().end_headers() |
| 19 | |
| 20 | |
| 21 | if __name__ == '__main__': |
| 22 | import argparse |
| 23 | |
| 24 | parser = argparse.ArgumentParser() |
| 25 | parser.add_argument('--bind', '-b', default='localhost', metavar='ADDRESS', |
| 26 | help='Specify alternate bind address ' |
Dean Jackson | 57cf95a | 2019-12-06 05:33:00 +1100 | [diff] [blame] | 27 | '[default: localhost - pass \'\' if you want to serve remote clients]') |
Jeff Gilbert | ecdb40d | 2019-02-14 15:40:15 -0800 | [diff] [blame] | 28 | parser.add_argument('--directory', '-d', default=os.getcwd(), |
| 29 | help='Specify alternative directory ' |
| 30 | '[default:current directory]') |
| 31 | parser.add_argument('port', action='store', |
| 32 | default=8000, type=int, |
| 33 | nargs='?', |
| 34 | help='Specify alternate port [default: 8000]') |
| 35 | args = parser.parse_args() |
| 36 | |
| 37 | handler_class = partial(NoCacheRequestHandler, directory=args.directory) |
Jeff Gilbert | 04f9d7f | 2020-11-13 16:51:34 -0800 | [diff] [blame] | 38 | |
| 39 | server = http.server.ThreadingHTTPServer((args.bind, args.port), handler_class) |
| 40 | print('Serving ThreadingHTTPServer for', args, '...') |
| 41 | server.serve_forever() |