Send the css/js file to the client.

Paramètres

array $files_to_save: Array of filenames and data.

string $uri: Requested filename.

bool $created: If file was created in a different thread.

string $filename: Just the filename no path information.

string $type: String: css or js.

array $aggregate_settings: Array of settings. Used to generate the 307 redirect location.

1 call to advagg_missing_send_saved_file()
advagg_missing_generate dans ./advagg.missing.inc
Generates a missing CSS/JS file and send it to client.

Fichier

./advagg.missing.inc, line 229

Code

function advagg_missing_send_saved_file(array $files_to_save, $uri, $created, $filename, $type, $redirect_counter, array $aggregate_settings = array()) {
    // Send a 304 if this is a repeat request.
    if (!empty($_SERVER['HTTP_IF_MODIFIED_SINCE']) && strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) >= REQUEST_TIME) {
        header("HTTP/1.1 304 Not Modified");
        exit;
    }
    $return_compressed_br = FALSE;
    $return_compressed_gz = FALSE;
    // Negotiate whether to use gzip compression.
    if (!empty($_SERVER['HTTP_ACCEPT_ENCODING'])) {
        if (strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'br') !== FALSE) {
            $return_compressed_br = TRUE;
        }
        if (strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== FALSE) {
            $return_compressed_gz = TRUE;
        }
    }
    header('Vary: Accept-Encoding', FALSE);
    if (!empty($created)) {
        if ($return_compressed_br && file_exists($uri . '.br') && filesize($uri . '.br') > 0) {
            $uri .= '.br';
        }
        elseif ($return_compressed_gz && file_exists($uri . '.gz') && filesize($uri . '.gz') > 0) {
            $uri .= '.gz';
        }
        if (!isset($files_to_save[$uri]) && file_exists($uri) && filesize($uri)) {
            // Do not use advagg_file_get_contents here.
            $files_to_save[$uri] = (string) @file_get_contents($uri);
        }
    }
    // Make sure zlib.output_compression does not compress the output.
    ini_set('zlib.output_compression', '0');
    header('Vary: Accept-Encoding', FALSE);
    // Clear the output buffer.
    if (ob_get_level()) {
        ob_end_clean();
    }
    // Set generic far future headers.
    if (variable_get('advagg_farfuture_php', ADVAGG_FARFUTURE_PHP)) {
        advagg_missing_set_farfuture_headers();
    }
    // Return compressed content if we can.
    if ($return_compressed_br || $return_compressed_gz) {
        foreach ($files_to_save as $uri => $data) {
            // See if this uri contains .br near the end of it.
            $pos = strripos($uri, '.br', 91 + strlen(ADVAGG_SPACE) * 3);
            if (!empty($pos)) {
                $len = strlen($uri);
                if ($pos == $len - 3) {
                    // .br file exists, send it out.
                    header('Content-Encoding: br');
                    break;
                }
            }
            // See if this uri contains .gz near the end of it.
            $pos = strripos($uri, '.gz', 91 + strlen(ADVAGG_SPACE) * 3);
            if (!empty($pos)) {
                $len = strlen($uri);
                if ($pos == $len - 3) {
                    // .gz file exists, send it out.
                    header('Content-Encoding: gzip');
                    break;
                }
            }
        }
    }
    else {
        $data = trim(reset($files_to_save));
    }
    // Output file and exit.
    if (!empty($data)) {
        $strlen = strlen($data);
        // Send a 304 if this is a repeat request.
        if (isset($_SERVER['HTTP_IF_NONE_MATCH'])) {
            $etags = explode(' ', $_SERVER['HTTP_IF_NONE_MATCH']);
            if ($etags[0] < REQUEST_TIME + 31 * 24 * 60 * 60 && isset($etags[1]) && $etags[1] == $strlen) {
                header("HTTP/1.1 304 Not Modified");
                exit;
            }
        }
        // Send out a 200 OK status.
        $default = ADVAGG_HTTP_200_CODE;
        if (module_exists('httprl') && variable_get('advagg_use_httprl', ADVAGG_USE_HTTPRL) && (is_callable('httprl_is_background_callback_capable') && httprl_is_background_callback_capable() || !is_callable('httprl_is_background_callback_capable'))) {
            // Use 203 instead of 200 if HTTPRL is being used.
            $default = 203;
        }
        $number = variable_get('advagg_http_200_code', $default);
        header("{$_SERVER['SERVER_PROTOCOL']} {$number} OK");
        // Insure the Last-Modified header is set so 304's work correctly.
        if (file_exists($uri) && ($filemtime = @filemtime($uri))) {
            header('Last-Modified: ' . gmdate('D, d M Y H:i:s \\G\\M\\T', $filemtime));
            // Etags generation in php is broken due to millisecond precision for the
            // files mtime; apache has it, php does not.
        }
        else {
            header('Last-Modified: ' . gmdate('D, d M Y H:i:s \\G\\M\\T', REQUEST_TIME));
        }
        // Set the Expires date 1 month into the future.
        if (variable_get('advagg_farfuture_php', ADVAGG_FARFUTURE_PHP)) {
            header('Expires: ' . gmdate('D, d M Y H:i:s \\G\\M\\T', REQUEST_TIME + 31 * 24 * 60 * 60));
        }
        // Also send an etag out.
        header('Etag: ' . REQUEST_TIME . ' ' . $strlen);
        if ($type === 'css') {
            header("Content-Type: text/css");
        }
        elseif ($type === 'js') {
            header("Content-Type: application/javascript; charset=UTF-8");
        }
        header('X-AdvAgg: Generated file at ' . REQUEST_TIME);
        print $data;
        exit;
    }
    else {
        // Redirect and try again on failure.
        $uri = advagg_generate_location_uri($filename, $type, $aggregate_settings);
        ++$redirect_counter;
        $uri .= '?redirect_counter=' . $redirect_counter;
        header('Location: ' . $uri, TRUE, 307);
        exit;
    }
}