If the encode method is '' (none) or compression level is 0, or the 'zlib'
extension isn't loaded, we return false.
Then the appropriate gz_* function is called to compress the content. If
this fails, false is returned.
The header "Vary: Accept-Encoding" is added. If encoding is successful,
the Content-Length header is updated, and Content-Encoding is also added.
/** * Gzip (encode) the HTTP response and write to output. * @param string $strBody The content that should be in the response. * @param string $strContentType The MIME type of the content. */ public static function send($strBody, $strContentType = "text/html") { $objEncoder = new \HTTP_Encoder(array("content" => $strBody, "type" => $strContentType)); $objEncoder->encode(); $objEncoder->sendAll(); exit; }
public static function render($arrFilter) { $dtLastModified = 0; //*** Load sources from sources directory. if (is_dir($GLOBALS["_PATHS"]['css'])) { //*** Directory exists. foreach ($arrFilter as $strFilter) { $strFile = $GLOBALS["_PATHS"]['css'] . "{$strFilter}.css"; $dtLastModified = self::getLastModified($strFile, $dtLastModified); //*** Auto check custom files. if (strpos($strFilter, "-custom") === false) { $strFile = $GLOBALS["_PATHS"]['css'] . "{$strFilter}-custom.css"; $dtLastModified = self::getLastModified($strFile, $dtLastModified); } } } //*** Check if we can send a "Not Modified" header. \HTTP_ConditionalGet::check($dtLastModified, true, array("maxAge" => 1200000)); //*** Modified. Get contents. $strOutput = self::minify($arrFilter); //*** Gzip the CSS. $objEncoder = new \HTTP_Encoder(array("content" => $strOutput, "type" => "text/css")); $objEncoder->encode(); $objEncoder->sendAll(); }
public static function render($arrFilter) { $dtLastModified = 0; //*** Load sources from sources directory. if (is_dir($GLOBALS["_PATHS"]['js'])) { //*** Directory exists. foreach ($arrFilter as $strFilter) { $strFile = $GLOBALS["_PATHS"]['js'] . $strFilter . ".js"; if (is_file($strFile)) { $lngLastModified = filemtime($strFile); if (empty($dtLastModified) || $lngLastModified > $dtLastModified) { $dtLastModified = $lngLastModified; } } } } //*** Check if we can send a "Not Modified" header. \HTTP_ConditionalGet::check($dtLastModified, true, array("maxAge" => 1200000)); //*** Modified. Get contents. $strOutput = self::minify($arrFilter); //*** Gzip the Javascript. $objEncoder = new \HTTP_Encoder(array("content" => $strOutput, "type" => "text/javascript")); $objEncoder->encode(); $objEncoder->sendAll(); }
function test_HTTP_Encoder() { global $thisDir; HTTP_Encoder::$encodeToIe6 = true; $methodTests = array(array('ua' => 'Any browser', 'ae' => 'compress, x-gzip', 'exp' => array('gzip', 'x-gzip'), 'desc' => 'recognize "x-gzip" as gzip'), array('ua' => 'Any browser', 'ae' => 'compress, x-gzip;q=0.5', 'exp' => array('gzip', 'x-gzip'), 'desc' => 'gzip w/ non-zero q'), array('ua' => 'Any browser', 'ae' => 'compress, x-gzip;q=0', 'exp' => array('compress', 'compress'), 'desc' => 'gzip w/ zero q'), array('ua' => 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)', 'ae' => 'gzip, deflate', 'exp' => array('', ''), 'desc' => 'IE6 w/o "enhanced security"'), array('ua' => 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)', 'ae' => 'gzip, deflate', 'exp' => array('deflate', 'deflate'), 'desc' => 'IE6 w/ "enhanced security"'), array('ua' => 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.01)', 'ae' => 'gzip, deflate', 'exp' => array('', ''), 'desc' => 'IE5.5'), array('ua' => 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.25', 'ae' => 'gzip,deflate', 'exp' => array('deflate', 'deflate'), 'desc' => 'Opera identifying as IE6')); foreach ($methodTests as $test) { $_SERVER['HTTP_USER_AGENT'] = $test['ua']; $_SERVER['HTTP_ACCEPT_ENCODING'] = $test['ae']; $exp = $test['exp']; $ret = HTTP_Encoder::getAcceptedEncoding(); $passed = assertTrue($exp == $ret, 'HTTP_Encoder : ' . $test['desc']); if (__FILE__ === realpath($_SERVER['SCRIPT_FILENAME'])) { echo "\n--- AE | UA = {$test['ae']} | {$test['ua']}\n"; echo "Expected = " . preg_replace('/\\s+/', ' ', var_export($exp, 1)) . "\n"; echo "Returned = " . preg_replace('/\\s+/', ' ', var_export($ret, 1)) . "\n\n"; } } HTTP_Encoder::$encodeToIe6 = false; $methodTests = array(array('ua' => 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)', 'ae' => 'gzip, deflate', 'exp' => array('', ''), 'desc' => 'IE6 w/ "enhanced security"')); foreach ($methodTests as $test) { $_SERVER['HTTP_USER_AGENT'] = $test['ua']; $_SERVER['HTTP_ACCEPT_ENCODING'] = $test['ae']; $exp = $test['exp']; $ret = HTTP_Encoder::getAcceptedEncoding(); $passed = assertTrue($exp == $ret, 'HTTP_Encoder : ' . $test['desc']); if (__FILE__ === realpath($_SERVER['SCRIPT_FILENAME'])) { echo "\n--- AE | UA = {$test['ae']} | {$test['ua']}\n"; echo "Expected = " . preg_replace('/\\s+/', ' ', var_export($exp, 1)) . "\n"; echo "Returned = " . preg_replace('/\\s+/', ' ', var_export($ret, 1)) . "\n\n"; } } if (!function_exists('gzdeflate')) { echo "!WARN: HTTP_Encoder : Zlib support is not present in PHP. Encoding cannot be performed/tested.\n"; return; } // test compression of varied content (HTML,JS, & CSS) $variedContent = file_get_contents($thisDir . '/_test_files/html/before.html') . file_get_contents($thisDir . '/_test_files/css/subsilver.css') . file_get_contents($thisDir . '/_test_files/js/jquery-1.2.3.js'); $variedLength = strlen($variedContent); $encodingTests = array(array('method' => 'deflate', 'inv' => 'gzinflate', 'exp' => 32157), array('method' => 'gzip', 'inv' => '_gzdecode', 'exp' => 32175), array('method' => 'compress', 'inv' => 'gzuncompress', 'exp' => 32211)); foreach ($encodingTests as $test) { $e = new HTTP_Encoder(array('content' => $variedContent, 'method' => $test['method'])); $e->encode(9); $ret = strlen($e->getContent()); // test uncompression $roundTrip = @call_user_func($test['inv'], $e->getContent()); $desc = "HTTP_Encoder : {$test['method']} : uncompress possible"; $passed = assertTrue($variedContent == $roundTrip, $desc); // test expected compressed size $desc = "HTTP_Encoder : {$test['method']} : compressed to " . sprintf('%4.2f%% of original', $ret / $variedLength * 100); $passed = assertTrue(abs($ret - $test['exp']) < 100, $desc); if (__FILE__ === realpath($_SERVER['SCRIPT_FILENAME'])) { echo "\n--- {$test['method']}: expected bytes: ", "{$test['exp']}. Returned: {$ret} ", "(off by " . abs($ret - $test['exp']) . " bytes)\n\n"; } } }
/** * Encode and send appropriate headers and content * * This is a convenience method for common use of the class * * @param string $content * * @param int $compressionLevel given to zlib functions. If not given, the * class default will be used. * * @return bool success true if the content was actually compressed */ public static function output($content, $compressionLevel = null) { if (null === $compressionLevel) { $compressionLevel = self::$compressionLevel; } $he = new HTTP_Encoder(array('content' => $content)); $ret = $he->encode($compressionLevel); $he->sendAll(); return $ret; }
<?php /** * AJAX checks for zlib.output_compression * * @package Minify */ $_oc = ini_get('zlib.output_compression'); // allow access only if builder is enabled require __DIR__ . '/../config.php'; if (!$min_enableBuilder) { header('Location: /'); exit; } if (isset($_GET['hello'])) { // echo 'World!' // try to prevent double encoding (may not have an effect) ini_set('zlib.output_compression', '0'); require $min_libPath . '/HTTP/Encoder.php'; HTTP_Encoder::$encodeToIe6 = true; // just in case $he = new HTTP_Encoder(array('content' => 'World!', 'method' => 'deflate')); $he->encode(); $he->sendAll(); } else { // echo status "0" or "1" header('Content-Type: text/plain'); echo (int) $_oc; }
/** * Echoes the Javascript if not cached. * * Echoes the javascript with the correct content. * Since the content is dinamic, i use the hash function. * * @param string $javascript * * @return void */ private function _echo_javascript($javascript) { $conditional_get = new HTTP_ConditionalGet(array('contentHash' => md5($javascript))); $conditional_get->sendHeaders(); if (!$conditional_get->cacheIsValid) { $http_encoder = new HTTP_Encoder(array('content' => $javascript, 'type' => 'text/javascript')); $compression_level = null; if ($this->_registry->get('model.settings')->get('disable_gzip_compression')) { // set the compression level to 0 to disable it. $compression_level = 0; } $http_encoder->encode($compression_level); $http_encoder->sendAll(); } Ai1ec_Http_Response_Helper::stop(0); }