]> granicus.if.org Git - apache/blob - docs/manual/mod/mod_lua.xml.fr
Update transformations.
[apache] / docs / manual / mod / mod_lua.xml.fr
1 <?xml version="1.0"?>
2 <!DOCTYPE modulesynopsis SYSTEM "../style/modulesynopsis.dtd">
3 <?xml-stylesheet type="text/xsl" href="../style/manual.fr.xsl"?>
4 <!-- English Revision: 1490095:1492782 (outdated) -->
5 <!-- French translation : Lucien GENTIS -->
6 <!-- Reviewed by : Vincent Deffontaines -->
7
8 <!--
9  Licensed to the Apache Software Foundation (ASF) under one or more
10  contributor license agreements.  See the NOTICE file distributed with
11  this work for additional information regarding copyright ownership.
12  The ASF licenses this file to You under the Apache License, Version 2.0
13  (the "License"); you may not use this file except in compliance with
14  the License.  You may obtain a copy of the License at
15
16      http://www.apache.org/licenses/LICENSE-2.0
17
18  Unless required by applicable law or agreed to in writing, software
19  distributed under the License is distributed on an "AS IS" BASIS,
20  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21  See the License for the specific language governing permissions and
22  limitations under the License.
23 -->
24
25 <modulesynopsis metafile="mod_lua.xml.meta">
26
27 <name>mod_lua</name>
28
29 <description>Fournit des points d'entr&eacute;e Lua dans diff&eacute;rentes parties du
30 traitement des requ&ecirc;tes httpd</description>
31 <status>Experimental</status>
32 <sourcefile>mod_lua.c</sourcefile>
33 <identifier>lua_module</identifier>
34 <compatibility>versions 2.3 et sup&eacute;rieures</compatibility>
35
36 <summary>
37 <p>Ce module permet d'ajouter au serveur des extensions sous forme de
38 scripts &eacute;crits dans le langage de programmation Lua.
39 <module>mod_lua</module> fournit de nombreuses extensions
40 (hooks) disponibles avec les modules natifs du serveur HTTP Apache,
41 comme les associations de requ&ecirc;tes &agrave; des fichiers, la g&eacute;n&eacute;ration de
42 r&eacute;ponses dynamiques, le contr&ocirc;le d'acc&egrave;s, l'authentification et
43 l'autorisation.</p>
44
45 <p>Vous trouverez davantage d'informations &agrave; propos du langage de
46 programmation Lua sur <a href="http://www.lua.org/">le site web de
47 Lua</a>.</p>
48
49 <note><code>mod_lua</code> est encore au stade exp&eacute;rimental. Son mode
50 d'utilisation et son comportement pourront changer &agrave; tout moment jusqu'&agrave;
51 ce qu'il passe au stade stable, et ce m&ecirc;me entre deux versions stables
52 2.4.x. N'oublez pas de consulter le fichier CHANGES avant toute mise &agrave;
53 jour.</note>
54
55 <note type="warning"><title>Avertissement</title>
56 <p>Ce module poss&egrave;de une grande capacit&eacute; d'action sur le fonctrionnement
57 de httpd, ce qui lui conf&egrave;re une grande puissance, mais peut aussi
58 induire un risque de s&eacute;curit&eacute;. Il est d&eacute;conseill&eacute; d'utiliser ce module
59 sur un serveur partag&eacute; avec des utilisateurs auxquels vous ne pouvez pas
60 accorder une confiance absolue, car il peut permettre de modifier le
61 fonctionnement interne de httpd.</p>
62 </note>
63
64 </summary>
65
66 <section id="basicconf"><title>Configuration de base</title>
67
68 <p>La directive de base pour le chargement du module est</p>
69
70 <highlight language="config">
71     LoadModule lua_module modules/mod_lua.so
72 </highlight>
73
74 <p>
75 <code>mod_lua</code> fournit un gestionnaire nomm&eacute;
76 <code>lua-script</code> qui peut &ecirc;tre utilis&eacute; avec une directive
77 <code>AddHandler</code> :</p>
78
79 <highlight language="config">
80 AddHandler lua-script .lua
81 </highlight>
82
83 <p>
84 Ceci aura pour effet de faire traiter les requ&ecirc;tes pour les fichiers
85 dont l'extension est <code>.lua</code> par <code>mod_lua</code> en
86 invoquant cette fonction de <code>gestion</code> de fichier.
87 </p>
88
89 <p>Pour plus de d&eacute;tails, voir la directive
90 <directive>LuaMapHandler</directive>.
91  </p>
92 </section>
93
94 <section id="writinghandlers"><title>Ecrire des gestionnaires</title>
95 <p>Dans l'API du serveur HTTP Apache, un gestionnaire est une sorte de
96 point d'accroche (hook) sp&eacute;cifique responsable de la g&eacute;n&eacute;ration de la
97 r&eacute;ponse. <module>mod_proxy</module>, <module>mod_cgi</module> et
98 <module>mod_status</module> sont des exemples de modules comportant un
99 gestionnaire.</p>
100
101 <p><code>mod_lua</code> cherche toujours &agrave; invoquer une fonction Lua pour le
102 gestionnaire, plut&ocirc;t que de simplement &eacute;valuer le corps d'un script dans
103 le style de CGI. Une fonction de gestionnaire se pr&eacute;sente comme suit :</p>
104
105
106 <highlight language="lua">
107 <strong>example.lua</strong><br/>
108 -- exemple de gestionnaire
109
110 require "string"
111
112 --[[
113      Il s'agit du nom de m&eacute;thode par d&eacute;faut pour les gestionnaires Lua ;
114      voir les noms de fonctions optionnels dans la directive
115      LuaMapHandler pour choisir un point d'entr&eacute;e diff&eacute;rent.
116 --]]
117 function handle(r)
118     r.content_type = "text/plain"
119
120     if r.method == 'GET' then
121         r:puts("Hello Lua World!\n")
122         for k, v in pairs( r:parseargs() ) do
123             r:puts( string.format("%s: %s\n", k, v) )
124         end
125     elseif r.method == 'POST' then
126         r:puts("Hello Lua World!\n")
127         for k, v in pairs( r:parsebody() ) do
128             r:puts( string.format("%s: %s\n", k, v) )
129         end
130     else
131     elseif r.method == 'PUT' then
132 -- message d'erreur personnalis&eacute;
133         r:puts("Unsupported HTTP method " .. r.method)
134         r.status = 405
135         return apache2.ok
136     else
137 -- message d'erreur ErrorDocument
138         return 501
139     end
140     return apache2.OK
141 end
142 </highlight>
143
144 <p>
145 Ce gestionnaire se contente d'afficher les arguments cod&eacute;s d'un uri ou
146 d'un formulaire dans un page au format texte.
147 </p>
148
149 <p>
150 Cela signifie que vous pouvez (et &ecirc;tes encourag&eacute; &agrave;) avoir plusieurs
151 gestionnaires (ou points d'entr&eacute;e, ou filtres) dans le m&ecirc;me script.
152 </p>
153
154 </section>
155 <section id="writingauthzproviders">
156 <title>Ecriture de fournisseurs d'autorisation</title>
157
158 <p><module>mod_authz_core</module> fournit une interface d'autorisation
159 de haut niveau bien plus facile &agrave; utiliser que dans les hooks
160 correspondants. Le premier argument de la directive <directive
161 module="mod_authz_core">Require</directive> permet de sp&eacute;cifier le
162 fournisseur d'autorisation &agrave; utiliser. Pour chaque directive <directive
163 module="mod_authz_core">Require</directive>,
164 <module>mod_authz_core</module> appellera le fournisseur d'autorisation
165 sp&eacute;cifi&eacute;, le reste de la ligne constituant les param&egrave;tres. Le
166 fournisseur consid&eacute;r&eacute; va alors v&eacute;rifier les autorisations et fournir le
167 r&eacute;sultat dans une valeur de retour.</p>
168
169 <p>En g&eacute;n&eacute;ral, le fournisseur authz est appel&eacute; avant l'authentification.
170 S'il doit conna&icirc;tre le nom d'utilisateur authentifi&eacute; (ou si
171 l'utilisateur est appel&eacute; &agrave; &ecirc;tre authentifi&eacute;), le fournisseur doit
172 renvoyer <code>apache2.AUTHZ_DENIED_NO_USER</code>, ce qui va
173 d&eacute;clancher le processus d'authentification et un deuxi&egrave;me appel du
174 fournisseur authz.</p>
175
176 <p>La fonction du fournisseur authz ci-dessous accepte deux arguments,
177 une adresse IP et un nom d'utilisateur. Elle autorise l'acc&egrave;s dans le
178 cas o&ugrave; la requ&ecirc;te provient de l'adresse IP sp&eacute;cifi&eacute;e, ou si
179 l'utilisateur authentifi&eacute; correspond au second argument :</p>
180
181 <highlight language="lua">
182 <strong>authz_provider.lua</strong><br/>
183
184 require 'apache2'
185
186 function authz_check_foo(r, ip, user)
187     if r.useragent_ip == ip then
188         return apache2.AUTHZ_GRANTED
189     elseif r.user == nil then
190         return apache2.AUTHZ_DENIED_NO_USER
191     elseif r.user == user then
192         return apache2.AUTHZ_GRANTED
193     else
194         return apache2.AUTHZ_DENIED
195     end
196 end
197 </highlight>
198
199 <p>La configuration suivante enregistre cette fonction en tant que
200 fournisseur <code>foo</code>, et la configure por l'URL <code>/</code> :</p>
201 <highlight language="config">
202 LuaAuthzProvider foo authz_provider.lua authz_check_foo
203 &lt;Location /&gt;
204   Require foo 10.1.2.3 john_doe
205 &lt;/Location&gt;
206 </highlight>
207
208 </section>
209
210 <section id="writinghooks"><title>Ecriture de fonctions d'accroche
211 (hooks)</title>
212
213 <p>Les fonctions d'accroche d&eacute;terminent la mani&egrave;re dont les modules (et
214 les scripts Lua) participent au traitement des requ&ecirc;tes. Chaque type
215 d'accroche propos&eacute; par le serveur a un r&ocirc;le sp&eacute;cifique, comme
216 l'association de requ&ecirc;tes au syst&egrave;me de fichiers, le contr&ocirc;le d'acc&egrave;s,
217 ou la d&eacute;finition de types MIME : </p>
218
219 <table border="1" style="zebra">
220     <tr>
221         <th>Phase d'accroche</th>
222         <th>Directive mod_lua</th>
223         <th>Description</th>
224     </tr>
225     <tr>
226         <td>Gestionnaire rapide</td>
227         <td><directive module="mod_lua">LuaQuickHandler</directive></td>
228         <td>Il s'agit de la premi&egrave;re accroche appel&eacute;e lorsqu'une requ&ecirc;te
229         a &eacute;t&eacute; associ&eacute;e &agrave; un serveur ou un serveur virtuel.</td>
230     </tr>
231     <tr>
232         <td>Phase de traduction</td>
233         <td><directive module="mod_lua">LuaHookTranslateName</directive></td>
234         <td>Cette phase traduit l'URI de la requ&ecirc;te en nom de fichier
235         sur le syst&egrave;me. Ce sont des modules comme
236         <module>mod_alias</module> et <module>mod_rewrite</module> qui
237         interviennent au cours de cette phase.</td>
238     </tr>
239     <tr>
240         <td>Choix du lieu de stockage de la ressource</td>
241         <td><directive module="mod_lua">LuaHookMapToStorage</directive></td>
242         <td>Cette phase d&eacute;finit le lieu de stockage de la ressource :
243         physique, en cache ou externe/mandat&eacute;. Elle est assur&eacute;e par les
244         modules de mandat ou de mise en cache.</td>
245     </tr>
246     <tr>
247         <td>Autorisation d'acc&egrave;s</td>
248         <td><directive module="mod_lua">LuaHookAccessChecker</directive></td>
249         <td>Cette phase v&eacute;rifie si un client a l'autorisation d'acc&egrave;s &agrave;
250         la ressource. Elle s'ex&eacute;cute avant l'authentification de
251         l'utisateur ; il faut donc &ecirc;tre prudent.
252         </td>
253     </tr>
254     <tr>
255         <td>V&eacute;rification de l'identifiant utilisateur</td>
256         <td><directive module="mod_lua">LuaHookCheckUserID</directive></td>
257         <td>Cette phase v&eacute;rifie l'identifiant de l'utilisateur ayant
258         fait l'objet d'une n&eacute;gociation.</td>
259     </tr>
260     <tr>
261         <td>V&eacute;rification de l'autorisation d'acc&egrave;s</td>
262         <td><directive module="mod_lua">LuaHookAuthChecker</directive>
263         ou
264             <directive module="mod_lua">LuaAuthzProvider</directive></td>
265         <td>Cette phase v&eacute;rifie l'autorisation d'acc&egrave;s d'un utilisateur
266         en fonction des ses param&egrave;tres de connexion, comme
267         l'identifiant, le certificat, etc...
268         </td>
269     </tr>
270     <tr>
271         <td>V&eacute;rification du type de la ressource</td>
272         <td><directive module="mod_lua">LuaHookTypeChecker</directive></td>
273         <td>Cette phase assigne un type de contenu et un gestionnaire &agrave;
274         la ressource.</td>
275     </tr>
276     <tr>
277         <td>Derniers r&eacute;glages</td>
278         <td><directive module="mod_lua">LuaHookFixups</directive></td>
279         <td>C'est la derni&egrave;re phase avant l'activation des gestionnaires
280         de contenu. Toute modification de derni&egrave;re minute &agrave; la requ&ecirc;te
281         doit &ecirc;tre effectu&eacute;e ici.</td>
282     </tr>
283     <tr>
284         <td>Gestionnaire de contenu</td>
285         <td>fichiers fx. <code>.lua</code> ou directive <directive module="mod_lua">LuaMapHandler</directive></td>
286         <td>C'est durant cette phase que le contenu est trait&eacute;. Les
287         fichiers sont lus, interpr&eacute;t&eacute;s, certains sont ex&eacute;cut&eacute;s, et le
288         r&eacute;sultat obtenu est envoy&eacute; au client.</td>
289     </tr>
290     <tr>
291         <td>Journalisation</td>
292         <td>aucune</td>
293         <td>Lorsqu'une requ&ecirc;te a &eacute;t&eacute; trait&eacute;e, plusieurs phases de
294         journalisation interviennent, et enregistrent leurs r&eacute;sultats
295         dans les fichiers d'erreur ou d'acc&egrave;s.</td>
296     </tr>
297
298 </table>
299
300 <p>Les fonctions d'accroche re&ccedil;oivent l'objet de la requ&ecirc;te comme seul
301 argument (sauf LuaAuthzProvider qui re&ccedil;oit aussi des arguments en
302 provenance de la directive Require). Elles peuvent renvoyer une valeur,
303 selon la fonction, mais il s'agit en g&eacute;n&eacute;ral d'un
304 code d'&eacute;tat HTTP ou des valeurs OK, DONE, ou DECLINED,
305 que vous pouvez &eacute;crire dans Lua sous la forme <code>apache2.OK</code>,
306 <code>apache2.DONE</code>, ou <code>apache2.DECLINED</code>.</p>
307
308
309 <highlight language="lua">
310 <strong>translate_name.lua</strong><br/>
311 -- exemple d'accroche qui r&eacute;&eacute;crit un URI en chemin du syst&egrave;me de
312 fichiers.
313
314 require 'apache2'
315
316 function translate_name(r)
317     if r.uri == "/translate-name" then
318         r.filename = r.document_root .. "/find_me.txt"
319         return apache2.OK
320     end
321     -- on ne g&egrave;re pas cette URL et on donne sa chance &agrave; un autre module
322     return apache2.DECLINED
323 end
324 </highlight>
325
326
327 <highlight language="lua">
328 <strong>translate_name2.lua</strong><br/>
329 --[[ exemple d'accroche qui r&eacute;&eacute;crit un URI vers un autre URI. Il renvoie
330         un apache2.DECLINED pour permettre &agrave; un autre interpr&eacute;teur d'URL de
331         travailler sur la substitution, y compris l'accroche translate_name
332         de base dont les tables de correspondances se basent sur DocumentRoot.
333
334      Note: utilisez le drapeau early/late de la directive pour
335      l'ex&eacute;cuter avant ou apr&egrave;s mod_alias.
336 --]]
337
338 require 'apache2'
339
340 function translate_name(r)
341     if r.uri == "/translate-name" then
342         r.uri = "/find_me.txt"
343         return apache2.DECLINED
344     end
345     return apache2.DECLINED
346 end
347 </highlight>
348 </section>
349
350 <section id="datastructures"><title>Structures de donn&eacute;es</title>
351
352 <dl>
353 <dt>request_rec</dt>
354         <dd>
355         <p>request_rec est consid&eacute;r&eacute;e en tant que donn&eacute;e utilisateur.
356         Elle poss&egrave;de une m&eacute;tatable qui vous permet d'accomplir des
357         choses int&eacute;ressantes. Pour la plus grande partie, elle poss&egrave;de
358         les m&ecirc;mes champs que la structure request_rec, la
359         plupart d'entre eux &eacute;tant accessibles en lecture et &eacute;criture (le
360         contenu des champs de la table peut &ecirc;tre modifi&eacute;, mais les
361         champs eux-m&ecirc;mes ne peuvent pas &ecirc;tre &eacute;tablis en tant que tables
362         distinctes).</p>
363
364         <table border="1" style="zebra">
365
366         <tr>
367           <th><strong>Nom</strong></th>
368           <th><strong>Type Lua</strong></th>
369           <th><strong>Modifiable</strong></th>
370           <th><strong>Description</strong></th>
371         </tr>
372         <tr>
373           <td><code>allowoverrides</code></td>
374           <td>string</td>
375           <td>non</td>
376           <td>L'option AllowOverride s'applique &agrave; la requ&ecirc;te courante.</td>
377         </tr>
378         <tr>
379           <td><code>ap_auth_type</code></td>
380           <td>string</td>
381           <td>non</td>
382           <td>Ce champ contient le type d'authentification effectu&eacute;e
383           (par exemple <code>basic</code>)</td>
384         </tr>
385         <tr>
386           <td><code>args</code></td>
387           <td>string</td>
388           <td>oui</td>
389           <td>La cha&icirc;ne de param&egrave;tres de la requ&ecirc;te (par exemple
390           <code>foo=bar&amp;name=johnsmith</code>)</td>
391         </tr>
392         <tr>
393           <td><code>assbackwards</code></td>
394           <td>boolean</td>
395           <td>non</td>
396           <td>contient true s'il s'agit d'une requ&ecirc;te de style HTTP/0.9
397           (par exemple <code>GET /foo</code> (sans champs d'en-t&ecirc;te) )</td>
398         </tr>
399         <tr>
400           <td><code>auth_name</code></td>
401           <td>string</td>
402           <td>non</td>
403           <td>La cha&icirc;ne d'identification utilis&eacute;e pour la v&eacute;rification
404           de l'autorisation d'acc&egrave;s (si elle est disponible).</td>
405         </tr>
406         <tr>
407           <td><code>banner</code></td>
408           <td>string</td>
409           <td>non</td>
410           <td>La banni&egrave;re du serveur, par exemple <code>Apache HTTP
411           Server/2.4.3 openssl/0.9.8c</code></td>
412         </tr>
413         <tr>
414           <td><code>basic_auth_pw</code></td>
415           <td>string</td>
416           <td>non</td>
417           <td>Le mot de passe pour l'authentification de base envoy&eacute;
418           avec la requ&ecirc;te, s'il existe</td>
419         </tr>
420         <tr>
421           <td><code>canonical_filename</code></td>
422           <td>string</td>
423           <td>non</td>
424           <td>Le nom de fichier canonique de la requ&ecirc;te</td>
425         </tr>
426         <tr>
427           <td><code>content_encoding</code></td>
428           <td>string</td>
429           <td>non</td>
430           <td>Le type de codage du contenu de la requ&ecirc;te courante</td>
431         </tr>
432         <tr>
433           <td><code>content_type</code></td>
434           <td>string</td>
435           <td>oui</td>
436           <td>Le type de contenu de la requ&ecirc;te courante, tel qu'il a &eacute;t&eacute;
437           d&eacute;termin&eacute; au cours de la phase type_check (par exemple
438           <code>image/gif</code> ou <code>text/html</code>)</td>
439         </tr>
440
441         <tr>
442           <td><code>context_prefix</code></td>
443           <td>string</td>
444           <td>non</td>
445           <td></td>
446         </tr>
447         <tr>
448           <td><code>context_document_root</code></td>
449           <td>string</td>
450           <td>non</td>
451           <td></td>
452         </tr>
453
454         <tr>
455           <td><code>document_root</code></td>
456           <td>string</td>
457           <td>non</td>
458           <td>La racine des documents du serveur</td>
459         </tr>
460         <tr>
461           <td><code>err_headers_out</code></td>
462           <td>table</td>
463           <td>non</td>
464           <td>L'en-t&ecirc;te MIME de l'environnement pour la r&eacute;ponse, &eacute;crit
465           m&ecirc;me en cas d'erreur et conserv&eacute; pendant les redirections
466           internes</td>
467         </tr>
468         <tr>
469           <td><code>filename</code></td>
470           <td>string</td>
471           <td>oui</td>
472           <td>Le nom de fichier correspondant &agrave; la requ&ecirc;te, par exemple
473           /www/example.com/foo.txt. Il peut &ecirc;tre modifi&eacute; au cours des
474           phases translate-name ou map-to-storage du traitement de la
475           requ&ecirc;te pour permettre au gestionnaire par d&eacute;faut (ou aux
476           gestionnaires de script) de servir une version du fichier
477           autre que celle demand&eacute;e.</td>
478         </tr>
479         <tr>
480           <td><code>handler</code></td>
481           <td>string</td>
482           <td>oui</td>
483           <td>Le nom du <a href="../handler.html">gestionnaire</a> qui
484           doit traiter la requ&ecirc;te, par exemple <code>lua-script</code>
485           si elle doit &ecirc;tre trait&eacute;e par mod_lua. Cette valeur est en
486           g&eacute;n&eacute;ral d&eacute;finie via les directives <directive
487           module="mod_mime">AddHandler</directive> ou <directive
488           module="core">SetHandler</directive>, mais peut aussi l'&ecirc;tre
489           via mod_lua pour permettre &agrave; un autre gestionnaire de traiter
490           une requ&ecirc;te sp&eacute;cifique qui ne serait pas trait&eacute;e par d&eacute;faut
491           par ce dernier.
492             </td>
493         </tr>
494         <tr>
495           <td><code>headers_in</code></td>
496           <td>table</td>
497           <td>oui</td>
498           <td>Les en-t&ecirc;tes MIME de l'environnement de la requ&ecirc;te. Il
499           s'agit des en-t&ecirc;tes comme <code>Host, User-Agent,
500           Referer</code>, etc...</td>
501         </tr>
502         <tr>
503           <td><code>headers_out</code></td>
504           <td>table</td>
505           <td>oui</td>
506           <td>Les en-t&ecirc;tes MIME de l'environnement de la r&eacute;ponse.</td>
507         </tr>
508         <tr>
509           <td><code>hostname</code></td>
510           <td>string</td>
511           <td>non</td>
512           <td>Le nom d'h&ocirc;te, tel que d&eacute;fini par l'en-t&ecirc;te
513           <code>Host:</code> ou par un URI complet.</td>
514         </tr>
515         <tr>
516           <td><code>is_https</code></td>
517           <td>boolean</td>
518           <td>non</td>
519           <td>Indique si la requ&ecirc;te &agrave; &eacute;t&eacute; faite via HTTPS</td>
520         </tr>
521         <tr>
522           <td><code>is_initial_req</code></td>
523           <td>boolean</td>
524           <td>non</td>
525           <td>Indique si la requ&ecirc;te courante est la requ&ecirc;te initiale ou
526           une sous-requ&ecirc;te.</td>
527         </tr>
528         <tr>
529           <td><code>limit_req_body</code></td>
530           <td>number</td>
531           <td>non</td>
532           <td>La taille maximale du corps de la requ&ecirc;te, ou 0 si aucune
533           limite.</td>
534         </tr>
535         <tr>
536         <td><code>log_id</code></td>
537           <td>string</td>
538           <td>non</td>
539           <td>L'identifiant de la requ&ecirc;te dans les journaux d'acc&egrave;s ou
540           d'erreur.</td>
541         </tr>
542         <tr>
543           <td><code>method</code></td>
544           <td>string</td>
545           <td>non</td>
546           <td>La m&eacute;thode de la requ&ecirc;te, par exemple <code>GET</code> ou
547           <code>POST</code>.</td>
548         </tr>
549         <tr>
550           <td><code>notes</code></td>
551           <td>table</td>
552           <td>oui</td>
553           <td>Une liste de notes qui peuvent &ecirc;tre transmises d'un module
554           &agrave; l'autre.</td>
555         </tr>
556         <tr>
557           <td><code>options</code></td>
558           <td>string</td>
559           <td>non</td>
560           <td>La valeur de la directive Options pour la requ&ecirc;te
561           courante.</td>
562         </tr>
563         <tr>
564           <td><code>path_info</code></td>
565           <td>string</td>
566           <td>non</td>
567           <td>La valeur de PATH_INFO extraite de la requ&ecirc;te.</td>
568         </tr>
569         <tr>
570           <td><code>port</code></td>
571           <td>number</td>
572           <td>non</td>
573           <td>Le port du serveur utilis&eacute; par la requ&ecirc;te.</td>
574         </tr>
575         <tr>
576           <td><code>protocol</code></td>
577           <td>string</td>
578           <td>non</td>
579           <td>Le protocole utilis&eacute;, par exemple <code>HTTP/1.1</code></td>
580         </tr>
581         <tr>
582           <td><code>proxyreq</code></td>
583           <td>string</td>
584           <td>oui</td>
585           <td>Indique s'il s'agit d'une requ&ecirc;te mandat&eacute;e ou non. Cette
586           valeur est en g&eacute;n&eacute;ral d&eacute;finie au cours de la phase
587           post_read_request/translate_name du traitement de la requ&ecirc;te.</td>
588         </tr>
589         <tr>
590           <td><code>range</code></td>
591           <td>string</td>
592           <td>non</td>
593           <td>Le contenu de l'en-t&ecirc;te <code>Range:</code>.</td>
594         </tr>
595         <tr>
596           <td><code>remaining</code></td>
597           <td>number</td>
598           <td>non</td>
599           <td>Le nombre d'octets du corps de la requ&ecirc;te restant &agrave; lire.</td>
600         </tr>
601         <tr>
602           <td><code>server_built</code></td>
603           <td>string</td>
604           <td>non</td>
605           <td>La date de compilation du serveur.</td>
606         </tr>
607         <tr>
608           <td><code>server_name</code></td>
609           <td>string</td>
610           <td>non</td>
611           <td>Le nom du serveur pour cette requ&ecirc;te.</td>
612         </tr>
613         <tr>
614           <td><code>some_auth_required</code></td>
615           <td>boolean</td>
616           <td>non</td>
617           <td>Indique si une autorisation est/&eacute;tait requise pour cette
618           requ&ecirc;te.</td>
619         </tr>
620         <tr>
621           <td><code>subprocess_env</code></td>
622           <td>table</td>
623           <td>oui</td>
624           <td>Le jeu de variables d'environnement pour cette requ&ecirc;te.</td>
625         </tr>
626         <tr>
627           <td><code>started</code></td>
628           <td>number</td>
629           <td>non</td>
630           <td>Le moment o&ugrave; le serveur a &eacute;t&eacute; (re)d&eacute;marr&eacute;, en secondes
631           depuis epoch (1er janvier 1970)</td>
632         </tr>
633         <tr>
634           <td><code>status</code></td>
635           <td>number</td>
636           <td>oui</td>
637           <td>Le code de retour (courant) pour cette requ&ecirc;te, par
638           exemple <code>200</code> ou <code>404</code>.</td>
639         </tr>
640         <tr>
641           <td><code>the_request</code></td>
642           <td>string</td>
643           <td>non</td>
644           <td>La cha&icirc;ne de la requ&ecirc;te telle qu'elle a &eacute;t&eacute; envoy&eacute;e par le
645           client, par exemple <code>GET /foo/bar HTTP/1.1</code>.</td>
646         </tr>
647         <tr>
648           <td><code>unparsed_uri</code></td>
649           <td>string</td>
650           <td>non</td>
651           <td>La partie URI non interpr&eacute;t&eacute;e de la requ&ecirc;te</td>
652         </tr>
653         <tr>
654           <td><code>uri</code></td>
655           <td>string</td>
656           <td>oui</td>
657           <td>L'URI apr&egrave;s interpr&eacute;tation par httpd</td>
658         </tr>
659         <tr>
660           <td><code>user</code></td>
661           <td>string</td>
662           <td>oui</td>
663           <td>Si une authentification a &eacute;t&eacute; effectu&eacute;e, nom de
664           l'utilisateur authentifi&eacute;.</td>
665         </tr>
666         <tr>
667           <td><code>useragent_ip</code></td>
668           <td>string</td>
669           <td>non</td>
670           <td>L'adresse IP de l'agent qui a envoy&eacute; la requ&ecirc;te</td>
671         </tr>
672         </table>
673         </dd>
674     </dl>
675 </section>
676 <section id="functions"><title>M&eacute;thodes de l'objet request_rec</title>
677
678 <p>L'objet request_rec poss&egrave;de (au minimum) les m&eacute;thodes suivantes :</p>
679
680 <highlight language="lua">
681 r:flush()   -- vide le tampon de sortie
682             -- Renvoie true si le vidage a &eacute;t&eacute; effectu&eacute; avec succ&egrave;s,
683             false dans le cas contraire.
684
685 while nous_avons_des_donn&eacute;es_&agrave;_envoyer do
686     r:puts("Bla bla bla\n") -- envoi des donn&eacute;es &agrave; envoyer vers le tampon
687     r:flush() -- vidage du tampon (envoi au client)
688     r:sleep(0.5) -- mise en attente et bouclage
689 end
690 </highlight>
691
692 <highlight language="lua">
693 r:addoutputfilter(name|function) -- ajoute un filtre en sortie
694
695 r:addoutputfilter("fooFilter") -- ins&egrave;re le filtre fooFilter dans le flux de sortie
696 </highlight>
697
698 <highlight language="lua">
699 r:sendfile(filename) -- envoie un fichier entier au client en
700 utilisant sendfile s'il est support&eacute; par la plateforme :
701
702 if use_sendfile_thing then
703     r:sendfile("/var/www/large_file.img")
704 end
705 </highlight>
706
707 <highlight language="lua">
708 r:parseargs() -- renvoie deux tables : une table standard de couples
709 cl&eacute;/valeur pour les donn&eacute;es GET simples, et une autre pour les donn&eacute;es
710 multivalu&eacute;es (par exemple foo=1&amp;foo=2&amp;foo=3) :
711
712 local GET, GETMULTI = r:parseargs()
713 r:puts("Votre nom est : " .. GET['name'] or "Unknown")
714 </highlight>
715
716
717 <highlight language="lua">
718 r:parsebody()([sizeLimit]) -- interpr&egrave;te le corps de la requ&ecirc;te
719 en tant que POST et renvoie deux tables lua, comme r:parseargs(). Un nombre optionnel
720 peut &ecirc;tre fourni pour sp&eacute;cifier le nombre maximal d'octets &agrave;
721 interpr&eacute;ter. La valeur par d&eacute;faut est 8192.
722
723 local POST, POSTMULTI = r:parsebody(1024*1024)
724 r:puts("Votre nom est : " .. POST['name'] or "Unknown")
725 </highlight>
726
727
728 <highlight language="lua">
729 r:puts("bonjour", " le monde", "!") -- affichage dans le corps de la r&eacute;ponse
730 </highlight>
731
732 <highlight language="lua">
733 r:write("une simple cha&icirc;ne") -- affichage dans le
734 corps de la r&eacute;ponse
735 </highlight>
736
737 <highlight language="lua">
738 r:escape_html("&lt;html&gt;test&lt;/html&gt;") -- Echappe le
739 code HTML et renvoie le r&eacute;sultat
740 </highlight>
741
742 <highlight language="lua">
743 r:base64_encode(string) -- Encode une cha&icirc;ne &agrave; l'aide du
744 standard de codage Base64.
745
746 local encoded = r:base64_encode("This is a test") -- returns VGhpcyBpcyBhIHRlc3Q=
747 </highlight>
748
749 <highlight language="lua">
750 r:base64_decode(string) -- D&eacute;code une cha&icirc;ne cod&eacute;e en Base64.
751
752 local decoded = r:base64_decode("VGhpcyBpcyBhIHRlc3Q=") -- returns 'This is a test'
753 </highlight>
754
755 <highlight language="lua">
756 r:md5(string) -- Calcule et renvoie le condens&eacute; MD5 d'une cha&icirc;ne
757 en mode binaire (binary safe).
758
759 local hash = r:md5("This is a test") -- returns ce114e4501d2f4e2dcea3e17b546f339
760 </highlight>
761
762 <highlight language="lua">
763 r:sha1(string) -- Calcule et renvoie le condens&eacute; SHA1 d'une cha&icirc;ne
764 en mode binaire (binary safe).
765
766 local hash = r:sha1("This is a test") -- returns a54d88e06612d820bc3be72877c74f257b561b19
767 </highlight>
768
769 <highlight language="lua">
770 r:escape(string) -- Echappe une cha&icirc;ne de type URL.
771
772 local url = "http://foo.bar/1 2 3 &amp; 4 + 5"
773 local escaped = r:escape(url) -- returns 'http%3a%2f%2ffoo.bar%2f1+2+3+%26+4+%2b+5'
774 </highlight>
775
776 <highlight language="lua">
777 r:unescape(string) -- D&eacute;s&eacute;chappe une cha&icirc;ne de type URL.
778
779 local url = "http%3a%2f%2ffoo.bar%2f1+2+3+%26+4+%2b+5"
780 local unescaped = r:escape(url) -- returns 'http://foo.bar/1 2 3 &amp; 4 + 5'
781 </highlight>
782
783 <highlight language="lua">
784 r:mpm_query(number) -- Interroge le serveur &agrave; propos de son
785 module MPM via la requ&ecirc;te ap_mpm_query.
786
787 local mpm = r.mpm_query(14)
788 if mpm == 1 then
789     r:puts("Ce serveur utilise le MPM Event")
790 end
791 </highlight>
792
793 <highlight language="lua">
794 r:expr(string) -- Evalue une cha&icirc;ne de type <a
795 href="../expr.html">expr</a>.
796
797 if r:expr("%{HTTP_HOST} =~ /^www/") then
798     r:puts("Ce nom d'h&ocirc;te commence par www")
799 end
800 </highlight>
801
802 <highlight language="lua">
803 r:scoreboard_process(a) -- Interroge le serveur &agrave; propos du
804 processus &agrave; la position <code>a</code>.
805
806 local process = r:scoreboard_process(1)
807 r:puts("Le serveur 1 a comme PID " .. process.pid)
808 </highlight>
809
810 <highlight language="lua">
811 r:scoreboard_worker(a, b) -- Interroge le serveur &agrave; propos du
812 thread <code>b</code>, dans le processus <code>a</code>.
813
814 local thread = r:scoreboard_worker(1, 1)
815 r:puts("L'ID du thread 1 du serveur 1 est " .. thread.tid .. " et son
816 &eacute;tat est " .. thread.status)
817 </highlight>
818
819 <highlight language="lua">
820 r:clock() -- Renvoie l'heure courante avec une pr&eacute;cision d'une
821 microseconde.
822 </highlight>
823
824 <highlight language="lua">
825 r:requestbody(filename) -- Lit et renvoie le corps d'une requ&ecirc;te. Si
826 'filename' est sp&eacute;cifi&eacute;, le corps de requ&ecirc;te n'est pas renvoy&eacute;, mais
827 sauvegard&eacute; dans le fichier correspondant.
828
829 local input = r:requestbody()
830 r:puts("Vous m'avez envoy&eacute; le corps de requ&ecirc;te suivant :\n")
831 r:puts(input)
832 </highlight>
833
834 <highlight language="lua">
835 r:add_input_filter(filter_name) -- Ajoute le filtre en entr&eacute;e
836 'filter_name'.
837 </highlight>
838
839 <highlight language="lua">
840 r:module_info(module_name) -- Interroge le serveur &agrave; propos d'un
841 module.
842
843 local mod = r.module_info("mod_lua.c")
844 if mod then
845     for k, v in pairs(mod.commands) do
846        r:puts( ("%s: %s\n"):format(k,v)) -- affiche toutes les directives impl&eacute;ment&eacute;es par ce module
847     end
848 end
849 </highlight>
850
851 <highlight language="lua">
852 r:loaded_modules() -- Renvoie une liste des modules charg&eacute;s par
853 httpd.
854
855 for k, module in pairs(r:loaded_modules()) do
856     r:puts("J'ai charg&eacute; le module " .. module .. "\n")
857 end
858 </highlight>
859
860 <highlight language="lua">
861 r:runtime_dir_relative(filename) -- G&eacute;n&egrave;re le nom d'un fichier run-time
862 (par exemple la m&eacute;moire partag&eacute;e "file") relativement au r&eacute;pertoire de
863 run-time. 
864 </highlight>
865
866 <highlight language="lua">
867 r:server_info() -- Renvoie une table contenant des informations
868 &agrave; propos du serveur, comme le nom de l'ex&eacute;cutable httpd, le
869 module mpm utilis&eacute;, etc...
870 </highlight>
871
872 <highlight language="lua">
873 r:set_document_root(file_path) -- D&eacute;finit la racine des
874 documents pour la requ&ecirc;te &agrave; file_path.
875 </highlight>
876
877 <highlight language="lua">
878 r:add_version_component(component_string) -- Ajoute un &eacute;l&eacute;ment &agrave;
879 la banni&egrave;re du serveur.
880 </highlight>
881
882 <highlight language="lua">
883 r:set_context_info(prefix, docroot) -- D&eacute;finit le pr&eacute;fixe et la
884 racine des documents du contexte pour une requ&ecirc;te.
885 </highlight>
886
887 <highlight language="lua">
888 r:os_escape_path(file_path) -- Convertit un chemin du syst&egrave;me de
889 fichiers en URL ind&eacute;pendamment du syst&egrave;me d'exploitation.
890 </highlight>
891
892 <highlight language="lua">
893 r:escape_logitem(string) -- Echappe une cha&icirc;ne pour
894 journalisation.
895 </highlight>
896
897 <highlight language="lua">
898 r.strcmp_match(string, pattern) -- V&eacute;rifie si 'string' correspond &agrave;
899 'pattern' via la fonction strcmp_match (GLOBs). Par exemple, est-ce que
900 'www.example.com' correspond &agrave; '*.example.com' ?
901
902 local match = r.strcmp_match("foobar.com", "foo*.com")
903 if match then 
904     r:puts("foobar.com matches foo*.com")
905 end
906 </highlight>
907
908 <highlight language="lua">
909 r:set_keepalive() -- D&eacute;finit l'&eacute;tat de persistance d'une
910 requ&ecirc;te. Renvoie true dans la mesure du possible, false dans le
911 cas contraire.
912 </highlight>
913
914 <highlight language="lua">
915 r:make_etag() -- G&eacute;n&egrave;re et renvoie le etag pour la requ&ecirc;te
916 courante.
917 </highlight>
918
919 <highlight language="lua">
920 r:send_interim_response(clear) -- Renvoie une r&eacute;ponse d'int&eacute;rim (1xx) au
921 client. Si 'clear' est vrai, les en-t&ecirc;tes disponibles seront envoy&eacute;s et
922 effac&eacute;s.
923 </highlight>
924
925 <highlight language="lua">
926 r:custom_response(status_code, string) -- G&eacute;n&egrave;re et d&eacute;finit une r&eacute;ponse
927 personnalis&eacute;e pour un code d'&eacute;tat particulier. Le fonctionnement est
928 tr&egrave;s proche de celui de la directive ErrorDocument.
929
930 r:custom_response(404, "Baleted!")
931 </highlight>
932
933 <highlight language="lua">
934 r.exists_config_define(string) -- V&eacute;rifie si une d&eacute;finition de
935 configuration existe.
936
937 if r.exists_config_define("FOO") then
938     r:puts("httpd a probablement &eacute;t&eacute; lanc&eacute; avec l'option -DFOO, ou FOO a
939     &eacute;t&eacute; d&eacute;fini dans la configuration")
940 end
941 </highlight>
942
943 <highlight language="lua">
944 r:state_query(string) -- Interroge le serveur &agrave; propos de son
945 &eacute;tat.
946 </highlight>
947
948 <highlight language="lua">
949 r:stat(filename) -- Ex&eacute;cute stat() sur un fichier, et renvoie
950 une table contenant des informations &agrave; propos de ce fichier.
951
952 local info = r:stat("/var/www/foo.txt")
953 if info then
954     r:puts("Ce fichier existe et a &eacute;t&eacute; modifi&eacute; pour la derni&egrave;re fois &agrave; : " .. info.modified)
955 end
956 </highlight>
957
958 <highlight language="lua">
959 r:regex(string, pattern, [drapeaux]) -- Ex&eacute;cute une recherche &agrave; base
960 d'expression rationnelle sur une cha&icirc;ne, et renvoie les
961 &eacute;ventuelles correspondances trouv&eacute;es.
962
963 local matches = r:regex("foo bar baz", [[foo (\w+) (\S*)]])
964 if matches then
965     r:puts("L'expression rationnelle correspond et le dernier mot
966     captur&eacute; ($2) est : " .. matches[2])
967 end
968
969 -- Exemple avec insensibilit&eacute; &agrave; la casse :
970 local matches = r:regex("FOO bar BAz", [[(foo) bar]], 1)
971
972 -- les drapeaux peuvent &ecirc;tre une combibaison bit &agrave; bit de :
973 -- 0x01: insensibilit&eacute; &agrave; la casse
974 -- 0x02: recherche multiligne
975 </highlight>
976
977 <highlight language="lua">
978 r:sleep(secondes) -- Interrompt l'ex&eacute;cution du script pendant le nombre de secondes sp&eacute;cifi&eacute;.
979                   -- La valeur peut &ecirc;tre sp&eacute;cifi&eacute;e sous la forme d'un nombre d&eacute;cimal comme 1.25 pour plus de pr&eacute;cision.
980 </highlight>
981
982 <highlight language="lua">
983 r:dbacquire(dbType[, dbParams]) -- Acquiert une connexion &agrave; une
984 base de donn&eacute;es et renvoie une classe database. Voir '<a
985 href="#databases">Connectivit&eacute; aux bases de donn&eacute;es</a>' pour plus de
986 d&eacute;tails.
987 </highlight>
988
989 <highlight language="lua">
990 r:ivm_set("key", value) -- D&eacute;fini une variable Inter-VM avec une valeur sp&eacute;cifique.
991                         -- Ces valeurs sont conserv&eacute;es m&ecirc;me si la VM est
992                         -- arr&ecirc;t&eacute;e ou non utilis&eacute;e, et ne doivent donc &ecirc;tre
993                         -- utilis&eacute;es que si MaxConnectionsPerChild > 0.
994                         -- Les valeurs peuvent &ecirc;tre de type number, string
995                         -- ou boolean et sont stock&eacute;es s&eacute;par&eacute;ment pour
996                         -- chaque processus (elles ne seront donc pas d'une
997                         -- grande utilit&eacute; si l'on utilise le mpm prefork).
998                         
999 r:ivm_get("key")        -- Lit le contenu d'une variable d&eacute;finie via ivm_set. Renvoie
1000                         -- le contenu de la variable si elle existe, ou nil
1001                         -- dans le cas contraire.
1002                         
1003 -- Voici un exemple de lecture/&eacute;criture qui sauvegarde une variable
1004 -- globale en dehors de la VM :
1005 function handle(r)
1006     -- La premi&egrave;re VM qui effectue l'appel suivant n'obtiendra aucune
1007     -- valeur, et devra la cr&eacute;er
1008     local foo = r:ivm_get("cached_data")
1009     if not foo then
1010         foo = do_some_calcs() -- simulation de valeurs de retour
1011         r:ivm_set("cached_data", foo) -- d&eacute;finition globale de la variable
1012     end
1013     r:puts("La donn&eacute;e en cache est : ", foo)
1014 end                     
1015 </highlight>
1016
1017 </section>
1018
1019 <section id="logging"><title>Fonctions de journalisation</title>
1020
1021 <highlight language="lua">
1022         -- exemples de messages de journalisation
1023         r:trace1("Ceci est un message de journalisation de niveau
1024         trace") -- les niveaux valides vont de trace1 &agrave; trace8 <br />
1025         r:debug("Ceci est un message de journalisation de niveau debug")<br />
1026         r:info("Ceci est un message de journalisation de niveau info")<br />
1027         r:notice("Ceci est un message de journalisation de niveau notice")<br />
1028         r:warn("Ceci est un message de journalisation de niveau warn")<br />
1029         r:err("Ceci est un message de journalisation de niveau err")<br />
1030         r:alert("Ceci est un message de journalisation de niveau alert")<br />
1031         r:crit("Ceci est un message de journalisation de niveau crit")<br />
1032         r:emerg("Ceci est un message de journalisation de niveau emerg")<br />
1033 </highlight>
1034
1035 </section>
1036
1037 <section id="apache2"><title>Paquet apache2</title>
1038 <p>Le paquet nomm&eacute; <code>apache2</code> est fourni avec (au minimum) le
1039 contenu suivant :</p>
1040 <dl>
1041   <dt>apache2.OK</dt>
1042   <dd>Constante interne OK. Les gestionnaires renverront cette valeur
1043   s'ils ont trait&eacute; la requ&ecirc;te.</dd>
1044   <dt>apache2.DECLINED</dt>
1045   <dd>Constante interne DECLINED. Les gestionnaires renverront cette
1046   valeur s'ils n'ont pas l'intention de traiter la requ&ecirc;te.</dd>
1047   <dt>apache2.DONE</dt>
1048   <dd>Constante interne DONE.</dd>
1049   <dt>apache2.version</dt>
1050   <dd>Cha&icirc;ne contenant la version du serveur HTTP Apache</dd>
1051   <dt>apache2.HTTP_MOVED_TEMPORARILY</dt>
1052   <dd>Code d'&eacute;tat HTTP</dd>
1053   <dt>apache2.PROXYREQ_NONE, apache2.PROXYREQ_PROXY, apache2.PROXYREQ_REVERSE, apache2.PROXYREQ_RESPONSE</dt>
1054   <dd>Constantes internes utilis&eacute;es par <module>mod_proxy</module></dd>
1055   <dt>apache2.AUTHZ_DENIED, apache2.AUTHZ_GRANTED, apache2.AUTHZ_NEUTRAL, apache2.AUTHZ_GENERAL_ERROR, apache2.AUTHZ_DENIED_NO_USER</dt>
1056   <dd>constantes internes utilis&eacute;es par <module>mod_authz_core</module></dd>
1057
1058 </dl>
1059 <p>Les autres codes d'&eacute;tat HTTP ne sont pas encore impl&eacute;ment&eacute;s.</p>
1060 </section>
1061
1062
1063 <section id="modifying_buckets">
1064     <title>Modification de contenu avec les filtres lua</title>
1065     <p>
1066     Les fonctions de filtrage impl&eacute;ment&eacute;es via les directives <directive
1067     module="mod_lua">LuaInputFilter</directive> ou <directive
1068     module="mod_lua">LuaOutputFilter</directive> sont con&ccedil;ues comme des
1069     fonctions de 3&egrave;me phase non blocantes utilisant des sous-routines
1070     pour suspendre et reprendre l'ex&eacute;cution d'une fonction lorsque des
1071     paquets de donn&eacute;es sont envoy&eacute;s &agrave; la cha&icirc;ne de filtrage. La
1072     structure de base d'une telle fonction est :
1073     </p>
1074     <highlight language="lua">
1075 function filter(r)
1076     -- Nous indiquons tout d'abord que nous sommes pr&ecirc;ts &agrave; recevoir des
1077     -- blocs de donn&eacute;es.
1078     -- Avant ceci, nous pouvons d&eacute;finir notre environnement, tester
1079     -- certaines conditions, et, si nous le jugeons n&eacute;cessaire, refuser le
1080     -- filtrage d'une requ&ecirc;te :
1081     if something_bad then
1082         return -- Le filtrage est saut&eacute;
1083     end
1084     -- Sans se pr&eacute;occuper des donn&eacute;es que nous devons &eacute;ventuellement ajouter, un arr&ecirc;t est r&eacute;alis&eacute; ici.
1085     -- Noter que les filtres de sortie sont les seuls capables d'ajouter des &eacute;l&eacute;ments au d&eacute;but des donn&eacute;es.
1086     -- Les filtres en entr&eacute;e peuvent ajouter des &eacute;l&eacute;ments &agrave; la fin des donn&eacute;es au stade final.
1087
1088     coroutine.yield([optional header to be prepended to the content])
1089
1090     -- Apr&egrave;s cet arr&ecirc;t, nous allons recevoir d'autres blocs de donn&eacute;es, un par un ;
1091     -- nous pouvons les traiter comme il nous pla&icirc;t et proc&eacute;der &agrave; la r&eacute;ponse.
1092     -- Ces blocs sont conserv&eacute;s dans la variable globale 'bucket', nous r&eacute;alisons donc
1093     -- une boucle pour v&eacute;rifier que 'bucket' n'est pas vide :
1094     while bucket ~= nil do
1095         local output = mangle(bucket) -- Do some stuff to the content
1096         coroutine.yield(output) -- Return our new content to the filter chain
1097     end
1098
1099     -- Une fois les blocs de donn&eacute;es &eacute;puis&eacute;s, 'bucket' est positionn&eacute; &agrave; une valeur vide ('nil'),
1100     -- ce qui va nous faire sortir de cette boucle et nous amener &agrave; l'&eacute;tape suivante.
1101     -- On peut ajouter ce qu'on veut &agrave; la fin des donn&eacute;es &agrave; cette &eacute;tape, qui constitue le dernier
1102     -- arr&ecirc;t. Les filtres d'entr&eacute;e comme de sortie peuvent servir &agrave; ajouter des &eacute;l&eacute;ments &agrave; la fin
1103     --  des donn&eacute;es &agrave; cette &eacute;tape.
1104     coroutine.yield([optional footer to be appended to the content])
1105 end
1106     </highlight>
1107 </section>
1108 <section id="databases">
1109     <title>Connectivit&eacute; aux bases de donn&eacute;es</title>
1110     <p>Mod_lua impl&eacute;mente une fonctionnalit&eacute; basique de connexion aux
1111 bases de donn&eacute;es permettant d'envoyer des requ&ecirc;tes ou d'ex&eacute;cuter des
1112 commandes aupr&egrave;s des moteurs de base de donn&eacute;es les plus courants
1113 (mySQL, PostgreSQL, FreeTDS, ODBC, SQLite, Oracle), ainsi que mod_dbd.
1114     </p>
1115     <p>L'exemple suivant montre comment se connecter &agrave; une base de
1116 donn&eacute;es et extraire des informations d'une table :</p>
1117     <highlight language="lua">
1118 function handle(r)
1119     -- connexion &agrave; la base de donn&eacute;es
1120     local database, err = r:dbacquire("mysql", "server=localhost,user=root,dbname=mydb")
1121     if not err then
1122         -- S&eacute;lection de certaines informations
1123         local results, err = database:select(r, "SELECT `name`, `age` FROM `people` WHERE 1")
1124         if not err then
1125             local rows = results(0) -- extrait tous les enregistrements en mode synchrone
1126             for k, row in pairs(rows) do
1127                 r:puts( string.format("Name: %s, Age: %s&lt;br/&gt;", row[1], row[2]) )
1128             end
1129         else
1130             r:puts("Database query error: " .. err)
1131         end
1132         database:close()
1133     else
1134         r:puts("Connexion &agrave; la base de donn&eacute;es impossible : " .. err)
1135     end
1136 end
1137     </highlight>
1138     <p>
1139     Pour utiliser <module>mod_dbd</module>, sp&eacute;cifiez
1140 <code>mod_dbd</code> comme type de base de donn&eacute;es, ou laissez le champ
1141 vide :
1142     </p>
1143     <highlight language="lua">
1144     local database = r:dbacquire("mod_dbd")
1145     </highlight>
1146     <section id="database_object">
1147         <title>L'objet database et ses m&eacute;thodes</title>
1148         <p>L'objet database renvoy&eacute; par <code>dbacquire</code> poss&egrave;de
1149 les m&eacute;thodes suivantes :</p>
1150         <p><strong>S&eacute;lection normale et requ&ecirc;te vers une base de donn&eacute;es
1151 :</strong></p>
1152     <highlight language="lua">
1153 -- Ex&eacute;cution d'une requ&ecirc;te et renvoie du nombre d'enregistrements
1154 affect&eacute;s :
1155 local affected, errmsg = database:query(r, "DELETE FROM `tbl` WHERE 1")
1156
1157 -- Ex&eacute;cution d'une requ&ecirc;te et renvoie du r&eacute;sultat qui peut &ecirc;tre utilis&eacute;
1158 en mode synchrone ou asynchrone :
1159 local result, errmsg = database:select(r, "SELECT * FROM `people` WHERE 1")
1160     </highlight>
1161         <p><strong>Utilisation de requ&ecirc;tes pr&eacute;par&eacute;es (recommand&eacute;) :</strong></p>
1162     <highlight language="lua">
1163 -- Cr&eacute;ation et ex&eacute;cution d'une requ&ecirc;te pr&eacute;par&eacute;e :
1164 local statement, errmsg = database:prepare(r, "DELETE FROM `tbl` WHERE `age` > %u")
1165 if not errmsg then
1166     local result, errmsg = statement:query(20) -- ex&eacute;cute la requ&ecirc;te pour age &gt; 20
1167 end
1168
1169 -- Extrait une requ&ecirc;te pr&eacute;par&eacute;e depuis une directive DBDPrepareSQL :
1170 local statement, errmsg = database:prepared(r, "someTag")
1171 if not errmsg then
1172     local result, errmsg = statement:select("John Doe", 123) -- injecte les valeurs "John Doe" et 123 dans la requ&ecirc;te
1173 end
1174
1175 </highlight>
1176         <p><strong>Echappement de valeurs, fermeture de la base donn&eacute;es,
1177 etc...</strong></p>
1178     <highlight language="lua">
1179 -- Echappe une valeur pour pouvoir l'utiliser dans une requ&ecirc;te :
1180 local escaped = database:escape(r, [["'|blabla]])
1181
1182 -- Ferme une base de donn&eacute;es et lib&egrave;re les liens vers cette derni&egrave;re :
1183 database:close()
1184
1185 -- V&eacute;rifie si une connexion &agrave; une base de donn&eacute;es est en service et
1186 op&eacute;rationnelle :
1187 local connected = database:active()
1188     </highlight>
1189     </section>
1190     <section id="result_sets">
1191     <title>Travail avec les jeux d'enregistrements renvoy&eacute;s par les requ&ecirc;tes</title>
1192     <p>Les jeux d'enregistrements renvoy&eacute;s par <code>db:select</code> ou par des
1193 requ&ecirc;tes pr&eacute;par&eacute;es cr&eacute;&eacute;es par <code>db:prepare</code> permettent de
1194 s&eacute;lectionner des enregistrements en mode synchrone ou
1195 asynchrone, selon le nombre d'enregistrements sp&eacute;cifi&eacute; :<br/>
1196     <code>result(0)</code> s&eacute;lectionne tous les enregistrements en mode
1197 synchrone en renvoyant une table d'enregistrements.<br/>
1198     <code>result(-1)</code> s&eacute;lectionne le prochain enregistrement disponible en
1199 mode asynchrone.<br/>
1200     <code>result(N)</code> s&eacute;lectionne l'enregistrement num&eacute;ro
1201 <code>N</code> en mode asynchrone.
1202     </p>
1203     <highlight language="lua">
1204 -- extrait un jeu d'enregistrements via une requ&ecirc;te r&eacute;guli&egrave;re :
1205 local result, err = db:select(r, "SELECT * FROM `tbl` WHERE 1")
1206
1207 local rows = result(0) -- s&eacute;lectionne tous les enregistrements en mode synchrone
1208 local row = result(-1) -- s&eacute;lectionne le prochain enregistrement disponible en mode asynchrone
1209 local row = result(1234) -- s&eacute;lectionne l'enregistrement 1234 en mode asynchrone
1210     </highlight>
1211     <p>Il est possible de construire une fonction qui renvoie une
1212 fonction it&eacute;rative permettant de traiter tous les enregistrement en mode
1213 synchrone ou asynchrone selon la valeur de l'argument async :
1214     </p>
1215     <highlight language="lua">
1216 function rows(resultset, async)
1217     local a = 0
1218     local function getnext()
1219         a = a + 1
1220         local row = resultset(-1)
1221         return row and a or nil, row
1222     end
1223     if not async then
1224         return pairs(resultset(0))
1225     else
1226         return getnext, self
1227     end
1228 end
1229
1230 local statement, err = db:prepare(r, "SELECT * FROM `tbl` WHERE `age` > %u")
1231 if not err then
1232      -- s&eacute;lectionne des enregistrements en mode asynchrone :
1233     local result, err = statement:select(20)
1234     if not err then
1235         for index, row in rows(result, true) do
1236             ....
1237         end
1238     end
1239
1240      -- s&eacute;lectionne des enregistrements en mode synchrone :
1241     local result, err = statement:select(20)
1242     if not err then
1243         for index, row in rows(result, false) do
1244             ....
1245         end
1246     end
1247 end
1248     </highlight>
1249     </section>
1250     <section id="closing_databases">
1251         <title>Fermeture d'une connexion &agrave; une base de donn&eacute;es</title>
1252
1253     <p>Lorsqu'elles ne sont plus utilis&eacute;es, les connexions aux bases de
1254 donn&eacute;es doivent &ecirc;tre ferm&eacute;es avec <code>database:close()</code>. Si vous
1255 ne les fermez pas manuellement, mod_lua les fermera peut-&ecirc;tre en tant
1256 que r&eacute;sidus collect&eacute;s, mais si ce n'est pas le cas, vous pouvez finir
1257 pas avoir trop de connexions vers la base de donn&eacute;es inutilis&eacute;es. Les
1258 deux mesures suivantes sont pratiquement identiques :
1259     </p>
1260     <highlight language="lua">
1261 -- M&eacute;thode 1 : fermeture manuelle de la connexion
1262 local database = r:dbacquire("mod_dbd")
1263 database:close() -- c'est tout
1264
1265 -- M&eacute;thode 2 : on laisse le collecteur de r&eacute;sidus la fermer
1266 local database = r:dbacquire("mod_dbd")
1267 database = nil -- on coupe le lien
1268 collectgarbage() -- fermeture de la connexion par le collecteur de r&eacute;sidus
1269 </highlight>
1270     </section>
1271     <section id="database_caveat">
1272     <title>Pr&eacute;cautions &agrave; prendre lorsque l'on travaille avec les bases
1273 de donn&eacute;es</title>
1274     <p>Bien que les fonctions <code>query</code> et <code>run</code>
1275 soient toujours disponibles, il est recommand&eacute; d'utiliser des requ&ecirc;tes
1276 pr&eacute;par&eacute;es chaque fois que possible, afin d'une part d'optimiser les
1277 performances (si votre connexion reste longtemps en vie), et d'autre part
1278 minimiser le risque d'attaques par injection SQL. Les fonctions
1279 <code>run</code> et <code>query</code> ne doivent &ecirc;tre utilis&eacute;es que
1280 lorsque la requ&ecirc;te ne contient pas de variables (requ&ecirc;te statique). Dans
1281 le cas des requ&ecirc;tes dynamiques, utilisez <code>db:prepare</code> ou
1282 <code>db:prepared</code>.
1283     </p>
1284     </section>
1285
1286 </section>
1287
1288 <directivesynopsis>
1289 <name>LuaRoot</name>
1290 <description>Sp&eacute;cifie le chemin de base pour la r&eacute;solution des chemins
1291 relatifs dans les directives de mod_lua</description>
1292 <syntax>LuaRoot /chemin/vers/un/r&eacute;pertoire</syntax>
1293 <contextlist><context>server config</context><context>virtual host</context>
1294 <context>directory</context><context>.htaccess</context>
1295 </contextlist>
1296 <override>All</override>
1297
1298 <usage>
1299     <p>Cette directive permet de sp&eacute;cifier le chemin de base qui sera
1300     utilis&eacute; pour &eacute;valuer tous les chemins relatifs dans mod_lua. En
1301     l'absence de cette directive, les chemins relatifs sont r&eacute;solus par
1302     rapport au r&eacute;pertoire de travail courant, ce qui ne sera pas
1303     toujours appropri&eacute; pour un serveur.</p>
1304 </usage>
1305 </directivesynopsis>
1306
1307 <directivesynopsis>
1308 <name>LuaScope</name>
1309 <description>Une valeur parmi once, request, conn, thread -- la valeur
1310 par d&eacute;faut est once</description>
1311 <syntax>LuaScope once|request|conn|thread|server [min] [max]</syntax>
1312 <default>LuaScope once</default>
1313 <contextlist><context>server config</context><context>virtual host</context>
1314 <context>directory</context><context>.htaccess</context>
1315 </contextlist>
1316 <override>All</override>
1317
1318 <usage>
1319     <p>Cette directive permet de sp&eacute;cifier la dur&eacute;e de vie de
1320     l'interpr&eacute;teur Lua qui sera utilis&eacute; dans ce "r&eacute;pertoire". La valeur
1321     par d&eacute;faut est "once".</p>
1322
1323    <dl>
1324     <dt>once:</dt> <dd>utilise l'interpr&eacute;teur une fois.</dd>
1325
1326     <dt>request:</dt> <dd>utilise l'interpr&eacute;teur pour traiter tout ce
1327     qui est bas&eacute; sur le m&ecirc;me fichier dans la requ&ecirc;te, et qui se trouve
1328     aussi dans la port&eacute;e de la requ&ecirc;te.</dd>
1329
1330     <dt>conn:</dt> <dd>idem request, mais attach&eacute; &agrave; connection_rec</dd>
1331
1332     <dt>thread:</dt> <dd>Utilise l'interpr&eacute;teur pendant toute la dur&eacute;e
1333     de vie du thread qui traite la requ&ecirc;te (disponible seulement avec
1334     les MPMs thread&eacute;s).</dd>
1335
1336     <dt>server:</dt>  <dd>Le comportement est ici diff&eacute;rent, car la
1337     port&eacute;e du serveur pr&eacute;sente une dur&eacute;e de vie assez longue, et
1338     plusieurs threads vont partager le m&ecirc;me server_rec. Pour g&eacute;rer tout
1339     ceci, les &eacute;tats lua du serveur sont stock&eacute;s dans une liste de ressources
1340     apr. Les arguments <code>min</code> et <code>max</code> permettent
1341     de sp&eacute;cifier les nombres minimaux et maximaux d'&eacute;tats lua &agrave; stocker
1342     dans la liste.</dd>
1343    </dl>
1344    <p>En g&eacute;n&eacute;ral, les port&eacute;es <code>thread</code> et <code>server</code>
1345    sont 2 &agrave; 3 fois plus rapides que les autres, car elles n'ont pas besoin
1346    de r&eacute;g&eacute;n&eacute;rer de nouveaux &eacute;tats Lua &agrave; chaque requ&ecirc;te (comme c'est le
1347    cas avec le MPM event, o&ugrave; m&ecirc;me les connexions persistantes utilisent un
1348    nouveau thread pour chaque requ&ecirc;te). Si vous pensez que vos scripts
1349    n'auront pas de probl&egrave;me s'il r&eacute;utilisent un &eacute;tat, alors les port&eacute;es
1350    <code>thread</code> ou <code>server</code> doivent &ecirc;tre utilis&eacute;es car
1351    elles pr&eacute;senteront de meilleures performances. Alors que la port&eacute;e
1352    <code>thread</code> fournira les r&eacute;ponses les plus rapides, la port&eacute;e
1353    <code>server</code> utilisera moins de m&eacute;moire car les &eacute;tats sont
1354    rassembl&eacute;s dans des jeux, permettant par exemple &agrave; 1000 threads de
1355    partager 100 &eacute;tats Lua, ne n&eacute;cessitant ainsi que 10% de la m&eacute;moire
1356    requise par la port&eacute;e <code>thread</code>.
1357     </p>
1358 </usage>
1359 </directivesynopsis>
1360
1361 <directivesynopsis>
1362 <name>LuaMapHandler</name>
1363 <description>Met en correspondance un chemin avec un gestionnaire lua</description>
1364 <syntax>LuaMapHandler modele-uri /chemin/vers/lua/script.lua
1365 [nom-fonction]</syntax>
1366 <contextlist><context>server config</context><context>virtual host</context>
1367 <context>directory</context><context>.htaccess</context>
1368 </contextlist>
1369 <override>All</override>
1370 <usage>
1371     <p>Cette directive permet de faire correspondre un mod&egrave;le d'uri avec
1372     une fonction de gestionnaire situ&eacute;e dans un fichier sp&eacute;cifique. Elle
1373     utilise les expressions rationnelles PCRE pour mettre en
1374     correspondance l'uri, et supporte les groupes de correspondance
1375     d'interpolation dans le chemin du fichier et le nom de la fonction.
1376     Prenez garde aux probl&egrave;mes de s&eacute;curit&eacute; en &eacute;crivant vos expressions
1377     rationnelles.</p>
1378    <example><title>Exemples :</title>
1379     <highlight language="config">
1380     LuaMapHandler /(\w+)/(\w+) /scripts/$1.lua handle_$2
1381     </highlight>
1382    </example>
1383         <p>Cette directive va faire correspondre des uri comme
1384         /photos/show?id=9 au fichier /scripts/photos.lua, et invoquera la
1385         fonction de gestionnaire handle_show au niveau de la vm lua
1386         apr&egrave;s chargement de ce fichier.</p>
1387
1388 <highlight language="config">
1389     LuaMapHandler /bingo /scripts/wombat.lua
1390 </highlight>
1391         <p>Cette directive invoquera la fonction "handle" qui est la
1392         valeur par d&eacute;faut si aucun nom de fonction sp&eacute;cifique n'est
1393         sp&eacute;cifi&eacute;.</p>
1394 </usage>
1395 </directivesynopsis>
1396
1397 <directivesynopsis>
1398 <name>LuaPackagePath</name>
1399 <description>Ajoute un r&eacute;pertoire au package.path de lua</description>
1400 <syntax>LuaPackagePath /chemin/vers/include/?.lua</syntax>
1401 <contextlist><context>server config</context><context>virtual host</context>
1402 <context>directory</context><context>.htaccess</context>
1403 </contextlist>
1404 <override>All</override>
1405     <usage><p>Cette directive permet d'ajouter un chemin &agrave; la liste des
1406     chemins de recherche du module lua. Elle suit les m&ecirc;mes conventions
1407     que lua. Ceci modifie le package.path dans les vms lua.</p>
1408
1409     <example><title>Exemples :</title>
1410         <highlight language="config">
1411 LuaPackagePath /scripts/lib/?.lua
1412 LuaPackagePath /scripts/lib/?/init.lua
1413     </highlight>
1414     </example>
1415 </usage>
1416 </directivesynopsis>
1417
1418 <directivesynopsis>
1419 <name>LuaPackageCPath</name>
1420 <description>Ajoute un r&eacute;pertoire au package.cpath de lua</description>
1421 <syntax>LuaPackageCPath /chemin/vers/include/?.soa</syntax>
1422 <contextlist><context>server config</context><context>virtual host</context>
1423 <context>directory</context><context>.htaccess</context>
1424 </contextlist>
1425 <override>All</override>
1426
1427 <usage>
1428     <p>Cette directive permet d'ajouter un chemin &agrave; la liste des chemins
1429     de recherche des biblioth&egrave;ques partag&eacute;es de lua. Ceci modifie le
1430     package.cpath dans les vms lua.</p>
1431
1432 </usage>
1433 </directivesynopsis>
1434
1435 <directivesynopsis>
1436 <name>LuaCodeCache</name>
1437 <description>Configure le cache de code compil&eacute;.</description>
1438 <syntax>LuaCodeCache stat|forever|never</syntax>
1439 <default>LuaCodeCache stat</default>
1440 <contextlist>
1441 <context>server config</context><context>virtual host</context>
1442 <context>directory</context><context>.htaccess</context>
1443 </contextlist>
1444 <override>All</override>
1445
1446 <usage><p>
1447     Cette directive permet de d&eacute;finir le comportement du cache de code
1448     en m&eacute;moire. La valeur par d&eacute;faut est stat ; dans ce cas, le script
1449     du niveau le plus haut (et pas les scripts inclus) est v&eacute;rifi&eacute; &agrave;
1450     chaque fois que ce fichier est n&eacute;cessaire, et est recharg&eacute; si la
1451     date de modification est plus r&eacute;cente que celle du script d&eacute;j&agrave;
1452     charg&eacute;. Les autres valeurs permettent respectivement de garder le
1453     fichier en cache perp&eacute;tuellement (forever - jamais v&eacute;rifi&eacute; ni
1454     remplac&eacute;), ou de ne jamais le mettre en cache (never).</p>
1455
1456     <p>En g&eacute;n&eacute;ral, les valeurs stat et forever sont utilis&eacute;es pour un
1457     serveur en production, et les valeurs stat ou never pour un serveur
1458     en d&eacute;veloppement.</p>
1459
1460     <example><title>Exemples :</title>
1461         <highlight language="config">
1462 LuaCodeCache stat
1463 LuaCodeCache forever
1464 LuaCodeCache never
1465     </highlight>
1466     </example>
1467
1468 </usage>
1469 </directivesynopsis>
1470
1471 <directivesynopsis>
1472 <name>LuaHookTranslateName</name>
1473 <description>Fournit un point d'entr&eacute;e &agrave; la phase du nom de
1474 traduction du traitement de la requ&ecirc;te</description>
1475 <syntax>LuaHookTranslateName  /chemin/vers/lua/script.lua  nom_fonction_hook [early|late]</syntax>
1476 <contextlist><context>server config</context><context>virtual host</context>
1477 </contextlist>
1478 <override>All</override>
1479 <compatibility>Le troisi&egrave;me argument optionnel est disponible depuis la
1480 version 2.3.15 du serveur HTTP Apache.</compatibility>
1481
1482 <usage><p>
1483     Cette directive permet d'ajouter un point d'entr&eacute;e (&agrave;
1484     APR_HOOK_MIDDLE) &agrave; la phase du nom de traduction du traitement de la
1485     requ&ecirc;te. La fonction hook accepte un seul argument, le request_rec,
1486     et doit renvoyer un code d'&eacute;tat qui est soit un code d'erreur HTTP,
1487     ou une constante d&eacute;finie dans le module apache2 :  apache2.OK,
1488     apache2.DECLINED, ou apache2.DONE.</p>
1489
1490     <p>Pour ceux qui ne sont pas familiers avec les points d'entr&eacute;e
1491     (hook), en gros, chaque hook sera invoqu&eacute; jusqu'&agrave; ce que l'un
1492     d'entre eux renvoie apache2.OK. Si un hook n'effectuer pas la
1493     traduction, il doit juste renvoyer apache2.DECLINED. Si le
1494     traitement de la requ&ecirc;te doit &ecirc;tre interrompu, la valeur renvoy&eacute;e
1495     doit &ecirc;tre apache2.DONE.</p>
1496
1497     <p>Exemple :</p>
1498
1499 <highlight language="config">
1500 # httpd.conf
1501 LuaHookTranslateName /scripts/conf/hooks.lua silly_mapper
1502 </highlight>
1503
1504 <highlight language="lua">
1505 -- /scripts/conf/hooks.lua --
1506 require "apache2"
1507 function silly_mapper(r)
1508     if r.uri == "/" then
1509         r.filename = "/var/www/home.lua"
1510         return apache2.OK
1511     else
1512         return apache2.DECLINED
1513     end
1514 end
1515 </highlight>
1516
1517    <note><title>Contexte</title><p>Cette directive ne peut &ecirc;tre
1518    utilis&eacute;e ni &agrave; l'int&eacute;rieur d'une section <directive type="section"
1519    module="core">Directory</directive> ou <directive type="section"
1520    module="core">Files</directive>, ni dans un fichier htaccess.</p></note>
1521
1522    <note><title>Ordonnancement</title><p>Les arguments optionnels
1523    "early" ou "late" permettent de contr&ocirc;ler le moment auquel ce script
1524    s'ex&eacute;cute par rapport aux autres modules.</p></note>
1525 </usage>
1526 </directivesynopsis>
1527
1528 <directivesynopsis>
1529 <name>LuaHookFixups</name>
1530 <description>Fournit un point d'entr&eacute;e pour la phase de correction du
1531 traitement de la requ&ecirc;te</description>
1532 <syntax>LuaHookFixups  /chemin/vers/lua/script.lua hook_function_name</syntax>
1533 <contextlist><context>server config</context><context>virtual host</context>
1534 <context>directory</context><context>.htaccess</context>
1535 </contextlist>
1536 <override>All</override>
1537 <usage>
1538 <p>
1539     Idem LuaHookTranslateName, mais s'ex&eacute;cute durant la phase de
1540     correction.
1541 </p>
1542 </usage>
1543 </directivesynopsis>
1544
1545 <directivesynopsis>
1546 <name>LuaHookMapToStorage</name>
1547 <description>Fournit un point d'entr&eacute;e pour la phase map_to_storage du
1548 traitement de la requ&ecirc;te</description>
1549 <syntax>LuaHookMapToStorage  /chemin/vers/lua/script.lua hook_function_name</syntax>
1550 <contextlist><context>server config</context><context>virtual host</context>
1551 <context>directory</context><context>.htaccess</context>
1552 </contextlist>
1553 <override>All</override>
1554     <usage>
1555     <p>Identique &agrave; la directive
1556     <directive>LuaHookTranslateName</directive>, mais s'ex&eacute;cute &agrave; la
1557     phase map-to-storage du traitement de la requ&ecirc;te. Les modules comme
1558     mod_cache agissent pendant cette phase, ce qui permet de pr&eacute;senter
1559     un exemple int&eacute;ressant de ce que l'on peut faire ici :</p>
1560     <highlight language="config">
1561     LuaHookMapToStorage /path/to/lua/script.lua check_cache
1562     </highlight>
1563     <highlight language="lua">
1564 require"apache2"
1565 cached_files = {}
1566
1567 function read_file(filename)
1568     local input = io.open(filename, "r")
1569     if input then
1570         local data = input:read("*a")
1571         cached_files[filename] = data
1572         file = cached_files[filename]
1573         input:close()
1574     end
1575     return cached_files[filename]
1576 end
1577
1578 function check_cache(r)
1579     if r.filename:match("%.png$") then -- Only match PNG files
1580         local file = cached_files[r.filename] -- Check cache entries
1581         if not file then
1582             file = read_file(r.filename)  -- Read file into cache
1583         end
1584         if file then -- If file exists, write it out
1585             r.status = 200
1586             r:write(file)
1587             r:info(("Sent %s to client from cache"):format(r.filename))
1588             return apache2.DONE -- skip default handler for PNG files
1589         end
1590     end
1591     return apache2.DECLINED -- If we had nothing to do, let others serve this.
1592 end
1593     </highlight>
1594
1595     </usage>
1596 </directivesynopsis>
1597
1598 <directivesynopsis>
1599 <name>LuaHookCheckUserID</name>
1600 <description>Fournit un point d'entr&eacute;e pour la phase check_user_id du
1601 traitement de la requ&ecirc;te</description>
1602 <syntax>LuaHookCheckUserID  /chemin/vers/lua/script.lua hook_function_name [early|late]</syntax>
1603 <contextlist><context>server config</context><context>virtual host</context>
1604 <context>directory</context><context>.htaccess</context>
1605 </contextlist>
1606 <override>All</override>
1607 <compatibility>Le troisi&egrave;me argument optionnel est disponible depuis la
1608 version 2.3.15 du serveur HTTP Apache.</compatibility>
1609 <usage><p>...</p>
1610    <note><title>Ordonnancement</title><p>Les arguments optionnels
1611    "early" ou "late" permettent de contr&ocirc;ler le moment auquel ce script
1612    s'ex&eacute;cute par rapport aux autres modules.</p></note>
1613 </usage>
1614 </directivesynopsis>
1615
1616 <directivesynopsis>
1617 <name>LuaHookTypeChecker</name>
1618 <description>Fournit un point d'entr&eacute;e pour la phase type_checker du
1619 traitement de la requ&ecirc;te</description>
1620 <syntax>LuaHookTypeChecker  /chemin/vers/lua/script.lua hook_function_name</syntax>
1621 <contextlist><context>server config</context><context>virtual host</context>
1622 <context>directory</context><context>.htaccess</context>
1623 </contextlist>
1624 <override>All</override>
1625     <usage><p>...</p></usage>
1626 </directivesynopsis>
1627
1628 <directivesynopsis>
1629 <name>LuaHookAuthChecker</name>
1630 <description>Fournit un point d'entr&eacute;e pour la phase auth_checker du
1631 traitement de la requ&ecirc;te</description>
1632 <syntax>LuaHookAuthChecker  /chemin/vers/lua/script.lua hook_function_name [early|late]</syntax>
1633 <contextlist><context>server config</context><context>virtual host</context>
1634 <context>directory</context><context>.htaccess</context>
1635 </contextlist>
1636 <override>All</override>
1637 <compatibility>Le troisi&egrave;me argument optionnel est disponible depuis la
1638 version 2.3.15 du serveur HTTP Apache.</compatibility>
1639     <usage>
1640 <p>Invoque une fonction lua au cours de la phase auth_checker du
1641 traitement de la requ&ecirc;te. Cette directive peut s'utiliser pour
1642 impl&eacute;menter une v&eacute;rification arbitraire de l'authentification et de
1643 l'autorisation. Voici un exemple tr&egrave;s simple :
1644 </p>
1645 <highlight language="lua">
1646 require 'apache2'
1647
1648 -- fonction d'accroche authcheck fictive
1649 -- Si la requ&ecirc;te ne contient aucune donn&eacute;e d'authentification, l'en-t&ecirc;te
1650 -- de la r&eacute;ponse est d&eacute;fini et un code 401 est renvoy&eacute; afin de demander au
1651 -- navigateur d'effectuer une authentification basique. Si la requ&ecirc;te
1652 -- comporte des donn&eacute;es d'authentification, elles ne sont pas vraiment
1653 -- consult&eacute;es, mais on admet la prise en compte de l'utilisateur 'foo' et
1654 -- on la valide. On v&eacute;rifie ensuite si l'utilisateur est bien 'foo' et on
1655 -- accepte la requ&ecirc;te.
1656 function authcheck_hook(r)
1657
1658    -- recherche des informations d'authentification
1659    auth = r.headers_in['Authorization']
1660    if auth ~= nil then
1661      -- d&eacute;finition d'un utilisateur par d&eacute;faut
1662      r.user = 'foo'
1663    end
1664
1665    if r.user == nil then
1666       r:debug("authcheck: user is nil, returning 401")
1667       r.err_headers_out['WWW-Authenticate'] = 'Basic realm="WallyWorld"'
1668       return 401
1669    elseif r.user == "foo" then
1670       r:debug('user foo: OK')
1671    else
1672       r:debug("authcheck: user='" .. r.user .. "'")
1673       r.err_headers_out['WWW-Authenticate'] = 'Basic realm="WallyWorld"'
1674       return 401
1675    end
1676    return apache2.OK
1677 end
1678 </highlight>
1679 <note><title>Ordonnancement</title><p>Les arguments optionnels
1680    "early" ou "late" permettent de contr&ocirc;ler le moment auquel ce script
1681    s'ex&eacute;cute par rapport aux autres modules.</p></note>
1682 </usage>
1683 </directivesynopsis>
1684
1685 <directivesynopsis>
1686 <name>LuaHookAccessChecker</name>
1687 <description>Fournit un point d'entr&eacute;e pour la phase access_checker du
1688 traitement de la requ&ecirc;te</description>
1689 <syntax>LuaHookAccessChecker  /chemin/vers/lua/script.lua  hook_function_name [early|late]</syntax>
1690 <contextlist><context>server config</context><context>virtual host</context>
1691 <context>directory</context><context>.htaccess</context>
1692 </contextlist>
1693 <override>All</override>
1694 <compatibility>Le troisi&egrave;me argument optionnel est disponible depuis la
1695 version 2.3.15 du serveur HTTP Apache.</compatibility>
1696
1697 <usage>
1698 <p>Ajoute votre fonction d'accroche &agrave; la phase access_checker. Une
1699 fonction d'accroche access checker renvoie en g&eacute;n&eacute;ral OK, DECLINED, ou
1700 HTTP_FORBIDDEN.</p>
1701 <note><title>Ordonnancement</title><p>Les arguments optionnels
1702    "early" ou "late" permettent de contr&ocirc;ler le moment auquel ce script
1703    s'ex&eacute;cute par rapport aux autres modules.</p></note>
1704 </usage>
1705 </directivesynopsis>
1706 <directivesynopsis>
1707 <name>LuaHookInsertFilter</name>
1708 <description>Fournit un point d'entr&eacute;e pour la phase insert_filter du
1709 traitement de la requ&ecirc;te</description>
1710 <syntax>LuaHookInsertFilter  /chemin/vers/lua/script.lua hook_function_name</syntax>
1711 <contextlist><context>server config</context><context>virtual host</context>
1712 <context>directory</context><context>.htaccess</context>
1713 </contextlist>
1714 <override>All</override>
1715     <usage><p>Non encore impl&eacute;ment&eacute;</p></usage>
1716 </directivesynopsis>
1717
1718 <directivesynopsis>
1719 <name>LuaInherit</name>
1720 <description>Contr&ocirc;le la mani&egrave;re dont les sections de configuration
1721 parentes sont fusionn&eacute;es dans les enfants</description>
1722 <syntax>LuaInherit none|parent-first|parent-last</syntax>
1723 <default>LuaInherit parent-first</default>
1724 <contextlist><context>server config</context><context>virtual host</context>
1725 <context>directory</context><context>.htaccess</context>
1726 </contextlist>
1727 <override>All</override>
1728 <compatibility>Versions 2.4.0 et sup&eacute;rieures</compatibility>
1729     <usage><p>Par d&eacute;faut, si des directives LuaHook* se trouvent dans
1730     des sections de configuration Directory ou Location qui se
1731     chevauchent, les scripts
1732     d&eacute;finis dans les sections les plus sp&eacute;cifiques s'ex&eacute;cutent
1733     <em>apr&egrave;s</em> ceux d&eacute;finis dans les sections plus g&eacute;n&eacute;riques
1734     (LuaInherit parent-first). Vous pouvez inverser cet ordre, ou faire
1735     en sorte que le contexte parent ne s'applique pas du tout.</p>
1736
1737     <p>Jusqu'aux versions 2.3.x, le comportement par d&eacute;faut consistait &agrave;
1738     ignorer les directives LuaHook* situ&eacute;es dans les sections de
1739     configuration parentes.</p></usage>
1740 </directivesynopsis>
1741
1742 <directivesynopsis>
1743 <name>LuaQuickHandler</name>
1744 <description>Fournit un point d'entr&eacute;e pour la gestion rapide du
1745 traitement de la requ&ecirc;te</description>
1746 <syntax>LuaQuickHandler /path/to/script.lua hook_function_name</syntax>
1747 <contextlist><context>server config</context><context>virtual host</context>
1748 <context>directory</context><context>.htaccess</context>
1749 </contextlist>
1750 <override>All</override>
1751 <usage>
1752     <p>Cette phase s'ex&eacute;cute juste apr&egrave;s l'attribution de la requ&ecirc;te &agrave;
1753     un serveur virtuel, et permet d'effectuer certains traitements avant
1754     le d&eacute;roulement des autres phases, ou de servir une requ&ecirc;te sans
1755     avoir &agrave; la traduire, l'associer &agrave; un espace de stockage, etc...
1756     Comme cette phase s'ex&eacute;cute avant toute autre, les directives telles
1757     que <directive type="section" module="core">Location</directive> ou
1758     <directive type="section" module="core">Directory</directive> ne
1759     sont pas encore prises en compte, car Les URI n'ont pas encore &eacute;t&eacute;
1760     enti&egrave;rement interpr&eacute;t&eacute;s.
1761     </p>
1762    <note><title>Contexte</title><p>Cette directive ne peut &ecirc;tre
1763    utilis&eacute;e ni &agrave; l'int&eacute;rieur d'une section <directive type="section"
1764    module="core">Directory</directive> ou <directive type="section"
1765    module="core">Files</directive>, ni dans un fichier htaccess.</p></note>
1766 </usage>
1767 </directivesynopsis>
1768
1769 <directivesynopsis>
1770 <name>LuaAuthzProvider</name>
1771 <description>Branche une fonction fournisseur d'autorisation dans <module>mod_authz_core</module>
1772 </description>
1773 <syntax>LuaAuthzProvider provider_name /path/to/lua/script.lua function_name</syntax>
1774 <contextlist><context>server config</context> </contextlist>
1775 <compatibility>Disponible depuis la version 2.4.3 du serveur HTTP Apache</compatibility>
1776
1777 <usage>
1778 <p>Lorsqu'une fonction lua a &eacute;t&eacute; enregistr&eacute;e en tant que fournisseur
1779 d'autorisation, elle peut &ecirc;tre appel&eacute;e via la directive <directive
1780 module="mod_authz_core">Require</directive> :</p>
1781
1782
1783 <highlight language="config">
1784 LuaRoot /usr/local/apache2/lua
1785 LuaAuthzProvider foo authz.lua authz_check_foo
1786 &lt;Location /&gt;
1787   Require foo johndoe
1788 &lt;/Location&gt;
1789 </highlight>
1790 <highlight language="lua">
1791 require "apache2"
1792 function authz_check_foo(r, who)
1793     if r.user ~= who then return apache2.AUTHZ_DENIED
1794     return apache2.AUTHZ_GRANTED
1795 end
1796 </highlight>
1797
1798 </usage>
1799 </directivesynopsis>
1800
1801
1802 </modulesynopsis>
1803