summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristoph Helma <helma@in-silico.ch>2012-08-02 23:33:11 +0200
committerChristoph Helma <helma@in-silico.ch>2012-08-02 23:33:11 +0200
commit75b1d2a98c17d8ef86c3a7a974e1be5444c9fb20 (patch)
tree650b0c673387ad54f4f6083a79adc3f435e9ae56
parent32ad3c8f6e1e16cfe9fd59a47df6b560ffb13ddd (diff)
error handling improved
-rw-r--r--lib/error.rb22
-rw-r--r--lib/opentox-client.rb2
-rw-r--r--lib/rest-client-wrapper.rb43
3 files changed, 27 insertions, 40 deletions
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