class Geokit::Geocoders::IpGeocoder
Provides geocoding based upon an IP address. The underlying web service is a hostip.info which sources their data through a combination of publicly available information as well as community contributions.
Private Class Methods
do_geocode(ip)
click to toggle source
Given an IP address, returns a GeoLoc instance which contains latitude, longitude, city, and country code. Sets the success attribute to false if the ip parameter does not match an ip address.
# File lib/geokit/geocoders/ip.rb, line 12 def self.do_geocode(ip) return GeoLoc.new unless valid_ip?(ip) url = submit_url(ip) res = call_geocoder_service(url) return GeoLoc.new unless net_adapter.success?(res) ensure_utf8_encoding(res) body = res.body body = body.encode("UTF-8") if body.respond_to? :encode parse :yaml, body end
ensure_utf8_encoding(res)
click to toggle source
Forces UTF-8 encoding on the body Rails expects string input to be UTF-8 hostip.info specifies the charset encoding in the headers thus extract encoding from headers and tell Rails about it by forcing it
# File lib/geokit/geocoders/ip.rb, line 50 def self.ensure_utf8_encoding(res) if (enc_string = extract_charset(res)) if defined?(Encoding) && Encoding.aliases.values.include?(enc_string.upcase) res.body.force_encoding(enc_string.upcase) if res.body.respond_to?(:force_encoding) res.body.encode("UTF-8") else require "iconv" res.body.replace Iconv.conv("UTF8", "iso88591", res.body) end end end
extract_charset(res)
click to toggle source
Extracts charset out of the response headers
# File lib/geokit/geocoders/ip.rb, line 63 def self.extract_charset(res) if (content_type = res["content-type"]) capture = content_type.match(/charset=(.+)/) capture && capture[1] end end
submit_url(ip)
click to toggle source
# File lib/geokit/geocoders/ip.rb, line 23 def self.submit_url(ip) "http://api.hostip.info/get_html.php?ip=#{ip}&position=true" end