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