summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorCraig Andrews <candrews@integralblue.com>2009-09-13 17:30:50 -0400
committerCraig Andrews <candrews@integralblue.com>2009-09-13 17:30:50 -0400
commitb9e4b6dd49e8f2c56025df8424137144723d2021 (patch)
treef2b6a89e78d05bc77846d61a5416d160063e62ff /lib
parent20997619b353faa94591800fbfc02bc19a4cdce3 (diff)
Generate ETags for pages which don't specify themselves.
Diffstat (limited to 'lib')
-rw-r--r--lib/action.php43
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)
+ {
}
/**