(self)
| 1114 | return data |
| 1115 | |
| 1116 | async def _receive_frame(self) -> None: |
| 1117 | # Read the frame header. |
| 1118 | data = await self._read_bytes(2) |
| 1119 | header, mask_payloadlen = struct.unpack("BB", data) |
| 1120 | is_final_frame = header & self.FIN |
| 1121 | reserved_bits = header & self.RSV_MASK |
| 1122 | opcode = header & self.OPCODE_MASK |
| 1123 | opcode_is_control = opcode & 0x8 |
| 1124 | if self._decompressor is not None and opcode != 0: |
| 1125 | # Compression flag is present in the first frame's header, |
| 1126 | # but we can't decompress until we have all the frames of |
| 1127 | # the message. |
| 1128 | self._frame_compressed = bool(reserved_bits & self.RSV1) |
| 1129 | reserved_bits &= ~self.RSV1 |
| 1130 | if reserved_bits: |
| 1131 | # client is using as-yet-undefined extensions; abort |
| 1132 | self._abort() |
| 1133 | return |
| 1134 | is_masked = bool(mask_payloadlen & 0x80) |
| 1135 | payloadlen = mask_payloadlen & 0x7F |
| 1136 | |
| 1137 | # Parse and validate the length. |
| 1138 | if opcode_is_control and payloadlen >= 126: |
| 1139 | # control frames must have payload < 126 |
| 1140 | self._abort() |
| 1141 | return |
| 1142 | if payloadlen < 126: |
| 1143 | self._frame_length = payloadlen |
| 1144 | elif payloadlen == 126: |
| 1145 | data = await self._read_bytes(2) |
| 1146 | payloadlen = struct.unpack("!H", data)[0] |
| 1147 | elif payloadlen == 127: |
| 1148 | data = await self._read_bytes(8) |
| 1149 | payloadlen = struct.unpack("!Q", data)[0] |
| 1150 | new_len = payloadlen |
| 1151 | if self._fragmented_message_buffer is not None: |
| 1152 | new_len += len(self._fragmented_message_buffer) |
| 1153 | if new_len > self.params.max_message_size: |
| 1154 | self.close(1009, "message too big") |
| 1155 | self._abort() |
| 1156 | return |
| 1157 | |
| 1158 | # Read the payload, unmasking if necessary. |
| 1159 | if is_masked: |
| 1160 | self._frame_mask = await self._read_bytes(4) |
| 1161 | data = await self._read_bytes(payloadlen) |
| 1162 | if is_masked: |
| 1163 | assert self._frame_mask is not None |
| 1164 | data = _websocket_mask(self._frame_mask, data) |
| 1165 | |
| 1166 | # Decide what to do with this frame. |
| 1167 | if opcode_is_control: |
| 1168 | # control frames may be interleaved with a series of fragmented |
| 1169 | # data frames, so control frames must not interact with |
| 1170 | # self._fragmented_* |
| 1171 | if not is_final_frame: |
| 1172 | # control frames must not be fragmented |
| 1173 | self._abort() |
no test coverage detected