예제 #1
0
 async def wrapper(request: ConnexionRequest):
     if "Authorization" not in request.headers:
         # Otherwise we will never reach self.extract_token and self._set_user
         request.headers = CIMultiDict(request.headers)
         request.headers["Authorization"] = "Bearer null"
     token_info = get_authorization_info(auth_funcs, request,
                                         required_scopes)
     # token_info = {"token": <token>} at this point, now do the real work
     await self._set_user(request.context, token_info["token"])
     return await function(request)
예제 #2
0
    def get_request(cls, req):
        """Convert aiohttp request to connexion

        :param req: instance of aiohttp.web.Request
        :return: connexion request instance
        :rtype: ConnexionRequest
        """
        url = str(req.url)
        logger.debug('Getting data and status code',
                     extra={
                         'has_body': req.has_body,
                         'url': url
                     })

        query = parse_qs(req.rel_url.query_string)
        headers = {k.decode(): v.decode() for k, v in req.raw_headers}
        body = None
        if req.can_read_body:
            body = yield from req.read()

        return ConnexionRequest(url=url,
                                method=req.method.lower(),
                                path_params=dict(req.match_info),
                                query=query,
                                headers=headers,
                                body=body,
                                json_getter=lambda: cls.jsonifier.loads(body),
                                files={},
                                context=req)
예제 #3
0
    def get_request(cls, *args, **params):
        # type: (*Any, **Any) -> ConnexionRequest
        """Gets ConnexionRequest instance for the operation handler
        result. Status Code and Headers for response.  If only body
        data is returned by the endpoint function, then the status
        code will be set to 200 and no headers will be added.

        If the returned object is a flask.Response then it will just
        pass the information needed to recreate it.

        :rtype: ConnexionRequest
        """
        context_dict = {}
        setattr(flask._request_ctx_stack.top, 'connexion_context', context_dict)
        flask_request = flask.request
        request = ConnexionRequest(
            flask_request.url,
            flask_request.method,
            headers=flask_request.headers,
            form=flask_request.form,
            query=flask_request.args,
            body=flask_request.get_data(),
            json_getter=lambda: flask_request.get_json(silent=True),
            files=flask_request.files,
            path_params=params,
            context=context_dict
        )
        logger.debug('Getting data and status code',
                     extra={
                         'data': request.body,
                         'data_type': type(request.body),
                         'url': request.url
                     })
        return request
예제 #4
0
    def get_request(cls, req):
        """Convert aiohttp request to connexion

        :param req: instance of aiohttp.web.Request
        :return: connexion request instance
        :rtype: ConnexionRequest
        """
        url = str(req.url)
        logger.debug('Getting data and status code',
                     extra={'has_body': req.has_body, 'url': url})

        query = parse_qs(req.rel_url.query_string)
        headers = req.headers
        body = None
        if req.body_exists:
            body = yield from req.read()

        data = yield from req.post()
        files = {k: v for k, v in data.items() if isinstance(v, FileField)}

        return ConnexionRequest(url=url,
                                method=req.method.lower(),
                                path_params=dict(req.match_info),
                                query=query,
                                headers=headers,
                                body=body,
                                json_getter=lambda: cls.jsonifier.loads(body),
                                files=files,
                                context=req)
예제 #5
0
def test_apiuriparser_call(q_value):
    query_dict.update({'q': q_value})
    uri_parser = APIUriParser({}, {})
    function = MagicMock()
    request = ConnexionRequest(url=q_value,
                               method='method_value',
                               query=query_dict)
    expected_request = ConnexionRequest(
        url=q_value,
        method='method_value',
        query={
            k: v.lower() if k in LOWER_FIELDS else v
            for k, v in query_dict.items()
        })
    # uri_parser(function)(request):
    # It's calling the __call__ class method.
    # The wrapper is being parametrized by the second parameter between brackets.
    if ';' in q_value:
        with pytest.raises(APIError, match='2009 .*'):
            uri_parser(function)(request)
    else:
        uri_parser(function)(request)
        assert request.query == expected_request.query