Update fun.py
Browse files
fun.py
CHANGED
@@ -1,22 +1,24 @@
|
|
1 |
-
from fastapi import FastAPI, Request, Response,
|
2 |
import httpx
|
3 |
import uvicorn
|
4 |
import asyncio
|
5 |
import websockets
|
|
|
6 |
|
7 |
app = FastAPI()
|
8 |
|
9 |
-
TARGET_BASE = "http://127.0.0.1:9222" #
|
10 |
-
TARGET_WS_BASE = "ws://127.0.0.1:9222" # WebSocket
|
|
|
|
|
|
|
|
|
11 |
|
12 |
@app.api_route("/{path:path}", methods=["GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS", "HEAD"])
|
13 |
async def proxy(request: Request, path: str):
|
14 |
-
|
15 |
url = f"{TARGET_BASE}/{path}"
|
16 |
headers = dict(request.headers)
|
17 |
-
host =
|
18 |
-
# 强制 Host 头为 127.0.0.1,避免 Chrome 拒绝
|
19 |
-
headers["host"] = "127.0.0.1"
|
20 |
body = await request.body()
|
21 |
async with httpx.AsyncClient(follow_redirects=True) as client:
|
22 |
resp = await client.request(
|
@@ -26,35 +28,44 @@ async def proxy(request: Request, path: str):
|
|
26 |
content=body,
|
27 |
params=request.query_params
|
28 |
)
|
29 |
-
headers = dict(resp.headers)
|
30 |
-
headers["host"] = host
|
31 |
return Response(
|
32 |
content=resp.content,
|
33 |
status_code=resp.status_code,
|
34 |
-
headers=headers
|
35 |
)
|
36 |
|
37 |
@app.websocket("/{path:path}")
|
38 |
async def websocket_proxy(websocket: WebSocket, path: str):
|
39 |
await websocket.accept()
|
40 |
target_url = f"{TARGET_WS_BASE}/{path}"
|
|
|
|
|
41 |
try:
|
42 |
-
async with websockets.connect(
|
|
|
|
|
|
|
|
|
|
|
43 |
async def client_to_server():
|
44 |
while True:
|
45 |
-
data = await websocket.
|
46 |
await target_ws.send(data)
|
47 |
|
48 |
async def server_to_client():
|
49 |
while True:
|
50 |
data = await target_ws.recv()
|
51 |
-
|
|
|
|
|
|
|
52 |
|
53 |
await asyncio.gather(client_to_server(), server_to_client())
|
54 |
except WebSocketDisconnect:
|
55 |
-
|
56 |
-
except Exception:
|
|
|
57 |
await websocket.close()
|
58 |
|
59 |
if __name__ == "__main__":
|
60 |
-
uvicorn.run("
|
|
|
1 |
+
from fastapi import FastAPI, Request, Response, WebSocket, WebSocketDisconnect
|
2 |
import httpx
|
3 |
import uvicorn
|
4 |
import asyncio
|
5 |
import websockets
|
6 |
+
import logging
|
7 |
|
8 |
app = FastAPI()
|
9 |
|
10 |
+
TARGET_BASE = "http://127.0.0.1:9222" # Chrome DevTools HTTP 地址
|
11 |
+
TARGET_WS_BASE = "ws://127.0.0.1:9222" # Chrome DevTools WebSocket 地址
|
12 |
+
|
13 |
+
# 配置日志
|
14 |
+
logging.basicConfig(level=logging.INFO)
|
15 |
+
logger = logging.getLogger(__name__)
|
16 |
|
17 |
@app.api_route("/{path:path}", methods=["GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS", "HEAD"])
|
18 |
async def proxy(request: Request, path: str):
|
|
|
19 |
url = f"{TARGET_BASE}/{path}"
|
20 |
headers = dict(request.headers)
|
21 |
+
headers["host"] = "127.0.0.1" # 强制修改 Host 头
|
|
|
|
|
22 |
body = await request.body()
|
23 |
async with httpx.AsyncClient(follow_redirects=True) as client:
|
24 |
resp = await client.request(
|
|
|
28 |
content=body,
|
29 |
params=request.query_params
|
30 |
)
|
|
|
|
|
31 |
return Response(
|
32 |
content=resp.content,
|
33 |
status_code=resp.status_code,
|
34 |
+
headers=dict(resp.headers)
|
35 |
)
|
36 |
|
37 |
@app.websocket("/{path:path}")
|
38 |
async def websocket_proxy(websocket: WebSocket, path: str):
|
39 |
await websocket.accept()
|
40 |
target_url = f"{TARGET_WS_BASE}/{path}"
|
41 |
+
logger.info(f"Forwarding WebSocket to: {target_url}")
|
42 |
+
|
43 |
try:
|
44 |
+
async with websockets.connect(
|
45 |
+
target_url,
|
46 |
+
extra_headers={"Host": "127.0.0.1"},
|
47 |
+
ping_timeout=30,
|
48 |
+
close_timeout=10
|
49 |
+
) as target_ws:
|
50 |
async def client_to_server():
|
51 |
while True:
|
52 |
+
data = await websocket.receive_bytes() # 支持二进制
|
53 |
await target_ws.send(data)
|
54 |
|
55 |
async def server_to_client():
|
56 |
while True:
|
57 |
data = await target_ws.recv()
|
58 |
+
if isinstance(data, bytes):
|
59 |
+
await websocket.send_bytes(data)
|
60 |
+
else:
|
61 |
+
await websocket.send_text(data)
|
62 |
|
63 |
await asyncio.gather(client_to_server(), server_to_client())
|
64 |
except WebSocketDisconnect:
|
65 |
+
logger.info("Client disconnected")
|
66 |
+
except Exception as e:
|
67 |
+
logger.error(f"WebSocket error: {e}")
|
68 |
await websocket.close()
|
69 |
|
70 |
if __name__ == "__main__":
|
71 |
+
uvicorn.run("hg:app", host="0.0.0.0", port=8000, reload=True)
|