Merge pull request #262 from stripe/request-ids

Add request IDs to all API errors
This commit is contained in:
Kyle Conroy 2015-07-02 14:33:12 -07:00
commit 8b0a074cbf
5 changed files with 40 additions and 26 deletions

View File

@ -139,8 +139,8 @@ module Stripe
raise
end
rescue RestClient::ExceptionWithResponse => e
if rcode = e.http_code and rbody = e.http_body
handle_api_error(rcode, rbody)
if e.response
handle_api_error(e.response)
else
handle_restclient_error(e, api_base_url)
end
@ -241,45 +241,46 @@ module Stripe
"(HTTP response code was #{rcode})", rcode, rbody)
end
def self.handle_api_error(rcode, rbody)
def self.handle_api_error(resp)
begin
error_obj = JSON.parse(rbody)
error_obj = JSON.parse(resp.body)
error_obj = Util.symbolize_names(error_obj)
error = error_obj[:error] or raise StripeError.new # escape from parsing
rescue JSON::ParserError, StripeError
raise general_api_error(rcode, rbody)
raise general_api_error(resp.code, resp.body)
end
case rcode
case resp.code
when 400, 404
raise invalid_request_error error, rcode, rbody, error_obj
raise invalid_request_error(error, resp, error_obj)
when 401
raise authentication_error error, rcode, rbody, error_obj
raise authentication_error(error, resp, error_obj)
when 402
raise card_error error, rcode, rbody, error_obj
raise card_error(error, resp, error_obj)
else
raise api_error error, rcode, rbody, error_obj
raise api_error(error, resp, error_obj)
end
end
def self.invalid_request_error(error, rcode, rbody, error_obj)
InvalidRequestError.new(error[:message], error[:param], rcode,
rbody, error_obj)
def self.invalid_request_error(error, resp, error_obj)
InvalidRequestError.new(error[:message], error[:param], resp.code,
resp.body, error_obj, resp.headers)
end
def self.authentication_error(error, rcode, rbody, error_obj)
AuthenticationError.new(error[:message], rcode, rbody, error_obj)
def self.authentication_error(error, resp, error_obj)
AuthenticationError.new(error[:message], resp.code, resp.body, error_obj,
resp.headers)
end
def self.card_error(error, rcode, rbody, error_obj)
def self.card_error(error, resp, error_obj)
CardError.new(error[:message], error[:param], error[:code],
rcode, rbody, error_obj)
resp.code, resp.body, error_obj, resp.headers)
end
def self.api_error(error, rcode, rbody, error_obj)
APIError.new(error[:message], rcode, rbody, error_obj)
def self.api_error(error, resp, error_obj)
APIError.new(error[:message], resp.code, resp.body, error_obj, resp.headers)
end
def self.handle_restclient_error(e, api_base_url=nil)

View File

@ -2,8 +2,9 @@ module Stripe
class CardError < StripeError
attr_reader :param, :code
def initialize(message, param, code, http_status=nil, http_body=nil, json_body=nil)
super(message, http_status, http_body, json_body)
def initialize(message, param, code, http_status=nil, http_body=nil, json_body=nil,
http_headers=nil)
super(message, http_status, http_body, json_body, http_headers)
@param = param
@code = code
end

View File

@ -2,8 +2,9 @@ module Stripe
class InvalidRequestError < StripeError
attr_accessor :param
def initialize(message, param, http_status=nil, http_body=nil, json_body=nil)
super(message, http_status, http_body, json_body)
def initialize(message, param, http_status=nil, http_body=nil, json_body=nil,
http_headers=nil)
super(message, http_status, http_body, json_body, http_headers)
@param = param
end
end

View File

@ -3,18 +3,24 @@ module Stripe
attr_reader :message
attr_reader :http_status
attr_reader :http_body
attr_reader :http_headers
attr_reader :request_id
attr_reader :json_body
def initialize(message=nil, http_status=nil, http_body=nil, json_body=nil)
def initialize(message=nil, http_status=nil, http_body=nil, json_body=nil,
http_headers=nil)
@message = message
@http_status = http_status
@http_body = http_body
@http_headers = http_headers || {}
@json_body = json_body
@request_id = @http_headers[:request_id]
end
def to_s
status_string = @http_status.nil? ? "" : "(Status #{@http_status}) "
"#{status_string}#{@message}"
id_string = @request_id.nil? ? "" : "(Request #{@request_id}) "
"#{status_string}#{id_string}#{@message}"
end
end
end

View File

@ -5,9 +5,14 @@ module Stripe
# can't just use the stubs interface.
body = JSON.generate(body) if !(body.kind_of? String)
m = mock
m.instance_variable_set('@stripe_values', { :body => body, :code => code })
m.instance_variable_set('@stripe_values', {
:body => body,
:code => code,
:headers => {},
})
def m.body; @stripe_values[:body]; end
def m.code; @stripe_values[:code]; end
def m.headers; @stripe_values[:headers]; end
m
end