import http.server import os import posixpath import ssl import urllib.parse class UAPrefixRoutingHandler(http.server.SimpleHTTPRequestHandler): # Match on the first N characters of User-Agent. UA_PREFIX_LEN = 5 # Edit this map as needed: prefix -> subdirectory. UA_DIR_MAP = { "Mozil": "site_mozilla", "curl/": "site_curl", } DEFAULT_SUBDIR = "site_default" def _selected_subdir(self): user_agent = self.headers.get("User-Agent", "") prefix = user_agent[: self.UA_PREFIX_LEN] return self.UA_DIR_MAP.get(prefix, self.DEFAULT_SUBDIR) def translate_path(self, path): # Same idea as SimpleHTTPRequestHandler.translate_path, but rooted # in a user-agent-specific subdirectory. path = path.split("?", 1)[0] path = path.split("#", 1)[0] trailing_slash = path.endswith("/") path = posixpath.normpath(urllib.parse.unquote(path)) parts = [part for part in path.split("/") if part] translated = os.path.join(os.getcwd(), self._selected_subdir()) for part in parts: part = os.path.basename(part) if part in (os.curdir, os.pardir): continue translated = os.path.join(translated, part) if trailing_slash: translated += "/" return translated def log_request(self, code="-", size="-"): super().log_request(code, size) try: status_code = int(code) except (TypeError, ValueError): return if 200 <= status_code < 300: user_agent = self.headers.get("User-Agent", "") print(f"Successful request User-Agent: {user_agent}", flush=True) # Define server address and handler server_address = ('0.0.0.0', 443) handler = UAPrefixRoutingHandler # Create the HTTP server httpd = http.server.HTTPServer(server_address, handler) # Set up SSL context (modern way) context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) context.load_cert_chain(certfile='fullchain.crt', keyfile='privkey.key') # Wrap the socket httpd.socket = context.wrap_socket(httpd.socket, server_side=True) print("Serving on port 443") httpd.serve_forever()