From 94d3dd4b13595781475210a19b7b5ca89a787d8c Mon Sep 17 00:00:00 2001 From: Alex Root Junior Date: Sun, 29 Jul 2018 03:17:44 +0300 Subject: [PATCH] You can now use the Retry-After response header to configure the delay after which the Bot API will retry the request after an unsuccessful response from a webhook. --- aiogram/dispatcher/webhook.py | 10 ++++++++-- aiogram/utils/executor.py | 11 ++++++++--- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/aiogram/dispatcher/webhook.py b/aiogram/dispatcher/webhook.py index 970fd655..83c5fb74 100644 --- a/aiogram/dispatcher/webhook.py +++ b/aiogram/dispatcher/webhook.py @@ -128,8 +128,14 @@ class WebhookRequestHandler(web.View): response = self.get_response(results) if response: - return response.get_web_response() - return web.Response(text='ok') + web_response = response.get_web_response() + else: + web_response = web.Response(text='ok') + + if self.request.app['RETRY_AFTER']: + web_response.headers['Retry-After'] = self.request.app['RETRY_AFTER'] + + return web_response async def get(self): self.validate_ip() diff --git a/aiogram/utils/executor.py b/aiogram/utils/executor.py index e114e534..e3d8aa1f 100644 --- a/aiogram/utils/executor.py +++ b/aiogram/utils/executor.py @@ -40,7 +40,7 @@ def start_polling(dispatcher, *, loop=None, skip_updates=False, reset_webhook=Tr def start_webhook(dispatcher, webhook_path, *, loop=None, skip_updates=None, - on_startup=None, on_shutdown=None, check_ip=False, **kwargs): + on_startup=None, on_shutdown=None, check_ip=False, retry_after=None, **kwargs): """ Start bot in webhook mode @@ -54,7 +54,8 @@ def start_webhook(dispatcher, webhook_path, *, loop=None, skip_updates=None, :param kwargs: :return: """ - executor = Executor(dispatcher, skip_updates=skip_updates, check_ip=check_ip, loop=loop) + executor = Executor(dispatcher, skip_updates=skip_updates, check_ip=check_ip, retry_after=retry_after, + loop=loop) _setup_callbacks(executor, on_startup, on_shutdown) executor.start_webhook(webhook_path, **kwargs) @@ -84,12 +85,13 @@ class Executor: Main executor class """ - def __init__(self, dispatcher, skip_updates=None, check_ip=False, loop=None): + def __init__(self, dispatcher, skip_updates=None, check_ip=False, retry_after=None, loop=None): if loop is None: loop = dispatcher.loop self.dispatcher = dispatcher self.skip_updates = skip_updates self.check_ip = check_ip + self.retry_after = retry_after self.loop = loop self._identity = secrets.token_urlsafe(16) @@ -186,6 +188,9 @@ class Executor: if app is None: self._web_app = app = web.Application() + if self.retry_after: + app['RETRY_AFTER'] = self.retry_after + if self._identity == app.get(self._identity): # App is already configured return