From: Michal Fojtik <[email protected]>

Signed-off-by: Michal fojtik <[email protected]>
---
 client/lib/deltacloud.rb         |   18 +++++++++++-------
 server/views/errors/500.xml.haml |    5 ++---
 2 files changed, 13 insertions(+), 10 deletions(-)

diff --git a/client/lib/deltacloud.rb b/client/lib/deltacloud.rb
index 55cd854..b782509 100644
--- a/client/lib/deltacloud.rb
+++ b/client/lib/deltacloud.rb
@@ -359,7 +359,7 @@ module DeltaCloud
       if conf[:method].eql?(:post)
         resource = RestClient::Resource.new(conf[:path], :open_timeout => 
conf[:open_timeout], :timeout => conf[:timeout])
         resource.send(:post, conf[:form_data], 
default_headers.merge(extended_headers)) do |response, request, block|
-          handle_backend_error(response) if [500, 502].include? response.code
+          handle_backend_error(response) if [500, 502, 501].include? 
response.code
           if response.respond_to?('body')
             yield response.body if block_given?
           else
@@ -369,7 +369,7 @@ module DeltaCloud
       else
         resource = RestClient::Resource.new(conf[:path], :open_timeout => 
conf[:open_timeout], :timeout => conf[:timeout])
         resource.send(conf[:method], default_headers.merge(extended_headers)) 
do |response, request, block|
-          handle_backend_error(response) if [500, 502].include? response.code
+          handle_backend_error(response) if [500, 502, 501].include? 
response.code
           if conf[:method].eql?(:get) and [301, 302, 307].include? 
response.code
             response.follow_redirection(request) do |response, request, block|
               if response.respond_to?('body')
@@ -392,16 +392,20 @@ module DeltaCloud
     # Re-raise backend errors as on exception in client with message from
     # backend
     class BackendError < StandardError
+
       def initialize(opts={})
-        @message = "[#{opts[:code]}] #{opts[:message]}"
-      end
-      def message
-        @message
+        super("#{opts[:code]} : #{opts[:message]}")
+        set_backtrace(opts[:backtrace].split("\n").map { |l| l.strip }[0..10]) 
if opts[:backtrace]
       end
+
     end
 
     def handle_backend_error(response)
-      raise BackendError.new(:message => 
(Nokogiri::XML(response)/'error/message').text, :code => response.code)
+      response_xml = Nokogiri::XML(response)
+      backtrace = (response_xml/'error/backtrace').empty? ? nil : 
(response_xml/'error/backtrace').text
+      raise BackendError.new(:message => (response_xml/'error/message').text,
+                             :code => response.code,
+                             :backtrace => backtrace)
     end
 
     # Check if specified collection have wanted feature
diff --git a/server/views/errors/500.xml.haml b/server/views/errors/500.xml.haml
index 0827986..5c111e8 100644
--- a/server/views/errors/500.xml.haml
+++ b/server/views/errors/500.xml.haml
@@ -3,10 +3,9 @@
   %backend{ :driver => driver_symbol, :provider => 
"#{Thread::current[:provider] || ENV['API_PROVIDER'] || 'default'}" }
     %code=response.status
   %message< #{cdata @error.message}
+  - if @error.respond_to? :backtrace
+    %backtrace=cdata @error.backtrace.join("\n")
   - if params
     %request
       - params.each do |k, v|
         %param{ :name => k}=v
-  - if @error.respond_to? :backtrace
-    %[email protected]("\n")
-
-- 
1.7.4.4

Reply via email to