| 269 | |
| 270 | |
| 271 | def _encode_client_ws_frame(opcode: int, payload: bytes = b"") -> bytes: |
| 272 | frame = bytearray([0x80 | opcode]) |
| 273 | payload_length = len(payload) |
| 274 | |
| 275 | if payload_length < 126: |
| 276 | frame.append(0x80 | payload_length) |
| 277 | elif payload_length < 1 << 16: |
| 278 | frame.append(0x80 | 126) |
| 279 | frame.extend(struct.pack("!H", payload_length)) |
| 280 | else: |
| 281 | frame.append(0x80 | 127) |
| 282 | frame.extend(struct.pack("!Q", payload_length)) |
| 283 | |
| 284 | mask = os.urandom(4) |
| 285 | frame.extend(mask) |
| 286 | frame.extend(byte ^ mask[index % 4] for index, byte in enumerate(payload)) |
| 287 | return bytes(frame) |
| 288 | |
| 289 | |
| 290 | def _read_ws_frame(reader: _SocketBuffer) -> tuple[int, bytes]: |