]> granicus.if.org Git - apache/blob - docs/manual/mod/mod_lua.xml.fr
rebuild
[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: 1522030:1523433 (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><directive module="mod_lua">LuaHookLog</directive></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. Mod_lua peut
296         s'intercaler au d&eacute;part de ce processus et ainsi contr&ocirc;ler la
297         journalisation.</td>
298     </tr>
299
300 </table>
301
302 <p>Les fonctions d'accroche re&ccedil;oivent l'objet de la requ&ecirc;te comme seul
303 argument (sauf LuaAuthzProvider qui re&ccedil;oit aussi des arguments en
304 provenance de la directive Require). Elles peuvent renvoyer une valeur,
305 selon la fonction, mais il s'agit en g&eacute;n&eacute;ral d'un
306 code d'&eacute;tat HTTP ou des valeurs OK, DONE, ou DECLINED,
307 que vous pouvez &eacute;crire dans Lua sous la forme <code>apache2.OK</code>,
308 <code>apache2.DONE</code>, ou <code>apache2.DECLINED</code>.</p>
309
310
311 <highlight language="lua">
312 <strong>translate_name.lua</strong><br/>
313 -- exemple d'accroche qui r&eacute;&eacute;crit un URI en chemin du syst&egrave;me de
314 fichiers.
315
316 require 'apache2'
317
318 function translate_name(r)
319     if r.uri == "/translate-name" then
320         r.filename = r.document_root .. "/find_me.txt"
321         return apache2.OK
322     end
323     -- on ne g&egrave;re pas cette URL et on donne sa chance &agrave; un autre module
324     return apache2.DECLINED
325 end
326 </highlight>
327
328
329 <highlight language="lua">
330 <strong>translate_name2.lua</strong><br/>
331 --[[ exemple d'accroche qui r&eacute;&eacute;crit un URI vers un autre URI. Il renvoie
332         un apache2.DECLINED pour permettre &agrave; un autre interpr&eacute;teur d'URL de
333         travailler sur la substitution, y compris l'accroche translate_name
334         de base dont les tables de correspondances se basent sur DocumentRoot.
335
336      Note: utilisez le drapeau early/late de la directive pour
337      l'ex&eacute;cuter avant ou apr&egrave;s mod_alias.
338 --]]
339
340 require 'apache2'
341
342 function translate_name(r)
343     if r.uri == "/translate-name" then
344         r.uri = "/find_me.txt"
345         return apache2.DECLINED
346     end
347     return apache2.DECLINED
348 end
349 </highlight>
350 </section>
351
352 <section id="datastructures"><title>Structures de donn&eacute;es</title>
353
354 <dl>
355 <dt>request_rec</dt>
356         <dd>
357         <p>request_rec est consid&eacute;r&eacute;e en tant que donn&eacute;e utilisateur.
358         Elle poss&egrave;de une m&eacute;tatable qui vous permet d'accomplir des
359         choses int&eacute;ressantes. Pour la plus grande partie, elle poss&egrave;de
360         les m&ecirc;mes champs que la structure request_rec, la
361         plupart d'entre eux &eacute;tant accessibles en lecture et &eacute;criture (le
362         contenu des champs de la table peut &ecirc;tre modifi&eacute;, mais les
363         champs eux-m&ecirc;mes ne peuvent pas &ecirc;tre &eacute;tablis en tant que tables
364         distinctes).</p>
365
366         <table border="1" style="zebra">
367
368         <tr>
369           <th><strong>Nom</strong></th>
370           <th><strong>Type Lua</strong></th>
371           <th><strong>Modifiable</strong></th>
372           <th><strong>Description</strong></th>
373         </tr>
374         <tr>
375           <td><code>allowoverrides</code></td>
376           <td>string</td>
377           <td>non</td>
378           <td>L'option AllowOverride s'applique &agrave; la requ&ecirc;te courante.</td>
379         </tr>
380         <tr>
381           <td><code>ap_auth_type</code></td>
382           <td>string</td>
383           <td>non</td>
384           <td>Ce champ contient le type d'authentification effectu&eacute;e
385           (par exemple <code>basic</code>)</td>
386         </tr>
387         <tr>
388           <td><code>args</code></td>
389           <td>string</td>
390           <td>oui</td>
391           <td>La cha&icirc;ne de param&egrave;tres de la requ&ecirc;te (par exemple
392           <code>foo=bar&amp;name=johnsmith</code>)</td>
393         </tr>
394         <tr>
395           <td><code>assbackwards</code></td>
396           <td>boolean</td>
397           <td>non</td>
398           <td>contient true s'il s'agit d'une requ&ecirc;te de style HTTP/0.9
399           (par exemple <code>GET /foo</code> (sans champs d'en-t&ecirc;te) )</td>
400         </tr>
401         <tr>
402           <td><code>auth_name</code></td>
403           <td>string</td>
404           <td>non</td>
405           <td>La cha&icirc;ne d'identification utilis&eacute;e pour la v&eacute;rification
406           de l'autorisation d'acc&egrave;s (si elle est disponible).</td>
407         </tr>
408         <tr>
409           <td><code>banner</code></td>
410           <td>string</td>
411           <td>non</td>
412           <td>La banni&egrave;re du serveur, par exemple <code>Apache HTTP
413           Server/2.4.3 openssl/0.9.8c</code></td>
414         </tr>
415         <tr>
416           <td><code>basic_auth_pw</code></td>
417           <td>string</td>
418           <td>non</td>
419           <td>Le mot de passe pour l'authentification de base envoy&eacute;
420           avec la requ&ecirc;te, s'il existe</td>
421         </tr>
422         <tr>
423           <td><code>canonical_filename</code></td>
424           <td>string</td>
425           <td>non</td>
426           <td>Le nom de fichier canonique de la requ&ecirc;te</td>
427         </tr>
428         <tr>
429           <td><code>content_encoding</code></td>
430           <td>string</td>
431           <td>non</td>
432           <td>Le type de codage du contenu de la requ&ecirc;te courante</td>
433         </tr>
434         <tr>
435           <td><code>content_type</code></td>
436           <td>string</td>
437           <td>oui</td>
438           <td>Le type de contenu de la requ&ecirc;te courante, tel qu'il a &eacute;t&eacute;
439           d&eacute;termin&eacute; au cours de la phase type_check (par exemple
440           <code>image/gif</code> ou <code>text/html</code>)</td>
441         </tr>
442
443         <tr>
444           <td><code>context_prefix</code></td>
445           <td>string</td>
446           <td>non</td>
447           <td></td>
448         </tr>
449         <tr>
450           <td><code>context_document_root</code></td>
451           <td>string</td>
452           <td>non</td>
453           <td></td>
454         </tr>
455
456         <tr>
457           <td><code>document_root</code></td>
458           <td>string</td>
459           <td>non</td>
460           <td>La racine des documents du serveur</td>
461         </tr>
462         <tr>
463           <td><code>err_headers_out</code></td>
464           <td>table</td>
465           <td>non</td>
466           <td>L'en-t&ecirc;te MIME de l'environnement pour la r&eacute;ponse, &eacute;crit
467           m&ecirc;me en cas d'erreur et conserv&eacute; pendant les redirections
468           internes</td>
469         </tr>
470         <tr>
471           <td><code>filename</code></td>
472           <td>string</td>
473           <td>oui</td>
474           <td>Le nom de fichier correspondant &agrave; la requ&ecirc;te, par exemple
475           /www/example.com/foo.txt. Il peut &ecirc;tre modifi&eacute; au cours des
476           phases translate-name ou map-to-storage du traitement de la
477           requ&ecirc;te pour permettre au gestionnaire par d&eacute;faut (ou aux
478           gestionnaires de script) de servir une version du fichier
479           autre que celle demand&eacute;e.</td>
480         </tr>
481         <tr>
482           <td><code>handler</code></td>
483           <td>string</td>
484           <td>oui</td>
485           <td>Le nom du <a href="../handler.html">gestionnaire</a> qui
486           doit traiter la requ&ecirc;te, par exemple <code>lua-script</code>
487           si elle doit &ecirc;tre trait&eacute;e par mod_lua. Cette valeur est en
488           g&eacute;n&eacute;ral d&eacute;finie via les directives <directive
489           module="mod_mime">AddHandler</directive> ou <directive
490           module="core">SetHandler</directive>, mais peut aussi l'&ecirc;tre
491           via mod_lua pour permettre &agrave; un autre gestionnaire de traiter
492           une requ&ecirc;te sp&eacute;cifique qui ne serait pas trait&eacute;e par d&eacute;faut
493           par ce dernier.
494             </td>
495         </tr>
496         <tr>
497           <td><code>headers_in</code></td>
498           <td>table</td>
499           <td>oui</td>
500           <td>Les en-t&ecirc;tes MIME de l'environnement de la requ&ecirc;te. Il
501           s'agit des en-t&ecirc;tes comme <code>Host, User-Agent,
502           Referer</code>, etc...</td>
503         </tr>
504         <tr>
505           <td><code>headers_out</code></td>
506           <td>table</td>
507           <td>oui</td>
508           <td>Les en-t&ecirc;tes MIME de l'environnement de la r&eacute;ponse.</td>
509         </tr>
510         <tr>
511           <td><code>hostname</code></td>
512           <td>string</td>
513           <td>non</td>
514           <td>Le nom d'h&ocirc;te, tel que d&eacute;fini par l'en-t&ecirc;te
515           <code>Host:</code> ou par un URI complet.</td>
516         </tr>
517         <tr>
518           <td><code>is_https</code></td>
519           <td>boolean</td>
520           <td>non</td>
521           <td>Indique si la requ&ecirc;te &agrave; &eacute;t&eacute; faite via HTTPS</td>
522         </tr>
523         <tr>
524           <td><code>is_initial_req</code></td>
525           <td>boolean</td>
526           <td>non</td>
527           <td>Indique si la requ&ecirc;te courante est la requ&ecirc;te initiale ou
528           une sous-requ&ecirc;te.</td>
529         </tr>
530         <tr>
531           <td><code>limit_req_body</code></td>
532           <td>number</td>
533           <td>non</td>
534           <td>La taille maximale du corps de la requ&ecirc;te, ou 0 si aucune
535           limite.</td>
536         </tr>
537         <tr>
538         <td><code>log_id</code></td>
539           <td>string</td>
540           <td>non</td>
541           <td>L'identifiant de la requ&ecirc;te dans les journaux d'acc&egrave;s ou
542           d'erreur.</td>
543         </tr>
544         <tr>
545           <td><code>method</code></td>
546           <td>string</td>
547           <td>non</td>
548           <td>La m&eacute;thode de la requ&ecirc;te, par exemple <code>GET</code> ou
549           <code>POST</code>.</td>
550         </tr>
551         <tr>
552           <td><code>notes</code></td>
553           <td>table</td>
554           <td>oui</td>
555           <td>Une liste de notes qui peuvent &ecirc;tre transmises d'un module
556           &agrave; l'autre.</td>
557         </tr>
558         <tr>
559           <td><code>options</code></td>
560           <td>string</td>
561           <td>non</td>
562           <td>La valeur de la directive Options pour la requ&ecirc;te
563           courante.</td>
564         </tr>
565         <tr>
566           <td><code>path_info</code></td>
567           <td>string</td>
568           <td>non</td>
569           <td>La valeur de PATH_INFO extraite de la requ&ecirc;te.</td>
570         </tr>
571         <tr>
572           <td><code>port</code></td>
573           <td>number</td>
574           <td>non</td>
575           <td>Le port du serveur utilis&eacute; par la requ&ecirc;te.</td>
576         </tr>
577         <tr>
578           <td><code>protocol</code></td>
579           <td>string</td>
580           <td>non</td>
581           <td>Le protocole utilis&eacute;, par exemple <code>HTTP/1.1</code></td>
582         </tr>
583         <tr>
584           <td><code>proxyreq</code></td>
585           <td>string</td>
586           <td>oui</td>
587           <td>Indique s'il s'agit d'une requ&ecirc;te mandat&eacute;e ou non. Cette
588           valeur est en g&eacute;n&eacute;ral d&eacute;finie au cours de la phase
589           post_read_request/translate_name du traitement de la requ&ecirc;te.</td>
590         </tr>
591         <tr>
592           <td><code>range</code></td>
593           <td>string</td>
594           <td>non</td>
595           <td>Le contenu de l'en-t&ecirc;te <code>Range:</code>.</td>
596         </tr>
597         <tr>
598           <td><code>remaining</code></td>
599           <td>number</td>
600           <td>non</td>
601           <td>Le nombre d'octets du corps de la requ&ecirc;te restant &agrave; lire.</td>
602         </tr>
603         <tr>
604           <td><code>server_built</code></td>
605           <td>string</td>
606           <td>non</td>
607           <td>La date de compilation du serveur.</td>
608         </tr>
609         <tr>
610           <td><code>server_name</code></td>
611           <td>string</td>
612           <td>non</td>
613           <td>Le nom du serveur pour cette requ&ecirc;te.</td>
614         </tr>
615         <tr>
616           <td><code>some_auth_required</code></td>
617           <td>boolean</td>
618           <td>non</td>
619           <td>Indique si une autorisation est/&eacute;tait requise pour cette
620           requ&ecirc;te.</td>
621         </tr>
622         <tr>
623           <td><code>subprocess_env</code></td>
624           <td>table</td>
625           <td>oui</td>
626           <td>Le jeu de variables d'environnement pour cette requ&ecirc;te.</td>
627         </tr>
628         <tr>
629           <td><code>started</code></td>
630           <td>number</td>
631           <td>non</td>
632           <td>Le moment o&ugrave; le serveur a &eacute;t&eacute; (re)d&eacute;marr&eacute;, en secondes
633           depuis epoch (1er janvier 1970)</td>
634         </tr>
635         <tr>
636           <td><code>status</code></td>
637           <td>number</td>
638           <td>oui</td>
639           <td>Le code de retour (courant) pour cette requ&ecirc;te, par
640           exemple <code>200</code> ou <code>404</code>.</td>
641         </tr>
642         <tr>
643           <td><code>the_request</code></td>
644           <td>string</td>
645           <td>non</td>
646           <td>La cha&icirc;ne de la requ&ecirc;te telle qu'elle a &eacute;t&eacute; envoy&eacute;e par le
647           client, par exemple <code>GET /foo/bar HTTP/1.1</code>.</td>
648         </tr>
649         <tr>
650           <td><code>unparsed_uri</code></td>
651           <td>string</td>
652           <td>non</td>
653           <td>La partie URI non interpr&eacute;t&eacute;e de la requ&ecirc;te</td>
654         </tr>
655         <tr>
656           <td><code>uri</code></td>
657           <td>string</td>
658           <td>oui</td>
659           <td>L'URI apr&egrave;s interpr&eacute;tation par httpd</td>
660         </tr>
661         <tr>
662           <td><code>user</code></td>
663           <td>string</td>
664           <td>oui</td>
665           <td>Si une authentification a &eacute;t&eacute; effectu&eacute;e, nom de
666           l'utilisateur authentifi&eacute;.</td>
667         </tr>
668         <tr>
669           <td><code>useragent_ip</code></td>
670           <td>string</td>
671           <td>non</td>
672           <td>L'adresse IP de l'agent qui a envoy&eacute; la requ&ecirc;te</td>
673         </tr>
674         </table>
675         </dd>
676     </dl>
677 </section>
678 <section id="functions"><title>M&eacute;thodes de l'objet request_rec</title>
679
680 <p>L'objet request_rec poss&egrave;de (au minimum) les m&eacute;thodes suivantes :</p>
681
682 <highlight language="lua">
683 r:flush()   -- vide le tampon de sortie
684             -- Renvoie true si le vidage a &eacute;t&eacute; effectu&eacute; avec succ&egrave;s,
685             false dans le cas contraire.
686
687 while nous_avons_des_donn&eacute;es_&agrave;_envoyer do
688     r:puts("Bla bla bla\n") -- envoi des donn&eacute;es &agrave; envoyer vers le tampon
689     r:flush() -- vidage du tampon (envoi au client)
690     r.usleep(500000) -- mise en attente pendant 0.5 secondes et bouclage
691 end
692 </highlight>
693
694 <highlight language="lua">
695 r:addoutputfilter(name|function) -- ajoute un filtre en sortie
696
697 r:addoutputfilter("fooFilter") -- ins&egrave;re le filtre fooFilter dans le flux de sortie
698 </highlight>
699
700 <highlight language="lua">
701 r:sendfile(filename) -- envoie un fichier entier au client en
702 utilisant sendfile s'il est support&eacute; par la plateforme :
703
704 if use_sendfile_thing then
705     r:sendfile("/var/www/large_file.img")
706 end
707 </highlight>
708
709 <highlight language="lua">
710 r:parseargs() -- renvoie deux tables : une table standard de couples
711 cl&eacute;/valeur pour les donn&eacute;es GET simples, et une autre pour les donn&eacute;es
712 multivalu&eacute;es (par exemple foo=1&amp;foo=2&amp;foo=3) :
713
714 local GET, GETMULTI = r:parseargs()
715 r:puts("Votre nom est : " .. GET['name'] or "Unknown")
716 </highlight>
717
718
719 <highlight language="lua">
720 r:parsebody()([sizeLimit]) -- interpr&egrave;te le corps de la requ&ecirc;te
721 en tant que POST et renvoie deux tables lua, comme r:parseargs(). Un nombre optionnel
722 peut &ecirc;tre fourni pour sp&eacute;cifier le nombre maximal d'octets &agrave;
723 interpr&eacute;ter. La valeur par d&eacute;faut est 8192.
724
725 local POST, POSTMULTI = r:parsebody(1024*1024)
726 r:puts("Votre nom est : " .. POST['name'] or "Unknown")
727 </highlight>
728
729
730 <highlight language="lua">
731 r:puts("bonjour", " le monde", "!") -- affichage dans le corps de la r&eacute;ponse
732 </highlight>
733
734 <highlight language="lua">
735 r:write("une simple cha&icirc;ne") -- affichage dans le
736 corps de la r&eacute;ponse
737 </highlight>
738
739 <highlight language="lua">
740 r:escape_html("&lt;html&gt;test&lt;/html&gt;") -- Echappe le
741 code HTML et renvoie le r&eacute;sultat
742 </highlight>
743
744 <highlight language="lua">
745 r:base64_encode(string) -- Encode une cha&icirc;ne &agrave; l'aide du
746 standard de codage Base64.
747
748 local encoded = r:base64_encode("This is a test") -- returns VGhpcyBpcyBhIHRlc3Q=
749 </highlight>
750
751 <highlight language="lua">
752 r:base64_decode(string) -- D&eacute;code une cha&icirc;ne cod&eacute;e en Base64.
753
754 local decoded = r:base64_decode("VGhpcyBpcyBhIHRlc3Q=") -- returns 'This is a test'
755 </highlight>
756
757 <highlight language="lua">
758 r:md5(string) -- Calcule et renvoie le condens&eacute; MD5 d'une cha&icirc;ne
759 en mode binaire (binary safe).
760
761 local hash = r:md5("This is a test") -- returns ce114e4501d2f4e2dcea3e17b546f339
762 </highlight>
763
764 <highlight language="lua">
765 r:sha1(string) -- Calcule et renvoie le condens&eacute; SHA1 d'une cha&icirc;ne
766 en mode binaire (binary safe).
767
768 local hash = r:sha1("This is a test") -- returns a54d88e06612d820bc3be72877c74f257b561b19
769 </highlight>
770
771 <highlight language="lua">
772 r:escape(string) -- Echappe une cha&icirc;ne de type URL.
773
774 local url = "http://foo.bar/1 2 3 &amp; 4 + 5"
775 local escaped = r:escape(url) -- renvoie 'http%3a%2f%2ffoo.bar%2f1+2+3+%26+4+%2b+5'
776 </highlight>
777
778 <highlight language="lua">
779 r:unescape(string) -- D&eacute;s&eacute;chappe une cha&icirc;ne de type URL.
780
781 local url = "http%3a%2f%2ffoo.bar%2f1+2+3+%26+4+%2b+5"
782 local unescaped = r:unescape(url) -- renvoie 'http://foo.bar/1 2 3 &amp; 4 + 5'
783 </highlight>
784
785 <highlight language="lua">
786 r:construct_url(string) -- Construit une URL &agrave; partir d'un URI
787
788 local url = r:construct_url(r.uri)
789 </highlight>
790
791 <highlight language="lua">
792 r.mpm_query(number) -- Interroge le serveur &agrave; propos de son
793 module MPM via la requ&ecirc;te ap_mpm_query.
794
795 local mpm = r.mpm_query(14)
796 if mpm == 1 then
797     r:puts("Ce serveur utilise le MPM Event")
798 end
799 </highlight>
800
801 <highlight language="lua">
802 r:expr(string) -- Evalue une cha&icirc;ne de type <a
803 href="../expr.html">expr</a>.
804
805 if r:expr("%{HTTP_HOST} =~ /^www/") then
806     r:puts("Ce nom d'h&ocirc;te commence par www")
807 end
808 </highlight>
809
810 <highlight language="lua">
811 r:scoreboard_process(a) -- Interroge le serveur &agrave; propos du
812 processus &agrave; la position <code>a</code>.
813
814 local process = r:scoreboard_process(1)
815 r:puts("Le serveur 1 a comme PID " .. process.pid)
816 </highlight>
817
818 <highlight language="lua">
819 r:scoreboard_worker(a, b) -- Interroge le serveur &agrave; propos du
820 thread <code>b</code>, dans le processus <code>a</code>.
821
822 local thread = r:scoreboard_worker(1, 1)
823 r:puts("L'ID du thread 1 du serveur 1 est " .. thread.tid .. " et son
824 &eacute;tat est " .. thread.status)
825 </highlight>
826
827 <highlight language="lua">
828 r:clock() -- Renvoie l'heure courante avec une pr&eacute;cision d'une
829 microseconde.
830 </highlight>
831
832 <highlight language="lua">
833 r:requestbody(filename) -- Lit et renvoie le corps d'une requ&ecirc;te. Si
834 'filename' est sp&eacute;cifi&eacute;, le corps de requ&ecirc;te n'est pas renvoy&eacute;, mais
835 sauvegard&eacute; dans le fichier correspondant.
836
837 local input = r:requestbody()
838 r:puts("Vous m'avez envoy&eacute; le corps de requ&ecirc;te suivant :\n")
839 r:puts(input)
840 </highlight>
841
842 <highlight language="lua">
843 r:add_input_filter(filter_name) -- Ajoute le filtre en entr&eacute;e
844 'filter_name'.
845 </highlight>
846
847 <highlight language="lua">
848 r:module_info(module_name) -- Interroge le serveur &agrave; propos d'un
849 module.
850
851 local mod = r.module_info("mod_lua.c")
852 if mod then
853     for k, v in pairs(mod.commands) do
854        r:puts( ("%s: %s\n"):format(k,v)) -- affiche toutes les directives impl&eacute;ment&eacute;es par ce module
855     end
856 end
857 </highlight>
858
859 <highlight language="lua">
860 r:loaded_modules() -- Renvoie une liste des modules charg&eacute;s par
861 httpd.
862
863 for k, module in pairs(r:loaded_modules()) do
864     r:puts("J'ai charg&eacute; le module " .. module .. "\n")
865 end
866 </highlight>
867
868 <highlight language="lua">
869 r:runtime_dir_relative(filename) -- G&eacute;n&egrave;re le nom d'un fichier run-time
870 (par exemple la m&eacute;moire partag&eacute;e "file") relativement au r&eacute;pertoire de
871 run-time. 
872 </highlight>
873
874 <highlight language="lua">
875 r:server_info() -- Renvoie une table contenant des informations
876 &agrave; propos du serveur, comme le nom de l'ex&eacute;cutable httpd, le
877 module mpm utilis&eacute;, etc...
878 </highlight>
879
880 <highlight language="lua">
881 r:set_document_root(file_path) -- D&eacute;finit la racine des
882 documents pour la requ&ecirc;te &agrave; file_path.
883 </highlight>
884
885 <highlight language="lua">
886 r:add_version_component(component_string) -- Ajoute un &eacute;l&eacute;ment &agrave;
887 la banni&egrave;re du serveur.
888 </highlight>
889
890 <highlight language="lua">
891 r:set_context_info(prefix, docroot) -- D&eacute;finit le pr&eacute;fixe et la
892 racine des documents du contexte pour une requ&ecirc;te.
893 </highlight>
894
895 <highlight language="lua">
896 r:os_escape_path(file_path) -- Convertit un chemin du syst&egrave;me de
897 fichiers en URL ind&eacute;pendamment du syst&egrave;me d'exploitation.
898 </highlight>
899
900 <highlight language="lua">
901 r:escape_logitem(string) -- Echappe une cha&icirc;ne pour
902 journalisation.
903 </highlight>
904
905 <highlight language="lua">
906 r.strcmp_match(string, pattern) -- V&eacute;rifie si 'string' correspond &agrave;
907 'pattern' via la fonction strcmp_match (GLOBs). Par exemple, est-ce que
908 'www.example.com' correspond &agrave; '*.example.com' ?
909
910 local match = r.strcmp_match("foobar.com", "foo*.com")
911 if match then 
912     r:puts("foobar.com matches foo*.com")
913 end
914 </highlight>
915
916 <highlight language="lua">
917 r:set_keepalive() -- D&eacute;finit l'&eacute;tat de persistance d'une
918 requ&ecirc;te. Renvoie true dans la mesure du possible, false dans le
919 cas contraire.
920 </highlight>
921
922 <highlight language="lua">
923 r:make_etag() -- G&eacute;n&egrave;re et renvoie le etag pour la requ&ecirc;te
924 courante.
925 </highlight>
926
927 <highlight language="lua">
928 r:send_interim_response(clear) -- Renvoie une r&eacute;ponse d'int&eacute;rim (1xx) au
929 client. Si 'clear' est vrai, les en-t&ecirc;tes disponibles seront envoy&eacute;s et
930 effac&eacute;s.
931 </highlight>
932
933 <highlight language="lua">
934 r:custom_response(status_code, string) -- G&eacute;n&egrave;re et d&eacute;finit une r&eacute;ponse
935 personnalis&eacute;e pour un code d'&eacute;tat particulier. Le fonctionnement est
936 tr&egrave;s proche de celui de la directive ErrorDocument.
937
938 r:custom_response(404, "Baleted!")
939 </highlight>
940
941 <highlight language="lua">
942 r.exists_config_define(string) -- V&eacute;rifie si une d&eacute;finition de
943 configuration existe.
944
945 if r.exists_config_define("FOO") then
946     r:puts("httpd a probablement &eacute;t&eacute; lanc&eacute; avec l'option -DFOO, ou FOO a
947     &eacute;t&eacute; d&eacute;fini dans la configuration")
948 end
949 </highlight>
950
951 <highlight language="lua">
952 r:state_query(string) -- Interroge le serveur &agrave; propos de son
953 &eacute;tat.
954 </highlight>
955
956 <highlight language="lua">
957 r:stat(filename [,wanted]) -- Ex&eacute;cute stat() sur un fichier, et renvoie
958 une table contenant des informations &agrave; propos de ce fichier.
959
960 local info = r:stat("/var/www/foo.txt")
961 if info then
962     r:puts("Ce fichier existe et a &eacute;t&eacute; modifi&eacute; pour la derni&egrave;re fois &agrave; : " .. info.modified)
963 end
964 </highlight>
965
966 <highlight language="lua">
967 r:regex(string, pattern [,flags]) -- Ex&eacute;cute une recherche &agrave; base
968 d'expression rationnelle sur une cha&icirc;ne, et renvoie les
969 &eacute;ventuelles correspondances trouv&eacute;es.
970
971 local matches = r:regex("foo bar baz", [[foo (\w+) (\S*)]])
972 if matches then
973     r:puts("L'expression rationnelle correspond et le dernier mot
974     captur&eacute; ($2) est : " .. matches[2])
975 end
976
977 -- Exemple avec insensibilit&eacute; &agrave; la casse :
978 local matches = r:regex("FOO bar BAz", [[(foo) bar]], 1)
979
980 -- les drapeaux peuvent &ecirc;tre une combibaison bit &agrave; bit de :
981 -- 0x01: insensibilit&eacute; &agrave; la casse
982 -- 0x02: recherche multiligne
983 </highlight>
984
985 <highlight language="lua">
986 r.usleep(microsecondes) -- Interrompt l'ex&eacute;cution du script pendant le nombre de microsecondes sp&eacute;cifi&eacute;.
987 </highlight>
988
989 <highlight language="lua">
990 r:dbacquire(dbType[, dbParams]) -- Acquiert une connexion &agrave; une
991 base de donn&eacute;es et renvoie une classe database. Voir '<a
992 href="#databases">Connectivit&eacute; aux bases de donn&eacute;es</a>' pour plus de
993 d&eacute;tails.
994 </highlight>
995
996 <highlight language="lua">
997 r:ivm_set("key", value) -- D&eacute;fini une variable Inter-VM avec une valeur sp&eacute;cifique.
998                         -- Ces valeurs sont conserv&eacute;es m&ecirc;me si la VM est
999                         -- arr&ecirc;t&eacute;e ou non utilis&eacute;e, et ne doivent donc &ecirc;tre
1000                         -- utilis&eacute;es que si MaxConnectionsPerChild > 0.
1001                         -- Les valeurs peuvent &ecirc;tre de type number, string
1002                         -- ou boolean et sont stock&eacute;es s&eacute;par&eacute;ment pour
1003                         -- chaque processus (elles ne seront donc pas d'une
1004                         -- grande utilit&eacute; si l'on utilise le mpm prefork).
1005                         
1006 r:ivm_get("key")        -- Lit le contenu d'une variable d&eacute;finie via ivm_set. Renvoie
1007                         -- le contenu de la variable si elle existe, ou nil
1008                         -- dans le cas contraire.
1009                         
1010 -- Voici un exemple de lecture/&eacute;criture qui sauvegarde une variable
1011 -- globale en dehors de la VM :
1012 function handle(r)
1013     -- La premi&egrave;re VM qui effectue l'appel suivant n'obtiendra aucune
1014     -- valeur, et devra la cr&eacute;er
1015     local foo = r:ivm_get("cached_data")
1016     if not foo then
1017         foo = do_some_calcs() -- simulation de valeurs de retour
1018         r:ivm_set("cached_data", foo) -- d&eacute;finition globale de la variable
1019     end
1020     r:puts("La donn&eacute;e en cache est : ", foo)
1021 end                     
1022 </highlight>
1023 <highlight language="lua">
1024 r:htpassword(string [,algorithm [,cost]]) -- G&eacute;n&egrave;re un hash de mot de passe &agrave; partir d'une cha&icirc;ne.
1025                                           -- algorithm: 0 = APMD5 (d&eacute;faut), 1 = SHA, 2 = BCRYPT, 3 = CRYPT.
1026                                           -- cost: ne s'utilise qu'avec l'algorythme BCRYPT (d&eacute;faut = 5).
1027 </highlight>
1028
1029 <highlight language="lua">
1030 r:mkdir(dir [,mode]) -- Cr&eacute;e un r&eacute;pertoire et d&eacute;finit son mode via le param&egrave;tre optionnel mode.
1031 </highlight>
1032
1033 <highlight language="lua">
1034 r:mkrdir(dir [,mode]) -- Cr&eacute;e des r&eacute;pertoires de mani&egrave;re r&eacute;cursive et d&eacute;finit leur mode via le param&egrave;tre optionnel mode.
1035 </highlight>
1036
1037 <highlight language="lua">
1038 r:rmdir(dir) -- Supprime un r&eacute;pertoire.
1039 </highlight>
1040
1041 <highlight language="lua">
1042 r:touch(file [,mtime]) -- D&eacute;finit la date de modification d'un fichier &agrave; la date courante ou &agrave; la valeur optionnelle mtime en msec.
1043 </highlight>
1044
1045 <highlight language="lua">
1046 r:get_direntries(dir) -- Renvoie une table contenant toutes les entr&eacute;es de r&eacute;pertoires.
1047
1048 -- Renvoie un chemin sous forme &eacute;clat&eacute;e en chemin, fichier, extension
1049 function handle(r)
1050   local dir = r.context_document_root
1051   for _, f in ipairs(r:get_direntries(dir)) do
1052     local info = r:stat(dir .. "/" .. f)
1053     if info then
1054       local mtime = os.date(fmt, info.mtime / 1000000)
1055       local ftype = (info.filetype == 2) and "[dir] " or "[file]"
1056       r:puts( ("%s %s %10i %s\n"):format(ftype, mtime, info.size, f) )
1057     end
1058   end
1059 end
1060 </highlight>
1061
1062 <highlight language="lua">
1063 r.date_parse_rfc(string) -- Interpr&egrave;te une cha&icirc;ne date/heure et renvoie l'&eacute;quivalent en secondes depuis epoche.
1064 </highlight>
1065
1066 <highlight language="lua">
1067 r:getcookie(key) -- Obtient un cookie HTTP
1068 </highlight>
1069
1070 <highlight language="lua">
1071 r:setcookie(key, value, secure, expires) -- D&eacute;finit un cookie HTTP, par exemple :
1072 r:setcookie("foo", "bar and stuff", false, os.time() + 86400)
1073 </highlight>
1074
1075 <highlight language="lua">
1076 r:wsupgrade() -- Met &agrave; jour une connexion vers les WebSockets si possible (et si demand&eacute;) :
1077 if r:wsupgrade() then -- si la mise &agrave; jour est possible :
1078     r:wswrite("Bienvenue dans les websockets!") -- &eacute;crit quelque chose &agrave; l'intention du client
1079     r:wsclose()  -- Au revoir !
1080 end
1081 </highlight>
1082
1083 <highlight language="lua">
1084 r:wsread() -- Lit un cadre de websocket depuis une connexion vers websocket mise &agrave; jour (voir ci-dessus) :
1085            -- Actuellement, seul le protocole WS est support&eacute; (pas de support WSS en lecture)
1086 local line, isFinal = r:wsread() -- isFinal indique s'il s'agit du cadre final.
1087                                  -- dans le cas contraire, on peut lire les cadres suivants
1088 r:wswrite("Vous avez &eacute;crit : " .. line)
1089 </highlight>
1090
1091 <highlight language="lua">
1092 r:wswrite(line) -- &eacute;crit un cadre vers un client WebSocket :
1093 r:wswrite("Bonjour le Monde !")
1094 </highlight>
1095
1096 <highlight language="lua">
1097 r:wsclose() -- ferme une requ&ecirc;te WebSocket et l'ach&egrave;ve pour httpd :
1098
1099 if r:wsupgrade() then
1100     r:wswrite("Ecrire quelque chose : ")
1101     local line = r:wsread() or "nothing"
1102     r:wswrite("Vous avez &eacute;crit : " .. line);
1103     r:wswrite("Au revoir !")
1104     r:wsclose()
1105 end
1106 </highlight>
1107
1108 </section>
1109
1110 <section id="logging"><title>Fonctions de journalisation</title>
1111
1112 <highlight language="lua">
1113         -- exemples de messages de journalisation
1114         r:trace1("Ceci est un message de journalisation de niveau
1115         trace") -- les niveaux valides vont de trace1 &agrave; trace8 <br />
1116         r:debug("Ceci est un message de journalisation de niveau debug")<br />
1117         r:info("Ceci est un message de journalisation de niveau info")<br />
1118         r:notice("Ceci est un message de journalisation de niveau notice")<br />
1119         r:warn("Ceci est un message de journalisation de niveau warn")<br />
1120         r:err("Ceci est un message de journalisation de niveau err")<br />
1121         r:alert("Ceci est un message de journalisation de niveau alert")<br />
1122         r:crit("Ceci est un message de journalisation de niveau crit")<br />
1123         r:emerg("Ceci est un message de journalisation de niveau emerg")<br />
1124 </highlight>
1125
1126 </section>
1127
1128 <section id="apache2"><title>Paquet apache2</title>
1129 <p>Le paquet nomm&eacute; <code>apache2</code> est fourni avec (au minimum) le
1130 contenu suivant :</p>
1131 <dl>
1132   <dt>apache2.OK</dt>
1133   <dd>Constante interne OK. Les gestionnaires renverront cette valeur
1134   s'ils ont trait&eacute; la requ&ecirc;te.</dd>
1135   <dt>apache2.DECLINED</dt>
1136   <dd>Constante interne DECLINED. Les gestionnaires renverront cette
1137   valeur s'ils n'ont pas l'intention de traiter la requ&ecirc;te.</dd>
1138   <dt>apache2.DONE</dt>
1139   <dd>Constante interne DONE.</dd>
1140   <dt>apache2.version</dt>
1141   <dd>Cha&icirc;ne contenant la version du serveur HTTP Apache</dd>
1142   <dt>apache2.HTTP_MOVED_TEMPORARILY</dt>
1143   <dd>Code d'&eacute;tat HTTP</dd>
1144   <dt>apache2.PROXYREQ_NONE, apache2.PROXYREQ_PROXY, apache2.PROXYREQ_REVERSE, apache2.PROXYREQ_RESPONSE</dt>
1145   <dd>Constantes internes utilis&eacute;es par <module>mod_proxy</module></dd>
1146   <dt>apache2.AUTHZ_DENIED, apache2.AUTHZ_GRANTED, apache2.AUTHZ_NEUTRAL, apache2.AUTHZ_GENERAL_ERROR, apache2.AUTHZ_DENIED_NO_USER</dt>
1147   <dd>constantes internes utilis&eacute;es par <module>mod_authz_core</module></dd>
1148
1149 </dl>
1150 <p>Les autres codes d'&eacute;tat HTTP ne sont pas encore impl&eacute;ment&eacute;s.</p>
1151 </section>
1152
1153
1154 <section id="modifying_buckets">
1155     <title>Modification de contenu avec les filtres lua</title>
1156     <p>
1157     Les fonctions de filtrage impl&eacute;ment&eacute;es via les directives <directive
1158     module="mod_lua">LuaInputFilter</directive> ou <directive
1159     module="mod_lua">LuaOutputFilter</directive> sont con&ccedil;ues comme des
1160     fonctions de 3&egrave;me phase non blocantes utilisant des sous-routines
1161     pour suspendre et reprendre l'ex&eacute;cution d'une fonction lorsque des
1162     paquets de donn&eacute;es sont envoy&eacute;s &agrave; la cha&icirc;ne de filtrage. La
1163     structure de base d'une telle fonction est :
1164     </p>
1165     <highlight language="lua">
1166 function filter(r)
1167     -- Nous indiquons tout d'abord que nous sommes pr&ecirc;ts &agrave; recevoir des
1168     -- blocs de donn&eacute;es.
1169     -- Avant ceci, nous pouvons d&eacute;finir notre environnement, tester
1170     -- certaines conditions, et, si nous le jugeons n&eacute;cessaire, refuser le
1171     -- filtrage d'une requ&ecirc;te :
1172     if something_bad then
1173         return -- Le filtrage est saut&eacute;
1174     end
1175     -- 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.
1176     -- 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.
1177     -- Les filtres en entr&eacute;e peuvent ajouter des &eacute;l&eacute;ments &agrave; la fin des donn&eacute;es au stade final.
1178
1179     coroutine.yield([optional header to be prepended to the content])
1180
1181     -- Apr&egrave;s cet arr&ecirc;t, nous allons recevoir d'autres blocs de donn&eacute;es, un par un ;
1182     -- nous pouvons les traiter comme il nous pla&icirc;t et proc&eacute;der &agrave; la r&eacute;ponse.
1183     -- Ces blocs sont conserv&eacute;s dans la variable globale 'bucket', nous r&eacute;alisons donc
1184     -- une boucle pour v&eacute;rifier que 'bucket' n'est pas vide :
1185     while bucket ~= nil do
1186         local output = mangle(bucket) -- Do some stuff to the content
1187         coroutine.yield(output) -- Return our new content to the filter chain
1188     end
1189
1190     -- Une fois les blocs de donn&eacute;es &eacute;puis&eacute;s, 'bucket' est positionn&eacute; &agrave; une valeur vide ('nil'),
1191     -- ce qui va nous faire sortir de cette boucle et nous amener &agrave; l'&eacute;tape suivante.
1192     -- On peut ajouter ce qu'on veut &agrave; la fin des donn&eacute;es &agrave; cette &eacute;tape, qui constitue le dernier
1193     -- arr&ecirc;t. Les filtres d'entr&eacute;e comme de sortie peuvent servir &agrave; ajouter des &eacute;l&eacute;ments &agrave; la fin
1194     --  des donn&eacute;es &agrave; cette &eacute;tape.
1195     coroutine.yield([optional footer to be appended to the content])
1196 end
1197     </highlight>
1198 </section>
1199 <section id="databases">
1200     <title>Connectivit&eacute; aux bases de donn&eacute;es</title>
1201     <p>Mod_lua impl&eacute;mente une fonctionnalit&eacute; basique de connexion aux
1202 bases de donn&eacute;es permettant d'envoyer des requ&ecirc;tes ou d'ex&eacute;cuter des
1203 commandes aupr&egrave;s des moteurs de base de donn&eacute;es les plus courants
1204 (mySQL, PostgreSQL, FreeTDS, ODBC, SQLite, Oracle), ainsi que mod_dbd.
1205     </p>
1206     <p>L'exemple suivant montre comment se connecter &agrave; une base de
1207 donn&eacute;es et extraire des informations d'une table :</p>
1208     <highlight language="lua">
1209 function handle(r)
1210     -- connexion &agrave; la base de donn&eacute;es
1211     local database, err = r:dbacquire("mysql", "server=localhost,user=root,dbname=mydb")
1212     if not err then
1213         -- S&eacute;lection de certaines informations
1214         local results, err = database:select(r, "SELECT `name`, `age` FROM `people` WHERE 1")
1215         if not err then
1216             local rows = results(0) -- extrait tous les enregistrements en mode synchrone
1217             for k, row in pairs(rows) do
1218                 r:puts( string.format("Name: %s, Age: %s&lt;br/&gt;", row[1], row[2]) )
1219             end
1220         else
1221             r:puts("Database query error: " .. err)
1222         end
1223         database:close()
1224     else
1225         r:puts("Connexion &agrave; la base de donn&eacute;es impossible : " .. err)
1226     end
1227 end
1228     </highlight>
1229     <p>
1230     Pour utiliser <module>mod_dbd</module>, sp&eacute;cifiez
1231 <code>mod_dbd</code> comme type de base de donn&eacute;es, ou laissez le champ
1232 vide :
1233     </p>
1234     <highlight language="lua">
1235     local database = r:dbacquire("mod_dbd")
1236     </highlight>
1237     <section id="database_object">
1238         <title>L'objet database et ses m&eacute;thodes</title>
1239         <p>L'objet database renvoy&eacute; par <code>dbacquire</code> poss&egrave;de
1240 les m&eacute;thodes suivantes :</p>
1241         <p><strong>S&eacute;lection normale et requ&ecirc;te vers une base de donn&eacute;es
1242 :</strong></p>
1243     <highlight language="lua">
1244 -- Ex&eacute;cution d'une requ&ecirc;te et renvoie du nombre d'enregistrements
1245 affect&eacute;s :
1246 local affected, errmsg = database:query(r, "DELETE FROM `tbl` WHERE 1")
1247
1248 -- Ex&eacute;cution d'une requ&ecirc;te et renvoie du r&eacute;sultat qui peut &ecirc;tre utilis&eacute;
1249 en mode synchrone ou asynchrone :
1250 local result, errmsg = database:select(r, "SELECT * FROM `people` WHERE 1")
1251     </highlight>
1252         <p><strong>Utilisation de requ&ecirc;tes pr&eacute;par&eacute;es (recommand&eacute;) :</strong></p>
1253     <highlight language="lua">
1254 -- Cr&eacute;ation et ex&eacute;cution d'une requ&ecirc;te pr&eacute;par&eacute;e :
1255 local statement, errmsg = database:prepare(r, "DELETE FROM `tbl` WHERE `age` > %u")
1256 if not errmsg then
1257     local result, errmsg = statement:query(20) -- ex&eacute;cute la requ&ecirc;te pour age &gt; 20
1258 end
1259
1260 -- Extrait une requ&ecirc;te pr&eacute;par&eacute;e depuis une directive DBDPrepareSQL :
1261 local statement, errmsg = database:prepared(r, "someTag")
1262 if not errmsg then
1263     local result, errmsg = statement:select("John Doe", 123) -- injecte les valeurs "John Doe" et 123 dans la requ&ecirc;te
1264 end
1265
1266 </highlight>
1267         <p><strong>Echappement de valeurs, fermeture de la base donn&eacute;es,
1268 etc...</strong></p>
1269     <highlight language="lua">
1270 -- Echappe une valeur pour pouvoir l'utiliser dans une requ&ecirc;te :
1271 local escaped = database:escape(r, [["'|blabla]])
1272
1273 -- Ferme une base de donn&eacute;es et lib&egrave;re les liens vers cette derni&egrave;re :
1274 database:close()
1275
1276 -- V&eacute;rifie si une connexion &agrave; une base de donn&eacute;es est en service et
1277 op&eacute;rationnelle :
1278 local connected = database:active()
1279     </highlight>
1280     </section>
1281     <section id="result_sets">
1282     <title>Travail avec les jeux d'enregistrements renvoy&eacute;s par les requ&ecirc;tes</title>
1283     <p>Les jeux d'enregistrements renvoy&eacute;s par <code>db:select</code> ou par des
1284 requ&ecirc;tes pr&eacute;par&eacute;es cr&eacute;&eacute;es par <code>db:prepare</code> permettent de
1285 s&eacute;lectionner des enregistrements en mode synchrone ou
1286 asynchrone, selon le nombre d'enregistrements sp&eacute;cifi&eacute; :<br/>
1287     <code>result(0)</code> s&eacute;lectionne tous les enregistrements en mode
1288 synchrone en renvoyant une table d'enregistrements.<br/>
1289     <code>result(-1)</code> s&eacute;lectionne le prochain enregistrement disponible en
1290 mode asynchrone.<br/>
1291     <code>result(N)</code> s&eacute;lectionne l'enregistrement num&eacute;ro
1292 <code>N</code> en mode asynchrone.
1293     </p>
1294     <highlight language="lua">
1295 -- extrait un jeu d'enregistrements via une requ&ecirc;te r&eacute;guli&egrave;re :
1296 local result, err = db:select(r, "SELECT * FROM `tbl` WHERE 1")
1297
1298 local rows = result(0) -- s&eacute;lectionne tous les enregistrements en mode synchrone
1299 local row = result(-1) -- s&eacute;lectionne le prochain enregistrement disponible en mode asynchrone
1300 local row = result(1234) -- s&eacute;lectionne l'enregistrement 1234 en mode asynchrone
1301     </highlight>
1302     <p>Il est possible de construire une fonction qui renvoie une
1303 fonction it&eacute;rative permettant de traiter tous les enregistrement en mode
1304 synchrone ou asynchrone selon la valeur de l'argument async :
1305     </p>
1306     <highlight language="lua">
1307 function rows(resultset, async)
1308     local a = 0
1309     local function getnext()
1310         a = a + 1
1311         local row = resultset(-1)
1312         return row and a or nil, row
1313     end
1314     if not async then
1315         return pairs(resultset(0))
1316     else
1317         return getnext, self
1318     end
1319 end
1320
1321 local statement, err = db:prepare(r, "SELECT * FROM `tbl` WHERE `age` > %u")
1322 if not err then
1323      -- s&eacute;lectionne des enregistrements en mode asynchrone :
1324     local result, err = statement:select(20)
1325     if not err then
1326         for index, row in rows(result, true) do
1327             ....
1328         end
1329     end
1330
1331      -- s&eacute;lectionne des enregistrements en mode synchrone :
1332     local result, err = statement:select(20)
1333     if not err then
1334         for index, row in rows(result, false) do
1335             ....
1336         end
1337     end
1338 end
1339     </highlight>
1340     </section>
1341     <section id="closing_databases">
1342         <title>Fermeture d'une connexion &agrave; une base de donn&eacute;es</title>
1343
1344     <p>Lorsqu'elles ne sont plus utilis&eacute;es, les connexions aux bases de
1345 donn&eacute;es doivent &ecirc;tre ferm&eacute;es avec <code>database:close()</code>. Si vous
1346 ne les fermez pas manuellement, mod_lua les fermera peut-&ecirc;tre en tant
1347 que r&eacute;sidus collect&eacute;s, mais si ce n'est pas le cas, vous pouvez finir
1348 pas avoir trop de connexions vers la base de donn&eacute;es inutilis&eacute;es. Les
1349 deux mesures suivantes sont pratiquement identiques :
1350     </p>
1351     <highlight language="lua">
1352 -- M&eacute;thode 1 : fermeture manuelle de la connexion
1353 local database = r:dbacquire("mod_dbd")
1354 database:close() -- c'est tout
1355
1356 -- M&eacute;thode 2 : on laisse le collecteur de r&eacute;sidus la fermer
1357 local database = r:dbacquire("mod_dbd")
1358 database = nil -- on coupe le lien
1359 collectgarbage() -- fermeture de la connexion par le collecteur de r&eacute;sidus
1360 </highlight>
1361     </section>
1362     <section id="database_caveat">
1363     <title>Pr&eacute;cautions &agrave; prendre lorsque l'on travaille avec les bases
1364 de donn&eacute;es</title>
1365     <p>Bien que les fonctions <code>query</code> et <code>run</code>
1366 soient toujours disponibles, il est recommand&eacute; d'utiliser des requ&ecirc;tes
1367 pr&eacute;par&eacute;es chaque fois que possible, afin d'une part d'optimiser les
1368 performances (si votre connexion reste longtemps en vie), et d'autre part
1369 minimiser le risque d'attaques par injection SQL. Les fonctions
1370 <code>run</code> et <code>query</code> ne doivent &ecirc;tre utilis&eacute;es que
1371 lorsque la requ&ecirc;te ne contient pas de variables (requ&ecirc;te statique). Dans
1372 le cas des requ&ecirc;tes dynamiques, utilisez <code>db:prepare</code> ou
1373 <code>db:prepared</code>.
1374     </p>
1375     </section>
1376
1377 </section>
1378
1379 <directivesynopsis>
1380 <name>LuaRoot</name>
1381 <description>Sp&eacute;cifie le chemin de base pour la r&eacute;solution des chemins
1382 relatifs dans les directives de mod_lua</description>
1383 <syntax>LuaRoot /chemin/vers/un/r&eacute;pertoire</syntax>
1384 <contextlist><context>server config</context><context>virtual host</context>
1385 <context>directory</context><context>.htaccess</context>
1386 </contextlist>
1387 <override>All</override>
1388
1389 <usage>
1390     <p>Cette directive permet de sp&eacute;cifier le chemin de base qui sera
1391     utilis&eacute; pour &eacute;valuer tous les chemins relatifs dans mod_lua. En
1392     l'absence de cette directive, les chemins relatifs sont r&eacute;solus par
1393     rapport au r&eacute;pertoire de travail courant, ce qui ne sera pas
1394     toujours appropri&eacute; pour un serveur.</p>
1395 </usage>
1396 </directivesynopsis>
1397
1398 <directivesynopsis>
1399 <name>LuaScope</name>
1400 <description>Une valeur parmi once, request, conn, thread -- la valeur
1401 par d&eacute;faut est once</description>
1402 <syntax>LuaScope once|request|conn|thread|server [min] [max]</syntax>
1403 <default>LuaScope once</default>
1404 <contextlist><context>server config</context><context>virtual host</context>
1405 <context>directory</context><context>.htaccess</context>
1406 </contextlist>
1407 <override>All</override>
1408
1409 <usage>
1410     <p>Cette directive permet de sp&eacute;cifier la dur&eacute;e de vie de
1411     l'interpr&eacute;teur Lua qui sera utilis&eacute; dans ce "r&eacute;pertoire". La valeur
1412     par d&eacute;faut est "once".</p>
1413
1414    <dl>
1415     <dt>once:</dt> <dd>utilise l'interpr&eacute;teur une fois.</dd>
1416
1417     <dt>request:</dt> <dd>utilise l'interpr&eacute;teur pour traiter tout ce
1418     qui est bas&eacute; sur le m&ecirc;me fichier dans la requ&ecirc;te, et qui se trouve
1419     aussi dans la port&eacute;e de la requ&ecirc;te.</dd>
1420
1421     <dt>conn:</dt> <dd>idem request, mais attach&eacute; &agrave; connection_rec</dd>
1422
1423     <dt>thread:</dt> <dd>Utilise l'interpr&eacute;teur pendant toute la dur&eacute;e
1424     de vie du thread qui traite la requ&ecirc;te (disponible seulement avec
1425     les MPMs thread&eacute;s).</dd>
1426
1427     <dt>server:</dt>  <dd>Le comportement est ici diff&eacute;rent, car la
1428     port&eacute;e du serveur pr&eacute;sente une dur&eacute;e de vie assez longue, et
1429     plusieurs threads vont partager le m&ecirc;me server_rec. Pour g&eacute;rer tout
1430     ceci, les &eacute;tats lua du serveur sont stock&eacute;s dans une liste de ressources
1431     apr. Les arguments <code>min</code> et <code>max</code> permettent
1432     de sp&eacute;cifier les nombres minimaux et maximaux d'&eacute;tats lua &agrave; stocker
1433     dans la liste.</dd>
1434    </dl>
1435    <p>En g&eacute;n&eacute;ral, les port&eacute;es <code>thread</code> et <code>server</code>
1436    sont 2 &agrave; 3 fois plus rapides que les autres, car elles n'ont pas besoin
1437    de r&eacute;g&eacute;n&eacute;rer de nouveaux &eacute;tats Lua &agrave; chaque requ&ecirc;te (comme c'est le
1438    cas avec le MPM event, o&ugrave; m&ecirc;me les connexions persistantes utilisent un
1439    nouveau thread pour chaque requ&ecirc;te). Si vous pensez que vos scripts
1440    n'auront pas de probl&egrave;me s'il r&eacute;utilisent un &eacute;tat, alors les port&eacute;es
1441    <code>thread</code> ou <code>server</code> doivent &ecirc;tre utilis&eacute;es car
1442    elles pr&eacute;senteront de meilleures performances. Alors que la port&eacute;e
1443    <code>thread</code> fournira les r&eacute;ponses les plus rapides, la port&eacute;e
1444    <code>server</code> utilisera moins de m&eacute;moire car les &eacute;tats sont
1445    rassembl&eacute;s dans des jeux, permettant par exemple &agrave; 1000 threads de
1446    partager 100 &eacute;tats Lua, ne n&eacute;cessitant ainsi que 10% de la m&eacute;moire
1447    requise par la port&eacute;e <code>thread</code>.
1448     </p>
1449 </usage>
1450 </directivesynopsis>
1451
1452 <directivesynopsis>
1453 <name>LuaMapHandler</name>
1454 <description>Met en correspondance un chemin avec un gestionnaire lua</description>
1455 <syntax>LuaMapHandler modele-uri /chemin/vers/lua/script.lua
1456 [nom-fonction]</syntax>
1457 <contextlist><context>server config</context><context>virtual host</context>
1458 <context>directory</context><context>.htaccess</context>
1459 </contextlist>
1460 <override>All</override>
1461 <usage>
1462     <p>Cette directive permet de faire correspondre un mod&egrave;le d'uri avec
1463     une fonction de gestionnaire situ&eacute;e dans un fichier sp&eacute;cifique. Elle
1464     utilise les expressions rationnelles PCRE pour mettre en
1465     correspondance l'uri, et supporte les groupes de correspondance
1466     d'interpolation dans le chemin du fichier et le nom de la fonction.
1467     Prenez garde aux probl&egrave;mes de s&eacute;curit&eacute; en &eacute;crivant vos expressions
1468     rationnelles.</p>
1469    <example><title>Exemples :</title>
1470     <highlight language="config">
1471     LuaMapHandler /(\w+)/(\w+) /scripts/$1.lua handle_$2
1472     </highlight>
1473    </example>
1474         <p>Cette directive va faire correspondre des uri comme
1475         /photos/show?id=9 au fichier /scripts/photos.lua, et invoquera la
1476         fonction de gestionnaire handle_show au niveau de la vm lua
1477         apr&egrave;s chargement de ce fichier.</p>
1478
1479 <highlight language="config">
1480     LuaMapHandler /bingo /scripts/wombat.lua
1481 </highlight>
1482         <p>Cette directive invoquera la fonction "handle" qui est la
1483         valeur par d&eacute;faut si aucun nom de fonction sp&eacute;cifique n'est
1484         sp&eacute;cifi&eacute;.</p>
1485 </usage>
1486 </directivesynopsis>
1487
1488 <directivesynopsis>
1489 <name>LuaPackagePath</name>
1490 <description>Ajoute un r&eacute;pertoire au package.path de lua</description>
1491 <syntax>LuaPackagePath /chemin/vers/include/?.lua</syntax>
1492 <contextlist><context>server config</context><context>virtual host</context>
1493 <context>directory</context><context>.htaccess</context>
1494 </contextlist>
1495 <override>All</override>
1496     <usage><p>Cette directive permet d'ajouter un chemin &agrave; la liste des
1497     chemins de recherche du module lua. Elle suit les m&ecirc;mes conventions
1498     que lua. Ceci modifie le package.path dans les vms lua.</p>
1499
1500     <example><title>Exemples :</title>
1501         <highlight language="config">
1502 LuaPackagePath /scripts/lib/?.lua
1503 LuaPackagePath /scripts/lib/?/init.lua
1504     </highlight>
1505     </example>
1506 </usage>
1507 </directivesynopsis>
1508
1509 <directivesynopsis>
1510 <name>LuaPackageCPath</name>
1511 <description>Ajoute un r&eacute;pertoire au package.cpath de lua</description>
1512 <syntax>LuaPackageCPath /chemin/vers/include/?.soa</syntax>
1513 <contextlist><context>server config</context><context>virtual host</context>
1514 <context>directory</context><context>.htaccess</context>
1515 </contextlist>
1516 <override>All</override>
1517
1518 <usage>
1519     <p>Cette directive permet d'ajouter un chemin &agrave; la liste des chemins
1520     de recherche des biblioth&egrave;ques partag&eacute;es de lua. Ceci modifie le
1521     package.cpath dans les vms lua.</p>
1522
1523 </usage>
1524 </directivesynopsis>
1525
1526 <directivesynopsis>
1527 <name>LuaCodeCache</name>
1528 <description>Configure le cache de code compil&eacute;.</description>
1529 <syntax>LuaCodeCache stat|forever|never</syntax>
1530 <default>LuaCodeCache stat</default>
1531 <contextlist>
1532 <context>server config</context><context>virtual host</context>
1533 <context>directory</context><context>.htaccess</context>
1534 </contextlist>
1535 <override>All</override>
1536
1537 <usage><p>
1538     Cette directive permet de d&eacute;finir le comportement du cache de code
1539     en m&eacute;moire. La valeur par d&eacute;faut est stat ; dans ce cas, le script
1540     du niveau le plus haut (et pas les scripts inclus) est v&eacute;rifi&eacute; &agrave;
1541     chaque fois que ce fichier est n&eacute;cessaire, et est recharg&eacute; si la
1542     date de modification est plus r&eacute;cente que celle du script d&eacute;j&agrave;
1543     charg&eacute;. Les autres valeurs permettent respectivement de garder le
1544     fichier en cache perp&eacute;tuellement (forever - jamais v&eacute;rifi&eacute; ni
1545     remplac&eacute;), ou de ne jamais le mettre en cache (never).</p>
1546
1547     <p>En g&eacute;n&eacute;ral, les valeurs stat et forever sont utilis&eacute;es pour un
1548     serveur en production, et les valeurs stat ou never pour un serveur
1549     en d&eacute;veloppement.</p>
1550
1551     <example><title>Exemples :</title>
1552         <highlight language="config">
1553 LuaCodeCache stat
1554 LuaCodeCache forever
1555 LuaCodeCache never
1556     </highlight>
1557     </example>
1558
1559 </usage>
1560 </directivesynopsis>
1561
1562 <directivesynopsis>
1563 <name>LuaHookTranslateName</name>
1564 <description>Fournit un point d'entr&eacute;e &agrave; la phase du nom de
1565 traduction du traitement de la requ&ecirc;te</description>
1566 <syntax>LuaHookTranslateName  /chemin/vers/lua/script.lua  nom_fonction_hook [early|late]</syntax>
1567 <contextlist><context>server config</context><context>virtual host</context>
1568 </contextlist>
1569 <override>All</override>
1570 <compatibility>Le troisi&egrave;me argument optionnel est disponible depuis la
1571 version 2.3.15 du serveur HTTP Apache.</compatibility>
1572
1573 <usage><p>
1574     Cette directive permet d'ajouter un point d'entr&eacute;e (&agrave;
1575     APR_HOOK_MIDDLE) &agrave; la phase du nom de traduction du traitement de la
1576     requ&ecirc;te. La fonction hook accepte un seul argument, le request_rec,
1577     et doit renvoyer un code d'&eacute;tat qui est soit un code d'erreur HTTP,
1578     ou une constante d&eacute;finie dans le module apache2 :  apache2.OK,
1579     apache2.DECLINED, ou apache2.DONE.</p>
1580
1581     <p>Pour ceux qui ne sont pas familiers avec les points d'entr&eacute;e
1582     (hook), en gros, chaque hook sera invoqu&eacute; jusqu'&agrave; ce que l'un
1583     d'entre eux renvoie apache2.OK. Si un hook n'effectuer pas la
1584     traduction, il doit juste renvoyer apache2.DECLINED. Si le
1585     traitement de la requ&ecirc;te doit &ecirc;tre interrompu, la valeur renvoy&eacute;e
1586     doit &ecirc;tre apache2.DONE.</p>
1587
1588     <p>Exemple :</p>
1589
1590 <highlight language="config">
1591 # httpd.conf
1592 LuaHookTranslateName /scripts/conf/hooks.lua silly_mapper
1593 </highlight>
1594
1595 <highlight language="lua">
1596 -- /scripts/conf/hooks.lua --
1597 require "apache2"
1598 function silly_mapper(r)
1599     if r.uri == "/" then
1600         r.filename = "/var/www/home.lua"
1601         return apache2.OK
1602     else
1603         return apache2.DECLINED
1604     end
1605 end
1606 </highlight>
1607
1608    <note><title>Contexte</title><p>Cette directive ne peut &ecirc;tre
1609    utilis&eacute;e ni &agrave; l'int&eacute;rieur d'une section <directive type="section"
1610    module="core">Directory</directive> ou <directive type="section"
1611    module="core">Files</directive>, ni dans un fichier htaccess.</p></note>
1612
1613    <note><title>Ordonnancement</title><p>Les arguments optionnels
1614    "early" ou "late" permettent de contr&ocirc;ler le moment auquel ce script
1615    s'ex&eacute;cute par rapport aux autres modules.</p></note>
1616 </usage>
1617 </directivesynopsis>
1618
1619 <directivesynopsis>
1620 <name>LuaHookFixups</name>
1621 <description>Fournit un point d'entr&eacute;e pour la phase de correction du
1622 traitement de la requ&ecirc;te</description>
1623 <syntax>LuaHookFixups  /chemin/vers/lua/script.lua hook_function_name</syntax>
1624 <contextlist><context>server config</context><context>virtual host</context>
1625 <context>directory</context><context>.htaccess</context>
1626 </contextlist>
1627 <override>All</override>
1628 <usage>
1629 <p>
1630     Idem LuaHookTranslateName, mais s'ex&eacute;cute durant la phase de
1631     correction.
1632 </p>
1633 </usage>
1634 </directivesynopsis>
1635
1636 <directivesynopsis>
1637 <name>LuaHookLog</name>
1638 <description>Permet une insertion dans la phase de journalisation du
1639 traitement d'une requ&ecirc;te</description>
1640 <syntax>LuaHookLog  /path/to/lua/script.lua log_function_name</syntax>
1641 <contextlist><context>server config</context><context>virtual host</context>
1642 <context>directory</context><context>.htaccess</context>
1643 </contextlist>
1644 <override>All</override>
1645 <usage>
1646 <p>
1647     Ce dispositif d'insertion simple permet d'ex&eacute;cuter une fonction
1648     lorsque httpd entre dans la phase de journalisation du traitement
1649     d'une requ&ecirc;te. Vous pouvez ainsi ajouter des donn&eacute;es &agrave; vos propres
1650     entr&eacute;es de journalisation, manipuler les entr&eacute;es du journal standard
1651     avant leur enregistrement ou emp&ecirc;cher l'enregistrement d'une entr&eacute;e
1652     dans le journal. Pour emp&ecirc;cher l'enregistrement normal des entr&eacute;es
1653     du journal, renvoyez simplement <code>apache2.DONE</code> dans votre
1654     gestionnaire de journalisation, ou au contraire, renvoyez
1655     <code>apache2.OK</code> pour que httpd effectue une journalisation
1656     normale.
1657 </p>
1658 <p>Exemple :</p>
1659 <highlight language="config">
1660 LuaHookLog /path/to/script.lua logger
1661 </highlight>
1662 <highlight language="lua">
1663 -- /path/to/script.lua --
1664 function logger(r)
1665     -- on joue &agrave; pile ou face :
1666     -- Si on obtient 1, on &eacute;crit dans notre propre journal Lua et on dit
1667     -- &agrave; httpd de ne pas enregistrer d'entr&eacute;e dans le journal standard..
1668     -- Si on obtient 2, on nettoie un peu les donn&eacute;es avant que httpd ne
1669     -- les enregistre dans le journal standard.
1670
1671     if math.random(1,2) == 1 then
1672         -- On effectue notre propre journalisation et le journal
1673         -- standard n'est pas aliment&eacute;
1674         local f = io.open("/foo/secret.log", "a")
1675         if f then
1676             f:write("Quelque chose de secret est arriv&eacute; &agrave; " .. r.uri .. "\n")
1677             f:close()
1678         end
1679         return apache2.DONE -- On dit &agrave; httpd de ne rien enregistrer
1680                                 --dans le journal standard
1681     else
1682         r.uri = r.uri:gsub("somesecretstuff", "") -- nettoie les donn&eacute;es
1683         return apache2.OK -- et httpd doit alors les enregistrer.
1684     end
1685 end
1686 </highlight>
1687 </usage>
1688 </directivesynopsis>
1689
1690
1691 <directivesynopsis>
1692 <name>LuaHookMapToStorage</name>
1693 <description>Fournit un point d'entr&eacute;e pour la phase map_to_storage du
1694 traitement de la requ&ecirc;te</description>
1695 <syntax>LuaHookMapToStorage  /chemin/vers/lua/script.lua hook_function_name</syntax>
1696 <contextlist><context>server config</context><context>virtual host</context>
1697 <context>directory</context><context>.htaccess</context>
1698 </contextlist>
1699 <override>All</override>
1700     <usage>
1701     <p>Identique &agrave; la directive
1702     <directive>LuaHookTranslateName</directive>, mais s'ex&eacute;cute &agrave; la
1703     phase map-to-storage du traitement de la requ&ecirc;te. Les modules comme
1704     mod_cache agissent pendant cette phase, ce qui permet de pr&eacute;senter
1705     un exemple int&eacute;ressant de ce que l'on peut faire ici :</p>
1706     <highlight language="config">
1707     LuaHookMapToStorage /path/to/lua/script.lua check_cache
1708     </highlight>
1709     <highlight language="lua">
1710 require"apache2"
1711 cached_files = {}
1712
1713 function read_file(filename)
1714     local input = io.open(filename, "r")
1715     if input then
1716         local data = input:read("*a")
1717         cached_files[filename] = data
1718         file = cached_files[filename]
1719         input:close()
1720     end
1721     return cached_files[filename]
1722 end
1723
1724 function check_cache(r)
1725     if r.filename:match("%.png$") then -- Only match PNG files
1726         local file = cached_files[r.filename] -- Check cache entries
1727         if not file then
1728             file = read_file(r.filename)  -- Read file into cache
1729         end
1730         if file then -- If file exists, write it out
1731             r.status = 200
1732             r:write(file)
1733             r:info(("Sent %s to client from cache"):format(r.filename))
1734             return apache2.DONE -- skip default handler for PNG files
1735         end
1736     end
1737     return apache2.DECLINED -- If we had nothing to do, let others serve this.
1738 end
1739     </highlight>
1740
1741     </usage>
1742 </directivesynopsis>
1743
1744 <directivesynopsis>
1745 <name>LuaHookCheckUserID</name>
1746 <description>Fournit un point d'entr&eacute;e pour la phase check_user_id du
1747 traitement de la requ&ecirc;te</description>
1748 <syntax>LuaHookCheckUserID  /chemin/vers/lua/script.lua hook_function_name [early|late]</syntax>
1749 <contextlist><context>server config</context><context>virtual host</context>
1750 <context>directory</context><context>.htaccess</context>
1751 </contextlist>
1752 <override>All</override>
1753 <compatibility>Le troisi&egrave;me argument optionnel est disponible depuis la
1754 version 2.3.15 du serveur HTTP Apache.</compatibility>
1755 <usage><p>...</p>
1756    <note><title>Ordonnancement</title><p>Les arguments optionnels
1757    "early" ou "late" permettent de contr&ocirc;ler le moment auquel ce script
1758    s'ex&eacute;cute par rapport aux autres modules.</p></note>
1759 </usage>
1760 </directivesynopsis>
1761
1762 <directivesynopsis>
1763 <name>LuaHookTypeChecker</name>
1764 <description>Fournit un point d'entr&eacute;e pour la phase type_checker du
1765 traitement de la requ&ecirc;te</description>
1766 <syntax>LuaHookTypeChecker  /chemin/vers/lua/script.lua hook_function_name</syntax>
1767 <contextlist><context>server config</context><context>virtual host</context>
1768 <context>directory</context><context>.htaccess</context>
1769 </contextlist>
1770 <override>All</override>
1771     <usage><p>...</p></usage>
1772 </directivesynopsis>
1773
1774 <directivesynopsis>
1775 <name>LuaHookAuthChecker</name>
1776 <description>Fournit un point d'entr&eacute;e pour la phase auth_checker du
1777 traitement de la requ&ecirc;te</description>
1778 <syntax>LuaHookAuthChecker  /chemin/vers/lua/script.lua hook_function_name [early|late]</syntax>
1779 <contextlist><context>server config</context><context>virtual host</context>
1780 <context>directory</context><context>.htaccess</context>
1781 </contextlist>
1782 <override>All</override>
1783 <compatibility>Le troisi&egrave;me argument optionnel est disponible depuis la
1784 version 2.3.15 du serveur HTTP Apache.</compatibility>
1785     <usage>
1786 <p>Invoque une fonction lua au cours de la phase auth_checker du
1787 traitement de la requ&ecirc;te. Cette directive peut s'utiliser pour
1788 impl&eacute;menter une v&eacute;rification arbitraire de l'authentification et de
1789 l'autorisation. Voici un exemple tr&egrave;s simple :
1790 </p>
1791 <highlight language="lua">
1792 require 'apache2'
1793
1794 -- fonction d'accroche authcheck fictive
1795 -- Si la requ&ecirc;te ne contient aucune donn&eacute;e d'authentification, l'en-t&ecirc;te
1796 -- de la r&eacute;ponse est d&eacute;fini et un code 401 est renvoy&eacute; afin de demander au
1797 -- navigateur d'effectuer une authentification basique. Si la requ&ecirc;te
1798 -- comporte des donn&eacute;es d'authentification, elles ne sont pas vraiment
1799 -- consult&eacute;es, mais on admet la prise en compte de l'utilisateur 'foo' et
1800 -- on la valide. On v&eacute;rifie ensuite si l'utilisateur est bien 'foo' et on
1801 -- accepte la requ&ecirc;te.
1802 function authcheck_hook(r)
1803
1804    -- recherche des informations d'authentification
1805    auth = r.headers_in['Authorization']
1806    if auth ~= nil then
1807      -- d&eacute;finition d'un utilisateur par d&eacute;faut
1808      r.user = 'foo'
1809    end
1810
1811    if r.user == nil then
1812       r:debug("authcheck: user is nil, returning 401")
1813       r.err_headers_out['WWW-Authenticate'] = 'Basic realm="WallyWorld"'
1814       return 401
1815    elseif r.user == "foo" then
1816       r:debug('user foo: OK')
1817    else
1818       r:debug("authcheck: user='" .. r.user .. "'")
1819       r.err_headers_out['WWW-Authenticate'] = 'Basic realm="WallyWorld"'
1820       return 401
1821    end
1822    return apache2.OK
1823 end
1824 </highlight>
1825 <note><title>Ordonnancement</title><p>Les arguments optionnels
1826    "early" ou "late" permettent de contr&ocirc;ler le moment auquel ce script
1827    s'ex&eacute;cute par rapport aux autres modules.</p></note>
1828 </usage>
1829 </directivesynopsis>
1830
1831 <directivesynopsis>
1832 <name>LuaHookAccessChecker</name>
1833 <description>Fournit un point d'entr&eacute;e pour la phase access_checker du
1834 traitement de la requ&ecirc;te</description>
1835 <syntax>LuaHookAccessChecker  /chemin/vers/lua/script.lua  hook_function_name [early|late]</syntax>
1836 <contextlist><context>server config</context><context>virtual host</context>
1837 <context>directory</context><context>.htaccess</context>
1838 </contextlist>
1839 <override>All</override>
1840 <compatibility>Le troisi&egrave;me argument optionnel est disponible depuis la
1841 version 2.3.15 du serveur HTTP Apache.</compatibility>
1842
1843 <usage>
1844 <p>Ajoute votre fonction d'accroche &agrave; la phase access_checker. Une
1845 fonction d'accroche access checker renvoie en g&eacute;n&eacute;ral OK, DECLINED, ou
1846 HTTP_FORBIDDEN.</p>
1847 <note><title>Ordonnancement</title><p>Les arguments optionnels
1848    "early" ou "late" permettent de contr&ocirc;ler le moment auquel ce script
1849    s'ex&eacute;cute par rapport aux autres modules.</p></note>
1850 </usage>
1851 </directivesynopsis>
1852 <directivesynopsis>
1853 <name>LuaHookInsertFilter</name>
1854 <description>Fournit un point d'entr&eacute;e pour la phase insert_filter du
1855 traitement de la requ&ecirc;te</description>
1856 <syntax>LuaHookInsertFilter  /chemin/vers/lua/script.lua hook_function_name</syntax>
1857 <contextlist><context>server config</context><context>virtual host</context>
1858 <context>directory</context><context>.htaccess</context>
1859 </contextlist>
1860 <override>All</override>
1861     <usage><p>Non encore impl&eacute;ment&eacute;</p></usage>
1862 </directivesynopsis>
1863
1864 <directivesynopsis>
1865 <name>LuaInherit</name>
1866 <description>Contr&ocirc;le la mani&egrave;re dont les sections de configuration
1867 parentes sont fusionn&eacute;es dans les enfants</description>
1868 <syntax>LuaInherit none|parent-first|parent-last</syntax>
1869 <default>LuaInherit parent-first</default>
1870 <contextlist><context>server config</context><context>virtual host</context>
1871 <context>directory</context><context>.htaccess</context>
1872 </contextlist>
1873 <override>All</override>
1874 <compatibility>Versions 2.4.0 et sup&eacute;rieures</compatibility>
1875     <usage><p>Par d&eacute;faut, si des directives LuaHook* se trouvent dans
1876     des sections de configuration Directory ou Location qui se
1877     chevauchent, les scripts
1878     d&eacute;finis dans les sections les plus sp&eacute;cifiques s'ex&eacute;cutent
1879     <em>apr&egrave;s</em> ceux d&eacute;finis dans les sections plus g&eacute;n&eacute;riques
1880     (LuaInherit parent-first). Vous pouvez inverser cet ordre, ou faire
1881     en sorte que le contexte parent ne s'applique pas du tout.</p>
1882
1883     <p>Jusqu'aux versions 2.3.x, le comportement par d&eacute;faut consistait &agrave;
1884     ignorer les directives LuaHook* situ&eacute;es dans les sections de
1885     configuration parentes.</p></usage>
1886 </directivesynopsis>
1887
1888 <directivesynopsis>
1889 <name>LuaQuickHandler</name>
1890 <description>Fournit un point d'entr&eacute;e pour la gestion rapide du
1891 traitement de la requ&ecirc;te</description>
1892 <syntax>LuaQuickHandler /path/to/script.lua hook_function_name</syntax>
1893 <contextlist><context>server config</context><context>virtual host</context>
1894 <context>directory</context><context>.htaccess</context>
1895 </contextlist>
1896 <override>All</override>
1897 <usage>
1898     <p>Cette phase s'ex&eacute;cute juste apr&egrave;s l'attribution de la requ&ecirc;te &agrave;
1899     un serveur virtuel, et permet d'effectuer certains traitements avant
1900     le d&eacute;roulement des autres phases, ou de servir une requ&ecirc;te sans
1901     avoir &agrave; la traduire, l'associer &agrave; un espace de stockage, etc...
1902     Comme cette phase s'ex&eacute;cute avant toute autre, les directives telles
1903     que <directive type="section" module="core">Location</directive> ou
1904     <directive type="section" module="core">Directory</directive> ne
1905     sont pas encore prises en compte, car Les URI n'ont pas encore &eacute;t&eacute;
1906     enti&egrave;rement interpr&eacute;t&eacute;s.
1907     </p>
1908    <note><title>Contexte</title><p>Cette directive ne peut &ecirc;tre
1909    utilis&eacute;e ni &agrave; l'int&eacute;rieur d'une section <directive type="section"
1910    module="core">Directory</directive> ou <directive type="section"
1911    module="core">Files</directive>, ni dans un fichier htaccess.</p></note>
1912 </usage>
1913 </directivesynopsis>
1914
1915 <directivesynopsis>
1916 <name>LuaAuthzProvider</name>
1917 <description>Branche une fonction fournisseur d'autorisation dans <module>mod_authz_core</module>
1918 </description>
1919 <syntax>LuaAuthzProvider provider_name /path/to/lua/script.lua function_name</syntax>
1920 <contextlist><context>server config</context> </contextlist>
1921 <compatibility>Disponible depuis la version 2.4.3 du serveur HTTP Apache</compatibility>
1922
1923 <usage>
1924 <p>Lorsqu'une fonction lua a &eacute;t&eacute; enregistr&eacute;e en tant que fournisseur
1925 d'autorisation, elle peut &ecirc;tre appel&eacute;e via la directive <directive
1926 module="mod_authz_core">Require</directive> :</p>
1927
1928
1929 <highlight language="config">
1930 LuaRoot /usr/local/apache2/lua
1931 LuaAuthzProvider foo authz.lua authz_check_foo
1932 &lt;Location /&gt;
1933   Require foo johndoe
1934 &lt;/Location&gt;
1935 </highlight>
1936 <highlight language="lua">
1937 require "apache2"
1938 function authz_check_foo(r, who)
1939     if r.user ~= who then return apache2.AUTHZ_DENIED
1940     return apache2.AUTHZ_GRANTED
1941 end
1942 </highlight>
1943
1944 </usage>
1945 </directivesynopsis>
1946
1947 <directivesynopsis>
1948 <name>LuaInputFilter</name>
1949 <description>Fournit une fonction Lua pour le filtrage en entr&eacute;e</description>
1950 <syntax>LuaInputFilter filter_name /path/to/lua/script.lua function_name</syntax>
1951 <contextlist><context>server config</context> </contextlist>
1952 <compatibility>Disponible depuis la version 2.5.0 du serveur HTTP
1953 Apache</compatibility>
1954
1955 <usage>
1956 <p>Cette directive permet d'ajouter un filtre en entr&eacute;e sous la forme
1957 d'une fonction Lua. A l'instar des filtres en sorties, les filtres en
1958 entr&eacute;e fonctionnent comme des sous-routines, intervenant dans un premier
1959 temps avant l'envoi du contenu des tampons, puis chaque fois qu'un
1960 paquet de donn&eacute;es doit &ecirc;tre transmis &agrave; la cha&icirc;ne, et &eacute;ventuellement
1961 produisant toute donn&eacute;e &agrave; ajouter aux donn&eacute;es en entr&eacute;e. La variable
1962 globale <code>bucket</code> contient les paquets de donn&eacute;es tels qu'ils
1963 sont transmis au script Lua :
1964 </p>
1965
1966 <highlight language="config">
1967 LuaInputFilter myInputFilter /www/filter.lua input_filter
1968 &lt;FilesMatch "\.lua&gt;
1969   SetInputFilter myInputFilter
1970 &lt;/FilesMatch&gt;
1971 </highlight>
1972 <highlight language="lua">
1973 --[[
1974     Exemple de filtre en entr&eacute;e qui convertit toutes les donn&eacute;es POST en
1975     majuscules.
1976 ]]--
1977 function input_filter(r)
1978     print("luaInputFilter called") -- debug print
1979     coroutine.yield() -- Yield and wait for buckets
1980     while bucket do -- For each bucket, do...
1981         local output = string.upper(bucket) -- Convertit toutes les donn&eacute;es POST en majuscules
1982         coroutine.yield(output) -- Envoie les donn&eacute;es trait&eacute;es &agrave; la cha&icirc;ne
1983     end
1984     -- plus aucune donn&eacute;e &agrave; traiter.
1985     coroutine.yield("&amp;filterSignature=1234") -- Ajoute une signature &agrave; la fin
1986 end
1987 </highlight>
1988 <p>
1989 Le filtre en entr&eacute;e peut interdire ou sauter un filtre s'il est
1990 consid&eacute;r&eacute; comme ind&eacute;sirable :
1991 </p>
1992 <highlight language="lua">
1993 function input_filter(r)
1994     if not good then
1995         return -- Emp&ecirc;che tout simplement le filtrage et transmet le contenu original
1996     end
1997     coroutine.yield() -- attend des paquets de donn&eacute;es
1998     ... -- insert les filtres ici
1999 end
2000 </highlight>
2001 <p>
2002 Voir "<a href="#modifying_buckets">Modification de contenu avec les
2003 filtres Lua</a>" pour plus de d&eacute;tails.
2004 </p>
2005 </usage>
2006 </directivesynopsis>
2007
2008 <directivesynopsis>
2009 <name>LuaOutputFilter</name>
2010 <description>Fournit une fonction Lua pour le filtrage de contenu en
2011 sortie</description>
2012 <syntax>LuaOutputFilter filter_name /path/to/lua/script.lua function_name</syntax>
2013 <contextlist><context>server config</context> </contextlist>
2014 <compatibility>Disponible &agrave; partir de la version 2.5.0 du serveur HTTP
2015 Apache</compatibility>
2016
2017 <usage>
2018 <p>>Cette directive permet d'ajouter un filtre en sortie sous la forme
2019 d'une fonction Lua. A l'instar des filtres en sorties, les filtres en
2020 entr&eacute;e fonctionnent comme des sous-routines, intervenant dans un premier
2021 temps avant l'envoi du contenu des tampons, puis chaque fois qu'un
2022 paquet de donn&eacute;es doit &ecirc;tre transmis &agrave; la cha&icirc;ne, et &eacute;ventuellement
2023 produisant toute donn&eacute;e &agrave; ajouter aux donn&eacute;es en sortie. La variable
2024 globale <code>bucket</code> contient les paquets de donn&eacute;es tels qu'ils
2025 sont transmis au script Lua :
2026 </p>
2027
2028 <highlight language="config">
2029 LuaOutputFilter myOutputFilter /www/filter.lua output_filter
2030 &lt;FilesMatch "\.lua&gt;
2031   SetOutputFilter myOutputFilter
2032 &lt;/FilesMatch&gt;
2033 </highlight>
2034 <highlight language="lua">
2035 --[[
2036     Exemple de filtre en sortie qui &eacute;chappe toutes les entit&eacute;s HTML en
2037     sortie
2038 ]]--
2039 function output_filter(r)
2040     coroutine.yield("(Handled by myOutputFilter)&lt;br/&gt;\n") -- Ajoute des donn&eacute;es au d&eacute;but de la sortie, puis attend des paquets de donn&eacute;es &agrave; traiter
2041     while bucket do -- Pour chaque paquet, faire ...
2042         local output = r:escape_html(bucket) -- Echappe les donn&eacute;es en sortie
2043         coroutine.yield(output) -- Envoie les donn&eacute;es trait&eacute;es &agrave; la cha&icirc;ne
2044     end
2045     -- plus aucune donn&eacute;e &agrave; traiter.
2046 end
2047 </highlight>
2048 <p>
2049 Comme les filres en entr&eacute;e, le filtre en sortie peut interdire ou sauter un filtre s'il est
2050 consid&eacute;r&eacute; comme ind&eacute;sirable :
2051 </p>
2052 <highlight language="lua">
2053 function output_filter(r)
2054     if not r.content_type:match("text/html") then
2055         return -- Emp&ecirc;che tout simplement le filtrage et transmet le contenu original
2056     end
2057     coroutine.yield() -- attend des paquets de donn&eacute;es
2058     ... -- insert les filtres ici
2059 end
2060 </highlight>
2061 <note><title>Les filtres Lua avec <module>mod_filter</module></title>
2062 <p>Lorsqu'on utilise un filtre Lua comme fournisseur sous-jacent via la
2063 directive <directive module="mod_filter">FilterProvider</directive>, le
2064 filtrage ne fonctionnera que si <var>filter-name</var> est identique &agrave;
2065 <var>provider-name</var>.
2066 </p> </note>
2067
2068 <p>
2069 Voir "<a href="#modifying_buckets">Modification de contenu avec les
2070 filtres Lua</a>" pour plus de d&eacute;tails.
2071 </p>
2072
2073 </usage>
2074 </directivesynopsis>
2075
2076 </modulesynopsis>
2077