from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer from urllib.parse import urlsplit import base64 import http.client expected = "Basic " + base64.b64encode(b"proxy-user:proxy-pass").decode() class ProxyHandler(BaseHTTPRequestHandler): def do_GET(self): if self.headers.get("Proxy-Authorization") != expected: self.send_response(407) self.send_header("Proxy-Authenticate", 'Basic realm="proxy-lab"') self.end_headers() return target = urlsplit(self.path) if target.scheme != "http" or target.hostname != "127.0.0.1" or target.port != 8081: self.send_error(502, "proxy lab only forwards to http://127.0.0.1:8081") return path = target.path or "/" if target.query: path += "?" + target.query connection = http.client.HTTPConnection(target.hostname, target.port, timeout=5) connection.request("GET", path, headers={"X-Proxy-Lab": "authenticated-proxy"}) response = connection.getresponse() body = response.read() self.send_response(response.status) self.send_header("Content-Type", response.getheader("Content-Type", "application/octet-stream")) self.send_header("Content-Length", str(len(body))) self.end_headers() self.wfile.write(body) connection.close() def log_message(self, format, *args): return ThreadingHTTPServer(("127.0.0.1", 8888), ProxyHandler).serve_forever()