@@ -189,24 +189,21 @@ async def close(self):
189189 await self .send (b"" , self .CLOSE )
190190
191191 async def _read_frame (self ):
192- header = await self .reader .read (2 )
192+ header = await self .reader .readexactly (2 )
193193 if len (header ) != 2 : # pragma: no cover
194194 # raise OSError(32, "Websocket connection closed")
195195 opcode = self .CLOSE
196196 payload = b""
197197 return opcode , payload
198198 fin , opcode , has_mask , length = self ._parse_frame_header (header )
199199 if length == 126 : # Magic number, length header is 2 bytes
200- (length ,) = struct .unpack ("!H" , await self .reader .read (2 ))
200+ (length ,) = struct .unpack ("!H" , await self .reader .readexactly (2 ))
201201 elif length == 127 : # Magic number, length header is 8 bytes
202- (length ,) = struct .unpack ("!Q" , await self .reader .read (8 ))
202+ (length ,) = struct .unpack ("!Q" , await self .reader .readexactly (8 ))
203203
204204 if has_mask : # pragma: no cover
205- mask = await self .reader .read (4 )
206- payload = bytearray ()
207- while length > 0 :
208- payload .extend (await self .reader .read (length ))
209- length -= len (payload )
205+ mask = await self .reader .readexactly (4 )
206+ payload = await self .reader .readexactly (length )
210207 if has_mask : # pragma: no cover
211208 payload = bytes (x ^ mask [i % 4 ] for i , x in enumerate (payload ))
212209 return opcode , payload
0 commit comments