Repository navigation
Expand file tree
/
Copy pathserve.py
More file actions
59 lines (47 loc) · 1.93 KB
/
Copy pathserve.py
File metadata and controls
59 lines (47 loc) · 1.93 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
from http.server import SimpleHTTPRequestHandler, ThreadingHTTPServer
from pathlib import Path
import argparse
import json
class NoCacheHandler(SimpleHTTPRequestHandler):
def do_POST(self):
if self.path != "/__log":
self.send_error(404, "Not Found")
return
length = int(self.headers.get("Content-Length", 0) or 0)
raw_body = self.rfile.read(length).decode("utf-8", errors="replace")
try:
payload = json.loads(raw_body)
except json.JSONDecodeError:
payload = {"message": raw_body}
level = str(payload.get("level", "log")).upper()
message = payload.get("message", "")
source = payload.get("source", "browser")
print(f"[{source}] {level}: {message}", flush=True)
stack = payload.get("stack")
if stack:
print(stack, flush=True)
self.send_response(204)
self.end_headers()
def end_headers(self):
self.send_header("Cache-Control", "no-store, no-cache, must-revalidate, max-age=0")
self.send_header("Pragma", "no-cache")
self.send_header("Expires", "0")
super().end_headers()
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Serve the project with cache disabled.")
parser.add_argument("--host", default="127.0.0.1", help="Host to bind to")
parser.add_argument("--port", type=int, default=3001, help="Port to bind to")
parser.add_argument(
"--directory",
default=str(Path(__file__).resolve().parent),
help="Directory to serve",
)
args = parser.parse_args()
handler = lambda *handler_args, **handler_kwargs: NoCacheHandler(
*handler_args,
directory=args.directory,
**handler_kwargs,
)
with ThreadingHTTPServer((args.host, args.port), handler) as server:
print(f"Serving {args.directory} on http://{args.host}:{args.port}")
server.serve_forever()