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