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