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"; } } }
<?php require __DIR__ . '/../../bootstrap.php'; // emulate regularly updating document $every = 20; $lastModified = round(time() / $every) * $every - $every; list($enc, ) = HTTP_Encoder::getAcceptedEncoding(); $cg = new HTTP_ConditionalGet(array('lastModifiedTime' => $lastModified, 'encoding' => $enc)); $cg->sendHeaders(); if ($cg->cacheIsValid) { // we're done exit; } // output encoded content $title = 'ConditionalGet + Encoder'; $explain = ' <p>Using ConditionalGet and Encoder is straightforward. First impliment the ConditionalGet, then if the cache is not valid, encode and send the content</p> <p>This script emulates a document that changes every ' . $every . ' seconds. <br>This is version: ' . date('r', $lastModified) . '</p> '; require '_include.php'; $content = get_content(array('title' => $title, 'explain' => $explain)); $he = new HTTP_Encoder(array('content' => get_content(array('title' => $title, 'explain' => $explain)))); $he->encode(); // usually you would just $he->sendAll(), but here we want to emulate slow // connection $he->sendHeaders(); send_slowly($he->getContent());