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.

This commit is contained in:
Alex Root Junior 2018-07-29 03:17:44 +03:00
parent 9477e9af86
commit 94d3dd4b13
2 changed files with 16 additions and 5 deletions

View file

@ -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()

View file

@ -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