From 393e1966c74f8d95e2c16e30cf8133e41a6d8358 Mon Sep 17 00:00:00 2001 From: Lonami Exo Date: Sat, 7 Jul 2018 11:58:48 +0200 Subject: [PATCH] Avoid exceeding maximum container size This issue would likely be triggered when automatically merging multiple requests into a single one while having their size exceed 1044456 bytes like SaveFilePartRequest. This commit avoids such issue by keeping track of the current size, and if it exceeds the limit, avoid merge. --- telethon/network/mtprotosender.py | 7 +++++-- telethon/tl/core/messagecontainer.py | 5 +++++ telethon/tl/core/tlmessage.py | 3 +++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/telethon/network/mtprotosender.py b/telethon/network/mtprotosender.py index 38ace40b..81deae64 100644 --- a/telethon/network/mtprotosender.py +++ b/telethon/network/mtprotosender.py @@ -749,14 +749,17 @@ class _ContainerQueue(asyncio.Queue): isinstance(result.obj, MessageContainer): return result + size = result.size() result = [result] while not self.empty(): item = self.get_nowait() - if item == _reconnect_sentinel or\ - isinstance(item.obj, MessageContainer): + if (item == _reconnect_sentinel or + isinstance(item.obj, MessageContainer) + or size + item.size() > MessageContainer.MAXIMUM_SIZE): self.put_nowait(item) break else: + size += item.size() result.append(item) return result diff --git a/telethon/tl/core/messagecontainer.py b/telethon/tl/core/messagecontainer.py index f5c3c378..fc36fd5e 100644 --- a/telethon/tl/core/messagecontainer.py +++ b/telethon/tl/core/messagecontainer.py @@ -10,6 +10,11 @@ __log__ = logging.getLogger(__name__) class MessageContainer(TLObject): CONSTRUCTOR_ID = 0x73f1f8dc + # Maximum size in bytes for the inner payload of the container. + # Telegram will close the connection if the payload is bigger. + # The overhead of the container itself is subtracted. + MAXIMUM_SIZE = 1044456 - 8 + def __init__(self, messages): self.messages = messages diff --git a/telethon/tl/core/tlmessage.py b/telethon/tl/core/tlmessage.py index d0345cb2..5d032c7c 100644 --- a/telethon/tl/core/tlmessage.py +++ b/telethon/tl/core/tlmessage.py @@ -82,3 +82,6 @@ class TLMessage(TLObject): raise TypeError('Incoming messages should not be bytes()-ed') return self._body + + def size(self): + return len(self._body)