From 75b1d2a98c17d8ef86c3a7a974e1be5444c9fb20 Mon Sep 17 00:00:00 2001 From: Christoph Helma Date: Thu, 2 Aug 2012 23:33:11 +0200 Subject: error handling improved --- lib/error.rb | 22 ++++++---------------- lib/opentox-client.rb | 2 +- lib/rest-client-wrapper.rb | 43 ++++++++++++++++++++----------------------- 3 files changed, 27 insertions(+), 40 deletions(-) (limited to 'lib') diff --git a/lib/error.rb b/lib/error.rb index 84918b7..e58ed5d 100644 --- a/lib/error.rb +++ b/lib/error.rb @@ -5,12 +5,12 @@ class RuntimeError attr_accessor :http_code, :uri def initialize message, uri=nil super message - @uri = uri + @uri = uri.to_s.sub(%r{//.*:.*@},'//') # remove credentials from uri @http_code ||= 500 @rdf = RDF::Graph.new subject = RDF::Node.new @rdf << [subject, RDF.type, RDF::OT.ErrorReport] - @rdf << [subject, RDF::OT.actor, @uri.to_s] + @rdf << [subject, RDF::OT.actor, @uri] @rdf << [subject, RDF::OT.message, message.to_s] @rdf << [subject, RDF::OT.statusCode, @http_code] @rdf << [subject, RDF::OT.errorCode, self.class.to_s] @@ -57,27 +57,17 @@ module OpenTox end # OpenTox errors - { - "BadRequestError" => 400, - "NotAuthorizedError" => 401, - "NotFoundError" => 404, - "LockedError" => 423, - "InternalServerError" => 500, - "NotImplementedError" => 501, - "RestCallError" => 501, - "ServiceUnavailableError" => 503, - "TimeOutError" => 504, - }.each do |klass,code| + RestClientWrapper.known_errors.each do |error| # create error classes c = Class.new Error do define_method :initialize do |message, uri=nil| - super code, message, uri + super error[:code], message, uri end end - OpenTox.const_set klass,c + OpenTox.const_set error[:class],c # define global methods for raising errors, eg. bad_request_error - Object.send(:define_method, klass.underscore.to_sym) do |message,uri=nil| + Object.send(:define_method, error[:method]) do |message,uri=nil| raise c.new(message, uri) end end diff --git a/lib/opentox-client.rb b/lib/opentox-client.rb index 276d378..5f5a106 100644 --- a/lib/opentox-client.rb +++ b/lib/opentox-client.rb @@ -26,8 +26,8 @@ FALSE_REGEXP = /^(false|inactive|0|0.0|low tox|deactivating|non-carcinogen|non-m [ "overwrite.rb", - "error.rb", "rest-client-wrapper.rb", + "error.rb", "authorization.rb", "policy.rb", "otlogger.rb", diff --git a/lib/rest-client-wrapper.rb b/lib/rest-client-wrapper.rb index 387a01b..67a6264 100644 --- a/lib/rest-client-wrapper.rb +++ b/lib/rest-client-wrapper.rb @@ -18,13 +18,13 @@ module OpenTox # check input @subjectid = headers[:subjectid] ? headers[:subjectid] : nil bad_request_error "Invalid URI: '#{uri}'", uri unless URI.valid? uri - #not_found_error "URI '#{uri}' not found.", uri unless URI.accessible?(uri, @subjectid) unless URI.ssl?(uri) + #resource_not_found_error "URI '#{uri}' not found.", uri unless URI.accessible?(uri, @subjectid) unless URI.ssl?(uri) bad_request_error "Headers are not a hash: #{headers.inspect}", uri unless headers==nil or headers.is_a?(Hash) # make sure that no header parameters are set in the payload [:accept,:content_type,:subjectid].each do |header| if defined? $aa || URI(uri).host == URI($aa[:uri]).host else - bad_request_error "#{header} should be submitted in the headers" if payload and payload.is_a?(Hash) and payload[header] + bad_request_error "#{header} should be submitted in the headers", uri if payload and payload.is_a?(Hash) and payload[header] end end @@ -44,27 +44,11 @@ module OpenTox response.follow_redirection(request, result) elsif response.code >= 400 and !URI.task?(uri) message = response.to_s - message += "\nREST paramenters:\n#{request.args.inspect}" - case response.code - when 400 - bad_request_error message, uri - when 401 - not_authorized_error message, uri - when 404 - not_found_error message, uri - when 433 - locked_error message, uri - when 500 - internal_server_error message, uri - when 501 - not_implemented_error message, uri - when 503 - service_unavailable_error message, uri - when 504 - time_out_error message, uri - else - rest_call_error message, uri - end + parameters = request.args + parameters[:headers][:subjectid] = "REMOVED" if parameters[:headers] and parameters[:headers][:subjectid] + message += "\nREST paramenters:\n#{parameters.inspect}" + error = known_errors.collect{|e| e if e[:code] == response.code}.compact.first + Object.method(error[:method]).call message, uri # call error method else response end @@ -72,5 +56,18 @@ module OpenTox end end + def self.known_errors + errors = [] + RestClient::STATUSES.each do |code,k| + if code >= 400 + method = k.underscore.gsub(/ |'/,'_') + method += "_error" unless method.match(/_error$/) + klass = method.split("_").collect{|s| s.capitalize}.join("") + errors << {:code => code, :method => method.to_sym, :class => klass} + end + end + errors + end + end end -- cgit v1.2.3