diff options
author | Bharat Mediratta <bharat@menalto.com> | 2009-05-27 15:11:53 -0700 |
---|---|---|
committer | Bharat Mediratta <bharat@menalto.com> | 2009-05-27 15:11:53 -0700 |
commit | 12fe58d997d2066dc362fd393a18b4e5da190513 (patch) | |
tree | 3ad8e5afb77829e1541ec96d86785760d65c04ac /system/helpers/expires.php | |
parent | 00f47d4ddddcd1902db817018dd79ac01bcc8e82 (diff) |
Rename 'kohana' to 'system' to conform to the Kohana filesystem layout. I'm comfortable with us not clearly drawing the distinction about the fact that it's Kohana.
Diffstat (limited to 'system/helpers/expires.php')
-rw-r--r-- | system/helpers/expires.php | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/system/helpers/expires.php b/system/helpers/expires.php new file mode 100644 index 00000000..c43cc0cc --- /dev/null +++ b/system/helpers/expires.php @@ -0,0 +1,111 @@ +<?php defined('SYSPATH') OR die('No direct access allowed.'); +/** + * Controls headers that effect client caching of pages + * + * $Id: expires.php 4272 2009-04-25 21:47:26Z zombor $ + * + * @package Core + * @author Kohana Team + * @copyright (c) 2007-2008 Kohana Team + * @license http://kohanaphp.com/license.html + */ +class expires_Core { + + /** + * Sets the amount of time before a page expires + * + * @param integer Seconds before the page expires + * @return boolean + */ + public static function set($seconds = 60) + { + if (expires::check_headers()) + { + $now = $expires = time(); + + // Set the expiration timestamp + $expires += $seconds; + + // Send headers + header('Last-Modified: '.gmdate('D, d M Y H:i:s T', $now)); + header('Expires: '.gmdate('D, d M Y H:i:s T', $expires)); + header('Cache-Control: max-age='.$seconds); + + return $expires; + } + + return FALSE; + } + + /** + * Checks to see if a page should be updated or send Not Modified status + * + * @param integer Seconds added to the modified time received to calculate what should be sent + * @return bool FALSE when the request needs to be updated + */ + public static function check($seconds = 60) + { + if ( ! empty($_SERVER['HTTP_IF_MODIFIED_SINCE']) AND expires::check_headers()) + { + if (($strpos = strpos($_SERVER['HTTP_IF_MODIFIED_SINCE'], ';')) !== FALSE) + { + // IE6 and perhaps other IE versions send length too, compensate here + $mod_time = substr($_SERVER['HTTP_IF_MODIFIED_SINCE'], 0, $strpos); + } + else + { + $mod_time = $_SERVER['HTTP_IF_MODIFIED_SINCE']; + } + + $mod_time = strtotime($mod_time); + $mod_time_diff = $mod_time + $seconds - time(); + + if ($mod_time_diff > 0) + { + // Re-send headers + header('Last-Modified: '.gmdate('D, d M Y H:i:s T', $mod_time)); + header('Expires: '.gmdate('D, d M Y H:i:s T', time() + $mod_time_diff)); + header('Cache-Control: max-age='.$mod_time_diff); + header('Status: 304 Not Modified', TRUE, 304); + + // Prevent any output + Event::add('system.display', array('expires', 'prevent_output')); + + // Exit to prevent other output + exit; + } + } + + return FALSE; + } + + /** + * Check headers already created to not step on download or Img_lib's feet + * + * @return boolean + */ + public static function check_headers() + { + foreach (headers_list() as $header) + { + if ((session_cache_limiter() == '' AND stripos($header, 'Last-Modified:') === 0) + OR stripos($header, 'Expires:') === 0) + { + return FALSE; + } + } + + return TRUE; + } + + /** + * Prevent any output from being displayed. Executed during system.display. + * + * @return void + */ + public static function prevent_output() + { + Kohana::$output = ''; + } + +} // End expires
\ No newline at end of file |