From 644f734a1c41b129e8f60345f76886a77abb11b2 Mon Sep 17 00:00:00 2001 From: Wesley Beary Date: Wed, 19 Aug 2009 19:10:59 -0700 Subject: [PATCH] better error messages --- lib/fog/connection.rb | 18 +++++++++++++----- lib/fog/errors.rb | 16 +++++++++++++++- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/lib/fog/connection.rb b/lib/fog/connection.rb index 526d6ee5a..9b0ac92f8 100644 --- a/lib/fog/connection.rb +++ b/lib/fog/connection.rb @@ -46,6 +46,9 @@ unless Fog.mocking? response = Fog::Response.new response.request = params response.status = @connection.readline[9..11].to_i + if params[:expects] && params[:expects] != response.status + error = true + end while true data = @connection.readline.chomp! if data == "" @@ -55,8 +58,13 @@ unless Fog.mocking? response.headers[capitalize(header[0])] = header[1] end - if params[:parser] - body = Nokogiri::XML::SAX::PushParser.new(params[:parser]) + if error || params[:parser] + if error + parser = Fog::Errors::Parser.new + elsif params[:parser] + parser = params[:parser] + end + body = Nokogiri::XML::SAX::PushParser.new(parser) else body = '' end @@ -77,14 +85,14 @@ unless Fog.mocking? end end - if params[:parser] + if parser body.finish - response.body = params[:parser].response + response.body = parser.response else response.body = body end - if params[:expects] && params[:expects] != response.status + if error raise(Fog::Errors.status_error(params[:expects], response.status, response)) else response diff --git a/lib/fog/errors.rb b/lib/fog/errors.rb index a38207b18..f7a8ab953 100644 --- a/lib/fog/errors.rb +++ b/lib/fog/errors.rb @@ -1,3 +1,5 @@ +require "#{File.dirname(__FILE__)}/parser" + module Fog module Errors class Continue < StandardError; end # 100 @@ -124,7 +126,19 @@ module Fog 503 => 'Service Unavailable', 504 => 'Gateway Timeout' } - @errors[actual].new("Expected(#{expected} #{@messages[expected]}) <=> Actual(#{actual} #{@messages[actual]}) #{response.inspect}") + response = "#{response.body['Code']} => #{response.body['Message']}" + @errors[actual].new("Expected(#{expected} #{@messages[expected]}) <=> Actual(#{actual} #{@messages[actual]}): #{response}") + end + + class Parser < Fog::Parsers::Base + + def end_element(name) + case name + when 'Code', 'Message' + @response[name] = @value + end + end + end end