]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Generate ETags for pages which don't specify themselves.
authorCraig Andrews <candrews@integralblue.com>
Sun, 13 Sep 2009 21:30:50 +0000 (17:30 -0400)
committerCraig Andrews <candrews@integralblue.com>
Sun, 13 Sep 2009 21:30:50 +0000 (17:30 -0400)
index.php
lib/action.php

index 7669778f64e68a60081da00feb564494e4f78117..72ceb45df27fd0df0f44802efc9a3cdff3fbe5c9 100644 (file)
--- 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());
index 670eb498c1a63375af9c37b882c4a61b87f8af45..06cdbdfe0f70685b212df21b40cba962dd5bb8a4 100644 (file)
@@ -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)
+    {
     }
 
     /**