Spaces:
BG5
/
Running

BG5 commited on
Commit
e503e80
·
verified ·
1 Parent(s): d8ef23e

Update fun.py

Browse files
Files changed (1) hide show
  1. fun.py +57 -13
fun.py CHANGED
@@ -42,21 +42,65 @@ async def websocket_proxy(websocket: WebSocket, path: str):
42
 
43
  try:
44
  async with websockets.connect(target_url) as target_ws:
45
- async def forward(from_ws, to_ws, direction):
46
- while True:
47
- data = await from_ws.receive()
48
- logger.info(f"{direction} RAW DATA: {data}") # 打印原始数据
49
- if isinstance(data, str):
50
- await to_ws.send(data)
51
- else:
52
- await to_ws.send(data.bytes if hasattr(data, 'bytes') else data)
53
-
54
- await asyncio.gather(
55
- forward(websocket, target_ws, "CLIENT->CHROME"),
56
- forward(target_ws, websocket, "CHROME->CLIENT")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
57
  )
 
 
 
 
 
 
 
58
  except Exception as e:
59
- logger.error(f"Error: {e}")
 
 
 
 
 
 
60
 
61
  if __name__ == "__main__":
62
  uvicorn.run("fun:app", host="0.0.0.0", port=8000, reload=True)
 
42
 
43
  try:
44
  async with websockets.connect(target_url) as target_ws:
45
+ disconnect_event = asyncio.Event()
46
+
47
+ async def forward_client_to_server():
48
+ try:
49
+ while not disconnect_event.is_set():
50
+ # 正确处理 FastAPI WebSocket 接收
51
+ message = await websocket.receive()
52
+ logger.info(f"CLIENT->CHROME RAW DATA: {message}")
53
+
54
+ if message["type"] == "websocket.disconnect":
55
+ logger.info("Client disconnected")
56
+ disconnect_event.set()
57
+ break
58
+
59
+ if message["type"] == "websocket.receive.text":
60
+ await target_ws.send(message["text"])
61
+ elif message["type"] == "websocket.receive.bytes":
62
+ await target_ws.send(message["bytes"])
63
+ except Exception as e:
64
+ logger.error(f"Client->Server error: {e}")
65
+ disconnect_event.set()
66
+
67
+ async def forward_server_to_client():
68
+ try:
69
+ while not disconnect_event.is_set():
70
+ # 正确处理 websockets 库接收
71
+ message = await target_ws.recv()
72
+ if isinstance(message, str):
73
+ await websocket.send_text(message)
74
+ elif isinstance(message, bytes):
75
+ await websocket.send_bytes(message)
76
+ except Exception as e:
77
+ logger.error(f"Server->Client error: {e}")
78
+ disconnect_event.set()
79
+
80
+ # 并行运行两个转发任务
81
+ client_task = asyncio.create_task(forward_client_to_server())
82
+ server_task = asyncio.create_task(forward_server_to_client())
83
+
84
+ # 等待任意任务完成
85
+ done, pending = await asyncio.wait(
86
+ [client_task, server_task],
87
+ return_when=asyncio.FIRST_COMPLETED
88
  )
89
+
90
+ # 清理未完成的任务
91
+ disconnect_event.set()
92
+ for task in pending:
93
+ task.cancel()
94
+ await asyncio.gather(*pending, return_exceptions=True)
95
+
96
  except Exception as e:
97
+ logger.error(f"Connection error: {e}")
98
+ finally:
99
+ try:
100
+ await websocket.close()
101
+ except Exception:
102
+ pass
103
+
104
 
105
  if __name__ == "__main__":
106
  uvicorn.run("fun:app", host="0.0.0.0", port=8000, reload=True)