diff --git a/lib/geocoder/exceptions.rb b/lib/geocoder/exceptions.rb index 7f6a081c2c32a9f3f74c1334c0e7e24732e1479f..f01d7dd7f1c8ee2f5ff5567ea8249eaeda040b13 100644 --- a/lib/geocoder/exceptions.rb +++ b/lib/geocoder/exceptions.rb @@ -29,4 +29,7 @@ module Geocoder class ServiceUnavailable < Error end + class LookupTimeout < ::Timeout::Error + end + end diff --git a/lib/geocoder/lookups/base.rb b/lib/geocoder/lookups/base.rb index c6332162072aa9143cdc7456ef8d1a22d07ef476..7f3da3e1e5df624a6f488990d4dfbc73af7a39ae 100644 --- a/lib/geocoder/lookups/base.rb +++ b/lib/geocoder/lookups/base.rb @@ -271,20 +271,20 @@ module Geocoder # return the response object. # def make_api_request(query) - timeout(configuration.timeout) do - 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?) do |client| - req = Net::HTTP::Get.new(uri.request_uri, configuration.http_headers) - if configuration.basic_auth[:user] and configuration.basic_auth[:password] - req.basic_auth( - configuration.basic_auth[:user], - configuration.basic_auth[:password] - ) - end - client.request(req) + 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| + req = Net::HTTP::Get.new(uri.request_uri, configuration.http_headers) + if configuration.basic_auth[:user] and configuration.basic_auth[:password] + req.basic_auth( + configuration.basic_auth[:user], + configuration.basic_auth[:password] + ) end + client.request(req) end + rescue Net::OpenTimeout, Net::ReadTimeout + raise Geocoder::LookupTimeout end def use_ssl?