(
cls,
port: int,
path: str = "/ws",
headers: dict[str, str] | None = None,
)
| 338 | |
| 339 | @classmethod |
| 340 | def connect( |
| 341 | cls, |
| 342 | port: int, |
| 343 | path: str = "/ws", |
| 344 | headers: dict[str, str] | None = None, |
| 345 | ) -> tuple[_WebSocketClient, str]: |
| 346 | sock = socket.create_connection(("127.0.0.1", port), timeout=5) |
| 347 | sock.settimeout(5) |
| 348 | reader = _SocketBuffer(sock) |
| 349 | |
| 350 | try: |
| 351 | sock.sendall(_build_websocket_request(port, path, headers)) |
| 352 | |
| 353 | response = reader.read_until(b"\r\n\r\n") |
| 354 | if b"sec-websocket-accept:" not in response.lower(): |
| 355 | raise AssertionError( |
| 356 | "websocket upgrade response missing accept header" |
| 357 | ) |
| 358 | |
| 359 | status_line = response.split(b"\r\n", maxsplit=1)[0].decode("ascii") |
| 360 | return cls(sock, reader), status_line |
| 361 | except Exception: |
| 362 | sock.close() |
| 363 | raise |
| 364 | |
| 365 | def read_text(self) -> str: |
| 366 | opcode, payload = _read_ws_frame(self._reader) |
no test coverage detected