Skip to content

Commit aa96d95

Browse files
committed
example: add proxy/httpproxy
1 parent 49f698a commit aa96d95

File tree

1 file changed

+56
-0
lines changed

1 file changed

+56
-0
lines changed

example/proxy/httpproxy.py

+56
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
# coding:utf-8
2+
3+
from http.server import BaseHTTPRequestHandler
4+
from http.server import ThreadingHTTPServer
5+
6+
from xhtml import RequestProxy
7+
8+
PROXY: RequestProxy = RequestProxy("https://example.com/")
9+
10+
11+
class HTTPRequestProxy(BaseHTTPRequestHandler):
12+
def _get_request_data(self):
13+
content_length = int(self.headers.get("Content-Length", 0))
14+
return self.rfile.read(content_length) if content_length > 0 else None
15+
16+
def do_GET(self):
17+
print(f"GET Path: {self.path}")
18+
print("request.headers:\n%s", self.headers)
19+
headers = PROXY.filter_headers({k: v for k, v in self.headers.items()})
20+
response = PROXY.request(path=self.path,
21+
method="GET",
22+
data=self._get_request_data(),
23+
headers=headers
24+
).response
25+
self.send_response(response.status_code)
26+
print(response.status_code)
27+
for header, value in response.headers.items():
28+
print(f"{header}: {value}")
29+
if header.lower() in PROXY.EXCLUDED_RESPONSE_HEADERS:
30+
print(f"Excluded header: {header}")
31+
continue
32+
self.send_header(header, value)
33+
self.end_headers()
34+
print(len(response.content), response.content)
35+
self.wfile.write(response.content)
36+
self.wfile.flush()
37+
38+
def do_POST(self):
39+
print(f"POST Path: {self.path}")
40+
for key, value in self.headers.items():
41+
print(f"{key}: {value}")
42+
self.send_response(200)
43+
self.send_header("Content-type", "text/html")
44+
self.end_headers()
45+
self.wfile.write(b"test post")
46+
47+
48+
def run(host: str, port: int):
49+
listen_address = (host, port)
50+
httpd = ThreadingHTTPServer(listen_address, HTTPRequestProxy)
51+
print(f"Listening on {host}:{port}")
52+
httpd.serve_forever()
53+
54+
55+
if __name__ == "__main__":
56+
run("0.0.0.0", 5000)

0 commit comments

Comments
 (0)