class Geocoder::Lookup::Google
def base_query_url(query)
def base_query_url(query) "#{protocol}://maps.googleapis.com/maps/api/geocode/json?" end
def configure_ssl!(client)
def configure_ssl!(client) client.instance_eval { @ssl_context = OpenSSL::SSL::SSLContext.new options = OpenSSL::SSL::OP_NO_SSLv2 | OpenSSL::SSL::OP_NO_SSLv3 if OpenSSL::SSL.const_defined?('OP_NO_COMPRESSION') options |= OpenSSL::SSL::OP_NO_COMPRESSION end @ssl_context.set_params({options: options}) } end
def map_link_url(coordinates)
def map_link_url(coordinates) "http://maps.google.com/maps?q=#{coordinates.join(',')}" end
def name
def name "Google" end
def query_url_google_params(query)
def query_url_google_params(query) params = { :sensor => "false", :language => (query.language || configuration.language) } if query.options[:google_place_id] params[:place_id] = query.sanitized_text else params[(query.reverse_geocode? ? :latlng : :address)] = query.sanitized_text end unless (bounds = query.options[:bounds]).nil? params[:bounds] = bounds.map{ |point| "%f,%f" % point }.join('|') end unless (region = query.options[:region]).nil? params[:region] = region end unless (components = query.options[:components]).nil? params[:components] = components.is_a?(Array) ? components.join("|") : components end unless (result_type = query.options[:result_type]).nil? params[:result_type] = result_type.is_a?(Array) ? result_type.join("|") : result_type end params end
def query_url_params(query)
def query_url_params(query) query_url_google_params(query).merge( :key => configuration.api_key ).merge(super) end
def result_root_attr
def result_root_attr 'results' end
def results(query)
def results(query) return [] unless doc = fetch_data(query) case doc['status'] when "OK" # OK status implies >0 results return doc[result_root_attr] when "OVER_QUERY_LIMIT" raise_error(Geocoder::OverQueryLimitError) || Geocoder.log(:warn, "#{name} API error: over query limit.") when "REQUEST_DENIED" raise_error(Geocoder::RequestDenied, doc['error_message']) || Geocoder.log(:warn, "#{name} API error: request denied (#{doc['error_message']}).") when "INVALID_REQUEST" raise_error(Geocoder::InvalidRequest, doc['error_message']) || Geocoder.log(:warn, "#{name} API error: invalid request (#{doc['error_message']}).") end return [] end
def supported_protocols
def supported_protocols # Google requires HTTPS if an API key is used. if configuration.api_key [:https] else [:http, :https] end end
def valid_response?(response)
def valid_response?(response) json = parse_json(response.body) status = json["status"] if json super(response) and ['OK', 'ZERO_RESULTS'].include?(status) end