lib/moysklad/client/errors.rb in moysklad-0.2.0 vs lib/moysklad/client/errors.rb in moysklad-0.2.1
- old
+ new
@@ -2,22 +2,24 @@
class Errors
def self.build res
Moysklad.logger.warn "Moyskad::Client: #{res.status}: #{res.env.url.to_s}\n#{res.body}"
case res.status
- when 405
- raise MethodNotAllowedError.new res
when 401
raise UnauthorizedError.new res
+ when 403
+ raise ResourceForbidden.new res
when 404
raise NoResourceFound.new res.body
+ when 405
+ raise MethodNotAllowedError.new res
when 500
- raise ParsedError.new(res)
+ raise InternalServerError.new res
when 502
- raise HtmlParsedError.new(res)
+ raise BadGatewayError.new res
else
- raise ParsedError.new(res)
+ raise ParsedError.new res
end
end
end
end
@@ -44,31 +46,50 @@
private
def parse_title body
doc = Nokogiri::HTML body
- doc.css('body').css('h1').text
+ # у ResourceForbidden есть <u>
+ # у wrong_password <u> несколько
+ # Можно ошибку разбирать более грамотно по свойствам type, message, description: http://i.gyazo.com/e9d5d08bd610882d87f39d9002cdf25a.png
+ [doc.css('body').css('h1').text,doc.css('body').css('u').to_a.map(&:text).compact.last].join('; ')
rescue => err
- Moysklad.logger.debug "Moyskad::Client parse error #{err}: #{res.body}"
- body
+ Moysklad.logger.debug "Moyskad::Client parse error #{err}: #{body}"
+ body.force_encoding('utf-8')
end
end
class MethodNotAllowedError < HtmlParsedError
end
class UnauthorizedError < HtmlParsedError
end
+ class ResourceForbidden < HtmlParsedError
+ end
+
class ParsedError < Error
def initialize result
@status = result.status
@result = result
- @error = Moysklad::Entities::Error.parse result.body
- @message = @error.message
+ case result.headers['content-type']
+
+ when /application\/xml/
+ @error = Moysklad::Entities::Error.parse result.body
+ @message = @error.message
+ when /text\/html/
+ doc = Nokogiri::HTML body
+ @message = doc.css('body').css('h1').text
+ else
+ raise "Unknown content-type #{result.headers['content-type']} to parse error #{result.body}"
+ end
rescue => err
@message = "error in init #{err}: #{result.body}"
end
attr_reader :error
end
+
+
+ class BadGatewayError < HtmlParsedError; end
+ class InternalServerError < ParsedError; end
end