async def api_middleware(request: web.Request, handler: WebRequestHandler) -> web.StreamResponse: _handler = handler method_override = request.headers.get('X-Method-Override', None) if method_override: request = request.clone(method=method_override) new_match_info = await request.app.router.resolve(request) if new_match_info is None: raise InternalServerError('No matching method handler found') _handler = new_match_info.handler request._match_info = new_match_info # type: ignore # this is a hack ex = request.match_info.http_exception if ex is not None: # handled by exception_middleware raise ex new_api_version = request.headers.get('X-BackendAI-Version') legacy_api_version = request.headers.get('X-Sorna-Version') api_version = new_api_version or legacy_api_version try: if api_version is None: path_major_version = int(request.match_info.get('version', 5)) revision_date = LATEST_REV_DATES[path_major_version] request['api_version'] = (path_major_version, revision_date) elif api_version in VALID_VERSIONS: hdr_major_version, revision_date = api_version.split('.', maxsplit=1) request['api_version'] = (int(hdr_major_version[1:]), revision_date) else: return GenericBadRequest('Unsupported API version.') except (ValueError, KeyError): return GenericBadRequest('Unsupported API version.') resp = (await _handler(request)) return resp
def make_request(self, method, path, query_params={}, headers=None, match_info=None): if query_params: path = '%s?%s' % (path, urllib.parse.urlencode(query_params)) # Ported from: # https://github.com/KeepSafe/aiohttp/blob/fa06acc2392c516491bdb25301ad3ef2b700ff5f/tests/test_web_websocket.py#L21-L45 # noqa self.app = mock.Mock() self.app._debug = False if headers is None: headers = CIMultiDict({ 'HOST': 'server.example.com', 'UPGRADE': 'websocket', 'CONNECTION': 'Upgrade', 'SEC-WEBSOCKET-KEY': 'dGhlIHNhbXBsZSBub25jZQ==', 'ORIGIN': 'http://example.com', 'SEC-WEBSOCKET-PROTOCOL': 'chat, superchat', 'SEC-WEBSOCKET-VERSION': '13' }) message = make_raw_request_message(method, path, headers) self.payload = mock.Mock() self.transport = mock.Mock() self.reader = mock.Mock() self.writer = mock.Mock() self.app.loop = self.loop self.app.on_response_prepare = Signal(self.app) req = Request(self.app, message, self.payload, self.transport, self.reader, self.writer) req._match_info = match_info return req
def make_request(self, method, path, query_params={}, headers=None, match_info=None): if query_params: path = '%s?%s' % (path, urllib.parse.urlencode(query_params)) # Ported from: # https://github.com/KeepSafe/aiohttp/blob/fa06acc2392c516491bdb25301ad3ef2b700ff5f/tests/test_web_websocket.py#L21-L45 # noqa self.app = mock.Mock() self.app._debug = False if headers is None: headers = CIMultiDict( {'HOST': 'server.example.com', 'UPGRADE': 'websocket', 'CONNECTION': 'Upgrade', 'SEC-WEBSOCKET-KEY': 'dGhlIHNhbXBsZSBub25jZQ==', 'ORIGIN': 'http://example.com', 'SEC-WEBSOCKET-PROTOCOL': 'chat, superchat', 'SEC-WEBSOCKET-VERSION': '13'}) message = make_raw_request_message(method, path, headers) self.payload = mock.Mock() self.transport = mock.Mock() self.reader = mock.Mock() self.writer = mock.Mock() self.app.loop = self.loop self.app.on_response_prepare = Signal(self.app) req = Request(self.app, message, self.payload, self.transport, self.reader, self.writer) req._match_info = match_info return req
def handle_request(self, message, payload): app = self._app request = Request(app, message, payload, self.transport, self.reader, self.writer) try: match_info = yield from self._router.resolve(request) assert isinstance(match_info, AbstractMatchInfo), match_info request._match_info = match_info handler = match_info.handler for factory in reversed(self._middlewares): handler = yield from factory(app, handler) resp = yield from handler(request) if not isinstance(resp, StreamResponse): raise RuntimeError( ("Handler {!r} should return response instance, " "got {!r} [middlewares {!r}]").format( match_info.handler, type(resp), self._middlewares)) except HTTPException as exc: resp = exc return resp
async def handle(self, request: web.Request) -> web.StreamResponse: match_info = await self.resolve(request) match_info.freeze() resp = None request._match_info = match_info expect = request.headers.get(hdrs.EXPECT) if expect: resp = await match_info.expect_handler(request) await request.writer.drain() if resp is None: handler = match_info.handler for middleware in self._middleware: handler = partial(middleware, handler=handler) resp = await handler(request) return resp