Skip to content

Commit 0776a00

Browse files
authored
Merge pull request #839 from eclipse/fix-bytearray-payload
Fix publish() a bytearray payload
2 parents 29c1d43 + 7795dcd commit 0776a00

File tree

3 files changed

+58
-4
lines changed

3 files changed

+58
-4
lines changed

src/paho/mqtt/client.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -465,7 +465,7 @@ def _force_bytes(s: str | bytes) -> bytes:
465465
return s
466466

467467

468-
def _encode_payload(payload: str | bytes | bytearray | int | float | None) -> bytes:
468+
def _encode_payload(payload: str | bytes | bytearray | int | float | None) -> bytes|bytearray:
469469
if isinstance(payload, str):
470470
return payload.encode("utf-8")
471471

@@ -3368,7 +3368,7 @@ def _send_publish(
33683368
self,
33693369
mid: int,
33703370
topic: bytes,
3371-
payload: bytes = b"",
3371+
payload: bytes|bytearray = b"",
33723372
qos: int = 0,
33733373
retain: bool = False,
33743374
dup: bool = False,
@@ -3378,7 +3378,7 @@ def _send_publish(
33783378
# we assume that topic and payload are already properly encoded
33793379
if not isinstance(topic, bytes):
33803380
raise TypeError('topic must be bytes, not str')
3381-
if payload and not isinstance(payload, bytes):
3381+
if payload and not isinstance(payload, (bytes, bytearray)):
33823382
raise TypeError('payload must be bytes if set')
33833383

33843384
if self._sock is None:

tests/paho_test.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,8 @@ def gen_publish(topic, qos, payload=None, retain=False, dup=False, mid=0, proto_
228228
pack_format = pack_format + "%ds"%(len(properties))
229229

230230
if payload is not None:
231-
payload = payload.encode("utf-8")
231+
if isinstance(payload, str):
232+
payload = payload.encode("utf-8")
232233
rl = rl + len(payload)
233234
pack_format = pack_format + str(len(payload)) + "s"
234235
else:

tests/test_client.py

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -427,6 +427,59 @@ def on_connect(mqttc, obj, flags, rc):
427427
packet_in = fake_broker.receive_packet(1)
428428
assert not packet_in # Check connection is closed
429429

430+
@pytest.mark.parametrize("user_payload,sent_payload", [
431+
("string", b"string"),
432+
(b"byte", b"byte"),
433+
(bytearray(b"bytearray"), b"bytearray"),
434+
(42, b"42"),
435+
(4.2, b"4.2"),
436+
(None, b""),
437+
])
438+
def test_publish_various_payload(self, user_payload: client.PayloadType, sent_payload: bytes, fake_broker: FakeBroker) -> None:
439+
mqttc = client.Client(
440+
CallbackAPIVersion.VERSION2,
441+
"test_publish_various_payload",
442+
transport=fake_broker.transport,
443+
)
444+
445+
mqttc.connect("localhost", fake_broker.port)
446+
mqttc.loop_start()
447+
mqttc.enable_logger()
448+
449+
try:
450+
fake_broker.start()
451+
452+
connect_packet = paho_test.gen_connect(
453+
"test_publish_various_payload", keepalive=60,
454+
proto_ver=client.MQTTv311)
455+
fake_broker.expect_packet("connect", connect_packet)
456+
457+
connack_packet = paho_test.gen_connack(rc=0)
458+
count = fake_broker.send_packet(connack_packet)
459+
assert count # Check connection was not closed
460+
assert count == len(connack_packet)
461+
462+
mqttc.publish("test", user_payload)
463+
464+
publish_packet = paho_test.gen_publish(
465+
b"test", payload=sent_payload, qos=0
466+
)
467+
fake_broker.expect_packet("publish", publish_packet)
468+
469+
mqttc.disconnect()
470+
471+
disconnect_packet = paho_test.gen_disconnect()
472+
packet_in = fake_broker.receive_packet(1000)
473+
assert packet_in # Check connection was not closed
474+
assert packet_in == disconnect_packet
475+
476+
finally:
477+
mqttc.loop_stop()
478+
479+
packet_in = fake_broker.receive_packet(1)
480+
assert not packet_in # Check connection is closed
481+
482+
430483
@pytest.mark.parametrize("callback_version", [
431484
(CallbackAPIVersion.VERSION1),
432485
(CallbackAPIVersion.VERSION2),

0 commit comments

Comments
 (0)