Files
didactyl/local_test_servers.py

72 lines
2.3 KiB
Python

#!/usr/bin/env python3
import json
import ssl
import threading
from pathlib import Path
from http.server import BaseHTTPRequestHandler, HTTPServer
HOST = "127.0.0.1"
HTTP_PORT = 9080
HTTPS_PORT = 9449
CERT = "/home/teknari/.ssl_for_local_servers/cert.pem"
KEY = "/home/teknari/.ssl_for_local_servers/key.pem"
HTML_FILE = Path("./didactyl.html")
class Handler(BaseHTTPRequestHandler):
def _cors(self):
self.send_header("Access-Control-Allow-Origin", "*")
self.send_header("Access-Control-Allow-Methods", "GET, OPTIONS")
self.send_header("Access-Control-Allow-Headers", "Content-Type")
self.send_header("Access-Control-Allow-Private-Network", "true")
def do_OPTIONS(self):
self.send_response(204)
self._cors()
self.end_headers()
def do_GET(self):
if self.path in ("/", "/didactyl.html") and HTML_FILE.exists():
body = HTML_FILE.read_bytes()
self.send_response(200)
self.send_header("Content-Type", "text/html; charset=utf-8")
self._cors()
self.send_header("Content-Length", str(len(body)))
self.end_headers()
self.wfile.write(body)
return
body = json.dumps(
{
"success": True,
"name": "python-test",
"path": self.path,
"scheme_hint": "https" if self.server.server_port == HTTPS_PORT else "http",
}
).encode("utf-8")
self.send_response(200)
self.send_header("Content-Type", "application/json")
self._cors()
self.send_header("Content-Length", str(len(body)))
self.end_headers()
self.wfile.write(body)
def log_message(self, fmt, *args):
print(f"[{self.server.server_port}] " + (fmt % args), flush=True)
httpd = HTTPServer((HOST, HTTP_PORT), Handler)
httpsd = HTTPServer((HOST, HTTPS_PORT), Handler)
ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
ctx.load_cert_chain(certfile=CERT, keyfile=KEY)
httpsd.socket = ctx.wrap_socket(httpsd.socket, server_side=True)
print(f"HTTP listening on http://{HOST}:{HTTP_PORT}", flush=True)
print(f"HTTPS listening on https://{HOST}:{HTTPS_PORT}", flush=True)
print("Use Ctrl+C to stop", flush=True)
threading.Thread(target=httpd.serve_forever, daemon=True).start()
httpsd.serve_forever()