Example #1
0
    def handle_api_error(self, rbody, rcode, resp, rheaders):
        try:
            err = resp['error']
        except (KeyError, TypeError):
            raise error.APIError(
                "Invalid response object from API: %r (HTTP response code "
                "was %d)" % (rbody, rcode), rbody, rcode, resp)

        if rcode in [400, 404]:
            raise error.InvalidRequestError(err.get('message'),
                                            err.get('param'), rbody, rcode,
                                            resp, rheaders)
        elif rcode == 401:
            raise error.AuthenticationError(err.get('message'), rbody, rcode,
                                            resp, rheaders)
        elif rcode == 402:
            raise error.CardError(err.get('message'), err.get('param'),
                                  err.get('code'), rbody, rcode, resp,
                                  rheaders)
        elif rcode == 429:
            raise error.RateLimitError(err.get('message'), rbody, rcode, resp,
                                       rheaders)
        else:
            raise error.APIError(err.get('message'), rbody, rcode, resp,
                                 rheaders)
Example #2
0
    def handle_api_error(self, rbody, rcode, resp, rheaders):
        try:
            err = resp['error']
        except (KeyError, TypeError):
            raise error.APIError(
                "Invalid response object from API: %r (HTTP response code "
                "was %d)" % (rbody, rcode),
                rbody, rcode, resp)

        # Rate limits were previously coded as 400's with code 'rate_limit'
        if rcode == 429 or (rcode == 400 and err.get('code') == 'rate_limit'):
            raise error.RateLimitError(
                err.get('message'), rbody, rcode, resp, rheaders)
        elif rcode in [400, 404]:
            raise error.InvalidRequestError(
                err.get('message'), err.get('param'),
                rbody, rcode, resp, rheaders)
        elif rcode == 401:
            raise error.AuthenticationError(
                err.get('message'), rbody, rcode, resp,
                rheaders)
        elif rcode == 402:
            raise error.CardError(err.get('message'), err.get('param'),
                                  err.get('code'), rbody, rcode, resp,
                                  rheaders)
        elif rcode == 403:
            raise error.PermissionError(
                err.get('message'), rbody, rcode, resp,
                rheaders)
        else:
            raise error.APIError(err.get('message'), rbody, rcode, resp,
                                 rheaders)
    def handle_error_response(self, rbody, rcode, resp, rheaders):
        try:
            error_data = resp["error"]
        except (KeyError, TypeError):
            raise error.APIError(
                "Invalid response object from API: %r (HTTP response code "
                "was %d)" % (rbody, rcode),
                rbody,
                rcode,
                resp,
            )

        err = None

        # OAuth errors are a JSON object where `error` is a string. In
        # contrast, in API errors, `error` is a hash with sub-keys. We use
        # this property to distinguish between OAuth and API errors.
        if isinstance(error_data, six.string_types):
            err = self.specific_oauth_error(rbody, rcode, resp, rheaders,
                                            error_data)

        if err is None:
            err = self.specific_api_error(rbody, rcode, resp, rheaders,
                                          error_data)

        raise err
Example #4
0
    def specific_api_error(self, rbody, rcode, resp, rheaders, error_data):
        util.log_info(
            'Stripe API error received',
            error_code=error_data.get('code'),
            error_type=error_data.get('type'),
            error_message=error_data.get('message'),
            error_param=error_data.get('param'),
        )

        # Rate limits were previously coded as 400's with code 'rate_limit'
        if rcode == 429 or (rcode == 400 and
                            error_data.get('code') == 'rate_limit'):
            return error.RateLimitError(
                error_data.get('message'), rbody, rcode, resp, rheaders)
        elif rcode in [400, 404]:
            return error.InvalidRequestError(
                error_data.get('message'), error_data.get('param'),
                error_data.get('code'), rbody, rcode, resp, rheaders)
        elif rcode == 401:
            return error.AuthenticationError(
                error_data.get('message'), rbody, rcode, resp, rheaders)
        elif rcode == 402:
            return error.CardError(
                error_data.get('message'), error_data.get('param'),
                error_data.get('code'), rbody, rcode, resp, rheaders)
        elif rcode == 403:
            return error.PermissionError(
                error_data.get('message'), rbody, rcode, resp, rheaders)
        else:
            return error.APIError(
                error_data.get('message'), rbody, rcode, resp, rheaders)
