MCPcopy
hub / github.com/tornadoweb/tornado / _receive_frame

Method _receive_frame

tornado/websocket.py:1137–1218  ·  view source on GitHub ↗
(self)

Source from the content-addressed store, hash-verified

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()

Callers 1

_receive_frame_loopMethod · 0.95

Calls 4

_read_bytesMethod · 0.95
closeMethod · 0.95
_handle_messageMethod · 0.95
_abortMethod · 0.80

Tested by

no test coverage detected