From 81a061cb80e46c66a0770a139038feef90628b78 Mon Sep 17 00:00:00 2001 From: Steve Bazyl Date: Fri, 2 Oct 2015 13:31:19 -0700 Subject: [PATCH] Fix #292 - ensure multivalued parameters are encoded correctly --- lib/google/apis/core/http_command.rb | 13 +++++++++---- spec/google/apis/core/http_command_spec.rb | 18 +++++++++++++----- spec/spec_helper.rb | 2 +- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/lib/google/apis/core/http_command.rb b/lib/google/apis/core/http_command.rb index 21cf4187c..4827f7d1f 100644 --- a/lib/google/apis/core/http_command.rb +++ b/lib/google/apis/core/http_command.rb @@ -167,7 +167,7 @@ module Google # # @param [Fixnum] status # HTTP status code of response - # @param + # @param # @param [Hurley::Header] header # HTTP response headers # @param [String] body @@ -184,16 +184,16 @@ module Google when 200...300 nil when 301, 302, 303, 307 - message ||= sprintf('Redirect to %s', header[:location]) + message ||= sprintf('Redirect to %s', header[:location]) raise Google::Apis::RedirectError.new(message, status_code: status, header: header, body: body) when 401 message ||= 'Unauthorized' raise Google::Apis::AuthorizationError.new(message, status_code: status, header: header, body: body) when 304, 400, 402...500 - message ||= 'Invalid request' + message ||= 'Invalid request' raise Google::Apis::ClientError.new(message, status_code: status, header: header, body: body) when 500...600 - message ||= 'Server error' + message ||= 'Server error' raise Google::Apis::ServerError.new(message, status_code: status, header: header, body: body) else logger.warn(sprintf('Encountered unexpected status code %s', status)) @@ -254,6 +254,11 @@ module Google begin logger.debug { sprintf('Sending HTTP %s %s', method, url) } response = client.send(method, url, body) do |req| + # Temporary workaround for Hurley bug where the connection preference + # is ignored and it uses nested anyway + req.url.query_class = Hurley::Query::Flat + query.each { | k, v| req.url.query[k] = v } + # End workaround apply_request_options(req) end logger.debug { response.status_code } diff --git a/spec/google/apis/core/http_command_spec.rb b/spec/google/apis/core/http_command_spec.rb index 09c25c266..d7a7f6d6c 100644 --- a/spec/google/apis/core/http_command_spec.rb +++ b/spec/google/apis/core/http_command_spec.rb @@ -123,13 +123,13 @@ RSpec.describe Google::Apis::Core::HttpCommand do command.options.retries = 1 expect { command.execute(client) }.to raise_error(Google::Apis::ServerError) end - + context('with retries exceeded') do before(:example) do command.options.retries = 1 end - + let(:err) do begin command.execute(client) @@ -137,13 +137,13 @@ RSpec.describe Google::Apis::Core::HttpCommand do e end end - + it 'should raise error with HTTP status code' do expect(err.status_code).to eq 500 end - + end - + context('with callbacks') do it 'should return the response body after retries' do expect { |b| command.execute(client, &b) }.to yield_successive_args( @@ -255,4 +255,12 @@ RSpec.describe Google::Apis::Core::HttpCommand do expect { |b| command.execute(client, &b) }.to yield_with_args(nil, an_instance_of(Google::Apis::ClientError)) end end + + it 'should send repeated query parameters' do + stub_request(:get, 'https://www.googleapis.com/zoo/animals?a=1&a=2&a=3') + .to_return(status: [200, '']) + command = Google::Apis::Core::HttpCommand.new(:get, 'https://www.googleapis.com/zoo/animals') + command.query['a'] = [1,2,3] + command.execute(client) + end end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index af3803ef0..46f62a7ca 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -60,6 +60,7 @@ RSpec.configure do |config| config.capture_log_messages Google::Apis.logger.level = Logger::DEBUG + WebMock::Config.instance.query_values_notation = :flat_array end [JsonSpec::Matchers::BeJsonEql, @@ -121,4 +122,3 @@ end def run_integration_tests? ENV['GOOGLE_APPLICATION_CREDENTIALS'] && ENV['GOOGLE_PROJECT_ID'] end -