summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEvan Prodromou <evan@controlyourself.ca>2008-12-01 23:42:11 -0500
committerEvan Prodromou <evan@controlyourself.ca>2008-12-01 23:42:11 -0500
commitbe33850c5fceb418aec05fe537a85b7fe14f9bde (patch)
tree98b40d3b0f458781826a38240d72a5fc3b89386d
parentcad6f78fe66e73665fe736cfe78d6633e1120ea7 (diff)
add ETag handling
darcs-hash:20081202044211-5ed1f-d8779be7681fc21eebff3c0c56fdde892c2fa3da.gz
-rw-r--r--lib/action.php21
1 files changed, 18 insertions, 3 deletions
diff --git a/lib/action.php b/lib/action.php
index 754bbdbae..fc69efcce 100644
--- a/lib/action.php
+++ b/lib/action.php
@@ -40,6 +40,10 @@ class Action { // lawsuit
return NULL;
}
+ function etag() {
+ return NULL;
+ }
+
function is_readonly() {
return false;
}
@@ -62,6 +66,11 @@ class Action { // lawsuit
function handle($argarray=NULL) {
$lm = $this->last_modified();
+ $etag = $this->etag();
+
+ if ($etag) {
+ header('ETag: ' . $etag);
+ }
if ($lm) {
header('Last-Modified: ' . date(DATE_RFC822, $lm));
@@ -69,14 +78,20 @@ class Action { // lawsuit
if ($if_modified_since) {
$ims = strtotime($if_modified_since);
if ($lm <= $ims) {
- header('HTTP/1.1 304 Not Modified');
- # Better way to do this?
- exit(0);
+ if (!$etag || $this->_has_etag($etag, $_SERVER['HTTP_IF_NONE_MATCH'])) {
+ header('HTTP/1.1 304 Not Modified');
+ # Better way to do this?
+ exit(0);
+ }
}
}
}
}
+ function _has_etag($etag, $if_none_match) {
+ return ($if_none_match) && in_array($etag, explode(',', $if_none_match));
+ }
+
function boolean($key, $def=false) {
$arg = strtolower($this->trimmed($key));