Source code for kw.platform.aiohttp.middlewares

"""
Middlewares
===========
"""


import asyncio
import time

from aiohttp import web

from .. import settings, utils


[docs]@web.middleware async def user_agent_middleware(request, handler): """Validate client's User-Agent header and modify response based on that. If the User-Agent header is invalid, there are three possible outcomes: 1. The current time is less then :obj:`settings.KIWI_REQUESTS_SLOWDOWN_DATETIME`, do nothing in this case. 2. The current time is less then :obj:`settings.KIWI_REQUESTS_RESTRICT_DATETIME`, slow down the response twice the normal responce time. 3. The current time is more then :obj:`settings.KIWI_REQUESTS_RESTRICT_DATETIME`, refuse the request, return ``HTTP 400`` to the client. Usage:: from aiohttp import web from kw.platform.aiohttp.middlewares import user_agent_middleware app = web.Application(middlewares=[user_agent_middleware]) .. warning:: The middleware slows down requests by calling :meth:`asyncio.sleep()` (in the time frame when requests with invalid user-agent are being delayed). This can increase busyness and overload a service. """ user_agent = utils.UserAgentValidator(request.headers.get("User-Agent")) if user_agent.restrict: return web.json_response( status=400, data={"message": settings.KIWI_RESTRICT_USER_AGENT_MESSAGE} ) before_time = time.time() response = await handler(request) request_duration = time.time() - before_time if user_agent.slowdown: await asyncio.sleep(request_duration) return response