aboutsummaryrefslogtreecommitdiff
path: root/lib/http-conditional.php
diff options
context:
space:
mode:
authorGravatar Alexandre Alapetite <alexandre@alapetite.fr> 2013-11-03 22:29:15 +0100
committerGravatar Alexandre Alapetite <alexandre@alapetite.fr> 2013-11-04 23:33:04 +0100
commit665d22be76db6ea58ee88bf29674fd37b36f5e68 (patch)
tree5ce05386c6326327cf0ad8b6a078950cce19e172 /lib/http-conditional.php
parent123f8dd164d073e13011430e4eb03619925e88fe (diff)
Mise à jour de la librairie http-conditional
Ajout d'un entête Expires qui ne devrait pas être nécessaire d'après la spécification mais qui semble aider certains navigateurs
Diffstat (limited to 'lib/http-conditional.php')
-rw-r--r--lib/http-conditional.php273
1 files changed, 139 insertions, 134 deletions
diff --git a/lib/http-conditional.php b/lib/http-conditional.php
index bd038aec3..1cf37725d 100644
--- a/lib/http-conditional.php
+++ b/lib/http-conditional.php
@@ -35,12 +35,12 @@
... //Rest of the script, just as you would do normally.
?>
- Version 1.6.2a, 2008-03-06, http://alexandre.alapetite.fr/doc-alex/php-http-304/
+ Version 1.7 beta, 2013-11-03, http://alexandre.alapetite.fr/doc-alex/php-http-304/
------------------------------------------------------------------
Written by Alexandre Alapetite, http://alexandre.alapetite.fr/cv/
- Copyright 2004-2008, Licence: Creative Commons "Attribution-ShareAlike 2.0 France" BY-SA (FR),
+ Copyright 2004-2013, Licence: Creative Commons "Attribution-ShareAlike 2.0 France" BY-SA (FR),
http://creativecommons.org/licenses/by-sa/2.0/fr/
http://alexandre.alapetite.fr/divers/apropos/#by-sa
- Attribution. You must give the original author credit
@@ -57,151 +57,156 @@
*/
//In RSS/ATOM feedMode, contains the date of the clients last update.
-$clientCacheDate=0; //Global public variable because PHP4 does not allow conditional arguments by reference
-$_sessionMode=false; //Global private variable
+$clientCacheDate=0; //Global public variable because PHP4 does not allow conditional arguments by reference
+$_sessionMode=false; //Global private variable
function httpConditional($UnixTimeStamp,$cacheSeconds=0,$cachePrivacy=0,$feedMode=false,$compression=false,$session=false)
{//Credits: http://alexandre.alapetite.fr/doc-alex/php-http-304/
- //RFC2616 HTTP/1.1: http://www.w3.org/Protocols/rfc2616/rfc2616.html
- //RFC1945 HTTP/1.0: http://www.w3.org/Protocols/rfc1945/rfc1945.txt
-
- if (headers_sent()) return false;
-
- if (isset($_SERVER['SCRIPT_FILENAME'])) $scriptName=$_SERVER['SCRIPT_FILENAME'];
- elseif (isset($_SERVER['PATH_TRANSLATED'])) $scriptName=$_SERVER['PATH_TRANSLATED'];
- else return false;
-
- if ((!$feedMode)&&(($modifScript=filemtime($scriptName))>$UnixTimeStamp))
- $UnixTimeStamp=$modifScript;
- $UnixTimeStamp=min($UnixTimeStamp,time());
- $is304=true;
- $is412=false;
- $nbCond=0;
-
- //rfc2616-sec3.html#sec3.3.1
- $dateLastModif=gmdate('D, d M Y H:i:s \G\M\T',$UnixTimeStamp);
- $dateCacheClient='Thu, 10 Jan 1980 20:30:40 GMT';
-
- //rfc2616-sec14.html#sec14.19 //='"0123456789abcdef0123456789abcdef"'
- if (isset($_SERVER['QUERY_STRING'])) $myQuery='?'.$_SERVER['QUERY_STRING'];
- else $myQuery='';
- if ($session&&isset($_SESSION))
- {
- global $_sessionMode;
- $_sessionMode=$session;
- $myQuery.=print_r($_SESSION,true).session_name().'='.session_id();
- }
- $etagServer='"'.md5($scriptName.$myQuery.'#'.$dateLastModif).'"';
-
- if ((!$is412)&&isset($_SERVER['HTTP_IF_MATCH']))
- {//rfc2616-sec14.html#sec14.24
- $etagsClient=stripslashes($_SERVER['HTTP_IF_MATCH']);
- $is412=(($etagClient!='*')&&(strpos($etagsClient,$etagServer)===false));
- }
- if ($is304&&isset($_SERVER['HTTP_IF_MODIFIED_SINCE']))
- {//rfc2616-sec14.html#sec14.25 //rfc1945.txt
- $nbCond++;
- $dateCacheClient=$_SERVER['HTTP_IF_MODIFIED_SINCE'];
- $p=strpos($dateCacheClient,';');
- if ($p!==false)
- $dateCacheClient=substr($dateCacheClient,0,$p);
- $is304=($dateCacheClient==$dateLastModif);
- }
- if ($is304&&isset($_SERVER['HTTP_IF_NONE_MATCH']))
- {//rfc2616-sec14.html#sec14.26
- $nbCond++;
- $etagClient=stripslashes($_SERVER['HTTP_IF_NONE_MATCH']);
- $is304=(($etagClient==$etagServer)||($etagClient=='*'));
- }
- if ((!$is412)&&isset($_SERVER['HTTP_IF_UNMODIFIED_SINCE']))
- {//rfc2616-sec14.html#sec14.28
- $dateCacheClient=$_SERVER['HTTP_IF_UNMODIFIED_SINCE'];
- $p=strpos($dateCacheClient,';');
- if ($p!==false)
- $dateCacheClient=substr($dateCacheClient,0,$p);
- $is412=($dateCacheClient!=$dateLastModif);
- }
- if ($feedMode)
- {//Special RSS/ATOM
- global $clientCacheDate;
- $clientCacheDate=strtotime($dateCacheClient);
- $cachePrivacy=0;
- }
-
- if ($is412)
- {//rfc2616-sec10.html#sec10.4.13
- header('HTTP/1.1 412 Precondition Failed');
- header('Cache-Control: private, max-age=0, must-revalidate');
- header('Content-Type: text/plain');
- echo "HTTP/1.1 Error 412 Precondition Failed: Precondition request failed positive evaluation\n";
- return true;
- }
- elseif ($is304&&($nbCond>0))
- {//rfc2616-sec10.html#sec10.3.5
- header('HTTP/1.0 304 Not Modified');
- header('Etag: '.$etagServer);
- if ($feedMode) header('Connection: close'); //Comment this line under IIS
- return true;
- }
- else
- {//rfc2616-sec10.html#sec10.2.1
- //rfc2616-sec14.html#sec14.3
- if ($compression) ob_start('_httpConditionalCallBack'); //Will check HTTP_ACCEPT_ENCODING
- //header('HTTP/1.0 200 OK');
- if ($cacheSeconds<0)
- {
- $cache='private, no-cache, no-store, must-revalidate';
- header('Pragma: no-cache');
- }
- else
- {
- if ($cacheSeconds==0) $cache='private, must-revalidate, ';
- elseif ($cachePrivacy==0) $cache='private, ';
- elseif ($cachePrivacy==2) $cache='public, ';
- else $cache='';
- $cache.='max-age='.floor($cacheSeconds);
- }
- //header('Expires: '.gmdate('D, d M Y H:i:s \G\M\T',time()+$cacheSeconds)); //HTTP/1.0 //rfc2616-sec14.html#sec14.21
- header('Cache-Control: '.$cache); //rfc2616-sec14.html#sec14.9
- header('Last-Modified: '.$dateLastModif);
- header('Etag: '.$etagServer);
- if ($feedMode) header('Connection: close'); //rfc2616-sec14.html#sec14.10 //Comment this line under IIS
- return $_SERVER['REQUEST_METHOD']=='HEAD'; //rfc2616-sec9.html#sec9.4
- }
+ //RFC2616 HTTP/1.1: http://www.w3.org/Protocols/rfc2616/rfc2616.html
+ //RFC1945 HTTP/1.0: http://www.w3.org/Protocols/rfc1945/rfc1945.txt
+
+ if (headers_sent()) return false;
+
+ if (isset($_SERVER['SCRIPT_FILENAME'])) $scriptName=$_SERVER['SCRIPT_FILENAME'];
+ elseif (isset($_SERVER['PATH_TRANSLATED'])) $scriptName=$_SERVER['PATH_TRANSLATED'];
+ else return false;
+
+ if ((!$feedMode)&&(($modifScript=filemtime($scriptName))>$UnixTimeStamp))
+ $UnixTimeStamp=$modifScript;
+ $UnixTimeStamp=min($UnixTimeStamp,time());
+ $is304=true;
+ $is412=false;
+ $nbCond=0;
+
+ //rfc2616-sec3.html#sec3.3.1
+ $dateLastModif=gmdate('D, d M Y H:i:s \G\M\T',$UnixTimeStamp);
+ $dateCacheClient='Thu, 10 Jan 1980 20:30:40 GMT';
+
+ //rfc2616-sec14.html#sec14.19 //='"0123456789abcdef0123456789abcdef"'
+ if (isset($_SERVER['QUERY_STRING'])) $myQuery='?'.$_SERVER['QUERY_STRING'];
+ else $myQuery='';
+ if ($session&&isset($_SESSION))
+ {
+ global $_sessionMode;
+ $_sessionMode=$session;
+ $myQuery.=print_r($_SESSION,true).session_name().'='.session_id();
+ }
+ $etagServer='"'.md5($scriptName.$myQuery.'#'.$dateLastModif).'"';
+
+ if ((!$is412)&&isset($_SERVER['HTTP_IF_MATCH']))
+ {//rfc2616-sec14.html#sec14.24
+ $etagsClient=stripslashes($_SERVER['HTTP_IF_MATCH']);
+ $is412=(($etagClient!=='*')&&(strpos($etagsClient,$etagServer)===false));
+ }
+ if ($is304&&isset($_SERVER['HTTP_IF_MODIFIED_SINCE']))
+ {//rfc2616-sec14.html#sec14.25 //rfc1945.txt
+ $nbCond++;
+ $dateCacheClient=$_SERVER['HTTP_IF_MODIFIED_SINCE'];
+ $p=strpos($dateCacheClient,';');
+ if ($p!==false)
+ $dateCacheClient=substr($dateCacheClient,0,$p);
+ $is304=($dateCacheClient==$dateLastModif);
+ }
+ if ($is304&&isset($_SERVER['HTTP_IF_NONE_MATCH']))
+ {//rfc2616-sec14.html#sec14.26
+ $nbCond++;
+ $etagClient=stripslashes($_SERVER['HTTP_IF_NONE_MATCH']);
+ $is304=(($etagClient===$etagServer)||($etagClient==='*'));
+ }
+ if ((!$is412)&&isset($_SERVER['HTTP_IF_UNMODIFIED_SINCE']))
+ {//rfc2616-sec14.html#sec14.28
+ $dateCacheClient=$_SERVER['HTTP_IF_UNMODIFIED_SINCE'];
+ $p=strpos($dateCacheClient,';');
+ if ($p!==false)
+ $dateCacheClient=substr($dateCacheClient,0,$p);
+ $is412=($dateCacheClient!==$dateLastModif);
+ }
+ if ($feedMode)
+ {//Special RSS/ATOM
+ global $clientCacheDate;
+ $clientCacheDate=strtotime($dateCacheClient);
+ $cachePrivacy=0;
+ }
+
+ if ($is412)
+ {//rfc2616-sec10.html#sec10.4.13
+ header('HTTP/1.1 412 Precondition Failed');
+ header('Cache-Control: private, max-age=0, must-revalidate');
+ header('Content-Type: text/plain');
+ echo "HTTP/1.1 Error 412 Precondition Failed: Precondition request failed positive evaluation\n";
+ return true;
+ }
+ elseif ($is304&&($nbCond>0))
+ {//rfc2616-sec10.html#sec10.3.5
+ header('HTTP/1.0 304 Not Modified');
+ header('Etag: '.$etagServer);
+ if ($feedMode) header('Connection: close'); //Comment this line under IIS
+ return true;
+ }
+ else
+ {//rfc2616-sec10.html#sec10.2.1
+ //rfc2616-sec14.html#sec14.3
+ if ($compression) ob_start('_httpConditionalCallBack'); //Will check HTTP_ACCEPT_ENCODING
+ //header('HTTP/1.0 200 OK');
+ if ($cacheSeconds<0)
+ {
+ $cache='private, no-cache, no-store, must-revalidate';
+ header('Expires: 0');
+ header('Pragma: no-cache');
+ }
+ else
+ {
+ if ($cacheSeconds===0)
+ {
+ $cache='private, must-revalidate, ';
+ header('Expires: 0');
+ }
+ elseif ($cachePrivacy===0) $cache='private, ';
+ elseif ($cachePrivacy===2) $cache='public, ';
+ else $cache='';
+ $cache.='max-age='.floor($cacheSeconds);
+ }
+ //header('Expires: '.gmdate('D, d M Y H:i:s \G\M\T',time()+$cacheSeconds)); //HTTP/1.0 //rfc2616-sec14.html#sec14.21
+ header('Cache-Control: '.$cache); //rfc2616-sec14.html#sec14.9
+ header('Last-Modified: '.$dateLastModif);
+ header('Etag: '.$etagServer);
+ if ($feedMode) header('Connection: close'); //rfc2616-sec14.html#sec14.10 //Comment this line under IIS
+ return $_SERVER['REQUEST_METHOD']==='HEAD'; //rfc2616-sec9.html#sec9.4
+ }
}
function _httpConditionalCallBack($buffer,$mode=5)
{//Private function automatically called at the end of the script when compression is enabled
- //rfc2616-sec14.html#sec14.11
- //You can adjust the level of compression with zlib.output_compression_level in php.ini
- if (extension_loaded('zlib')&&(!ini_get('zlib.output_compression')))
- {
- $buffer2=ob_gzhandler($buffer,$mode); //Will check HTTP_ACCEPT_ENCODING and put correct headers such as Vary //rfc2616-sec14.html#sec14.44
- if (strlen($buffer2)>1) //When ob_gzhandler succeeded
- $buffer=$buffer2;
- }
- header('Content-Length: '.strlen($buffer)); //Allows persistant connections //rfc2616-sec14.html#sec14.13
- return $buffer;
+ //rfc2616-sec14.html#sec14.11
+ //You can adjust the level of compression with zlib.output_compression_level in php.ini
+ if (extension_loaded('zlib')&&(!ini_get('zlib.output_compression')))
+ {
+ $buffer2=ob_gzhandler($buffer,$mode); //Will check HTTP_ACCEPT_ENCODING and put correct headers such as Vary //rfc2616-sec14.html#sec14.44
+ if (strlen($buffer2)>1) //When ob_gzhandler succeeded
+ $buffer=$buffer2;
+ }
+ header('Content-Length: '.strlen($buffer)); //Allows persistant connections //rfc2616-sec14.html#sec14.13
+ return $buffer;
}
function httpConditionalRefresh($UnixTimeStamp)
{//Update HTTP headers if the content has just been modified by the client's request
- //See an example on http://alexandre.alapetite.fr/doc-alex/compteur/
- if (headers_sent()) return false;
+ //See an example on http://alexandre.alapetite.fr/doc-alex/compteur/
+ if (headers_sent()) return false;
- if (isset($_SERVER['SCRIPT_FILENAME'])) $scriptName=$_SERVER['SCRIPT_FILENAME'];
- elseif (isset($_SERVER['PATH_TRANSLATED'])) $scriptName=$_SERVER['PATH_TRANSLATED'];
- else return false;
+ if (isset($_SERVER['SCRIPT_FILENAME'])) $scriptName=$_SERVER['SCRIPT_FILENAME'];
+ elseif (isset($_SERVER['PATH_TRANSLATED'])) $scriptName=$_SERVER['PATH_TRANSLATED'];
+ else return false;
- $dateLastModif=gmdate('D, d M Y H:i:s \G\M\T',$UnixTimeStamp);
+ $dateLastModif=gmdate('D, d M Y H:i:s \G\M\T',$UnixTimeStamp);
- if (isset($_SERVER['QUERY_STRING'])) $myQuery='?'.$_SERVER['QUERY_STRING'];
- else $myQuery='';
- global $_sessionMode;
- if ($_sessionMode&&isset($_SESSION))
- $myQuery.=print_r($_SESSION,true).session_name().'='.session_id();
- $etagServer='"'.md5($scriptName.$myQuery.'#'.$dateLastModif).'"';
+ if (isset($_SERVER['QUERY_STRING'])) $myQuery='?'.$_SERVER['QUERY_STRING'];
+ else $myQuery='';
+ global $_sessionMode;
+ if ($_sessionMode&&isset($_SESSION))
+ $myQuery.=print_r($_SESSION,true).session_name().'='.session_id();
+ $etagServer='"'.md5($scriptName.$myQuery.'#'.$dateLastModif).'"';
- header('Last-Modified: '.$dateLastModif);
- header('Etag: '.$etagServer);
+ header('Last-Modified: '.$dateLastModif);
+ header('Etag: '.$etagServer);
}