<<
path:
root/public/blog.git/html/dev/server.py
blob: dd88a8a047c95336149a48a14fffcfa7c7be9118
[raw]
[clear marker]
1from http.server import HTTPServer, SimpleHTTPRequestHandler
2from http.client import HTTPConnection
3from urllib.parse import urlparse, parse_qs
4from functools import partial
8# This kinda mimics the behavior of my nginx config.
9# Do not use it in prod!
11LOCALHOST = "127.0.0.1"
12SEARCH_SERVER_PORT = 8081
17class RewriteHandler(SimpleHTTPRequestHandler):
19 parsed = urlparse(self.path)
20 query = parse_qs(parsed.query)
24 self.forward_to_search_server(self.path)
27 ts_value = query['ts'][0]
28 new_path = f"posts/{ts_value}.html"
30 elif parsed.path == "/rss":
31 self.path = "/ptrace.dev.rss"
33 file_path = self.translate_path(path)
34 if not os.path.exists(file_path):
35 file_path_html = self.translate_path(path + ".html")
36 if os.path.exists(file_path_html):
37 self.path = path + ".html"
39 return super().do_GET()
44 except BrokenPipeError:
47 def send_error(self, code, message=None, explain=None):
49 super().send_error(code, message, explain)
50 except BrokenPipeError:
53 def forward_to_search_server(self, path):
55 conn = HTTPConnection(LOCALHOST, SEARCH_SERVER_PORT)
56 conn.request("GET", path, headers={"Host": f"{LOCALHOST}:8000"})
57 resp = conn.getresponse()
59 self.send_response(resp.status)
60 for key, value in resp.getheaders():
61 if key.lower() not in ("transfer-encoding", "connection"):
62 self.send_header(key, value)
65 self.wfile.write(resp.read())
66 except ConnectionRefusedError:
67 self.send_error(502, "Search server unavailable")
72if __name__ == "__main__":
73 handler = partial(RewriteHandler, directory=ROOT_DIR)
74 server = HTTPServer((LOCALHOST, WEB_SERVER_PORT), handler)
77 print(f"Serving {ROOT_DIR} on http://localhost:{WEB_SERVER_PORT}")
78 print("DO NOT USE IT IN PROD!")
79 print("DO NOT USE IT IN PROD!")
80 print("DO NOT USE IT IN PROD!")
81 print("----------------------")
82 server.serve_forever()
83 except KeyboardInterrupt:
84 print("\nStopping server...")