diff --git a/lib/geocoder/lookups/base.rb b/lib/geocoder/lookups/base.rb index 8b2ddd11dd7ec1c0679862829bb0e54d7573d5b5..3d8c66febd4c514153b74ad9faf780ea8abfa98a 100644 --- a/lib/geocoder/lookups/base.rb +++ b/lib/geocoder/lookups/base.rb @@ -88,6 +88,13 @@ module Geocoder end end + ## + # Is the given string a loopback IP address? + # + def loopback_address?(ip) + !!(ip == "0.0.0.0" or ip.match(/^127/)) + end + ## # Simulate ActiveSupport's Object#to_query. # diff --git a/lib/geocoder/lookups/freegeoip.rb b/lib/geocoder/lookups/freegeoip.rb index 791bac4c2d5b79091915541d55b01538c01c90e0..dcc5e44f5565ef97cb2d73228a78ab3c55a7af7f 100644 --- a/lib/geocoder/lookups/freegeoip.rb +++ b/lib/geocoder/lookups/freegeoip.rb @@ -7,6 +7,8 @@ module Geocoder::Lookup private # --------------------------------------------------------------- def result(query, reverse = false) + # don't look up a loopback address, just return the stored result + return reserved_result(query) if loopback_address?(query) begin if doc = fetch_data(query, reverse) doc @@ -16,6 +18,21 @@ module Geocoder::Lookup end end + def reserved_result(ip) + { + "ip" => ip, + "city" => "", + "region_code" => "", + "region_name" => "", + "metrocode" => "", + "zipcode" => "", + "latitude" => "0", + "longitude" => "0", + "country_name" => "Reserved", + "country_code" => "RD" + } + end + def query_url(query, reverse = false) "http://freegeoip.net/json/#{query}" end diff --git a/lib/geocoder/request.rb b/lib/geocoder/request.rb index 909e9b3599a5aba544455d797f1a5c6b6f746b7e..dafb8db05c97ccf7dfe8285a298f1b9a82e7241d 100644 --- a/lib/geocoder/request.rb +++ b/lib/geocoder/request.rb @@ -6,12 +6,7 @@ module Geocoder def location unless defined?(@location) - if ip.nil? or ip == "0.0.0.0" or ip.match /^127/ # don't look up loopback - # but return a Geocoder::Result for consistency - @location = Geocoder::Result::Freegeoip.new("ip" => ip) - else - @location = Geocoder.search(ip) - end + @location = Geocoder.search(ip) end @location end