RestClientWrapper follows redirects
authorChristoph Helma <helma@in-silico.ch>
Thu, 29 Mar 2012 12:50:03 +0000 (14:50 +0200)
committerChristoph Helma <helma@in-silico.ch>
Thu, 29 Mar 2012 12:50:03 +0000 (14:50 +0200)
lib/error.rb
lib/opentox.rb
lib/rest-client-wrapper.rb

index e12f140..579f42b 100644 (file)
@@ -52,11 +52,12 @@ module OpenTox
   
   # Errors received from RestClientWrapper calls
   class RestCallError < Error
-    attr_accessor :request, :response
-    def initialize request, response, message
+    attr_accessor :request#, :response
+    def initialize message, request, uri
+    #def initialize request, response, message
       @request = request
-      @response = response
-      super 502, message, request.url
+      #@response = response
+      super 502, message, uri
     end
   end
 
@@ -78,7 +79,7 @@ module OpenTox
       cut_index = backtrace.size-1 if cut_index < 0
       @report[RDF::OT.errorDetails] = backtrace[0..cut_index].join("\n")
       @report[RDF::OT.errorDetails] += "REST paramenters:\n#{error.request.args.inspect}" if defined? error.request
-      @report[RDF::OT.message] += "\n" + error.response.body.to_s if defined? error.response
+      #@report[RDF::OT.message] += "\n" + error.response.body.to_s if defined? error.response
       # TODO fix Error cause
       # should point to another errorReport, but errorReports do not have URIs
       # create a separate service?
index 2232063..187eb08 100644 (file)
@@ -70,12 +70,6 @@ module OpenTox
     end
   end
 
-#  def to_hash
-#    hash = {}
-#    metadata.each{|k,v| v.is_a?(Array) ? hash[k.to_s] = v.collect{|i| i.to_s} : hash[k.to_s] = v.to_s}
-#    hash
-#  end
-
   def to_yaml
     @rdf.to_hash.to_yaml
   end
index 30292de..aa5d9c4 100644 (file)
@@ -34,13 +34,16 @@ module OpenTox
         headers.each{ |k,v| headers.delete(k) if v==nil } if headers #remove keys with empty values, as this can cause problems
         args[:headers] = headers 
 
-        # perform request
         @request = RestClient::Request.new(args)
-        # do not throw RestClient exceptions in order to create a @response object (needed for error reports) in every case
-        @response = @request.execute { |response, request, result| return response }
         # ignore error codes from Task services (may return error codes >= 400 according to API, which causes exceptions in RestClient and RDF::Reader)
-        raise OpenTox::RestCallError.new @request, @response, "Response code is #{@response.code}." unless @response.code < 400 or URI.task? uri
-        @response
+        @response = @request.execute do |response, request, result|
+          if [301, 302, 307].include? response.code and request.method == :get
+            response.follow_redirection(request, result)
+          else
+            raise OpenTox::RestCallError.new response.to_s, request, uri unless response.code < 400 or URI.task? uri
+            response
+          end
+        end
       end
     end