diff --git a/Gemfile b/Gemfile index 6d6958927282c875a78ba4b77dff5741cc50e157..288a90caf46c6207edf968939c14a44f54ca50bd 100644 --- a/Gemfile +++ b/Gemfile @@ -24,6 +24,7 @@ end group :test do gem 'sqlite3', :platform => [:ruby, :mswin, :mingw] + gem 'webmock' platforms :ruby do gem 'pg' diff --git a/lib/geocoder/lookups/base.rb b/lib/geocoder/lookups/base.rb index eb398937bab3490f9aa5f28cc93cc80df660af30..ed9b946be095175856a0d7f3ff98c8737712e531 100644 --- a/lib/geocoder/lookups/base.rb +++ b/lib/geocoder/lookups/base.rb @@ -274,6 +274,7 @@ module Geocoder uri = URI.parse(query_url(query)) Geocoder.log(:debug, "Geocoder: HTTP request being made for #{uri.to_s}") http_client.start(uri.host, uri.port, use_ssl: use_ssl?, open_timeout: configuration.timeout, read_timeout: configuration.timeout) do |client| + configure_ssl!(client) if use_ssl? req = Net::HTTP::Get.new(uri.request_uri, configuration.http_headers) if configuration.basic_auth[:user] and configuration.basic_auth[:password] req.basic_auth( @@ -297,6 +298,8 @@ module Geocoder end end + def configure_ssl!(client); end + def check_api_key_configuration!(query) key_parts = query.lookup.required_api_key_parts if key_parts.size > Array(configuration.api_key).size diff --git a/lib/geocoder/lookups/google.rb b/lib/geocoder/lookups/google.rb index d3ffeb74cfd84ca9b8c52b5fcede046d788e220b..8483f137869f0c6038dd6d5ccc12c02907d52665 100644 --- a/lib/geocoder/lookups/google.rb +++ b/lib/geocoder/lookups/google.rb @@ -27,6 +27,13 @@ module Geocoder::Lookup private # --------------------------------------------------------------- + def configure_ssl!(client) + client.instance_eval { + @ssl_context = OpenSSL::SSL::SSLContext.new + @ssl_context.set_params({:options=> OpenSSL::SSL::OP_NO_SSLv2 | OpenSSL::SSL::OP_NO_SSLv3 | OpenSSL::SSL::OP_NO_COMPRESSION}) + } + end + def valid_response?(response) json = parse_json(response.body) status = json["status"] if json diff --git a/test/test_helper.rb b/test/test_helper.rb index 8ad22fc798c4f541acfeab13b8540fe72fba2bff..d0b6ca48924b90bcc0b67381fc4e5b40a376bd8c 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -120,6 +120,7 @@ module Geocoder fixture_exists?(filename) ? filename : default_fixture_filename end + alias_method :make_api_http_request, :make_api_request remove_method(:make_api_request) def make_api_request(query) diff --git a/test/unit/lookup_test.rb b/test/unit/lookup_test.rb index 5a91ad573596da1fbf2a8acda5b3772ff882a721..c4dbce1364cb7ed4fa5c36c511d990e1c6c648d8 100644 --- a/test/unit/lookup_test.rb +++ b/test/unit/lookup_test.rb @@ -160,4 +160,19 @@ class LookupTest < GeocoderTestCase assert_equal :google, Geocoder::Lookup::Google.new.handle assert_equal :geocoder_ca, Geocoder::Lookup::GeocoderCa.new.handle end + + def test_http_request + Geocoder.configure(use_https: true) + + require 'webmock/test_unit' + WebMock.enable! + stub_all = WebMock.stub_request(:any, /.*/).to_return(status: 200) + + g = Geocoder::Lookup::Google.new + g.send(:make_api_http_request, Geocoder::Query.new('test location')) + assert_requested(stub_all) + + WebMock.reset! + WebMock.disable! + end end