コード例 #1
0
    def _send(self, request):
        response = self.client.http.send(request)

        if response is None:
            if self.exceptions:
                raise RequestFailedError('No response available')

            log.warning('Request failed (no response returned)')
            return None

        if response.status_code < 200 or response.status_code >= 300:
            log_request_error(log, response)

            # Raise an exception (if enabled)
            if self.exceptions:
                if response.status_code >= 500:
                    raise ServerError(response)
                else:
                    raise ClientError(response)

            return None

        # Update pagination state
        self.per_page = try_convert(response.headers.get('x-pagination-limit'), int)
        self.total_items = try_convert(response.headers.get('x-pagination-item-count'), int)
        self.total_pages = try_convert(response.headers.get('x-pagination-page-count'), int)

        return response
コード例 #2
0
ファイル: executors.py プロジェクト: jmolinski/traktpy
    def _delegate_to_interface(
            self, **kwargs) -> Union[ApiResponse, PaginationIterator[T]]:
        matching_paths = self.find_matching_path()

        if len(matching_paths) != 1:
            raise ClientError("Invalid call: matching paths # has to be 1")

        path, interface_handler = matching_paths[0]

        return interface_handler(**kwargs)
コード例 #3
0
    def get_data(response, exceptions=False, parse=True):
        if response is None:
            return None

        # Return response, if parse=False
        if not parse:
            return response

        # Parse response, return data
        content_type = response.headers.get('content-type')

        if content_type and content_type.startswith('application/json'):
            # Try parse json response
            try:
                data = response.json()
            except Exception as e:
                log.warning('unable to parse JSON response: %s', e)
                return None
        else:
            log.debug(
                'response returned content-type: %r, falling back to raw data',
                content_type)

            # Fallback to raw content
            data = response.content

        # Check status code, log any errors
        error = False

        if response.status_code < 200 or response.status_code >= 300:
            # Lookup status code in trakt error definitions
            name, desc = ERRORS.get(response.status_code,
                                    ("Unknown", "Unknown"))

            log.warning('request failed: %s - "%s" (code: %s)', name, desc,
                        response.status_code)

            if exceptions:
                # Raise an exception (including the response for further processing)
                if response.status_code >= 500:
                    raise ServerError(response)
                else:
                    raise ClientError(response)

            # Set error flag
            error = True

        # Return `None` if we encountered an error, return response data
        if error:
            return None

        return data
コード例 #4
0
    def get_data(self, response, exceptions=False, parse=True):
        if response is None:
            if exceptions:
                raise RequestFailedError('No response available')

            log.warning('Request failed (no response returned)')
            return None

        # Return response, if parsing is disabled or pagination is enabled
        if not parse or isinstance(response, PaginationIterator):
            return response

        # Check status code, log any errors
        error = False

        if response.status_code < 200 or response.status_code >= 300:
            log_request_error(log, response)

            # Raise an exception (if enabled)
            if exceptions:
                if response.status_code >= 500:
                    raise ServerError(response)
                else:
                    raise ClientError(response)

            # Set error flag
            error = True

        # Return `None` if we encountered an error, return response data
        if error:
            return None

        # Parse response, return data
        content_type = response.headers.get('content-type')

        if content_type and content_type.startswith('application/json'):
            # Try parse json response
            try:
                data = response.json()
            except Exception as e:
                log.warning('unable to parse JSON response: %s', e)
                return None
        else:
            log.debug(
                'response returned content-type: %r, falling back to raw data',
                content_type)

            # Fallback to raw content
            data = response.content

        return data
コード例 #5
0
    def get_path_and_qargs(self) -> Tuple[str, Dict[str, Any]]:
        if not self.is_bound():  # pragma: no cover
            raise ClientError("call .is_valid first!")

        parts = [self._get_param_value(p) for p in self.params]
        parts = [str(p) for p in parts if p]  # omit None (empty optional params)

        qargs = {
            q: self.__bound_kwargs[q] for q in self.qargs if q in self.__bound_kwargs
        }

        qargs.update(self._get_parsed_filters())

        if "extended" in self.__bound_kwargs and self.__bound_kwargs["extended"]:
            if self.__bound_kwargs["extended"] is True:
                # if len(self.extended) == 1 setting extended=True
                # sets it to the proper val (meta or full)
                self.__bound_kwargs["extended"] = self.extended[0]

            qargs["extended"] = self.__bound_kwargs["extended"]

        qargs = {k: self._stringify_param(v) for k, v in qargs.items()}

        return "/".join(parts), qargs
コード例 #6
0
    def get_data(self, response, exceptions=False, pagination=False, parse=True):
        if response is None:
            if exceptions:
                raise RequestFailedError('No response available')

            log.warn('Request failed (no response returned)')
            return None

        # Return response, if parse=False
        if not parse:
            return response

        # Check status code, log any errors
        error = False

        if response.status_code < 200 or response.status_code >= 300:
            log_request_error(log, response)

            # Raise an exception (if enabled)
            if exceptions:
                if response.status_code >= 500:
                    raise ServerError(response)
                else:
                    raise ClientError(response)

            # Set error flag
            error = True

        # Return `None` if we encountered an error, return response data
        if error:
            return None

        # Check for pagination response
        page_count = try_convert(response.headers.get('x-pagination-page-count'), int)

        if page_count and page_count > 1:
            if pagination:
                return PaginationIterator(self.client, response)

            warnings.warn(
                'Unhandled pagination response, more pages can be returned with `pagination=True`',
                stacklevel=3
            )

        # Parse response, return data
        content_type = response.headers.get('content-type')

        if content_type and content_type.startswith('application/json'):
            # Try parse json response
            try:
                data = response.json()
            except Exception as e:
                log.warning('unable to parse JSON response: %s', e)
                return None
        else:
            log.debug('response returned content-type: %r, falling back to raw data', content_type)

            # Fallback to raw content
            data = response.content

        return data