fix(gateway): honor server retry_after in _send_with_retry for Telegram flood control (#46762)
When Telegram's sendRichMessage returns a FloodWait/RetryAfter error, _try_send_rich() now extracts the server-provided retry_after value and propagates it through SendResult.retry_after. The base _send_with_retry() layer honors this value instead of using its default short exponential backoff (~2s, ~4s), preventing the retry budget from being exhausted against a server that demands a 25-37s wait. Salvaged from #46774 by @liuhao1024. Telegram adapter path moved from gateway/platforms/telegram.py to plugins/platforms/telegram/adapter.py since the original PR. Closes #46762
This commit is contained in:
parent
cedbb4cfa2
commit
404b06ac4f
3 changed files with 78 additions and 2 deletions
|
|
@ -1378,6 +1378,15 @@ class TelegramAdapter(BasePlatformAdapter):
|
|||
_TimedOut = None
|
||||
is_timeout = (_TimedOut and isinstance(exc, _TimedOut)) or "timed out" in err_str
|
||||
is_connect_timeout = self._looks_like_connect_timeout(exc)
|
||||
# Extract server-requested retry_after for flood control so the
|
||||
# base retry layer honors Telegram's backoff instead of its own
|
||||
# short exponential schedule.
|
||||
_retry_after = getattr(exc, "retry_after", None)
|
||||
if _retry_after is None:
|
||||
import re as _re
|
||||
_m = _re.search(r"retry\s+(?:in\s+)?(\d+)", err_str, _re.IGNORECASE)
|
||||
if _m:
|
||||
_retry_after = float(_m.group(1))
|
||||
logger.warning(
|
||||
"[%s] sendRichMessage transient failure (no legacy resend): %s",
|
||||
self.name, exc,
|
||||
|
|
@ -1386,6 +1395,7 @@ class TelegramAdapter(BasePlatformAdapter):
|
|||
success=False,
|
||||
error=str(exc),
|
||||
retryable=(is_connect_timeout or not is_timeout),
|
||||
retry_after=_retry_after,
|
||||
)
|
||||
|
||||
message_id = None
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue