当本地存在8081端口的情况下,8080端口接收请求转发到8081端口
import http.server
import socketserver
import socket
import requests
# from urllib.parse import urlparse
# 检查端口是否被占用
def is_port_in_use(port):
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
try:
s.bind(("localhost", port))
return False
except OSError:
return True
# 自定义请求处理器
class ProxyHandler(http.server.SimpleHTTPRequestHandler):
def forward_request(self, method):
# 构造目标 URL,将请求转发到 8081 端口
target_url = f"http://localhost:8081{self.path}"
# 获取请求头
headers = {key: value for key, value in self.headers.items()}
# 处理请求体(如果有)
content_length = int(self.headers.get('Content-Length', 0))
body = self.rfile.read(content_length) if content_length > 0 else None
try:
# 根据请求方法转发请求
if method == "GET":
response = requests.get(target_url, headers=headers, timeout=5)
elif method == "POST":
response = requests.post(target_url, headers=headers, data=body, timeout=5)
else:
self.send_error(405, "Method Not Allowed")
return
# 发送响应状态码
self.send_response(response.status_code)
# 发送响应头
for key, value in response.headers.items():
self.send_header(key, value)
self.end_headers()
# 发送响应内容
self.wfile.write(response.content)
except requests.RequestException as e:
self.send_error(502, f"Bad Gateway: {str(e)}")
def do_GET(self):
if is_port_in_use(8081):
self.forward_request("GET")
else:
self.send_response(200)
self.send_header("Content-type", "text/plain")
self.end_headers()
self.wfile.write(b"Port 8081 is not available, handling request at 8080")
def do_POST(self):
if is_port_in_use(8081):
self.forward_request("POST")
else:
self.send_response(200)
self.send_header("Content-type", "text/plain")
self.end_headers()
self.wfile.write(b"Port 8081 is not available, handling request at 8080")
def live_listen():
# 设置服务器
PORT = 8080
Handler = ProxyHandler
# 使用 ThreadingTCPServer 支持并发请求
with socketserver.ThreadingTCPServer(("", PORT), Handler) as httpd:
print(f"Serving on port {PORT}")
try:
httpd.serve_forever()
except KeyboardInterrupt:
print("\nServer stopped")
httpd.server_close()