From e6092f277e425faad9aa4b2424bd7c8801e02460 Mon Sep 17 00:00:00 2001
From: Fil <fil@rezo.net>
Date: Wed, 1 Feb 2006 17:53:44 +0000
Subject: [PATCH] =?UTF-8?q?#HTTP=20se=20s=C3=A9pare=20en=20deux=20balises?=
 =?UTF-8?q?=20:=20-=20#HTTP=5FHEADER{Chose:=20valeur}=20qui=20ins=C3=A8re?=
 =?UTF-8?q?=20un=20entete=20dans=20le=20tableau=20$page[entetes]=20(ceci?=
 =?UTF-8?q?=20toujours=20via=20le=20hack=20d'insertion=20de=20la=20sequenc?=
 =?UTF-8?q?e=20<=3Fphp=20header(...)=20=3F>=20dans=20le=20code,=20qui=20es?=
 =?UTF-8?q?t=20ensuite=20nettoy=C3=A9e)=20-=20#CACHE{delai}=20qui=20fixe?=
 =?UTF-8?q?=20la=20dur=C3=A9e=20du=20fichier=20cache.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

A noter qu'on peut mixer les deux de façon parfois étonnante comme sur le login, où le fichier est mis en cache côté spip, mais pas côté navigateur
---
 dist/404.html            |  5 +++-
 dist/agenda.html         |  2 +-
 dist/article.html        |  2 +-
 dist/auteur.html         |  2 +-
 dist/backend.html        | 10 ++++----
 dist/breve.html          |  2 +-
 dist/distrib.html        |  3 ++-
 dist/forum.html          |  4 +++-
 dist/ical.html           |  3 ++-
 dist/login.html          | 14 ++++++++++-
 dist/mot.html            |  2 +-
 dist/plan.html           |  2 +-
 dist/recherche.html      |  2 +-
 dist/resume.html         |  2 +-
 dist/rubrique.html       |  2 +-
 dist/site.html           |  2 +-
 dist/sommaire.html       |  2 +-
 dist/sommaire_texte.html |  2 +-
 dist/style.html          |  4 +++-
 ecrire/inc_filtres.php   | 14 ++++++++++-
 inc-balises.php3         | 52 +++++++++++++++++++++++++++++-----------
 inc-calcul.php3          | 27 ++++++++++++---------
 22 files changed, 112 insertions(+), 48 deletions(-)

diff --git a/dist/404.html b/dist/404.html
index f7eebc16ec..a7daca60ba 100644
--- a/dist/404.html
+++ b/dist/404.html
@@ -1,4 +1,7 @@
-#HTTP{"Cache-Control: no-store, no-cache, must-revalidate","Pragma: no-cache"}
+#CACHE{24 * 3600}
+#HTTP_HEADER{Cache-Control: no-store, no-cache, must-revalidate}
+#HTTP_HEADER{Pragma: no-cache}
+
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html dir="#LANG_DIR" lang="#LANG">
 <head>
diff --git a/dist/agenda.html b/dist/agenda.html
index 27be563918..b1837923ff 100644
--- a/dist/agenda.html
+++ b/dist/agenda.html
@@ -1,4 +1,4 @@
-#HTTP{7200}
+#CACHE{7200}
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html dir="#LANG_DIR" lang="#LANG">
 <head>
diff --git a/dist/article.html b/dist/article.html
index 6723ee0ab9..fcee57a820 100644
--- a/dist/article.html
+++ b/dist/article.html
@@ -1,4 +1,4 @@
-#HTTP{86400}
+#CACHE{86400}
 <BOUCLE_article_principal(ARTICLES) {id_article}><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html dir="#LANG_DIR" lang="#LANG">
 <head>
diff --git a/dist/auteur.html b/dist/auteur.html
index 3932bb0576..824a3c4361 100644
--- a/dist/auteur.html
+++ b/dist/auteur.html
@@ -1,4 +1,4 @@
-#HTTP{86400}
+#CACHE{86400}
 <BOUCLE_auteur_principal(AUTEURS) {id_auteur}
 ><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html dir="#LANG_DIR" lang="#LANG">
