@@ -189,24 +189,21 @@ async def close(self):
189
189
await self .send (b"" , self .CLOSE )
190
190
191
191
async def _read_frame (self ):
192
- header = await self .reader .read (2 )
192
+ header = await self .reader .readexactly (2 )
193
193
if len (header ) != 2 : # pragma: no cover
194
194
# raise OSError(32, "Websocket connection closed")
195
195
opcode = self .CLOSE
196
196
payload = b""
197
197
return opcode , payload
198
198
fin , opcode , has_mask , length = self ._parse_frame_header (header )
199
199
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 ))
201
201
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 ))
203
203
204
204
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 )
210
207
if has_mask : # pragma: no cover
211
208
payload = bytes (x ^ mask [i % 4 ] for i , x in enumerate (payload ))
212
209
return opcode , payload
0 commit comments