aio-libs / aio-libs/aiohttp

ClientWebSocketResponse: Add way to get close message when using msg iterator

未關閉
#7,682 1 則留言 0 個 reaction 已指派 0 人 在 GitHub 檢視
enhancement
主要語言
Python
星號
16.5k
分支
2.4k
平均合併
17 小時 22 分鐘
30 天內合併 PR
212

描述

### Is your feature request related to a problem?

The websocket server I'm connecting to will send a close message. I want to get this message.

There doesn't seem to a way to do this when using the async message iterator on ClientWebSocketResponse:

e.g.

async with session.ws_connect('http://example.org/ws') as ws:
async for msg in ws:
if msg.type == aiohttp.WSMsgType.TEXT:
await ws.send_str(msg.data + '/answer')
elif msg.type == aiohttp.WSMsgType.ERROR:
break
# No way to get close message here

### Describe the solution you'd like

There should be a `ClientWebSocketResponse.close_message` property that is set when the server has sent a close message

### Describe alternatives you've considered

As a workaround, I'm using the `ClientWebSocketResponse.receive()` method instead of async message iterator. Then I'm able to handle the close message my self. E.g.:

close_msg = None
async with session.ws_connect('http://example.org/ws') as ws:
while True:
msg = await ws.receive()
if msg.type == aiohttp.WSMsgType.TEXT:
await ws.send_str(msg.data + '/answer')
elif msg.type == aiohttp.WSMsgType.ERROR:
break
elif msg.type == WSMsgType.CLOSE:
close_msg = msg.extra
break
logger.info(f"Closed: {ws.close_code} {close_msg}")

### Related component

Client

### Additional context

_No response_

### Code of Conduct

- [X] I agree to follow the aio-libs Code of Conduct

貢獻指南

開啟貢獻指南

評估

這個 Issue 還沒有評估資料。

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。