Example #5
0
    def handle_api_error(self, rbody, rcode, resp, rheaders):
        try:
            err_type = resp['error']
        except (KeyError, TypeError):
            raise error.APIError(
                "Invalid response object from API: %r (HTTP response code "
                "was %d)" % (rbody, rcode), rbody, rcode, resp)

        description = resp.get('error_description', None)
        raise error.OAuthError(err_type, description, rbody, rcode, resp,
                               rheaders)
Example #6
0
    def specific_api_error(self, rbody, rcode, resp, rheaders, error_data):
        util.log_info(
            "Stripe API error received",
            error_code=error_data.get("code"),
            error_type=error_data.get("type"),
            error_message=error_data.get("message"),
            error_param=error_data.get("param"),
        )

        # Rate limits were previously coded as 400's with code 'rate_limit'
        if rcode == 429 or (
            rcode == 400 and error_data.get("code") == "rate_limit"
        ):
            return error.RateLimitError(
                error_data.get("message"), rbody, rcode, resp, rheaders
            )
        elif rcode in [400, 404]:
            if error_data.get("type") == "idempotency_error":
                return error.IdempotencyError(
                    error_data.get("message"), rbody, rcode, resp, rheaders
                )
            else:
                return error.InvalidRequestError(
                    error_data.get("message"),
                    error_data.get("param"),
                    error_data.get("code"),
                    rbody,
                    rcode,
                    resp,
                    rheaders,
                )
        elif rcode == 401:
            return error.AuthenticationError(
                error_data.get("message"), rbody, rcode, resp, rheaders
            )
        elif rcode == 402:
            return error.CardError(
                error_data.get("message"),
                error_data.get("param"),
                error_data.get("code"),
                rbody,
                rcode,
                resp,
                rheaders,
            )
        elif rcode == 403:
            return error.PermissionError(
                error_data.get("message"), rbody, rcode, resp, rheaders
            )
        else:
            return error.APIError(
                error_data.get("message"), rbody, rcode, resp, rheaders
            )
Example #7
0
 def interpret_response(self, rbody, rcode):
     try:
         if hasattr(rbody, 'decode'):
             rbody = rbody.decode('utf-8')
         resp = util.json.loads(rbody)
     except Exception:
         raise error.APIError(
             "Invalid response body from API: %s "
             "(HTTP response code was %d)" % (rbody, rcode), rbody, rcode)
     if not (200 <= rcode < 300):
         self.handle_api_error(rbody, rcode, resp)
     return resp
Example #8
0
    def interpret_response(self, rbody, rcode, rheaders):
        try:
            if hasattr(rbody, 'decode'):
                rbody = rbody.decode('utf-8')
            resp = StripeResponse(rbody, rcode, rheaders)
        except Exception:
            raise error.APIError(
                "Invalid response body from API: %s "
                "(HTTP response code was %d)" % (rbody, rcode), rbody, rcode,
                rheaders)
        if not (200 <= rcode < 300):
            self.handle_error_response(rbody, rcode, resp.data, rheaders)

        return resp
Example #9
0
 def interpret_response(self, rbody, rcode, rheaders):
     try:
         if hasattr(rbody, "decode"):
             rbody = rbody.decode("utf-8")
         resp = StripeResponse(rbody, rcode, rheaders)
     except Exception:
         raise error.APIError(
             "Invalid response body from API: %s "
             "(HTTP response code was %d)" % (rbody, rcode),
             rbody,
             rcode,
             rheaders,
         )
     if self._should_handle_code_as_error(rcode):
         self.handle_error_response(rbody, rcode, resp.data, rheaders)
     return resp
Example #10
0
 def interpret_response(self, rbody, rcode, rheaders):
     try:
         if hasattr(rbody, 'decode'):
             rbody = rbody.decode('utf-8')
         resp = util.json.loads(rbody)
     except Exception:
         raise error.APIError(
             "Invalid response body from API: %s "
             "(HTTP response code was %d)" % (rbody, rcode),
             rbody, rcode, rheaders)
     if not (200 <= rcode < 300):
         util.log_info(
             'Stripe API error received',
             error=resp.get('error'),
             error_description=resp.get('error_description', ''),
         )
         self.handle_api_error(rbody, rcode, resp, rheaders)
     return resp