Пример #1
0
    def gather_parameters(self, request, response, context, api_version=None, **input_parameters):
        """Gathers and returns all parameters that will be used for this endpoint"""
        input_parameters.update(request.params)

        if self.parse_body and request.content_length:
            body = request.stream
            content_type, content_params = parse_content_type(request.content_type)
            body_formatter = body and self.inputs.get(content_type, self.api.http.input_format(content_type))
            if body_formatter:
                body = body_formatter(body, **content_params)
            if 'body' in self.all_parameters:
                input_parameters['body'] = body
            if isinstance(body, dict):
                input_parameters.update(body)
        elif 'body' in self.all_parameters:
            input_parameters['body'] = None

        if 'request' in self.all_parameters:
            input_parameters['request'] = request
        if 'response' in self.all_parameters:
            input_parameters['response'] = response
        if 'api_version' in self.all_parameters:
            input_parameters['api_version'] = api_version
        for parameter, directive in self.directives.items():
            arguments = (self.defaults[parameter], ) if parameter in self.defaults else ()
            input_parameters[parameter] = directive(*arguments, response=response, request=request,
                                                    api=self.api, api_version=api_version, context=context,
                                                    interface=self)
        return input_parameters
Пример #2
0
Файл: use.py Проект: zxy-zxy/hug
    def request(self, method, url, url_params=empty.dict, headers=empty.dict, timeout=None, **params):
        function = self.api.http.versioned.get(self.version, {}).get(url, None)
        if not function:
            function = self.api.http.versioned.get(None, {}).get(url, None)

        if not function:
            if 404 in self.raise_on:
                raise requests.HTTPError('404 Not Found occured for url: {0}'.format(url))
            return Response('Not Found', 404, {'content-type', 'application/json'})

        interface = function.interface.http
        response = falcon.Response()
        request = Request(None, None, empty.dict)
        context = self.api.context_factory(api=self.api, api_version=self.version, interface=interface)
        interface.set_response_defaults(response)

        params.update(url_params)
        params = interface.gather_parameters(request, response, context, api_version=self.version, **params)
        errors = interface.validate(params, context)
        if errors:
            interface.render_errors(errors, request, response)
        else:
            interface.render_content(interface.call_function(params), context, request, response)

        data = BytesIO(response.data)
        content_type, content_params = parse_content_type(response._headers.get('content-type', ''))
        if content_type in input_format:
            data = input_format[content_type](data, **content_params)

        status_code = int(''.join(re.findall('\d+', response.status)))
        if status_code in self.raise_on:
            raise requests.HTTPError('{0} occured for url: {1}'.format(response.status, url))

        return Response(data, status_code, response._headers)
Пример #3
0
    def request(self,
                method,
                url,
                url_params=empty.dict,
                headers=empty.dict,
                timeout=None,
                **params):
        url = "{0}/{1}".format(self.version,
                               url.lstrip("/")) if self.version else url
        kwargs = {"json" if self.json_transport else "params": params}
        response = self.session.request(method,
                                        self.endpoint + url.format(url_params),
                                        headers=headers,
                                        **kwargs)

        data = BytesIO(response.content)
        content_type, content_params = parse_content_type(
            response.headers.get("content-type", ""))
        if content_type in input_format:
            data = input_format[content_type](data, **content_params)

        if response.status_code in self.raise_on:
            raise requests.HTTPError("{0} {1} occured for url: {2}".format(
                response.status_code, response.reason, url))

        return Response(data, response.status_code, response.headers)
Пример #4
0
    def gather_parameters(self, request, response, context, api_version=None, **input_parameters):
        """Gathers and returns all parameters that will be used for this endpoint"""
        input_parameters.update(request.params)

        if self.parse_body and request.content_length:
            body = request.stream
            content_type, content_params = parse_content_type(request.content_type)
            body_formatter = body and self.inputs.get(content_type, self.api.http.input_format(content_type))
            if body_formatter:
                body = body_formatter(body, content_length=request.content_length, **content_params)
            if 'body' in self.all_parameters:
                input_parameters['body'] = body
            if isinstance(body, dict):
                input_parameters.update(body)
        elif 'body' in self.all_parameters:
            input_parameters['body'] = None

        if 'request' in self.all_parameters:
            input_parameters['request'] = request
        if 'response' in self.all_parameters:
            input_parameters['response'] = response
        if 'api_version' in self.all_parameters:
            input_parameters['api_version'] = api_version
        for parameter, directive in self.directives.items():
            arguments = (self.defaults[parameter], ) if parameter in self.defaults else ()
            input_parameters[parameter] = directive(*arguments, response=response, request=request,
                                                    api=self.api, api_version=api_version, context=context,
                                                    interface=self)
        return input_parameters
Пример #5
0
    def request(self,
                method,
                url,
                url_params=empty.dict,
                headers=empty.dict,
                timeout=None,
                **params):
        function = self.api.http.versioned.get(self.version, {}).get(url, None)
        if not function:
            function = self.api.http.versioned.get(None, {}).get(url, None)

        if not function:
            if 404 in self.raise_on:
                raise requests.HTTPError(
                    "404 Not Found occured for url: {0}".format(url))
            return Response("Not Found", 404,
                            {"content-type", "application/json"})

        interface = function.interface.http
        response = falcon.Response()
        request = Request(None, None, empty.dict)
        context = self.api.context_factory(api=self.api,
                                           api_version=self.version,
                                           interface=interface)
        interface.set_response_defaults(response)

        params.update(url_params)
        params = interface.gather_parameters(request,
                                             response,
                                             context,
                                             api_version=self.version,
                                             **params)
        errors = interface.validate(params, context)
        if errors:
            interface.render_errors(errors, request, response)
        else:
            interface.render_content(interface.call_function(params), context,
                                     request, response)

        data = BytesIO(response.data)
        content_type, content_params = parse_content_type(
            response._headers.get("content-type", ""))
        if content_type in input_format:
            data = input_format[content_type](data, **content_params)

        status_code = int("".join(re.findall("\d+", response.status)))
        if status_code in self.raise_on:
            raise requests.HTTPError("{0} occured for url: {1}".format(
                response.status, url))

        return Response(data, status_code, response._headers)
Пример #6
0
Файл: use.py Проект: zxy-zxy/hug
    def request(self, method, url, url_params=empty.dict, headers=empty.dict, timeout=None, **params):
        url = "{0}/{1}".format(self.version, url.lstrip('/')) if self.version else url
        kwargs = {'json' if self.json_transport else 'params': params}
        response = self.session.request(method, self.endpoint + url.format(url_params), headers=headers, **kwargs)

        data = BytesIO(response.content)
        content_type, content_params = parse_content_type(response.headers.get('content-type', ''))
        if content_type in input_format:
            data = input_format[content_type](data, **content_params)

        if response.status_code in self.raise_on:
            raise requests.HTTPError('{0} {1} occured for url: {2}'.format(response.status_code, response.reason, url))

        return Response(data, response.status_code, response.headers)