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)