diff --git a/channels/handler.py b/channels/handler.py index 9cb5036..27ff2e4 100644 --- a/channels/handler.py +++ b/channels/handler.py @@ -268,6 +268,9 @@ class AsgiHandler(base.BaseHandler): Yields (chunk, last_chunk) tuples. """ position = 0 + if not data: + yield data, True + return while position < len(data): yield ( data[position:position + cls.chunk_size], diff --git a/channels/tests/test_handler.py b/channels/tests/test_handler.py index f94ca03..b637392 100644 --- a/channels/tests/test_handler.py +++ b/channels/tests/test_handler.py @@ -88,3 +88,30 @@ class HandlerTests(SimpleTestCase): self.assertEqual(reply_messages[0]["more_content"], True) self.assertEqual(reply_messages[1]["content"], b"andhereistherest") self.assertEqual(reply_messages[1].get("more_content", False), False) + + def test_chunk_bytes(self): + """ + Makes sure chunk_bytes works correctly + """ + # Empty string should still return one chunk + result = list(FakeAsgiHandler.chunk_bytes(b"")) + self.assertEqual(len(result), 1) + self.assertEqual(result[0][0], b"") + self.assertEqual(result[0][1], True) + # Below chunk size + result = list(FakeAsgiHandler.chunk_bytes(b"12345678901234567890123456789")) + self.assertEqual(len(result), 1) + self.assertEqual(result[0][0], b"12345678901234567890123456789") + self.assertEqual(result[0][1], True) + # Exactly chunk size + result = list(FakeAsgiHandler.chunk_bytes(b"123456789012345678901234567890")) + self.assertEqual(len(result), 1) + self.assertEqual(result[0][0], b"123456789012345678901234567890") + self.assertEqual(result[0][1], True) + # Just above chunk size + result = list(FakeAsgiHandler.chunk_bytes(b"123456789012345678901234567890a")) + self.assertEqual(len(result), 2) + self.assertEqual(result[0][0], b"123456789012345678901234567890") + self.assertEqual(result[0][1], False) + self.assertEqual(result[1][0], b"a") + self.assertEqual(result[1][1], True)