Files
LabelChange-server/proxy.py
2026-06-01 16:30:29 +08:00

125 lines
5.0 KiB
Python

import http.server
import socketserver
import urllib.request
import urllib.error
import urllib.parse
PORT = 3000
TARGET_HOST = 'localhost'
TARGET_PORT = 5002
class ProxyHandler(http.server.SimpleHTTPRequestHandler):
def do_GET(self):
# 构建目标 URL
target_url = f'http://{TARGET_HOST}:{TARGET_PORT}{self.path}'
print(f'Proxying GET request to: {target_url}')
try:
# 转发请求到目标服务器
req = urllib.request.Request(target_url)
# 复制请求头
for key, value in self.headers.items():
if key not in ['Host', 'Connection']:
req.add_header(key, value)
# 发送请求并获取响应
with urllib.request.urlopen(req) as response:
# 获取响应状态码和头
status_code = response.getcode()
headers = response.getheaders()
content = response.read()
# 发送响应给客户端,添加 CORS 头
self.send_response(status_code)
for key, value in headers:
# 跳过可能导致冲突的头
if key not in ['Content-Length', 'Transfer-Encoding', 'Connection']:
self.send_header(key, value)
# 添加 CORS 头
self.send_header('Access-Control-Allow-Origin', '*')
self.send_header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS')
self.send_header('Access-Control-Allow-Headers', '*')
self.end_headers()
# 发送响应内容
self.wfile.write(content)
except urllib.error.HTTPError as e:
# 处理 HTTP 错误
self.send_response(e.code)
self.send_header('Access-Control-Allow-Origin', '*')
self.end_headers()
self.wfile.write(e.read())
except Exception as e:
# 处理其他错误
self.send_response(500)
self.send_header('Access-Control-Allow-Origin', '*')
self.end_headers()
self.wfile.write(str(e).encode())
def do_POST(self):
# 构建目标 URL
target_url = f'http://{TARGET_HOST}:{TARGET_PORT}{self.path}'
print(f'Proxying POST request to: {target_url}')
try:
# 读取请求体
content_length = int(self.headers['Content-Length'])
post_data = self.rfile.read(content_length)
# 转发请求到目标服务器
req = urllib.request.Request(target_url, data=post_data)
# 复制请求头
for key, value in self.headers.items():
if key not in ['Host', 'Connection', 'Content-Length']:
req.add_header(key, value)
# 发送请求并获取响应
with urllib.request.urlopen(req) as response:
# 获取响应状态码和头
status_code = response.getcode()
headers = response.getheaders()
content = response.read()
# 发送响应给客户端,添加 CORS 头
self.send_response(status_code)
for key, value in headers:
# 跳过可能导致冲突的头
if key not in ['Content-Length', 'Transfer-Encoding', 'Connection']:
self.send_header(key, value)
# 添加 CORS 头
self.send_header('Access-Control-Allow-Origin', '*')
self.send_header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS')
self.send_header('Access-Control-Allow-Headers', '*')
self.end_headers()
# 发送响应内容
self.wfile.write(content)
except urllib.error.HTTPError as e:
# 处理 HTTP 错误
self.send_response(e.code)
self.send_header('Access-Control-Allow-Origin', '*')
self.end_headers()
self.wfile.write(e.read())
except Exception as e:
# 处理其他错误
self.send_response(500)
self.send_header('Access-Control-Allow-Origin', '*')
self.end_headers()
self.wfile.write(str(e).encode())
def do_OPTIONS(self):
# 处理 OPTIONS 请求(预检请求)
self.send_response(200)
self.send_header('Access-Control-Allow-Origin', '*')
self.send_header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS')
self.send_header('Access-Control-Allow-Headers', '*')
self.end_headers()
if __name__ == '__main__':
with socketserver.TCPServer(('', PORT), ProxyHandler) as httpd:
print(f'Proxy server running at http://localhost:{PORT}')
print(f'Forwarding requests to http://{TARGET_HOST}:{TARGET_PORT}')
httpd.serve_forever()