コード例 #1
0
/**
 * Reads the headers of the data file to be used throughout the detection.
 *
 * @return array
 *   The headers of the data file.
 */
function fiftyone_degrees_get_headers()
{
    global $_fiftyone_degrees_data_file_path;
    $headers['data_file_path'] = $_fiftyone_degrees_data_file_path;
    $_fiftyone_degrees_data_file = fiftyone_degrees_get_data_file(0);
    $headers['info'] = fiftyone_degrees_get_data_info($_fiftyone_degrees_data_file);
    $version = "{$headers['info']['major_version']}.{$headers['info']['minor_version']}";
    $supported_version = fiftyone_degrees_get_supported_version();
    if ($version !== $supported_version) {
        die('An incompatible data file has been supplied. Ensure the lastest 51Degrees data and api are being used.');
    }
    $headers['ascii_strings_offset'] = fiftyone_degrees_read_int($_fiftyone_degrees_data_file);
    $headers['ascii_strings_length'] = fiftyone_degrees_read_int($_fiftyone_degrees_data_file);
    $headers['ascii_strings_count'] = fiftyone_degrees_read_int($_fiftyone_degrees_data_file);
    $headers['component_offset'] = fiftyone_degrees_read_int($_fiftyone_degrees_data_file);
    $headers['component_length'] = fiftyone_degrees_read_int($_fiftyone_degrees_data_file);
    $headers['component_count'] = fiftyone_degrees_read_int($_fiftyone_degrees_data_file);
    $headers['map_offset'] = fiftyone_degrees_read_int($_fiftyone_degrees_data_file);
    $headers['map_length'] = fiftyone_degrees_read_int($_fiftyone_degrees_data_file);
    $headers['map_count'] = fiftyone_degrees_read_int($_fiftyone_degrees_data_file);
    $headers['property_offset'] = fiftyone_degrees_read_int($_fiftyone_degrees_data_file);
    $headers['property_length'] = fiftyone_degrees_read_int($_fiftyone_degrees_data_file);
    $headers['property_count'] = fiftyone_degrees_read_int($_fiftyone_degrees_data_file);
    $headers['values_offset'] = fiftyone_degrees_read_int($_fiftyone_degrees_data_file);
    $headers['values_length'] = fiftyone_degrees_read_int($_fiftyone_degrees_data_file);
    $headers['values_count'] = fiftyone_degrees_read_int($_fiftyone_degrees_data_file);
    $headers['profile_offset'] = fiftyone_degrees_read_int($_fiftyone_degrees_data_file);
    $headers['profile_length'] = fiftyone_degrees_read_int($_fiftyone_degrees_data_file);
    $headers['profile_count'] = fiftyone_degrees_read_int($_fiftyone_degrees_data_file);
    $headers['signatures_offset'] = fiftyone_degrees_read_int($_fiftyone_degrees_data_file);
    $headers['signatures_length'] = fiftyone_degrees_read_int($_fiftyone_degrees_data_file);
    $headers['signatures_count'] = fiftyone_degrees_read_int($_fiftyone_degrees_data_file);
    $headers['ranked_signatures_offset'] = fiftyone_degrees_read_int($_fiftyone_degrees_data_file);
    $headers['ranked_signatures_length'] = fiftyone_degrees_read_int($_fiftyone_degrees_data_file);
    $headers['ranked_signatures_count'] = fiftyone_degrees_read_int($_fiftyone_degrees_data_file);
    $headers['node_offset'] = fiftyone_degrees_read_int($_fiftyone_degrees_data_file);
    $headers['node_length'] = fiftyone_degrees_read_int($_fiftyone_degrees_data_file);
    $headers['node_count'] = fiftyone_degrees_read_int($_fiftyone_degrees_data_file);
    $headers['root_node_offset'] = fiftyone_degrees_read_int($_fiftyone_degrees_data_file);
    $headers['root_node_length'] = fiftyone_degrees_read_int($_fiftyone_degrees_data_file);
    $headers['root_node_count'] = fiftyone_degrees_read_int($_fiftyone_degrees_data_file);
    $headers['profile_offsets_offset'] = fiftyone_degrees_read_int($_fiftyone_degrees_data_file);
    $headers['profile_offsets_length'] = fiftyone_degrees_read_int($_fiftyone_degrees_data_file);
    $headers['profile_offsets_count'] = fiftyone_degrees_read_int($_fiftyone_degrees_data_file);
    return $headers;
}
コード例 #2
0
function fiftyone_degrees_download_to_file($url, $file_name)
{
    $result = FALSE;
    $params = array('http' => array('method' => 'GET', 'header' => "Accept: application/octet-stream\r\n" . "Accept-Language: en-GB,en-US;q=0.8,en;q=0.6\r\n"));
    $name = fiftyone_degrees_get_current_dataset_name();
    if ($name != 'Lite') {
        $data_date = fiftyone_degrees_get_data_date();
        $fdate = date('r', $data_date);
        $params['http']['header'] .= "Last-Modified: {$fdate}\r\n";
    }
    ini_set('user_agent', '51Degrees PHP Device Data Updater');
    $ctx = stream_context_create($params);
    stream_context_set_params($ctx, array("notification" => "fiftyone_degrees_stream_notification"));
    $file = fopen($url, "rb", FALSE, $ctx);
    if (fiftyone_degrees_response_is_304($http_response_header)) {
        fiftyone_degrees_write_message("There is no available data file newer than the one previously installed.");
        if (isset($fdate)) {
            fiftyone_degrees_write_message("Current data is dated {$fdate}.");
        }
        return TRUE;
    }
    $temp_file_name = $file_name . '.tmp';
    if ($file) {
        $newf = fopen($temp_file_name, "wb");
        global $fiftyone_degrees_bytes_max;
        if ($newf) {
            $bytes_loaded = 0;
            while (!feof($file)) {
                /* fread used in this way presents two separate files as the same stream.
                   This checks if the content length has been reached and stops the download
                   before the file is corrupted. */
                $bytes_left = $fiftyone_degrees_bytes_max - $bytes_loaded;
                if ($bytes_left > 0) {
                    $bytes_to_read = 1024 * 8;
                    if ($bytes_to_read > $bytes_left) {
                        $bytes_to_read = $bytes_left;
                    }
                    $segment = fread($file, $bytes_to_read);
                    $written = fwrite($newf, $segment, $bytes_to_read);
                    $bytes_loaded += $written;
                } else {
                    break;
                }
            }
            fclose($newf);
            if (fiftyone_degrees_has_valid_hash($http_response_header, $temp_file_name)) {
                // check that the file is a supported version
                $temp_file = fopen($temp_file_name, 'rb');
                $info = fiftyone_degrees_get_data_info($temp_file);
                $version = "{$info['major_version']}.{$info['minor_version']}";
                $supported_version = fiftyone_degrees_get_supported_version();
                fclose($temp_file);
                if ($version != $supported_version) {
                    fiftyone_degrees_write_message('The data file downloaded has a newer format version than this API supports. Update the API to get new data files.');
                } else {
                    $attempt = 0;
                    while (!@rename($temp_file_name, $file_name) && $attempt < 20) {
                        usleep(500);
                        $attempt++;
                    }
                    if ($attempt >= 20) {
                        fiftyone_degrees_write_message('The data file cannot be written, probably because the server does not have sufficient permissions, or another process is locking the file.');
                    } else {
                        $new_data_date = fiftyone_degrees_get_data_date();
                        $new_data_date_f = date('r', $new_data_date);
                        fiftyone_degrees_write_message("New data downloaded published on {$new_data_date_f}");
                        $result = TRUE;
                    }
                }
            } else {
                fiftyone_degrees_write_message('Invalid file hash. The file is probably corrupted.');
            }
            @unlink($temp_file_name);
        }
        fclose($file);
    }
    return $result;
}