(
self, websocket: Websocket, send: ASGISendCallable
)
| 238 | ) |
| 239 | |
| 240 | async def handle_websocket( |
| 241 | self, websocket: Websocket, send: ASGISendCallable |
| 242 | ) -> None: |
| 243 | try: |
| 244 | response = await self.app.handle_websocket(websocket) |
| 245 | except Exception as error: |
| 246 | response = await _handle_exception(self.app, error) |
| 247 | |
| 248 | if response is not None and not self._accepted: |
| 249 | extensions = self.scope.get("extensions", {}) or {} |
| 250 | if "websocket.http.response" in extensions: |
| 251 | headers = [ |
| 252 | (key.lower().encode(), value.encode()) |
| 253 | for key, value in response.headers.items() |
| 254 | ] |
| 255 | await send( |
| 256 | cast( |
| 257 | WebsocketResponseStartEvent, |
| 258 | { |
| 259 | "type": "websocket.http.response.start", |
| 260 | "status": response.status_code, |
| 261 | "headers": headers, |
| 262 | }, |
| 263 | ) |
| 264 | ) |
| 265 | if isinstance(response, WerkzeugResponse): |
| 266 | for data in response.response: |
| 267 | await send( |
| 268 | cast( |
| 269 | WebsocketResponseBodyEvent, |
| 270 | { |
| 271 | "type": "websocket.http.response.body", |
| 272 | "body": data, |
| 273 | "more_body": True, |
| 274 | }, |
| 275 | ) |
| 276 | ) |
| 277 | elif isinstance(response, Response): |
| 278 | async with response.response as body: |
| 279 | async for data in body: |
| 280 | await send( |
| 281 | cast( |
| 282 | WebsocketResponseBodyEvent, |
| 283 | { |
| 284 | "type": "websocket.http.response.body", |
| 285 | "body": data, |
| 286 | "more_body": True, |
| 287 | }, |
| 288 | ) |
| 289 | ) |
| 290 | await send( |
| 291 | cast( |
| 292 | WebsocketResponseBodyEvent, |
| 293 | { |
| 294 | "type": "websocket.http.response.body", |
| 295 | "body": b"", |
| 296 | "more_body": False, |
| 297 | }, |
no test coverage detected