From 79a50f4a0fde36f85028896bdc206e47b34f287c Mon Sep 17 00:00:00 2001 From: Shubham Padkonde Date: Fri, 2 Oct 2026 11:34:16 +0530 Subject: [PATCH] fix: measure event payload limits in UTF-8 bytes --- pusher/pusher_client.py | 4 ++-- pusher_tests/test_pusher_client.py | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/pusher/pusher_client.py b/pusher/pusher_client.py index 8c35fd2..a73120c 100644 --- a/pusher/pusher_client.py +++ b/pusher/pusher_client.py @@ -91,7 +91,7 @@ def trigger(self, channels, event_name, data, socket_id=None): raise ValueError("event_name too long") data = data_to_string(data, self._json_encoder) - if sys.getsizeof(data) > 30720: + if len(data.encode('utf-8')) > 30720: raise ValueError("Too much data") channels = list(map(validate_channel, channels)) @@ -130,7 +130,7 @@ def trigger_batch(self, batch=[], already_encoded=False): event['data'] = data_to_string(event['data'], self._json_encoder) - if sys.getsizeof(event['data']) > 10240: + if len(event['data'].encode('utf-8')) > 10240: raise ValueError("Too much data") if is_encrypted_channel(event['channel']): diff --git a/pusher_tests/test_pusher_client.py b/pusher_tests/test_pusher_client.py index 23e36c7..987935e 100644 --- a/pusher_tests/test_pusher_client.py +++ b/pusher_tests/test_pusher_client.py @@ -25,6 +25,21 @@ class TestPusherClient(unittest.TestCase): + def test_payload_limit_uses_utf8_bytes(self): + for batch, limit in ((False, 30720), (True, 10240)): + def make_request(data): + if batch: + return self.pusher_client.trigger_batch.make_request([ + {'channel': 'test', 'name': 'event', 'data': data}]) + return self.pusher_client.trigger.make_request('test', 'event', data) + + with self.subTest(batch=batch, case='exact ASCII limit'): + request = make_request('a' * limit) + self.assertIsNotNone(request) + with self.subTest(batch=batch, case='oversized UTF-8'): + with self.assertRaises(ValueError): + make_request('\u4f60' * (limit // 3 + 1)) + def setUp(self): self.pusher_client = PusherClient(app_id=u'4', key=u'key', secret=u'secret', host=u'somehost')