|
|
@@ -119,8 +119,12 @@ class DirectTcpPath(BasePath):
|
|
|
async def send(self, data: bytes) -> None:
|
|
|
if self.closed or self.writer is None:
|
|
|
return
|
|
|
- self.writer.write(data)
|
|
|
- await self.writer.drain()
|
|
|
+ try:
|
|
|
+ self.writer.write(data)
|
|
|
+ await self.writer.drain()
|
|
|
+ except (BrokenPipeError, ConnectionResetError, RuntimeError, OSError, asyncio.CancelledError) as exc:
|
|
|
+ await self.close()
|
|
|
+ raise ConnectionError("relay closed") from exc
|
|
|
|
|
|
async def close(self) -> None:
|
|
|
if self.closed:
|
|
|
@@ -403,7 +407,11 @@ class RelayUdpPath(BasePath):
|
|
|
return
|
|
|
meta = encode_json({"host": self.target.host, "port": self.target.port, "family": self.target.family})
|
|
|
payload = meta + data
|
|
|
- await self.connection.send(Frame(UDP_SEND, self.session_id, self.stream_id, 0, len(meta), payload))
|
|
|
+ try:
|
|
|
+ await self.connection.send(Frame(UDP_SEND, self.session_id, self.stream_id, 0, len(meta), payload))
|
|
|
+ except Exception:
|
|
|
+ self.closed = True
|
|
|
+ raise
|
|
|
|
|
|
async def close(self) -> None:
|
|
|
if self.closed:
|