You are here

function smart_ip_get_location in Smart IP 7.2

Same name and namespace in other branches
  1. 6.2 smart_ip.module \smart_ip_get_location()
  2. 6 smart_ip.module \smart_ip_get_location()
  3. 7 smart_ip.module \smart_ip_get_location()

Get the geo location from the IP address

Parameters

string $ip_address: IP address to query for geolocation. It will use current user's IP address if empty.

Return value

array Geolocation details of queried IP address

3 calls to smart_ip_get_location()
smart_ip_get_current_visitor_location_data in ./smart_ip.module
Get current visitor's location information
smart_ip_update_user_location in ./smart_ip.module
Update user's location only if the IP address stored in session is not the same as the IP address detected by the server or debug mode IP.
_smart_ip_lookup_submit in includes/smart_ip.admin.inc
Submit handler to lookup an IP address in the database.

File

./smart_ip.module, line 393
Determines country, geo location (longitude/latitude), region, city and postal code of the user, based on IP address

Code

function smart_ip_get_location($ip_address = NULL) {
  $ip_address = trim($ip_address);

  // Options used in drupal_http_request().
  $timeout = variable_get('smart_ip_get_location_timeout', 2);
  $request_options = array(
    'timeout' => $timeout,
  );
  if (empty($ip_address)) {
    $ip_address = ip_address();
  }

  // Use a static cache if this function is called more often
  // for the same ip on the same page.
  $results =& drupal_static(__FUNCTION__);
  if (isset($results[$ip_address])) {
    return $results[$ip_address];
  }
  $result = array();
  $smart_ip_source = variable_get('smart_ip_source', 'ipinfodb_service');
  if ($smart_ip_source == 'local_db') {

    // Local database
    $ip = explode('.', $ip_address);
    if (count($ip) == 4) {
      smart_ip_check_fix_local_db();
      $ipl = (($ip[0] * 256 + $ip[1]) * 256 + $ip[2]) * 256 + $ip[3];
      $query = db_query('SELECT * FROM {smart_ip} WHERE ip_ref <= :ip ORDER BY ip_ref DESC LIMIT 1', array(
        ':ip' => $ipl,
      ));
      $result = $query
        ->fetchAssoc();
      if (!empty($result)) {
        module_load_include('inc', 'smart_ip', 'includes/smart_ip.country_list');
        $countries = country_get_predefined_list();
        $result['country'] = $countries[$result['country_code']];
        $region = array();
        $result['region_code'] = $result['region'];
        $region = smart_ip_get_region_static($result['country_code'], $result['region_code']);
        $result['region'] = $region[$result['country_code']][$result['region_code']];
      }
    }
  }
  elseif ($smart_ip_source == 'mod_geoip') {
    if (function_exists('apache_note')) {
      $result['country'] = apache_note('GEOIP_COUNTRY_NAME');
      $result['country_code'] = apache_note('GEOIP_COUNTRY_CODE');
      $result['country_code'] = strtoupper($result['country_code']);
      $result['region'] = apache_note('GEOIP_REGION_NAME');
      $result['region_code'] = apache_note('GEOIP_REGION');
      $result['city'] = apache_note('GEOIP_CITY');
      $result['zip'] = apache_note('GEOIP_POSTAL_CODE');
      $result['latitude'] = apache_note('GEOIP_LATITUDE');
      $result['longitude'] = apache_note('GEOIP_LONGITUDE');
      $result['time_zone'] = '';
    }
    else {
      $result['country'] = isset($_SERVER['GEOIP_COUNTRY_NAME']) ? $_SERVER['GEOIP_COUNTRY_NAME'] : '';
      $result['country_code'] = isset($_SERVER['GEOIP_COUNTRY_CODE']) ? $_SERVER['GEOIP_COUNTRY_CODE'] : '';
      $result['region'] = isset($_SERVER['GEOIP_REGION_NAME']) ? $_SERVER['GEOIP_REGION_NAME'] : '';
      $result['region_code'] = isset($_SERVER['GEOIP_REGION']) ? strtoupper($_SERVER['GEOIP_REGION']) : '';
      $result['city'] = isset($_SERVER['GEOIP_CITY']) ? $_SERVER['GEOIP_CITY'] : '';
      $result['zip'] = isset($_SERVER['GEOIP_POSTAL_CODE']) ? $_SERVER['GEOIP_POSTAL_CODE'] : '';
      $result['latitude'] = isset($_SERVER['GEOIP_LATITUDE']) ? $_SERVER['GEOIP_LATITUDE'] : '';
      $result['longitude'] = isset($_SERVER['GEOIP_LONGITUDE']) ? $_SERVER['GEOIP_LONGITUDE'] : '';
      $result['time_zone'] = '';
    }
  }
  elseif ($smart_ip_source == 'maxmindgeoip_service') {

    // MaxMind GeoIP Legacy Web Services
    module_load_include('inc', 'smart_ip', 'includes/smart_ip.country_list');
    $countries = country_get_predefined_list();
    $request = drupal_http_request(smart_ip_get_maxmindgeoip_url($ip_address), $request_options);
    if (!empty($request->code) && $request->code == 200 && !empty($request->data)) {
      switch (variable_get('smart_ip_maxmind_service', 'country')) {
        case 'country':

          // For MaxMind GeoIP Legacy Country Web Service
          // In case of errors the country code "(null),IP_NOT_FOUND" is returned,
          // so we need to check if the code is in our countries list.
          $result['country_code'] = isset($request->data) && isset($countries[$request->data]) ? strtoupper($request->data) : '';
          $result['country'] = empty($result['country_code']) ? '' : $countries[$request->data];
          $result['region'] = '';
          $result['region_code'] = '';
          $result['city'] = '';
          $result['zip'] = '';
          $result['latitude'] = '';
          $result['longitude'] = '';
          $result['time_zone'] = '';
          break;
        case 'city':

          // For MaxMind GeoIP Legacy City Web Service
          // In case of errors the country code "(null),IP_NOT_FOUND" is returned,
          // so we need to check if the code is in our countries list.
          $response = str_getcsv($request->data);
          $result['country_code'] = isset($request->data) && isset($countries[$response[0]]) ? strtoupper($response[0]) : '';
          $result['country'] = empty($result['country_code']) ? '' : $countries[$response[0]];
          $result['region'] = $response[1];
          $result['region_code'] = $response[1];
          $result['city'] = $response[2];
          $result['zip'] = '';
          $result['latitude'] = $response[3];
          $result['longitude'] = $response[4];
          $result['time_zone'] = '';
          break;
        case 'city_isp_org':

          // For MaxMind GeoIP Legacy City/ISP/Organization Web Service
          // In case of errors the country code "(null),IP_NOT_FOUND" is returned,
          // so we need to check if the code is in our countries list.
          $response = str_getcsv($request->data);
          $result['country_code'] = isset($request->data) && isset($countries[$response[0]]) ? strtoupper($response[0]) : '';
          $result['country'] = empty($result['country_code']) ? '' : $countries[$response[0]];
          $result['region'] = $response[1];
          $result['region_code'] = $response[1];
          $result['city'] = $response[2];
          $result['zip'] = $response[3];
          $result['latitude'] = $response[4];
          $result['longitude'] = $response[5];
          $result['time_zone'] = '';
          $result['metro_code'] = $response[6];
          $result['area_code'] = $response[7];
          $result['isp_name'] = $response[8];
          $result['organization_name'] = $response[9];
          break;
        case 'omni':

          // For MaxMind GeoIP Legacy Insights (formerly Omni) Web Service
          // In case of errors the country code "(null),IP_NOT_FOUND" is returned,
          // so we need to check if the code is in our countries list.
          $response = str_getcsv($request->data);
          $result['country_code'] = $response[0];
          $result['country'] = $response[1];
          $result['region'] = $response[3];
          $result['region_code'] = $response[2];
          $result['city'] = $response[4];
          $result['zip'] = $response[11];
          $result['latitude'] = $response[5];
          $result['longitude'] = $response[6];
          $result['time_zone'] = $response[9];
          $result['metro_code'] = $response[7];
          $result['area_code'] = $response[8];
          $result['isp_name'] = $response[12];
          $result['domain'] = $response[14];
          $result['autonomous_system_number'] = $response[15];
          $result['netspeed'] = $response[16];
          $result['user_type'] = $response[17];
          $result['country_confidence_factor'] = $response[19];
          $result['city_confidence_factor'] = $response[20];
          $result['region_confidence_factor'] = $response[21];
          $result['zip_confidence_factor'] = $response[22];
          $result['accuracy_radius'] = $response[18];
          $result['continent_code'] = $response[10];
          $result['organization_name'] = $response[13];
          break;
      }
    }
    else {
      watchdog('smart_ip', 'The MaxMind GeoIP Legacy Web Service request from %site seems to be broken, due to "%error".', array(
        '%site' => $smart_ip_source,
        '%error' => "{$request->code} {$request->error}",
      ), WATCHDOG_WARNING);
    }
  }
  elseif ($smart_ip_source == 'maxmindgeoip2_service') {

    // MaxMind GeoIP2 Precision Web Services
    global $language;
    $lang = $language->language;
    $request = drupal_http_request(smart_ip_get_maxmindgeoip2_url($ip_address), $request_options);
    if (!empty($request->code) && $request->code == 200 && !empty($request->data)) {
      $response = drupal_json_decode($request->data);
      $result['country_code'] = isset($response['country']['iso_code']) ? $response['country']['iso_code'] : '';
      if (isset($response['country']['names']['en'])) {
        $result['country'] = isset($response['country']['names'][$lang]) ? $response['country']['names'][$lang] : $response['country']['names']['en'];
      }
      else {
        $result['country'] = '';
      }
      if (isset($response['subdivisions'][0]['names']['en'])) {
        $result['region'] = isset($response['subdivisions'][0]['names'][$lang]) ? $response['subdivisions'][0]['names'][$lang] : $response['subdivisions'][0]['names']['en'];
      }
      else {
        $result['region'] = '';
      }
      $result['region_code'] = isset($response['subdivisions'][0]['iso_code']) ? $response['subdivisions'][0]['iso_code'] : '';
      if (isset($response['city']['names']['en'])) {
        $result['city'] = isset($response['city']['names'][$lang]) ? $response['city']['names'][$lang] : $response['city']['names']['en'];
      }
      else {
        $result['city'] = '';
      }
      $result['zip'] = isset($response['postal']['code']) ? $response['postal']['code'] : '';
      $result['latitude'] = isset($response['location']['latitude']) ? $response['location']['latitude'] : '';
      $result['longitude'] = isset($response['location']['longitude']) ? $response['location']['longitude'] : '';
      $result['time_zone'] = isset($response['location']['time_zone']) ? $response['location']['time_zone'] : '';
      $result['is_eu_country'] = isset($response['country']['is_in_european_union']) ? $response['country']['is_in_european_union'] : '';
      if (isset($response['location']['metro_code'])) {
        $result['metro_code'] = $response['location']['metro_code'];
      }
      if (isset($response['location']['accuracy_radius'])) {
        $result['accuracy_radius'] = $response['location']['accuracy_radius'];
      }
      if (isset($response['location']['average_income'])) {
        $result['average_income'] = $response['location']['average_income'];
      }
      if (isset($response['location']['population_density'])) {
        $result['population_density'] = $response['location']['population_density'];
      }
      if (isset($response['continent']['names'][$lang])) {
        $result['continent'] = $response['continent']['names'][$lang];
      }
      elseif (isset($response['continent']['names']['en'])) {
        $result['continent'] = $response['continent']['names']['en'];
      }
      if (isset($response['continent']['code'])) {
        $result['continent'] = $response['continent']['code'];
      }
      if (isset($response['traits']['isp'])) {
        $result['isp_name'] = $response['traits']['isp'];
      }
      if (isset($response['traits']['domain'])) {
        $result['domain'] = $response['traits']['domain'];
      }
      if (isset($response['traits']['netspeed'])) {
        $result['netspeed'] = $response['traits']['netspeed'];
      }
      if (isset($response['traits']['user_type'])) {
        $result['user_type'] = $response['traits']['user_type'];
      }
      if (isset($response['traits']['organization'])) {
        $result['organization_name'] = $response['traits']['organization'];
      }
      if (isset($response['traits']['autonomous_system_number'])) {
        $result['autonomous_system_number'] = $response['traits']['autonomous_system_number'];
      }
      if (isset($response['traits']['autonomous_system_organization'])) {
        $result['autonomous_system_organization'] = $response['traits']['autonomous_system_organization'];
      }
      if (isset($response['traits']['is_anonymous_proxy'])) {
        $result['is_anonymous_proxy'] = $response['traits']['is_anonymous_proxy'];
      }
      if (isset($response['traits']['is_satellite_provider'])) {
        $result['is_satellite_provider'] = $response['traits']['is_satellite_provider'];
      }
      if (isset($response['country']['confidence'])) {
        $result['country_confidence_factor'] = $response['country']['confidence'];
      }
      if (isset($response['city']['confidence'])) {
        $result['city_confidence_factor'] = $response['city']['confidence'];
      }
      if (isset($response['postal']['confidence'])) {
        $result['zip_confidence_factor'] = $response['postal']['confidence'];
      }
      if (isset($response['subdivisions'][0]['confidence'])) {
        $result['region_confidence_factor'] = $response['subdivisions'][0]['confidence'];
      }
    }
    else {
      watchdog('smart_ip', 'The Maxmind GeoIP2 Precision Web Service request from %site seems to be broken, due to "%error".', array(
        '%site' => $smart_ip_source,
        '%error' => "{$request->code} {$request->error}",
      ), WATCHDOG_WARNING);
    }
  }
  elseif ($smart_ip_source == 'maxmind_bin') {

    // MaxMind GeoIP Legacy binary database
    module_load_include('inc', 'smart_ip', 'includes/geoipcity');
    $db_path = variable_get('smart_ip_maxmind_bin_custom_path', '');
    if (empty($db_path) || variable_get('smart_ip_maxmind_bin_db_auto_update', TRUE)) {
      $db_path = drupal_realpath(file_stream_wrapper_uri_normalize('private://smart_ip'));
    }
    $version = variable_get('smart_ip_maxmind_bin_version', SMART_IP_MAXMIND_BIN_LICENSED_VERSION);
    $edition = variable_get('smart_ip_maxmind_bin_edition', SMART_IP_MAXMIND_BIN_EDITION_CITY);
    $filename = smart_ip_get_bin_source_filename($version, $edition);
    $db_path = "{$db_path}/{$filename}.dat";
    if (file_exists($db_path)) {
      require 'includes/geoipregionvars.php';
      $gi = geoip_open($db_path, GEOIP_STANDARD);
      switch ($edition) {
        case SMART_IP_MAXMIND_BIN_EDITION_CITY:
          $rec = geoip_record_by_addr($gi, $ip_address);
          if ($rec) {
            $result['country'] = $rec->country_name;
            $result['country_code'] = strtoupper($rec->country_code);
            $result['city'] = $rec->city;
            $result['zip'] = $rec->postal_code;
            $result['region_code'] = $rec->region;
            $result['region'] = isset($GEOIP_REGION_NAME[$rec->country_code][$rec->region]) ? $GEOIP_REGION_NAME[$rec->country_code][$rec->region] : '';
            $result['latitude'] = $rec->latitude;
            $result['longitude'] = $rec->longitude;
            $result['time_zone'] = '';
          }
          break;
        case SMART_IP_MAXMIND_BIN_EDITION_COUNTRY:
          $rec = geoip_country_code_by_addr($gi, $ip_address);
          if ($rec) {
            module_load_include('inc', 'smart_ip', 'includes/smart_ip.country_list');
            $countries = country_get_predefined_list();
            $result['country_code'] = strtoupper($rec);
            $result['country'] = $countries[$result['country_code']];
            $result['region'] = '';
            $result['region_code'] = '';
            $result['city'] = '';
            $result['zip'] = '';
            $result['latitude'] = '';
            $result['longitude'] = '';
            $result['time_zone'] = '';
          }
          break;
      }
      geoip_close($gi);
    }
    else {
      watchdog('smart_ip', 'Maxmind bin database has not been downloaded yet', array(), WATCHDOG_NOTICE);
      variable_set('smart_ip_maxmind_bin_db_update_error', t('Maxmind bin database does not exist (you can download the database now to get rid of this message).'));
    }
  }
  elseif ($smart_ip_source == 'maxmindgeoip2_bin') {

    // MaxMind GeoIP2 binary database
    module_load_include('php', 'smart_ip', 'includes/vendor/autoload');
    $version = variable_get('smart_ip_maxmind_geoip2_bin_version', SMART_IP_MAXMIND_BIN_LICENSED_VERSION);
    $edition = variable_get('smart_ip_maxmind_geoip2_bin_edition', SMART_IP_MAXMIND_GEOIP2_BIN_EDITION_CITY);
    $filename = smart_ip_get_geoip2_bin_source_filename($version, $edition);
    $db_path = variable_get('smart_ip_maxmind_geoip2_bin_custom_path', '');
    if (empty($db_path)) {
      $db_path = drupal_realpath(file_stream_wrapper_uri_normalize('private://smart_ip'));
    }
    $db_path = "{$db_path}/{$filename}";
    if (file_exists($db_path)) {
      if (class_exists('MaxMind\\Db\\Reader')) {
        $reader = new MaxMind\Db\Reader($db_path);
        $raw = $reader
          ->get($ip_address);
      }
      else {
        $reader = new GeoIp2\Database\Reader($db_path);
        if ($edition == SMART_IP_MAXMIND_GEOIP2_BIN_EDITION_CITY) {
          $record = $reader
            ->city($ip_address);
        }
        elseif ($edition == SMART_IP_MAXMIND_GEOIP2_BIN_EDITION_COUNTRY) {
          $record = $reader
            ->country($ip_address);
        }
        if (!empty($record)) {
          $raw = $record
            ->jsonSerialize();
        }
      }
      if (!empty($raw)) {
        global $language;
        $lang = $language->language;
        if (!isset($raw['country']['names'][$lang])) {

          // The current language is not yet supported by MaxMind, use English as
          // default language.
          $lang = 'en';
        }
        $result['original_data'] = $raw;
        $result['country'] = isset($raw['country']['names'][$lang]) ? $raw['country']['names'][$lang] : '';
        $result['country_code'] = isset($raw['country']['iso_code']) ? strtoupper($raw['country']['iso_code']) : '';
        $result['city'] = isset($raw['city']['names'][$lang]) ? $raw['city']['names'][$lang] : '';
        $result['zip'] = isset($raw['postal']['code']) ? $raw['postal']['code'] : '';
        $result['region_code'] = isset($raw['subdivisions'][0]['iso_code']) ? $raw['subdivisions'][0]['iso_code'] : '';
        $result['region'] = isset($raw['subdivisions'][0]['names'][$lang]) ? $raw['subdivisions'][0]['names'][$lang] : '';
        $result['latitude'] = isset($raw['location']['latitude']) ? $raw['location']['latitude'] : '';
        $result['longitude'] = isset($raw['location']['longitude']) ? $raw['location']['longitude'] : '';
        $result['time_zone'] = isset($raw['location']['time_zone']) ? $raw['location']['time_zone'] : '';
        $result['is_eu_country'] = isset($raw['country']['is_in_european_union']) ? $raw['country']['is_in_european_union'] : '';
      }
    }
  }
  elseif ($smart_ip_source == 'ip2location_bin') {

    // IP2Location binary database
    module_load_include('php', 'smart_ip', 'includes/vendor/autoload');
    $ip_ver = smart_ip_get_ip_address_version($ip_address);
    if ($ip_ver == 4) {
      $custom_path = variable_get('smart_ip_ip2location_bin_path', '');
    }
    elseif ($ip_ver == 6) {
      $custom_path = variable_get('smart_ip_ip2location_ipv6_bin_path', '');
    }
    if (!empty($custom_path)) {
      switch (variable_get('smart_ip_ip2location_bin_cache', 'no_cache')) {
        case 'shared_memory':
          $location_data = new IP2Location\Database($custom_path, IP2Location\Database::SHARED_MEMORY);
          break;
        case 'memory_cache':
          $location_data = new IP2Location\Database($custom_path, IP2Location\Database::MEMORY_CACHE);
          break;
        case 'no_cache':
        default:
          $location_data = new IP2Location\Database($custom_path, IP2Location\Database::FILE_IO);
          break;
      }
      $record = $location_data
        ->lookup($ip_address, IP2Location\Database::ALL);
      foreach ($record as &$item) {
        if (strpos($item, 'Please upgrade') !== FALSE || strpos($item, 'Invalid IP address') !== FALSE || $item == '-') {

          // Make the value "This parameter is unavailable in selected .BIN
          // data file. Please upgrade." or "Invalid IP address" or "-" as
          // NULL.
          $item = NULL;
        }
      }
      $result['original_data'] = $record;
      $result['country_code'] = isset($record['countryCode']) ? strtoupper($record['countryCode']) : '';
      $result['country'] = isset($record['countryName']) ? $record['countryName'] : '';
      $result['region'] = isset($record['regionName']) ? $record['regionName'] : '';
      $result['region_code'] = '';
      $result['city'] = isset($record['cityName']) ? $record['cityName'] : '';
      $result['zip'] = isset($record['zipCode']) ? $record['zipCode'] : '';
      $result['latitude'] = isset($record['latitude']) ? $record['latitude'] : '';
      $result['longitude'] = isset($record['longitude']) ? $record['longitude'] : '';
      $result['time_zone'] = isset($record['timeZone']) ? $record['timeZone'] : '';
    }
  }
  elseif ($smart_ip_source == 'ipinfodb_service') {

    // IPInfoDB.com service
    $ipinfodb_key = variable_get('smart_ip_ipinfodb_key', 0);
    $version = variable_get('smart_ip_use_ipinfodb_api_version', 3);
    $request = drupal_http_request(smart_ip_get_ipinfodb_url($ipinfodb_key, $ip_address, $version), $request_options);
    $request_data = isset($request->data) ? drupal_json_decode($request->data) : '';
    if (!empty($request_data)) {
      foreach ($request_data as &$datum) {
        if (strpos($datum, 'Please upgrade') !== FALSE || strpos($datum, 'Invalid IP address') !== FALSE || $datum == '-') {

          // Make the value "This parameter is unavailable in selected .BIN
          // data file. Please upgrade." or "Invalid IP address" or "-" as
          // NULL.
          $datum = NULL;
        }
      }
      if ($version == 3) {

        // IPInfoDB version 3
        $result['country'] = isset($request_data['countryName']) ? ucwords(strtolower($request_data['countryName'])) : '';
        $result['country_code'] = isset($request_data['countryCode']) ? strtoupper($request_data['countryCode']) : '';
        $result['region'] = isset($request_data['regionName']) ? ucwords(strtolower($request_data['regionName'])) : '';
        $result['region_code'] = '';
        $result['city'] = isset($request_data['cityName']) ? ucwords(strtolower($request_data['cityName'])) : '';
        $result['zip'] = isset($request_data['zipCode']) ? $request_data['zipCode'] : '';
        $result['latitude'] = isset($request_data['latitude']) ? $request_data['latitude'] : '';
        $result['longitude'] = isset($request_data['longitude']) ? $request_data['longitude'] : '';
        $result['time_zone'] = isset($request_data['timeZone']) ? $request_data['timeZone'] : '';
      }
      else {

        // IPInfoDB version 2
        $region = '';
        if (isset($request_data['RegionCode']) && isset($request_data['CountryCode'])) {
          $region_result = array();
          $region_result = smart_ip_get_region_static($request_data['CountryCode'], $request_data['RegionCode']);
          $region = $region_result[$request_data['CountryCode']][$request_data['RegionCode']];
        }
        elseif (isset($request_data['RegionName'])) {
          $region = $request_data['RegionName'];
        }
        $result['country'] = isset($request_data['CountryName']) ? $request_data['CountryName'] : '';
        $result['country_code'] = isset($request_data['CountryCode']) ? strtoupper($request_data['CountryCode']) : '';
        $result['region'] = $region;
        $result['region_code'] = isset($request_data['RegionCode']) ? $request_data['RegionCode'] : '';
        $result['city'] = isset($request_data['City']) ? $request_data['City'] : '';
        $result['zip'] = isset($request_data['ZipPostalCode']) ? $request_data['ZipPostalCode'] : '';
        $result['latitude'] = isset($request_data['Latitude']) ? $request_data['Latitude'] : '';
        $result['longitude'] = isset($request_data['Longitude']) ? $request_data['Longitude'] : '';
        $result['time_zone'] = '';
      }
    }
  }
  elseif ($smart_ip_source == 'abstract_service') {

    // Abstract IP Geolocation service
    $abstract_key = variable_get('smart_ip_abstract_key', 0);
    $version = variable_get('smart_ip_abstract_version', 1);
    $request = drupal_http_request(smart_ip_get_abstract_url($abstract_key, $ip_address, $version), $request_options);
    $request_data = isset($request->data) ? drupal_json_decode($request->data) : '';
    if (!empty($request_data) && !isset($request_data['error'])) {
      if ($version == 1) {

        // Abstract IP Geolocation service version 1
        $result['country'] = isset($request_data['country']) ? $request_data['country'] : '';
        $result['country_code'] = isset($request_data['country_code']) ? strtoupper($request_data['country_code']) : '';
        $result['region'] = isset($request_data['region']) ? $request_data['region'] : '';
        $result['region_code'] = isset($request_data['region_iso_code']) ? $request_data['region_iso_code'] : '';
        $result['city'] = isset($request_data['city']) ? $request_data['city'] : '';
        $result['zip'] = isset($request_data['postal_code']) ? $request_data['postal_code'] : '';
        $result['latitude'] = isset($request_data['latitude']) ? $request_data['latitude'] : '';
        $result['longitude'] = isset($request_data['longitude']) ? $request_data['longitude'] : '';
        $result['time_zone'] = isset($request_data['timezone']['name']) ? $request_data['timezone']['name'] : '';
      }
    }
  }
  elseif ($smart_ip_source == 'x_header') {

    // X-GeoIP
    module_load_include('inc', 'smart_ip', 'includes/smart_ip.country_list');
    $countries = country_get_predefined_list();
    $result['country_code'] = isset($_SERVER['HTTP_X_GEOIP_COUNTRY']) ? $_SERVER['HTTP_X_GEOIP_COUNTRY'] : '';
    $result['country'] = empty($result['country_code']) ? '' : $countries[$result['country_code']];
    $result['region'] = '';
    $result['region_code'] = '';
    $result['city'] = '';
    $result['zip'] = '';
    $result['latitude'] = '';
    $result['longitude'] = '';
    $result['time_zone'] = '';
  }
  elseif ($smart_ip_source == 'es_header') {

    // Akamai EdgeScape IP Geolocation
    module_load_include('inc', 'smart_ip', 'includes/smart_ip.country_list');
    $countries = country_get_predefined_list();
    if (isset($_SERVER['HTTP_X_AKAMAI_EDGESCAPE'])) {
      parse_str(str_replace(',', '&', $_SERVER['HTTP_X_AKAMAI_EDGESCAPE']), $es_header);
    }
    $result['country_code'] = isset($es_header['country_code']) ? $es_header['country_code'] : '';
    $result['country_code'] = strtoupper($result['country_code']);
    $result['country'] = empty($result['country_code']) ? '' : $countries[$result['country_code']];
    $result['region_code'] = isset($es_header['region_code']) ? $es_header['region_code'] : '';
    $region = '';
    if (isset($result['region_code']) && isset($result['country_code'])) {
      $region_result = array();
      $region_result = smart_ip_get_region_static($result['country_code'], $result['region_code']);
      $region = $region_result[$result['country_code']][$result['region_code']];
    }
    $result['region'] = $region;
    $result['city'] = isset($es_header['city']) ? $es_header['city'] : '';
    $result['zip'] = isset($es_header['zip']) ? $es_header['zip'] : '';
    $result['latitude'] = isset($es_header['lat']) ? $es_header['lat'] : '';
    $result['longitude'] = isset($es_header['long']) ? $es_header['long'] : '';
    $result['time_zone'] = isset($es_header['timezone']) ? $es_header['timezone'] : '';
  }
  elseif ($smart_ip_source == 'cf_header') {

    // Cloudflare IP Geolocation
    module_load_include('inc', 'smart_ip', 'includes/smart_ip.country_list');
    $countries = country_get_predefined_list();
    $result['country_code'] = isset($_SERVER['HTTP_CF_IPCOUNTRY']) ? $_SERVER['HTTP_CF_IPCOUNTRY'] : '';
    $result['country_code'] = strtoupper($result['country_code']);
    $result['country'] = empty($result['country_code']) ? '' : $countries[$result['country_code']];
    $result['region'] = '';
    $result['region_code'] = '';
    $result['city'] = '';
    $result['zip'] = '';
    $result['latitude'] = '';
    $result['longitude'] = '';
    $result['time_zone'] = '';
  }
  $result['source'] = SMART_IP_SOURCE_SMART_IP;
  $result['ip_address'] = $ip_address;
  $result['timestamp'] = REQUEST_TIME;
  smart_ip_update_fields($result);

  // Allow other modules to modify result via hook_smart_ip_get_location_alter()
  drupal_alter('smart_ip_get_location', $result);
  $results[$ip_address] = $result;
  return $result;
}