From 231310358f4f43864a2b4aacb753dd32172436b4 Mon Sep 17 00:00:00 2001
From: Alex Reisner <alex@alexreisner.com>
Date: Wed, 15 Sep 2010 00:59:16 -0400
Subject: [PATCH] Make Geocoder.search return nil on bad response.

"bad" = non-200 HTTP code
---
 lib/geocoder.rb | 33 ++++++++++++++++++++-------------
 1 file changed, 20 insertions(+), 13 deletions(-)

diff --git a/lib/geocoder.rb b/lib/geocoder.rb
index d3578260..74f43241 100644
--- a/lib/geocoder.rb
+++ b/lib/geocoder.rb
@@ -311,11 +311,13 @@ module Geocoder
 
   ##
   # Query Google for geographic information about the given phrase.
+  # Returns a REXML document representing a valid geocoder response.
+  # Returns nil if non-200 HTTP response, timeout, or other error.
   #
   def self.search(query)
-    if doc = _fetch_xml(query)
-      REXML::Document.new(doc)
-    end
+    doc = _fetch_document(query)
+    e = doc.elements['GeocodeResponse/status']
+    (e and e.text == "OK") ? doc : nil
   end
 
   ##
@@ -325,10 +327,6 @@ module Geocoder
   def self.fetch_coordinates(query)
     return nil unless doc = self.search(query)
 
-    # make sure search found a result
-    e = doc.elements['GeocodeResponse/status']
-    return nil unless (e and e.text == "OK")
-
     # isolate the relevant part of the result
     place = doc.elements['GeocodeResponse/result/geometry/location']
 
@@ -337,18 +335,27 @@ module Geocoder
   end
 
   ##
-  # Request an XML geo search result from Google.
+  # Returns a parsed Google geocoder search result (REXML document).
+  # This method is not intended for general use (prefer Geocoder.search).
+  #
+  def self._fetch_document(query)
+    if doc = _fetch_xml(query)
+      REXML::Document.new(doc)
+    end
+  end
+
+  ##
+  # Returns a raw Google geocoder search result (XML).
   # This method is not intended for general use (prefer Geocoder.search).
   #
   def self._fetch_xml(query)
     return nil if query.blank?
-    params = {
-      :address => query,
-      :sensor  => "false"
-    }
+
+    # build URL
+    params = { :address => query, :sensor  => "false" }
     url = "http://maps.google.com/maps/api/geocode/xml?" + params.to_query
 
-    # Query geocoder and make sure it responds quickly.
+    # query geocoder and make sure it responds quickly
     begin
       resp = nil
       timeout(3) do
-- 
GitLab