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