From a8128d63dcce968195afd5b830a032453444b995 Mon Sep 17 00:00:00 2001 From: Alex Reisner <alex@alexreisner.com> Date: Mon, 31 Dec 2012 12:33:32 -0500 Subject: [PATCH] Properly detect error in MaxMind response. --- lib/geocoder/lookups/maxmind.rb | 22 +++++++++++++++++++--- lib/geocoder/results/maxmind.rb | 2 +- test/fixtures/maxmind_24_24_24_21 | 2 +- test/fixtures/maxmind_24_24_24_22 | 2 +- test/fixtures/maxmind_24_24_24_23 | 2 +- test/fixtures/maxmind_24_24_24_24 | 2 +- test/test_helper.rb | 2 +- 7 files changed, 25 insertions(+), 9 deletions(-) diff --git a/lib/geocoder/lookups/maxmind.rb b/lib/geocoder/lookups/maxmind.rb index 0be2495c..7e67fae8 100644 --- a/lib/geocoder/lookups/maxmind.rb +++ b/lib/geocoder/lookups/maxmind.rb @@ -15,9 +15,12 @@ module Geocoder::Lookup private # --------------------------------------------------------------- - def service_code + ## + # Return the name of the configured service, or raise an exception. + # + def configured_service! if s = configuration[:service] and services.keys.include?(s) - services[s] + return s else raise( Geocoder::ConfigurationError, @@ -28,6 +31,19 @@ module Geocoder::Lookup end end + def service_code + services[configured_service!] + end + + def service_response_fields_count + Geocoder::Result::Maxmind.field_names[configured_service!].size + end + + def data_contains_error?(parsed_data) + # if all fields given then there is an error + parsed_data.size == service_response_fields_count and !parsed_data.last.nil? + end + ## # Service names mapped to code used in URL. # @@ -45,7 +61,7 @@ module Geocoder::Lookup return [reserved_result] if query.loopback_ip_address? doc = fetch_data(query) if doc and doc.is_a?(Array) - if doc.last.nil? + if !data_contains_error?(doc) return [doc] elsif doc.last == "INVALID_LICENSE_KEY" raise_error(Geocoder::InvalidApiKey) || warn("Invalid MaxMind API key.") diff --git a/lib/geocoder/results/maxmind.rb b/lib/geocoder/results/maxmind.rb index 2cc45beb..aa6c7aa9 100644 --- a/lib/geocoder/results/maxmind.rb +++ b/lib/geocoder/results/maxmind.rb @@ -71,7 +71,7 @@ module Geocoder::Result # def service_name self.class.field_names.to_a.each do |n,f| - return n if f.size == @data.size + return n if (@data.size..@data.size+1).include?(f.size) end nil end diff --git a/test/fixtures/maxmind_24_24_24_21 b/test/fixtures/maxmind_24_24_24_21 index 3fde7152..f4cd62e0 100644 --- a/test/fixtures/maxmind_24_24_24_21 +++ b/test/fixtures/maxmind_24_24_24_21 @@ -1 +1 @@ -US, +US diff --git a/test/fixtures/maxmind_24_24_24_22 b/test/fixtures/maxmind_24_24_24_22 index 426280ed..b9aee130 100644 --- a/test/fixtures/maxmind_24_24_24_22 +++ b/test/fixtures/maxmind_24_24_24_22 @@ -1 +1 @@ -US,NY,Jamaica,40.6915,-73.8057, +US,NY,Jamaica,40.6915,-73.8057 diff --git a/test/fixtures/maxmind_24_24_24_23 b/test/fixtures/maxmind_24_24_24_23 index 8ffaf07f..29ecfb21 100644 --- a/test/fixtures/maxmind_24_24_24_23 +++ b/test/fixtures/maxmind_24_24_24_23 @@ -1 +1 @@ -US,NY,Jamaica,,40.6915,-73.8057,501,718,"Road Runner","Road Runner", +US,NY,Jamaica,,40.6915,-73.8057,501,718,"Road Runner","Road Runner" diff --git a/test/fixtures/maxmind_24_24_24_24 b/test/fixtures/maxmind_24_24_24_24 index ab20e037..14939030 100644 --- a/test/fixtures/maxmind_24_24_24_24 +++ b/test/fixtures/maxmind_24_24_24_24 @@ -1 +1 @@ -US,"United States",NY,"New York",Jamaica,40.6915,-73.8057,501,718,America/New_York,NA,,"Road Runner","Road Runner",rr.com,"AS11351 Road Runner HoldCo LLC",Cable/DSL,residential,779,99,37,76,, +US,"United States",NY,"New York",Jamaica,40.6915,-73.8057,501,718,America/New_York,NA,,"Road Runner","Road Runner",rr.com,"AS11351 Road Runner HoldCo LLC",Cable/DSL,residential,779,99,37,76,35 diff --git a/test/test_helper.rb b/test/test_helper.rb index b3aa68f2..b74017d4 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -239,7 +239,7 @@ end class Test::Unit::TestCase def setup - Geocoder.configure(:maxmind => {:service => :omni}) + Geocoder.configure(:maxmind => {:service => :city_isp_org}) end def teardown -- GitLab