72 lines
2.3 KiB
Python
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()
|