_, 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
##
# @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
##
# 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
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