import json
from http.server import BaseHTTPRequestHandler, HTTPServer
HINTS = ("Sec-CH-UA, Sec-CH-UA-Mobile, Sec-CH-UA-Platform, Sec-CH-UA-Arch, "
"Sec-CH-UA-Bitness, Sec-CH-UA-Model, Sec-CH-UA-Full-Version, "
"Sec-CH-UA-Full-Version-List, Sec-CH-UA-Platform-Version")
PAGE = """<html><body><div id=o>pending</div><script>
(async () => {
const r = await fetch('/echo', { cache: 'no-store' });
const headers = await r.json();
let js = {};
try { js = await navigator.userAgentData.getHighEntropyValues(
['architecture','bitness','model','platform','platformVersion','uaFullVersion','fullVersionList']); } catch (e) { js = {err: String(e)}; }
document.getElementById('o').textContent = 'CH' + JSON.stringify({ headers, js });
})();
</script></body></html>"""
class H(BaseHTTPRequestHandler):
def log_message(self, *a):
pass
def do_GET(self):
if self.path.startswith('/echo'):
body = json.dumps({k: v for k, v in self.headers.items()
if k.lower().startswith('sec-ch') or k.lower() in ('user-agent', 'accept-language')}).encode()
self.send_response(200)
self.send_header('Content-Type', 'application/json')
self.send_header('Accept-CH', HINTS)
self.send_header('Content-Length', str(len(body)))
self.end_headers()
self.wfile.write(body)
return
body = PAGE.encode()
self.send_response(200)
self.send_header('Content-Type', 'text/html')
self.send_header('Accept-CH', HINTS)
self.send_header('Critical-CH', HINTS)
self.send_header('Content-Length', str(len(body)))
self.end_headers()
self.wfile.write(body)
HTTPServer(('127.0.0.1', 8761), H).serve_forever()