From b6bfebb518edf17abac7c6061eaf1a121ba1134d Mon Sep 17 00:00:00 2001 From: davor Date: Mon, 12 Aug 2013 15:03:50 +0200 Subject: Replaced ResourceNotFoundError in HEAD request to reduce Error messages (e.g. incase of URI.accessible?) --- lib/4store.rb | 13 +++++++------ lib/opentox.rb | 40 ++++++++++++++++++++-------------------- 2 files changed, 27 insertions(+), 26 deletions(-) diff --git a/lib/4store.rb b/lib/4store.rb index 8e5cb13..86f74f6 100644 --- a/lib/4store.rb +++ b/lib/4store.rb @@ -18,7 +18,8 @@ module OpenTox def self.head uri sparql = "SELECT DISTINCT ?g WHERE {GRAPH ?g {<#{uri}> ?p ?o.} }" rdf = query sparql, 'application/sparql-results+xml' - resource_not_found_error "#{uri} not found." unless rdf.match("#{uri}") + #resource_not_found_error "#{uri} not found." unless rdf.match("#{uri}") + return nil unless rdf.match("#{uri}") rdf end @@ -32,7 +33,7 @@ module OpenTox def self.post uri, rdf, mime_type bad_request_error "'#{mime_type}' is not a supported content type. Please use one of #{@@content_type_formats.join(", ")}." unless @@content_type_formats.include? mime_type or mime_type == "multipart/form-data" - bad_request_error "Request body empty." unless rdf + bad_request_error "Request body empty." unless rdf mime_type = "application/x-turtle" if mime_type == "text/plain" # ntriples is turtle in 4store RestClient.post File.join(four_store_uri,"data")+"/", :data => rdf.gsub(/\\C/,'C'), :graph => uri, "mime-type" => mime_type # remove backslashes in SMILES (4store interprets them as UTF-8 \C even within single quotes) update "INSERT DATA { GRAPH <#{uri}> { <#{uri}> <#{RDF::DC.modified}> \"#{DateTime.now}\" } }" @@ -40,7 +41,7 @@ module OpenTox def self.put uri, rdf, mime_type bad_request_error "'#{mime_type}' is not a supported content type. Please use one of #{@@content_type_formats.join(", ")}." unless @@content_type_formats.include? mime_type - bad_request_error "Reqest body empty." unless rdf + bad_request_error "Reqest body empty." unless rdf mime_type = "application/x-turtle" if mime_type == "text/plain" RestClientWrapper.put File.join(four_store_uri,"data",uri), rdf, :content_type => mime_type update "INSERT DATA { GRAPH <#{uri}> { <#{uri}> <#{RDF::DC.modified}> \"#{DateTime.now}\" } }" @@ -82,7 +83,7 @@ module OpenTox end elsif sparql =~ /CONSTRUCT/i case mime_type - when "text/plain", "application/rdf+xml" + when "text/plain", "application/rdf+xml" RestClient.get(sparql_uri, :params => { :query => sparql }, :accept => mime_type).body when /turtle/ nt = RestClient.get(sparql_uri, :params => { :query => sparql }, :accept => "text/tab-separated-values").body # 4store returns ntriples for turtle @@ -130,11 +131,11 @@ module OpenTox $four_store[:uri].sub(%r{//},"//#{$four_store[:user]}:#{$four_store[:password]}@") end - def self.sparql_uri + def self.sparql_uri File.join(four_store_uri, "sparql") + '/' end - def self.update_uri + def self.update_uri File.join(four_store_uri, "update") + '/' end diff --git a/lib/opentox.rb b/lib/opentox.rb index 4143414..b99fe92 100644 --- a/lib/opentox.rb +++ b/lib/opentox.rb @@ -1,12 +1,12 @@ require 'sinatra/base' -require "sinatra/reloader" +require "sinatra/reloader" ENV["RACK_ENV"] ||= "production" require File.join(ENV["HOME"],".opentox","config","default.rb") if File.exist? File.join(ENV["HOME"],".opentox","config","default.rb") require File.join(ENV["HOME"],".opentox","config","#{SERVICE}.rb") $aa[SERVICE.to_sym] = $aa logfile = File.join(ENV['HOME'], ".opentox","log","#{ENV["RACK_ENV"]}.log") -$logger = OTLogger.new(logfile) +$logger = OTLogger.new(logfile) module OpenTox @@ -32,9 +32,9 @@ module OpenTox get_subjectid if respond_to? :get_subjectid # fix for IE, and set accept to 'text/html' as we do exact-matching later (sth. like text/html,application/xhtml+xml,*/* is not supported) request.env['HTTP_ACCEPT'] = "text/html" if request.env["HTTP_USER_AGENT"]=~/MSIE/ or request.env['HTTP_ACCEPT']=~/text\/html/ - # support set accept via url by adding ?media= to the url + # support set accept via url by adding ?media= to the url request.env['HTTP_ACCEPT'] = request.params["media"] if request.params["media"] - # default is turtle + # default is turtle request.env['HTTP_ACCEPT'] = "text/turtle" if request.env['HTTP_ACCEPT'].size==0 or request.env['HTTP_ACCEPT']=~/\*\/\*/ @accept = request.env['HTTP_ACCEPT'] @@ -52,7 +52,7 @@ module OpenTox helpers do def parse_input - case request.content_type + case request.content_type when /multipart/ if params[:file] @body = params[:file][:tempfile].read @@ -95,29 +95,29 @@ module OpenTox content_type "text/plain" object.to_ntriples end - + end end end - - - # ERROR HANDLING (for errors outside of tasks, errors inside of tasks are taken care of in Task.run) + + + # ERROR HANDLING (for errors outside of tasks, errors inside of tasks are taken care of in Task.run) def return_ot_error(ot_error) case @accept when /text\/html/ content_type "text/html" halt ot_error.http_code, ot_error.to_turtle.to_html else - content_type "text/turtle" + content_type "text/turtle" halt ot_error.http_code, ot_error.to_turtle end end - - error Exception do # wraps non-opentox-errors like NoMethodError within an InternalServerError + + error Exception do # wraps non-opentox-errors like NoMethodError within an InternalServerError error = request.env['sinatra.error'] return_ot_error(OpenTox::Error.new(500,error.message,nil,error.backtrace)) end - + error OpenTox::Error do # this covers all opentox errors return_ot_error(request.env['sinatra.error']) end @@ -134,7 +134,7 @@ module OpenTox when /html/ response['Content-Type'] = "text/html" # html -> task created with html form -> redirect to task uri - redirect task.uri + redirect task.uri else # default /uri-list/ response['Content-Type'] = "text/uri-list" if task.completed? @@ -143,7 +143,7 @@ module OpenTox halt task.code,task.uri+"\n" end end - end + end # Default methods, may be overwritten by derived services # see http://jcalcote.wordpress.com/2008/10/16/put-or-post-the-rest-of-the-story/ @@ -156,7 +156,7 @@ module OpenTox # HEAD request for object in backend # algorithm, dataset, compound and validation overwrite this head "/#{SERVICE}/:id/?" do - resource_not_found_error "#{uri} not found." unless FourStore.head(@uri.split('?').first) + halt 404 unless FourStore.head(@uri.split('?').first) end # Get a list of objects at the server or perform a SPARQL query @@ -164,7 +164,7 @@ module OpenTox if params[:query] case @accept when "text/uri-list" # result URIs are protected by A+A - FourStore.query(params[:query], "text/uri-list") + FourStore.query(params[:query], "text/uri-list") else # prevent searches for protected resources bad_request_error "Accept header '#{@accept}' is disabled for SPARQL queries at service URIs in order to protect private data. Use 'text/uri-list' and repeat the query at the result URIs.", uri("/#{SERVICE}") end @@ -175,9 +175,9 @@ module OpenTox # internal route not in API get "/#{SERVICE}/last/ordered/?" do - FourStore.query("SELECT DISTINCT ?s WHERE - {GRAPH ?g - {?s <#{RDF.type}> <#{RDF::OT}#{SERVICE.capitalize}>; <#{RDF::DC.date}> ?o. } + FourStore.query("SELECT DISTINCT ?s WHERE + {GRAPH ?g + {?s <#{RDF.type}> <#{RDF::OT}#{SERVICE.capitalize}>; <#{RDF::DC.date}> ?o. } } ORDER BY ?o ", @accept) end -- cgit v1.2.3