Fwd: [PHP-CVS] cvs: php4 /pear Makefile.in /pear/HTTP Compress.php

Chuck Hagenbuch chuck@horde.org
Fri, 12 Jan 2001 10:29:28 -0500


Those of you following Horde cvs closely will need this fairly soon.

----- Forwarded message from Chuck Hagenbuch <chuck@horde.org> -----
    Date: Fri, 12 Jan 2001 15:24:21 -0000
    From: Chuck Hagenbuch <chuck@horde.org>
Reply-To: Chuck Hagenbuch <chuck@horde.org>
 Subject: [PHP-CVS] cvs: php4 /pear Makefile.in  /pear/HTTP Compress.php  
      To: php-cvs@lists.php.net

chagenbu		Fri Jan 12 07:24:21 2001 EDT

  Added files:                 
    /php4/pear/HTTP	Compress.php 

  Modified files:              
    /php4/pear	Makefile.in 
  Log:
  Add HTTP_Compress::, which provides an easy wrapper around producing
  gzip-compressed html. This should be ported to use the ob_gzhandler()
output
  handler, but I haven't had a chance to look into that yet.
  
  
Index: php4/pear/Makefile.in
diff -u php4/pear/Makefile.in:1.61 php4/pear/Makefile.in:1.62
--- php4/pear/Makefile.in:1.61	Fri Jan 12 01:13:55 2001
+++ php4/pear/Makefile.in	Fri Jan 12 07:24:21 2001
@@ -18,6 +18,7 @@
 	DB \
 	File \
 	HTML \
+	HTTP \
 	Image \
 	Log \
 	Mail \
@@ -52,6 +53,7 @@
 	File/SearchReplace.php \
 	HTML/Form.php \
 	HTTP.php \
+	HTTP/Compress.php \
 	Image/Remote.php \
 	Log.php \
 	Log/composite.php \

Index: php4/pear/HTTP/Compress.php
+++ php4/pear/HTTP/Compress.php
<?php
/**
 * HTTP_Compress:: provides a wrapper around php's output buffering
 * mechanisms and also does compression, generates headers - ETag,
 * Content-Length, etc. - which may be beneficial to bandwidth
 * usage and performance.
 *
 * @author Mark Nottingham <mnot@pobox.com>
 * @author Chuck Hagenbuch <chuck@horde.org>
 * @version $Revision: 1.1 $
 */
class HTTP_Compress {
    
    /**
     * Start the output buffer, and make sure that implicit flush is
     * off so that data is always buffered.
     */
    function start()
    {
        ob_start();
        ob_implicit_flush(0);
    }
    
    /**
     * Output the contents of the output buffer, compressed if
     * desired, along with any relevant headers.
     *
     * @param boolean $compress (optional) Use gzip compression, if the
browser supports it.
     * @param boolean $use_etag Generate an ETag, and don't send the
body if the browser has the same object cached.
     * @param boolean $send_body Send the body of the request? Might be
false for HEAD requests.
     */
    function output($compress = true, $use_etag = true, $send_body =
true)
    {
        $min_gz_size = 1024;
        $page = ob_get_contents();
        $length = strlen($page);
        ob_end_clean();
        
        if ($compress && extension_loaded('zlib') && (strlen($page) >
$min_gz_size) &&
isset($GLOBALS['HTTP_SERVER_VARS']['HTTP_ACCEPT_ENCODING'])) {
            $ae = explode(',', str_replace(' ', '',
$GLOBALS['HTTP_SERVER_VARS']['HTTP_ACCEPT_ENCODING']));
            $enc = false;
            if (in_array('gzip', $ae)) {
                $enc = 'gzip';
            } else if (in_array('x-gzip', $ae)) {
                $enc = 'x-gzip';
            }
            
            if ($enc) {
                $page = gzencode($page);
                $length = strlen($page);
                header('Content-Encoding: ' . $enc);
                header('Vary: Accept-Encoding');
            } else {
                $compress = false;
            }
        } else {
            $compress = false;
        }
        
        if ($use_etag) {
            $etag = '"' . md5($page) . '"';
            header('ETag: ' . $etag);
            if
(isset($GLOBALS['HTTP_SERVER_VARS']['HTTP_IF_NONE_MATCH'])) {
                $inm = explode(',',
$GLOBALS['HTTP_SERVER_VARS']['HTTP_IF_NONE_MATCH']);
                foreach ($inm as $i) {
                    if (trim($i) == $etag) {
                        header('HTTP/1.0 304 Not Modified');
                        $send_body = false;
                        break;
                    }
                }
            }
        }
        
        if ($send_body) {
            header('Content-Length: ' . $length);
            echo $page;
        }
    }
    
}
?>



-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, e-mail: php-cvs-unsubscribe@lists.php.net
For additional commands, e-mail: php-cvs-help@lists.php.net
To contact the list administrators, e-mail:
php-list-admin@lists.php.net


----- End forwarded message -----



-chuck

--
Charles Hagenbuch, <chuck@horde.org>
"If you can't stand the heat, get out of the chicken!" - Baby Blues