From 30d0ffc698aefb825de4c62e30751a053ed50117 Mon Sep 17 00:00:00 2001 From: Steven Bazyl Date: Thu, 4 Oct 2012 18:17:54 -0700 Subject: [PATCH] Issue 59 - handle 204 responses more gracefully --- lib/google/api_client/result.rb | 50 +++++++++++++++------------ spec/google/api_client/result_spec.rb | 20 +++++++++++ 2 files changed, 48 insertions(+), 22 deletions(-) diff --git a/lib/google/api_client/result.rb b/lib/google/api_client/result.rb index 8920f9421..38d08594e 100644 --- a/lib/google/api_client/result.rb +++ b/lib/google/api_client/result.rb @@ -71,7 +71,11 @@ module Google _, content_type = self.headers.detect do |h, v| h.downcase == 'Content-Type'.downcase end - content_type[/^([^;]*);?.*$/, 1].strip.downcase + if content_type + return content_type[/^([^;]*);?.*$/, 1].strip.downcase + else + return nil + end end ## @@ -121,7 +125,7 @@ module Google # @return [TrueClass, FalseClass] # true if body can be parsed def data? - self.media_type == 'application/json' + !(self.body.nil? || self.body.empty? || self.media_type != 'application/json') end ## @@ -132,26 +136,28 @@ module Google # Object if body parsable from API schema, Hash if JSON, raw body if unable to parse def data return @data ||= (begin - media_type = self.media_type - data = self.body - case media_type - when 'application/json' - data = MultiJson.load(data) - # Strip data wrapper, if present - data = data['data'] if data.has_key?('data') - else - raise ArgumentError, - "Content-Type not supported for parsing: #{media_type}" - end - if @request.api_method && @request.api_method.response_schema - # Automatically parse using the schema designated for the - # response of this API method. - data = @request.api_method.response_schema.new(data) - data - else - # Otherwise, return the raw unparsed value. - # This value must be indexable like a Hash. - data + if self.data? + media_type = self.media_type + data = self.body + case media_type + when 'application/json' + data = MultiJson.load(data) + # Strip data wrapper, if present + data = data['data'] if data.has_key?('data') + else + raise ArgumentError, + "Content-Type not supported for parsing: #{media_type}" + end + if @request.api_method && @request.api_method.response_schema + # Automatically parse using the schema designated for the + # response of this API method. + data = @request.api_method.response_schema.new(data) + data + else + # Otherwise, return the raw unparsed value. + # This value must be indexable like a Hash. + data + end end end) end diff --git a/spec/google/api_client/result_spec.rb b/spec/google/api_client/result_spec.rb index eba302348..dea1bc154 100644 --- a/spec/google/api_client/result_spec.rb +++ b/spec/google/api_client/result_spec.rb @@ -180,7 +180,27 @@ describe Google::APIClient::Result do it 'should return the correct error message' do @result.error_message.should == 'Parse Error' end + end + + describe 'with 204 No Content response' do + before do + @response.stub(:body).and_return('') + @response.stub(:status).and_return(204) + @response.stub(:headers).and_return({}) + @result = Google::APIClient::Result.new(@reference, @response) + end + it 'should indicate no data is available' do + @result.data?.should be_false + end + + it 'should return nil for data' do + @result.data.should == nil + end + + it 'should return nil for media_type' do + @result.media_type.should == nil + end end end end