diff options
author | Craig Andrews <candrews@integralblue.com> | 2009-09-13 17:30:50 -0400 |
---|---|---|
committer | Craig Andrews <candrews@integralblue.com> | 2009-09-13 17:30:50 -0400 |
commit | b9e4b6dd49e8f2c56025df8424137144723d2021 (patch) | |
tree | f2b6a89e78d05bc77846d61a5416d160063e62ff /lib | |
parent | 20997619b353faa94591800fbfc02bc19a4cdce3 (diff) |
Generate ETags for pages which don't specify themselves.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/action.php | 43 |
1 files changed, 38 insertions, 5 deletions
diff --git a/lib/action.php b/lib/action.php index 670eb498c..06cdbdfe0 100644 --- a/lib/action.php +++ b/lib/action.php @@ -873,38 +873,71 @@ class Action extends HTMLOutputter // lawsuit } /** - * Handler method + * Wrapper for the handle method that handles etags, last-modified, and other conditional headers * * @param array $argarray is ignored since it's now passed in in prepare() * * @return boolean is read only action? */ - function handle($argarray=null) + function handleWrapper($argarray=null) { - header('Vary: Accept-Encoding,Cookie'); + header('Vary: Accept-Encoding,Cookie,Accept-Language,Authorization'); + header("Cache-Control: must-revalidate"); $lm = $this->lastModified(); $etag = $this->etag(); if ($etag) { header('ETag: ' . $etag); } + $if_none_match = (array_key_exists('HTTP_IF_NONE_MATCH', $_SERVER)) ? + $_SERVER['HTTP_IF_NONE_MATCH'] : null; if ($lm) { header('Last-Modified: ' . date(DATE_RFC1123, $lm)); if (array_key_exists('HTTP_IF_MODIFIED_SINCE', $_SERVER)) { $if_modified_since = $_SERVER['HTTP_IF_MODIFIED_SINCE']; $ims = strtotime($if_modified_since); if ($lm <= $ims) { - $if_none_match = (array_key_exists('HTTP_IF_NONE_MATCH', $_SERVER)) ? - $_SERVER['HTTP_IF_NONE_MATCH'] : null; if (!$if_none_match || !$etag || $this->_hasEtag($etag, $if_none_match)) { header('HTTP/1.1 304 Not Modified'); + header('Content-Length: 0'); // Better way to do this? exit(0); } } } } + if($etag) { + $ret = $this->handle($argarray); + }else{ + ob_start(); + $ret = $this->handle($argarray); + $output = ob_get_contents(); + ob_end_clean(); + //deep etag + $etag = md5($output); + header('ETag: ' . $etag); + if($if_none_match && $this->_hasEtag($etag, $if_none_match)) { + header('HTTP/1.1 304 Not Modified'); + header('Content-Length: 0'); + // Better way to do this? + exit(0); + } + header('Content-Length: '.strlen($output)); + print $output; + } + return $ret; + } + + /** + * Handler method + * + * @param array $argarray is ignored since it's now passed in in prepare() + * + * @return boolean is read only action? + */ + function handle($argarray=null) + { } /** |