From 0a1d2635c1278a12a643c6ee684a9707df6e87dd Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Sun, 13 Sep 2009 01:01:31 -0400 Subject: Set a Vary header with accept-encoding and cookies. Fixes http://status.net/trac/ticket/17 --- lib/action.php | 1 + 1 file changed, 1 insertion(+) (limited to 'lib/action.php') diff --git a/lib/action.php b/lib/action.php index fafb2c6fc..670eb498c 100644 --- a/lib/action.php +++ b/lib/action.php @@ -881,6 +881,7 @@ class Action extends HTMLOutputter // lawsuit */ function handle($argarray=null) { + header('Vary: Accept-Encoding,Cookie'); $lm = $this->lastModified(); $etag = $this->etag(); if ($etag) { -- cgit v1.2.3-54-g00ecf From b9e4b6dd49e8f2c56025df8424137144723d2021 Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Sun, 13 Sep 2009 17:30:50 -0400 Subject: Generate ETags for pages which don't specify themselves. --- index.php | 2 +- lib/action.php | 43 ++++++++++++++++++++++++++++++++++++++----- 2 files changed, 39 insertions(+), 6 deletions(-) (limited to 'lib/action.php') diff --git a/index.php b/index.php index 7669778f6..72ceb45df 100644 --- a/index.php +++ b/index.php @@ -227,7 +227,7 @@ function main() try { if ($action_obj->prepare($args)) { - $action_obj->handle($args); + $action_obj->handleWrapper($args); } } catch (ClientException $cex) { $cac = new ClientErrorAction($cex->getMessage(), $cex->getCode()); 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) + { } /** -- cgit v1.2.3-54-g00ecf From d7e13e847dbce55ad8ed017f02e1ac8420881e4e Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Tue, 15 Sep 2009 17:17:36 -0400 Subject: 304 responses should not have a Content-Length header. --- lib/action.php | 2 -- 1 file changed, 2 deletions(-) (limited to 'lib/action.php') diff --git a/lib/action.php b/lib/action.php index 06cdbdfe0..ebef4f9e4 100644 --- a/lib/action.php +++ b/lib/action.php @@ -900,7 +900,6 @@ class Action extends HTMLOutputter // lawsuit !$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); } @@ -919,7 +918,6 @@ class Action extends HTMLOutputter // lawsuit 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); } -- cgit v1.2.3-54-g00ecf From 42ba05de5fa9413ce0f383cfdafa7288e291ab17 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Wed, 23 Sep 2009 09:33:40 -0400 Subject: revert output buffering (costly) for ETags (low priority) --- index.php | 2 +- lib/action.php | 41 +++++------------------------------------ 2 files changed, 6 insertions(+), 37 deletions(-) (limited to 'lib/action.php') diff --git a/index.php b/index.php index fa94f0c75..362ab3cd3 100644 --- a/index.php +++ b/index.php @@ -233,7 +233,7 @@ function main() try { if ($action_obj->prepare($args)) { - $action_obj->handleWrapper($args); + $action_obj->handle($args); } } catch (ClientException $cex) { $cac = new ClientErrorAction($cex->getMessage(), $cex->getCode()); diff --git a/lib/action.php b/lib/action.php index ebef4f9e4..670eb498c 100644 --- a/lib/action.php +++ b/lib/action.php @@ -873,29 +873,28 @@ class Action extends HTMLOutputter // lawsuit } /** - * Wrapper for the handle method that handles etags, last-modified, and other conditional headers + * Handler method * * @param array $argarray is ignored since it's now passed in in prepare() * * @return boolean is read only action? */ - function handleWrapper($argarray=null) + function handle($argarray=null) { - header('Vary: Accept-Encoding,Cookie,Accept-Language,Authorization'); - header("Cache-Control: must-revalidate"); + header('Vary: Accept-Encoding,Cookie'); $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)) { @@ -906,36 +905,6 @@ class Action extends HTMLOutputter // lawsuit } } } - 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'); - // 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) - { } /** -- cgit v1.2.3-54-g00ecf