MCPcopy Create free account
hub / github.com/EasyIME/PIME / _receive_frame

Method _receive_frame

python/python3/tornado/websocket.py:1116–1197  ·  view source on GitHub ↗
(self)

Source from the content-addressed store, hash-verified

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

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