diff --git a/dist/backend.html b/dist/backend.html
index 5da6c9ce3a..479a3c9899 100644
--- a/dist/backend.html
+++ b/dist/backend.html
@@ -1,7 +1,5 @@
-<?php	@header("Content-type: text/xml[; charset=(#CHARSET)]"); 
-	@header('Cache-Control: max-age=3600');
-	echo '<'.'?xml version="1.0"[ encoding="(#CHARSET)"]?'.">\n"; 
-?>
+#CACHE{3600}
+[(#HTTP_HEADER{Content-type: text/xml[; charset=(#CHARSET)]})]
 <rss version="2.0"
 	xmlns:dc="http://purl.org/dc/elements/1.1/"
 	xmlns:content="http://purl.org/rss/1.0/modules/content/"
@@ -14,6 +12,10 @@
 	<language>#LANG</language>
 	<generator>SPIP - www.spip.net</generator>
 
+#LOGO_SITE_SPIP
+
+[(#LOGO_SITE_SPIP||extraire_attribut{src})]
+
 [	<image>
 		<title>[(#NOM_SITE_SPIP|texte_backend)]</title>
 		<url>(#LOGO_SITE_SPIP||extraire_attribut{src}|url_absolue|texte_backend)</url>
diff --git a/dist/breve.html b/dist/breve.html
index 1ca2d4bb19..a953841557 100644
--- a/dist/breve.html
+++ b/dist/breve.html
@@ -1,4 +1,4 @@
-#HTTP{43200}
+#CACHE{43200}
 <BOUCLE_breve_principal(BREVES) {id_breve}
 ><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html dir="#LANG_DIR" lang="#LANG">
diff --git a/dist/distrib.html b/dist/distrib.html
index e719dadb05..1554646627 100644
--- a/dist/distrib.html
+++ b/dist/distrib.html
@@ -1,4 +1,5 @@
-#HTTP{"Content-Type: text/javascript", 'Cache-Control: max-age = 3600'}
+#CACHE{3600}
+#HTTP_HEADER{Content-Type: text/javascript}
 document.write('<table border="0" bgcolor="#000000" cellspacing="0" cellpadding="0"><tr><td>');
 document.write('<table border="0" bgcolor="#ffffff" cellspacing="1" cellpadding="2"><tr><td bgcolor="#d0d0d0" align="center">');
 document.write('<a href="#URL_SITE_SPIP/"><b>[(#NOM_SITE_SPIP|addslashes)]</b></a>&nbsp;</td></tr><tr><td><ul><small>');
diff --git a/dist/forum.html b/dist/forum.html
index 5ba053e938..083ede9e18 100644
--- a/dist/forum.html
+++ b/dist/forum.html
@@ -1,4 +1,6 @@
-#HTTP{"Cache-Control: max-age=3600, must-revalidate"}
+#CACHE{3600}
+#HTTP_HEADER{Cache-Control: max-age=3600, must-revalidate}
+
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html dir="#LANG_DIR" lang="#LANG">
 <head>
diff --git a/dist/ical.html b/dist/ical.html
index 34ff903a2f..005625c010 100644
--- a/dist/ical.html
+++ b/dist/ical.html
@@ -1,4 +1,5 @@
-#HTTP{"Content-type: text/calendar", 3600}
+#HTTP_HEADER{Content-type: text/calendar}
+#CACHE{3600}
 BEGIN:VCALENDAR
 CALSCALE:GREGORIAN
 X-WR-CALNAME;VALUE=TEXT:[(#NOM_SITE_SPIP|filtrer_ical)]
diff --git a/dist/login.html b/dist/login.html
index 589b60c741..97a8118538 100644
--- a/dist/login.html
+++ b/dist/login.html
@@ -1,4 +1,11 @@
-#HTTP{"Cache-Control: no-store, no-cache, must-revalidate","Pragma: no-cache"}
+[(#REM)
+	Le fichier est en cache dans SPIP, mais les navigateurs ne doivent pas
+	conserver cette page en memoire
+]
+#CACHE{24 * 3600}
+#HTTP_HEADER{"Cache-Control: no-store, no-cache, must-revalidate"}
+#HTTP_HEADER{Pragma: no-cache}
+
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html dir="#LANG_DIR" lang="#LANG">
 <head>
@@ -39,5 +46,10 @@
 
 </td></tr></table></div>
 
+[(#REM)
+	Esthetique : on ne veut pas des boutons d'admin sur la page de login
+]<!--
+#FORMULAIRE_ADMIN
+-->
 </body>
 </html>
diff --git a/dist/mot.html b/dist/mot.html
index 9a9f60ab13..a85c1edf88 100644
--- a/dist/mot.html
+++ b/dist/mot.html
@@ -1,4 +1,4 @@
-#HTTP{86400}
+#CACHE{86400}
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html dir="#LANG_DIR" lang="#LANG">
 <head>
diff --git a/dist/plan.html b/dist/plan.html
index 51e065c90b..4730117315 100644
--- a/dist/plan.html
+++ b/dist/plan.html
@@ -1,4 +1,4 @@
-#HTTP{7200}
+#CACHE{7200}
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html dir="#LANG_DIR" lang="#LANG">
 <head>
diff --git a/dist/recherche.html b/dist/recherche.html
index 65ea56e0ee..0ce7ae5139 100644
--- a/dist/recherche.html
+++ b/dist/recherche.html
@@ -1,4 +1,4 @@
-#HTTP{"Cache-Control: no-store, no-cache, must-revalidate","Pragma: no-cache"}
+#CACHE{0}
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
 <html dir="#LANG_DIR" lang="#LANG">
diff --git a/dist/resume.html b/dist/resume.html
index 063ef3d652..a876a77a8c 100644
--- a/dist/resume.html
+++ b/dist/resume.html
@@ -1,4 +1,4 @@
-#HTTP{7200}
+#CACHE{7200}
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html dir="#LANG_DIR" lang="#LANG">
 <head>
diff --git a/dist/rubrique.html b/dist/rubrique.html
index 6eb73417ac..964709fb3b 100644
--- a/dist/rubrique.html
+++ b/dist/rubrique.html
@@ -1,4 +1,4 @@
-#HTTP{7200}
+#CACHE{7200}
 <BOUCLE_rubrique_principal(RUBRIQUES) {id_rubrique}
 ><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html dir="#LANG_DIR" lang="#LANG">
diff --git a/dist/site.html b/dist/site.html
index be9bf170de..6953b547af 100644
--- a/dist/site.html
+++ b/dist/site.html
@@ -1,4 +1,4 @@
-#HTTP{7200}
+#CACHE{7200}
 <BOUCLE_site(SITES){id_syndic}
 ><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html dir="#LANG_DIR" lang="#LANG">
diff --git a/dist/sommaire.html b/dist/sommaire.html
index 36c9e66f1d..2d725baa98 100644
--- a/dist/sommaire.html
+++ b/dist/sommaire.html
@@ -1,4 +1,4 @@
-#HTTP{7200}
+#CACHE{7200}
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html dir="#LANG_DIR" lang="#LANG">
 <head>
diff --git a/dist/sommaire_texte.html b/dist/sommaire_texte.html
index 3416fbf018..76bd9bdf61 100644
--- a/dist/sommaire_texte.html
+++ b/dist/sommaire_texte.html
@@ -1,4 +1,4 @@
-#HTTP{7200}
+#CACHE{7200}
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html dir="#LANG_DIR" lang="#LANG">
 <!--
diff --git a/dist/style.html b/dist/style.html
index e720c66be3..b01052aec9 100644
--- a/dist/style.html
+++ b/dist/style.html
@@ -1,4 +1,3 @@
-#HTTP{'Content-type: text/css', 'Vary: Accept-Encoding', 360000}
 [(#REM)
 
 	Ce squelette definit les styles de l'espace prive
@@ -8,6 +7,9 @@
 	genant en cas de "rotation du cookie de session" apres
 	un changement d'IP (effet de clignotement).
 ]
+#CACHE{360*1000}
+#HTTP_HEADER{Content-Type: text/css}
+#HTTP_HEADER{Vary: Accept-Encoding}
 
 /*
  * Police par defaut (bof...)
diff --git a/ecrire/inc_filtres.php b/ecrire/inc_filtres.php
index 0f49ebf3c1..61df0e8bba 100644
--- a/ecrire/inc_filtres.php
+++ b/ecrire/inc_filtres.php
@@ -1683,7 +1683,7 @@ function alterner($i) {
 }
 
 // recuperer une balise HTML de type "xxx"
-// exemple : [(#DESCRIPTIF|extraire_attribut{img})] (pour flux RSS-photo)
+// exemple : [(#DESCRIPTIF|extraire_tag{img})] (pour flux RSS-photo)
 function extraire_tag($texte, $tag) {
 	if (preg_match(",<$tag(\\s.*)?".">,Uims", $texte, $regs))
 		return $regs[0];
@@ -1693,6 +1693,10 @@ function extraire_tag($texte, $tag) {
 // recuperer un attribut html d'une balise
 // ($complet demande de retourner $r)
 function extraire_attribut($balise, $attribut, $complet = false) {
+
+var_dump($balise);
+var_dump($attribut);
+
 	if (preg_match(",(.*<[^>]*)([[:space:]]+$attribut=[[:space:]]*(['\"])?(.*?)\\3)([^>]*>.*),ims", $balise, $r)) {
 		$att = $r[4];
 	}
@@ -2124,4 +2128,12 @@ function boutonne($t, $n, $v, $a='') {
 	. " value=\"$v\" $a />";
 }
 
+// valeur_numerique("3*2") => 6
+// n'accepte que les *, + et - (a ameliorer si on l'utilise vraiment)
+function valeur_numerique($expr) {
+	if (preg_match(',^[0-9]+(\s*[+*-]\s*[0-9]+)*$,', trim($expr)))
+		eval("\$a = $expr;");
+	return intval($a);
+}
+
 ?>
diff --git a/inc-balises.php3 b/inc-balises.php3
index 0e7522567c..4b5212e62b 100644
--- a/inc-balises.php3
+++ b/inc-balises.php3
@@ -776,22 +776,46 @@ function balise_REM_dist($p) {
 	return $p;
 }
 
+
 //
-// #HTTP
-// pour les entetes. A n'utiliser qu'en debut de squelette
+// #HTTP_HEADER
+// pour les entetes de retour http
+// Ne fonctionne pas sur les INCLURE !
+// #HTTP_HEADER{Content-Type: text/css}
 //
-function balise_HTTP_dist($p) {
-  $a = $p->param[0];
-  array_shift($a);
-  $code = "";
-  foreach($a as $v) {
-    if (is_numeric($h = $v[0]->texte))
-      $h = "Cache-Control: max-age=$h";
-    $code .= 'header("' . $h . '");';
-  }
-  $p->code="('<'.'?php $code  ?' . '>')";
-  $p->interdire_scripts = false;
-  return $p;
+function balise_HTTP_HEADER_dist($p) {
+
+	$header = calculer_liste($p->param[0][1],
+					$p->descr,
+					$p->boucles,
+					$p->id_boucle);
+
+	$p->code = "'<'.'?php header(\"' . "
+		. $header
+		. " . '\"); ?'.'>'";
+	$p->interdire_scripts = false;
+	return $p;
+}
+
+//
+// #CACHE
+// definit la duree de vie ($delais) du squelette
+// #CACHE{24*3600}
+function balise_CACHE_dist($p) {
+	$duree = valeur_numerique($p->param[0][1][0]->texte);
+	if ($duree > 0)
+		$p->code = '\'<'.'?php header("Cache-Control: max-age='
+			. $duree
+			. '"); ?'.'>\'';
+	else
+		$p->code = '\'<'
+		.'?php header("Cache-Control: no-store, no-cache, must-revalidate"); ?'
+		.'><'
+		.'?php header("Pragma: no-cache"); ?'
+		.'>\'';
+
+	$p->interdire_scripts = false;
+	return $p;
 }
 
 ?>
diff --git a/inc-calcul.php3 b/inc-calcul.php3
index 1b51c938cc..ca4902e95c 100644
--- a/inc-calcul.php3
+++ b/inc-calcul.php3
@@ -256,20 +256,25 @@ function calculer_page_globale($cache, $fond) {
 	return $page;
 }
 
-function analyse_resultat_skel($nom, $Cache, $corps)
-{
+function analyse_resultat_skel($nom, $Cache, $corps) {
 	$headers = array();
-        while (preg_match('/^(<[?]php\s+)@?header\s*\(\s*.([^:]*):\s*([^)]*)[^)]\s*\)\s*[;]?/ims',$corps, $r))
-          {
-            $corps = $r[1] . substr($corps,strlen($r[0]));
-	    $j=str_replace(' - ','-',ucwords(str_replace('-',' - ',$r[2])));
-	    $headers[$j] = $r[3];
-	  }
-	if (preg_match('/^<[?]php\s+[?]>\s*/', $corps, $r))
-	  $corps = substr($corps,strlen($r[0]));
+
+	// Recupere les < ?php header('Xx: y'); ? > pour $page['headers']
+	// note: on essaie d'attrapper aussi certains de ces entetes codes
+	// "a la main" dans les squelettes, mais evidemment sans exhaustivite
+	if (preg_match_all(
+	'/(<[?]php\s+)@?header\s*\(\s*.([^:]*):\s*([^)]*)[^)]\s*\)\s*[;]?\s*[?]>/ims',
+	$corps, $regs, PREG_SET_ORDER))
+	foreach ($regs as $r) {
+		$corps = str_replace($r[0], '', $corps);
+		# $j = Content-Type, et pas content-TYPE.
+		$j = join('-', array_map('ucwords', explode('-', strtolower($r[2]))));
+		$headers[$j] = $r[3];
+	}
+
 	return array('texte' => $corps,
 		     'squelette' => $nom,
-		     'process_ins' => ((strpos($corps,'<'.'?')=== false) ? 'html' : 'php'),
+		     'process_ins' => ((strpos($corps,'<'.'?')=== false)?'html':'php'),
 		     'invalideurs' => $Cache,
 		     'entetes' => $headers);
 }
-- 
GitLab