Skip to content

Commit 2fdf352

Browse files
committed
Always return bytes from recv().
Previously, a bytearray was returned when a client received fragments without reassembly while compression was disabled. The additional bytes() call is a no-op in all other cases. Refs #1641.
1 parent 036fd45 commit 2fdf352

File tree

3 files changed

+11
-5
lines changed

3 files changed

+11
-5
lines changed

src/websockets/asyncio/messages.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,7 @@ async def get(self, decode: bool | None = None) -> Data:
179179
finally:
180180
self.get_in_progress = False
181181

182+
# This converts frame.data to bytes when it's a bytearray.
182183
data = b"".join(frame.data for frame in frames)
183184
if decode:
184185
return data.decode()
@@ -243,7 +244,8 @@ async def get_iter(self, decode: bool | None = None) -> AsyncIterator[Data]:
243244
decoder = UTF8Decoder()
244245
yield decoder.decode(frame.data, frame.fin)
245246
else:
246-
yield frame.data
247+
# Convert to bytes when frame.data is a bytearray.
248+
yield bytes(frame.data)
247249

248250
# Following frames, for fragmented messages
249251
while not frame.fin:
@@ -257,7 +259,8 @@ async def get_iter(self, decode: bool | None = None) -> AsyncIterator[Data]:
257259
if decode:
258260
yield decoder.decode(frame.data, frame.fin)
259261
else:
260-
yield frame.data
262+
# Convert to bytes when frame.data is a bytearray.
263+
yield bytes(frame.data)
261264

262265
self.get_in_progress = False
263266

src/websockets/legacy/protocol.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1025,7 +1025,7 @@ async def read_message(self) -> Data | None:
10251025

10261026
# Shortcut for the common case - no fragmentation
10271027
if frame.fin:
1028-
return frame.data.decode() if text else frame.data
1028+
return frame.data.decode() if text else bytes(frame.data)
10291029

10301030
# 5.4. Fragmentation
10311031
fragments: list[Data] = []

src/websockets/sync/messages.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,7 @@ def get(self, timeout: float | None = None, decode: bool | None = None) -> Data:
193193
finally:
194194
self.get_in_progress = False
195195

196+
# This converts frame.data to bytes when it's a bytearray.
196197
data = b"".join(frame.data for frame in frames)
197198
if decode:
198199
return data.decode()
@@ -255,7 +256,8 @@ def get_iter(self, decode: bool | None = None) -> Iterator[Data]:
255256
decoder = UTF8Decoder()
256257
yield decoder.decode(frame.data, frame.fin)
257258
else:
258-
yield frame.data
259+
# Convert to bytes when frame.data is a bytearray.
260+
yield bytes(frame.data)
259261

260262
# Following frames, for fragmented messages
261263
while not frame.fin:
@@ -266,7 +268,8 @@ def get_iter(self, decode: bool | None = None) -> Iterator[Data]:
266268
if decode:
267269
yield decoder.decode(frame.data, frame.fin)
268270
else:
269-
yield frame.data
271+
# Convert to bytes when frame.data is a bytearray.
272+
yield bytes(frame.data)
270273

271274
self.get_in_progress = False
272275

0 commit comments

Comments
 (0)