]> granicus.if.org Git - apache/blob - docs/manual/mod/mod_lua.xml.fr
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: 1442083:1477001 (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 </summary>
56
57 <section id="basicconf"><title>Configuration de base</title>
58
59 <p>La directive de base pour le chargement du module est</p>
60
61 <highlight language="config">
62     LoadModule lua_module modules/mod_lua.so
63 </highlight>
64
65 <p>
66 <code>mod_lua</code> fournit un gestionnaire nomm&eacute;
67 <code>lua-script</code> qui peut &ecirc;tre utilis&eacute; avec une directive
68 <code>AddHandler</code> :</p>
69
70 <highlight language="config">
71 AddHandler lua-script .lua
72 </highlight>
73
74 <p>
75 Ceci aura pour effet de faire traiter les requ&ecirc;tes pour les fichiers
76 dont l'extension est <code>.lua</code> par <code>mod_lua</code> en
77 invoquant cette fonction de <code>gestion</code> de fichier.
78 </p>
79 <!--
80 <p>Pour plus de d&eacute;tails, voir la directive
81 <directive>LuaMapHandler</directive>.
82  </p>
83 -->
84 </section>
85
86 <section id="writinghandlers"><title>Ecrire des gestionnaires</title>
87 <p>Dans l'API du serveur HTTP Apache, un gestionnaire est une sorte de
88 point d'accroche (hook) sp&eacute;cifique responsable de la g&eacute;n&eacute;ration de la
89 r&eacute;ponse. <module>mod_proxy</module>, <module>mod_cgi</module> et
90 <module>mod_status</module> sont des exemples de modules comportant un
91 gestionnaire.</p>
92
93 <p><code>mod_lua</code> cherche toujours &agrave; invoquer une fonction Lua pour le
94 gestionnaire, plut&ocirc;t que de simplement &eacute;valuer le corps d'un script dans
95 le style de CGI. Une fonction de gestionnaire se pr&eacute;sente comme suit :</p>
96
97
98 <highlight language="lua">
99 <strong>example.lua</strong>
100 -- exemple de gestionnaire
101
102 require "string"
103
104 --[[
105      Il s'agit du nom de m&eacute;thode par d&eacute;faut pour les gestionnaires Lua ;
106      voir les noms de fonctions optionnels dans la directive
107      LuaMapHandler pour choisir un point d'entr&eacute;e diff&eacute;rent.
108 --]]
109 function handle(r)
110     r.content_type = "text/plain"
111     r:puts("Hello Lua World!\n")
112
113     if r.method == 'GET' then
114         for k, v in pairs( r:parseargs() ) do
115             r:puts( string.format("%s: %s\n", k, v) )
116          end
117     elseif r.method == 'POST' then
118         for k, v in pairs( r:parsebody() ) do
119             r:puts( string.format("%s: %s\n", k, v) )
120         end
121         
122     else
123         r:puts("Unsupported HTTP method " .. r.method)
124     end
125 end
126 </highlight>
127
128 <p>
129 Ce gestionnaire se contente d'afficher les arguments cod&eacute;s d'un uri ou
130 d'un formulaire dans un page au format texte.
131 </p>
132
133 <p>
134 Cela signifie que vous pouvez (et &ecirc;tes encourag&eacute; &agrave;) avoir plusieurs
135 gestionnaires (ou points d'entr&eacute;e, ou filtres) dans le m&ecirc;me script.
136 </p>
137
138 </section>
139 <section id="writingauthzproviders">
140 <title>Ecriture de fournisseurs d'autorisation</title>
141
142 <p><module>mod_authz_core</module> fournit une interface d'autorisation
143 de haut niveau bien plus facile &agrave; utiliser que dans les hooks
144 correspondants. Le premier argument de la directive <directive
145 module="mod_authz_core">Require</directive> permet de sp&eacute;cifier le
146 fournisseur d'autorisation &agrave; utiliser. Pour chaque directive <directive
147 module="mod_authz_core">Require</directive>,
148 <module>mod_authz_core</module> appellera le fournisseur d'autorisation
149 sp&eacute;cifi&eacute;, le reste de la ligne constituant les param&egrave;tres. Le
150 fournisseur consid&eacute;r&eacute; va alors v&eacute;rifier les autorisations et fournir le
151 r&eacute;sultat dans une valeur de retour.</p>
152
153 <p>En g&eacute;n&eacute;ral, le fournisseur authz est appel&eacute; avant l'authentification.
154 S'il doit conna&icirc;tre le nom d'utilisateur authentifi&eacute; (ou si
155 l'utilisateur est appel&eacute; &agrave; &ecirc;tre authentifi&eacute;), le fournisseur doit
156 renvoyer <code>apache2.AUTHZ_DENIED_NO_USER</code>, ce qui va
157 d&eacute;clancher le processus d'authentification et un deuxi&egrave;me appel du
158 fournisseur authz.</p>
159
160 <p>La fonction du fournisseur authz ci-dessous accepte deux arguments,
161 une adresse IP et un nom d'utilisateur. Elle autorise l'acc&egrave;s dans le
162 cas o&ugrave; la requ&ecirc;te provient de l'adresse IP sp&eacute;cifi&eacute;e, ou si
163 l'utilisateur authentifi&eacute; correspond au second argument :</p>
164
165 <highlight language="lua">
166 <strong>authz_provider.lua</strong><br/>
167
168 require 'apache2'
169
170 function authz_check_foo(r, ip, user)
171     if r.useragent_ip == ip then
172         return apache2.AUTHZ_GRANTED
173     elseif r.user == nil then
174         return apache2.AUTHZ_DENIED_NO_USER
175     elseif r.user == user then
176         return apache2.AUTHZ_GRANTED
177     else
178         return apache2.AUTHZ_DENIED
179     end
180 end
181 </highlight>
182
183 <p>La configuration suivante enregistre cette fonction en tant que
184 fournisseur <code>foo</code>, et la configure por l'URL <code>/</code> :</p>
185 <highlight language="config">
186 LuaAuthzProvider foo authz_provider.lua authz_check_foo
187 &lt;Location /&gt;
188   Require foo 10.1.2.3 john_doe
189 &lt;/Location&gt;
190 </highlight>
191
192 </section>
193
194 <section id="writinghooks"><title>Ecriture de fonctions d'accroche
195 (hooks)</title>
196
197 <p>Les fonctions d'accroche d&eacute;terminent la mani&egrave;re dont les modules (et
198 les scripts Lua) participent au traitement des requ&ecirc;tes. Chaque type
199 d'accroche propos&eacute; par le serveur a un r&ocirc;le sp&eacute;cifique, comme
200 l'association de requ&ecirc;tes au syst&egrave;me de fichiers, le contr&ocirc;le d'acc&egrave;s,
201 ou la d&eacute;finition de types MIME. Il existe aussi des accroches &agrave; usage
202 g&eacute;n&eacute;ral qui s'ex&eacute;cutent simplement &agrave; des moments opportuns du cycle
203 de vie de la requ&ecirc;te.</p>
204
205 <p>Les fonctions d'accroche acceptent l'objet de la requ&ecirc;te comme seul
206 et unique argument. Elles peuvent renvoyer une valeur, selon la
207 fonction, mais il s'agit en g&eacute;n&eacute;ral d'un
208 code d'&eacute;tat HTTP ou des valeurs OK, DONE, ou DECLINED,
209 que vous pouvez &eacute;crire dans lua sous la forme <code>apache2.OK</code>,
210 <code>apache2.DONE</code>, ou <code>apache2.DECLINED</code>.</p>
211
212 <highlight language="lua">
213 <strong>translate_name.lua</strong>
214 -- exemple d'accroche qui r&eacute;&eacute;crit un URI en chemin du syst&egrave;me de
215 fichiers.
216
217 require 'apache2'
218
219 function translate_name(r)
220     if r.uri == "/translate-name" then
221         r.filename = r.document_root .. "/find_me.txt"
222         return apache2.OK
223     end
224     -- on ne g&egrave;re pas cette URL et on donne sa chance &agrave; un autre module
225     return apache2.DECLINED
226 end
227 </highlight>
228
229 <highlight language="lua">
230 <strong>translate_name2.lua</strong>
231 --[[ exemple d'accroche qui r&eacute;&eacute;crit un URI vers un autre URI. Il renvoie
232         un apache2.DECLINED pour permettre &agrave; un autre interpr&eacute;teur d'URL de
233         travailler sur la substitution, y compris l'accroche translate_name
234         de base dont les tables de correspondances se basent sur DocumentRoot.
235
236      Note: actuellement, il est impossible de pr&eacute;voir si cette action
237      s'ex&eacute;cute avant ou apr&egrave;s mod_alias.
238 --]]
239
240 require 'apache2'
241
242 function translate_name(r)
243     if r.uri == "/translate-name" then
244         r.uri = "/find_me.txt"
245         return apache2.DECLINED
246     end
247     return apache2.DECLINED
248 end
249 </highlight>
250 </section>
251
252 <section id="datastructures"><title>Structures de donn&eacute;es</title>
253
254 <dl>
255 <dt>request_rec</dt>
256         <dd>
257         <p>request_rec est consid&eacute;r&eacute;e en tant que donn&eacute;e utilisateur.
258         Elle poss&egrave;de une m&eacute;tatable qui vous permet d'accomplir des
259         choses int&eacute;ressantes. Pour la plus grande partie, elle poss&egrave;de
260         les m&ecirc;mes champs que la structure request_rec (voir httpd.h en
261         attendant que cette documentation soit plus compl&egrave;te), la
262         plupart d'entre eux &eacute;tant accessibles en lecture et &eacute;criture (le
263         contenu des champs de la table peut &ecirc;tre modifi&eacute;, mais les
264         champs eux-m&ecirc;mes ne peuvent pas &ecirc;tre &eacute;tablis en tant que tables
265         distinctes).</p>
266
267         <table border="1">
268
269         <tr>
270           <th><strong>Nom</strong></th>
271           <th><strong>Type Lua</strong></th>
272           <th><strong>Modifiable</strong></th>
273         </tr>
274         <tr>
275           <td><code>ap_auth_type</code></td>
276           <td>string</td>
277           <td>non</td>
278         </tr>
279         <tr>
280           <td><code>args</code></td>
281           <td>string</td>
282           <td>oui</td>
283         </tr>
284         <tr>
285           <td><code>assbackwards</code></td>
286           <td>boolean</td>
287           <td>non</td>
288         </tr>
289
290         <tr>
291           <td><code>canonical_filename</code></td>
292           <td>string</td>
293           <td>non</td>
294         </tr>
295         <tr>
296           <td><code>content_encoding</code></td>
297           <td>string</td>
298           <td>non</td>
299         </tr>
300         <tr>
301           <td><code>content_type</code></td>
302           <td>string</td>
303           <td>oui</td>
304         </tr>
305         <tr>
306           <td><code>context_prefix</code></td>
307           <td>string</td>
308           <td>non</td>
309         </tr>
310         <tr>
311           <td><code>context_document_root</code></td>
312           <td>string</td>
313           <td>non</td>
314         </tr>
315
316         <tr>
317           <td><code>document_root</code></td>
318           <td>string</td>
319           <td>non</td>
320         </tr>
321         <tr>
322           <td><code>err_headers_out</code></td>
323           <td>table</td>
324           <td>non</td>
325         </tr>
326         <tr>
327           <td><code>filename</code></td>
328           <td>string</td>
329           <td>oui</td>
330         </tr>
331         <tr>
332           <td><code>handler</code></td>
333           <td>string</td>
334           <td>oui</td>
335         </tr>
336         <tr>
337           <td><code>headers_in</code></td>
338           <td>table</td>
339           <td>oui</td>
340         </tr>
341         <tr>
342           <td><code>headers_out</code></td>
343           <td>table</td>
344           <td>oui</td>
345         </tr>
346         <tr>
347           <td><code>hostname</code></td>
348           <td>string</td>
349           <td>non</td>
350         </tr>
351         <tr>
352           <td><code>log_id</code></td>
353           <td>string</td>
354           <td>non</td>
355         </tr>
356         <tr>
357           <td><code>method</code></td>
358           <td>string</td>
359           <td>non</td>
360         </tr>
361         <tr>
362           <td><code>notes</code></td>
363           <td>table</td>
364           <td>oui</td>
365         </tr>
366         <tr>
367           <td><code>path_info</code></td>
368           <td>string</td>
369           <td>non</td>
370         </tr>
371         <tr>
372           <td><code>protocol</code></td>
373           <td>string</td>
374           <td>non</td>
375         </tr>
376         <tr>
377           <td><code>proxyreq</code></td>
378           <td>string</td>
379           <td>oui</td>
380         </tr>
381         <tr>
382           <td><code>range</code></td>
383           <td>string</td>
384           <td>non</td>
385         </tr>
386         <tr>
387           <td><code>subprocess_env</code></td>
388           <td>table</td>
389           <td>oui</td>
390         </tr>
391         <tr>
392           <td><code>status</code></td>
393           <td>number</td>
394           <td>oui</td>
395         </tr>
396         <tr>
397           <td><code>the_request</code></td>
398           <td>string</td>
399           <td>non</td>
400         </tr>
401         <tr>
402           <td><code>unparsed_uri</code></td>
403           <td>string</td>
404           <td>non</td>
405         </tr>
406         <tr>
407           <td><code>uri</code></td>
408           <td>string</td>
409           <td>oui</td>
410         </tr>
411         <tr>
412           <td><code>user</code></td>
413           <td>string</td>
414           <td>oui</td>
415         </tr>
416         <tr>
417           <td><code>useragent_ip</code></td>
418           <td>string</td>
419           <td>non</td>
420         </tr>
421         </table>
422
423         <p>La structure request_rec poss&egrave;de (au minimum) les m&eacute;thodes
424         suivantes :</p>
425
426         <highlight language="lua">
427         r:addoutputfilter(name|function) -- ajoute un filtre en sortie
428         </highlight>
429
430         <highlight language="lua">
431         r:parseargs() -- renvoie une table lua contenant la cha&icirc;ne
432         d'arguments de la requ&ecirc;te
433         </highlight>
434
435         <highlight language="lua">
436         r:parsebody()([sizeLimit]) -- interpr&egrave;te le corps de la requ&ecirc;te
437         en tant que POST et renvoie une table lua. Un nombre optionnel
438         peut &ecirc;tre fourni pour sp&eacute;cifier le nombre maximal d'octets &agrave;
439         interpr&eacute;ter. La valeur par d&eacute;faut est 8192.
440         </highlight>
441
442         <highlight language="lua">
443         r:puts("bonjour", " le monde", "!") -- affichage dans le corps de la r&eacute;ponse
444         </highlight>
445
446         <highlight language="lua">
447         r:write("une simple cha&icirc;ne") -- affichage dans le
448         corps de la r&eacute;ponse
449         </highlight>
450
451         <highlight language="lua">
452         r:dbacquire(dbType[, dbParams]) -- Acquiert une connexion &agrave; une
453 base de donn&eacute;es et renvoie une classe database. Voir '<a
454 href="#databases">Connectivit&eacute; aux bases de donn&eacute;es</a>' pour plus de
455 d&eacute;tails.
456         </highlight>
457         </dd>
458     </dl>
459
460 </section>
461
462 <section id="logging"><title>Fonctions de journalisation</title>
463
464 <highlight language="lua">
465         -- exemples de messages de journalisation
466         r:trace1("Ceci est un message de journalisation de niveau
467         trace") -- les niveaux valides vont de trace1 &agrave; trace8 <br />
468         r:debug("Ceci est un message de journalisation de niveau debug")<br />
469         r:info("Ceci est un message de journalisation de niveau info")<br />
470         r:notice("Ceci est un message de journalisation de niveau notice")<br />
471         r:warn("Ceci est un message de journalisation de niveau warn")<br />
472         r:err("Ceci est un message de journalisation de niveau err")<br />
473         r:alert("Ceci est un message de journalisation de niveau alert")<br />
474         r:crit("Ceci est un message de journalisation de niveau crit")<br />
475         r:emerg("Ceci est un message de journalisation de niveau emerg")<br />
476 </highlight>
477
478 </section>
479
480 <section id="apache2"><title>Paquet apache2</title>
481 <p>Le paquet nomm&eacute; <code>apache2</code> est fourni avec (au minimum) le
482 contenu suivant :</p>
483 <dl>
484   <dt>apache2.OK</dt>
485   <dd>Constante interne OK. Les gestionnaires renverront cette valeur
486   s'ils ont trait&eacute; la requ&ecirc;te.</dd>
487   <dt>apache2.DECLINED</dt>
488   <dd>Constante interne DECLINED. Les gestionnaires renverront cette
489   valeur s'ils n'ont pas l'intention de traiter la requ&ecirc;te.</dd>
490   <dt>apache2.DONE</dt>
491   <dd>Constante interne DONE.</dd>
492   <dt>apache2.version</dt>
493   <dd>Cha&icirc;ne contenant la version du serveur HTTP Apache</dd>
494   <dt>apache2.HTTP_MOVED_TEMPORARILY</dt>
495   <dd>Code d'&eacute;tat HTTP</dd>
496   <dt>apache2.PROXYREQ_NONE, apache2.PROXYREQ_PROXY, apache2.PROXYREQ_REVERSE, apache2.PROXYREQ_RESPONSE</dt>
497   <dd>Constantes internes utilis&eacute;es par <module>mod_proxy</module></dd>
498 </dl>
499 <p>Les autres codes d'&eacute;tat HTTP ne sont pas encore impl&eacute;ment&eacute;s.</p>
500 </section>
501
502 <section id="databases">
503     <title>Connectivit&eacute; aux bases de donn&eacute;es</title>
504     <p>Mod_lua impl&eacute;mente une fonctionnalit&eacute; basique de connexion aux
505 bases de donn&eacute;es permettant d'envoyer des requ&ecirc;tes ou d'ex&eacute;cuter des
506 commandes aupr&egrave;s des moteurs de base de donn&eacute;es les plus courants
507 (mySQL, PostgreSQL, FreeTDS, ODBC, SQLite, Oracle), ainsi que mod_dbd.
508     </p>
509     <p>L'exemple suivant montre comment se connecter &agrave; une base de
510 donn&eacute;es et extraire des informations d'une table :</p>
511     <highlight language="lua">
512 function handler(r)
513     -- connexion &agrave; la base de donn&eacute;es
514     local database, err = r:dbacquire("mysql", "server=localhost,user=root,dbname=mydb")
515     if not err then
516         -- S&eacute;lection de certaines informations
517         local results, err = database:select(r, "SELECT `name`, `age` FROM `people` WHERE 1")
518         if not err then
519             local rows = results(0) -- extrait tous les enregistrements en mode synchrone
520             for k, row in pairs(rows) do
521                 r:puts( string.format("Name: %s, Age: %s&lt;br/&gt;", row[1], row[2]) )
522             end
523         else
524             r:puts("Database query error: " .. err)
525         end
526         database:close()
527     else
528         r:puts("Connexion &agrave; la base de donn&eacute;es impossible : " .. err)
529     end
530 end
531     </highlight>
532     <p>
533     Pour utiliser <module>mod_dbd</module>, sp&eacute;cifiez
534 <code>mod_dbd</code> comme type de base de donn&eacute;es, ou laissez le champ
535 vide :
536     </p>
537     <highlight language="lua">
538     local database = r:dbacquire("mod_dbd")
539     </highlight>
540     <section id="database_object">
541         <title>L'objet database et ses m&eacute;thodes</title>
542         <p>L'objet database renvoy&eacute; par <code>dbacquire</code> poss&egrave;de
543 les m&eacute;thodes suivantes :</p>
544         <p><strong>S&eacute;lection normale et requ&ecirc;te vers une base de donn&eacute;es
545 :</strong></p>
546     <highlight language="lua">
547 -- Ex&eacute;cution d'une requ&ecirc;te et renvoie du nombre d'enregistrements
548 affect&eacute;s :
549 local affected, errmsg = database:query(r, "DELETE FROM `tbl` WHERE 1")
550
551 -- Ex&eacute;cution d'une requ&ecirc;te et renvoie du r&eacute;sultat qui peut &ecirc;tre utilis&eacute;
552 en mode synchrone ou asynchrone :
553 local result, errmsg = database:select(r, "SELECT * FROM `people` WHERE 1")
554     </highlight>
555         <p><strong>Utilisation de requ&ecirc;tes pr&eacute;par&eacute;es (recommand&eacute;) :</strong></p>
556     <highlight language="lua">
557 -- Cr&eacute;ation et ex&eacute;cution d'une requ&ecirc;te pr&eacute;par&eacute;e :
558 local statement, errmsg = database:prepare(r, "DELETE FROM `tbl` WHERE `age` > %u")
559 if not errmsg then
560     local result, errmsg = statement:query(20) -- ex&eacute;cute la requ&ecirc;te pour age > 20
561 end
562
563 -- Extrait une requ&ecirc;te pr&eacute;par&eacute;e depuis une directive DBDPrepareSQL :
564 local statement, errmsg = database:prepared(r, "someTag")
565 if not errmsg then
566     local result, errmsg = statement:select("John Doe", 123) -- injecte les valeurs "John Doe" et 123 dans la requ&ecirc;te
567 end
568
569 </highlight>
570         <p><strong>Echappement de valeurs, fermeture de la base donn&eacute;es,
571 etc...</strong></p>
572     <highlight language="lua">
573 -- Echappe une valeur pour pouvoir l'utiliser dans une requ&ecirc;te :
574 local escaped = database:escape(r, [["'|blabla]])
575
576 -- Ferme une base de donn&eacute;es et lib&egrave;re les liens vers cette derni&egrave;re :
577 database:close()
578
579 -- V&eacute;rifie si une connexion &agrave; une base de donn&eacute;es est en service et
580 op&eacute;rationnelle :
581 local connected = database:active()
582     </highlight>
583     </section>
584     <section id="result_sets">
585     <title>Travail avec les jeux d'enregistrements renvoy&eacute;s par les requ&ecirc;tes</title>
586     <p>Les jeux d'enregistrements renvoy&eacute;s par <code>db:select</code> ou par des
587 requ&ecirc;tes pr&eacute;par&eacute;es cr&eacute;&eacute;es par <code>db:prepare</code> permettent de
588 s&eacute;lectionner des enregistrements en mode synchrone ou
589 asynchrone, selon le nombre d'enregistrements sp&eacute;cifi&eacute; :<br/>
590     <code>result(0)</code> s&eacute;lectionne tous les enregistrements en mode
591 synchrone en renvoyant une table d'enregistrements.<br/>
592     <code>result(-1)</code> s&eacute;lectionne le prochain enregistrement disponible en
593 mode asynchrone.<br/>
594     <code>result(N)</code> s&eacute;lectionne l'enregistrement num&eacute;ro
595 <code>N</code> en mode asynchrone.
596     </p>
597     <highlight language="lua">
598 -- extrait un jeu d'enregistrements via une requ&ecirc;te r&eacute;guli&egrave;re :
599 local result, err = db:select(r, "SELECT * FROM `tbl` WHERE 1")
600
601 local rows = result(0) -- s&eacute;lectionne tous les enregistrements en mode synchrone
602 local row = result(-1) -- s&eacute;lectionne le prochain enregistrement disponible en mode asynchrone
603 local row = result(1234) -- s&eacute;lectionne l'enregistrement 1234 en mode asynchrone
604     </highlight>
605     <p>Il est possible de construire une fonction qui renvoie une
606 fonction it&eacute;rative permettant de traiter tous les enregistrement en mode
607 synchrone ou asynchrone selon la valeur de l'argument async :
608     </p>
609     <highlight language="lua">
610 function rows(resultset, async)
611     local a = 0
612     local function getnext()
613         a = a + 1
614         local row = resultset(-1)
615         return row and a or nil, row
616     end
617     if not async then
618         return pairs(resultset(0))
619     else
620         return getnext, self
621     end
622 end
623
624 local statement, err = db:prepare(r, "SELECT * FROM `tbl` WHERE `age` > %u")
625 if not err then
626      -- s&eacute;lectionne des enregistrements en mode asynchrone :
627     local result, err = statement:select(20)
628     if not err then
629         for index, row in rows(result, true) do
630             ....
631         end
632     end
633
634      -- s&eacute;lectionne des enregistrements en mode synchrone :
635     local result, err = statement:select(20)
636     if not err then
637         for index, row in rows(result, false) do
638             ....
639         end
640     end
641 end
642     </highlight>
643     </section>
644     <section id="closing_databases">
645         <title>Fermeture d'une connexion &agrave; une base de donn&eacute;es</title>
646
647     <p>Lorsqu'elles ne sont plus utilis&eacute;es, les connexions aux bases de
648 donn&eacute;es doivent &ecirc;tre ferm&eacute;es avec <code>database:close()</code>. Si vous
649 ne les fermez pas manuellement, mod_lua les fermera peut-&ecirc;tre en tant
650 que r&eacute;sidus collect&eacute;s, mais si ce n'est pas le cas, vous pouvez finir
651 pas avoir trop de connexions vers la base de donn&eacute;es inutilis&eacute;es. Les
652 deux mesures suivantes sont pratiquement identiques :
653     </p>
654     <highlight language="lua">
655 -- M&eacute;thode 1 : fermeture manuelle de la connexion
656 local database = r:dbacquire("mod_dbd")
657 database:close() -- c'est tout
658
659 -- M&eacute;thode 2 : on laisse le collecteur de r&eacute;sidus la fermer
660 local database = r:dbacquire("mod_dbd")
661 database = nil -- on coupe le lien
662 collectgarbage() -- fermeture de la connexion par le collecteur de r&eacute;sidus
663 </highlight>
664     </section>
665     <section id="database_caveat">
666     <title>Pr&eacute;cautions &agrave; prendre lorsque l'on travaille avec les bases
667 de donn&eacute;es</title>
668     <p>Bien que les fonctions <code>query</code> et <code>run</code>
669 soient toujours disponibles, il est recommand&eacute; d'utiliser des requ&ecirc;tes
670 pr&eacute;par&eacute;es chaque fois que possible, afin d'une part d'optimiser les
671 performances (si votre connexion reste longtemps en vie), et d'autre part
672 minimiser le risque d'attaques par injection SQL. Les fonctions
673 <code>run</code> et <code>query</code> ne doivent &ecirc;tre utilis&eacute;es que
674 lorsque la requ&ecirc;te ne contient pas de variables (requ&ecirc;te statique). Dans
675 le cas des requ&ecirc;tes dynamiques, utilisez <code>db:prepare</code> ou
676 <code>db:prepared</code>.
677     </p>
678     </section>
679
680 </section>
681
682 <directivesynopsis>
683 <name>LuaRoot</name>
684 <description>Sp&eacute;cifie le chemin de base pour la r&eacute;solution des chemins
685 relatifs dans les directives de mod_lua</description>
686 <syntax>LuaRoot /chemin/vers/un/r&eacute;pertoire</syntax>
687 <contextlist><context>server config</context><context>virtual host</context>
688 <context>directory</context><context>.htaccess</context>
689 </contextlist>
690 <override>All</override>
691
692 <usage>
693     <p>Cette directive permet de sp&eacute;cifier le chemin de base qui sera
694     utilis&eacute; pour &eacute;valuer tous les chemins relatifs dans mod_lua. En
695     l'absence de cette directive, les chemins relatifs sont r&eacute;solus par
696     rapport au r&eacute;pertoire de travail courant, ce qui ne sera pas
697     toujours appropri&eacute; pour un serveur.</p>
698 </usage>
699 </directivesynopsis>
700
701 <directivesynopsis>
702 <name>LuaScope</name>
703 <description>Une valeur parmi once, request, conn, thread -- la valeur
704 par d&eacute;faut est once</description>
705 <syntax>LuaScope once|request|conn|thread -- la valeur par d&eacute;faur est
706 once</syntax>
707 <default>LuaScope once</default>
708 <contextlist><context>server config</context><context>virtual host</context>
709 <context>directory</context><context>.htaccess</context>
710 </contextlist>
711 <override>All</override>
712
713 <usage>
714     <p>Cette directive permet de sp&eacute;cifier la dur&eacute;e de vie de
715     l'interpr&eacute;teur Lua qui sera utilis&eacute; dans ce "r&eacute;pertoire". La valeur
716     par d&eacute;faut est "once".</p>
717
718    <dl>
719     <dt>once:</dt> <dd>utilise l'interpr&eacute;teur une fois.</dd>
720
721     <dt>request:</dt> <dd>utilise l'interpr&eacute;teur pour traiter tout ce
722     qui est bas&eacute; sur le m&ecirc;me fichier dans la requ&ecirc;te, et qui se trouve
723     aussi dans la port&eacute;e de la requ&ecirc;te.</dd>
724
725     <dt>conn:</dt> <dd>idem request, mais attach&eacute; &agrave; connection_rec</dd>
726     <dt>thread:</dt> <dd>Utilise l'interpr&eacute;teur pendant toute la dur&eacute;e
727     de vie du thread qui traite la requ&ecirc;te (disponible seulement avec
728     les MPMs thread&eacute;s).</dd>
729 <!-- not implemented
730     <dt>server:</dt>  <dd>Le comportement est ici diff&eacute;rent, car la
731     port&eacute;e du serveur pr&eacute;sente une dur&eacute;e de vie assez longue, et
732     plusieurs threads vont partager le m&ecirc;me server_rec. Pour g&eacute;rer tout
733     ceci, les interpr&eacute;teurs sont stock&eacute;s dans une liste de ressources
734     apr. Les arguments min et max ont &eacute;t&eacute; pr&eacute;vus pour sp&eacute;cifier une
735     taille de jeu, mais sont inutilis&eacute;s pour le moment.</dd>
736 -->
737    </dl>
738 </usage>
739 </directivesynopsis>
740
741 <!--
742 +/* Not implemented in 2.4.x yet */
743 <directivesynopsis>
744 <name>LuaMapHandler</name>
745 <description>Met en correspondance un chemin avec un gestionnaire lua</description>
746 <syntax>LuaMapHandler modele-uri /chemin/vers/lua/script.lua
747 [nom-fonction]</syntax>
748 <contextlist><context>server config</context><context>virtual host</context>
749 <context>directory</context><context>.htaccess</context>
750 </contextlist>
751 <override>All</override>
752 <usage>
753     <p>Cette directive permet de faire correspondre un mod&egrave;le d'uri avec
754     une fonction de gestionnaire situ&eacute;e dans un fichier sp&eacute;cifique. Elle
755     utilise les expressions rationnelles PCRE pour mettre en
756     correspondance l'uri, et supporte les groupes de correspondance
757     d'interpolation dans le chemin du fichier et le nom de la fonction.
758     Prenez garde aux probl&egrave;mes de s&eacute;curit&eacute; en &eacute;crivant vos expressions
759     rationnelles.</p>
760    <example><title>Exemples :</title>
761     <highlight language="config">
762     LuaMapHandler /(\w+)/(\w+) /scripts/$1.lua handle_$2
763     </highlight>
764    </example>
765         <p>Cette directive va faire correspondre des uri comme
766         /photos/show?id=9 au fichier /scripts/photos.lua, et invoquera la
767         fonction de gestionnaire handle_show au niveau de la vm lua
768         apr&egrave;s chargement de ce fichier.</p>
769
770 <highlight language="config">
771     LuaMapHandler /bingo /scripts/wombat.lua
772 </highlight>
773         <p>Cette directive invoquera la fonction "handle" qui est la
774         valeur par d&eacute;faut si aucun nom de fonction sp&eacute;cifique n'est
775         sp&eacute;cifi&eacute;.</p>
776 </usage>
777 </directivesynopsis>
778 -->
779
780 <directivesynopsis>
781 <name>LuaPackagePath</name>
782 <description>Ajoute un r&eacute;pertoire au package.path de lua</description>
783 <syntax>LuaPackagePath /chemin/vers/include/?.lua</syntax>
784 <contextlist><context>server config</context><context>virtual host</context>
785 <context>directory</context><context>.htaccess</context>
786 </contextlist>
787 <override>All</override>
788     <usage><p>Cette directive permet d'ajouter un chemin &agrave; la liste des
789     chemins de recherche du module lua. Elle suit les m&ecirc;mes conventions
790     que lua. Ceci modifie le package.path dans les vms lua.</p>
791
792     <example><title>Exemples :</title>
793         <highlight language="config">
794 LuaPackagePath /scripts/lib/?.lua
795 LuaPackagePath /scripts/lib/?/init.lua
796     </highlight>
797     </example>
798 </usage>
799 </directivesynopsis>
800
801 <directivesynopsis>
802 <name>LuaPackageCPath</name>
803 <description>Ajoute un r&eacute;pertoire au package.cpath de lua</description>
804 <syntax>LuaPackageCPath /chemin/vers/include/?.soa</syntax>
805 <contextlist><context>server config</context><context>virtual host</context>
806 <context>directory</context><context>.htaccess</context>
807 </contextlist>
808 <override>All</override>
809
810 <usage>
811     <p>Cette directive permet d'ajouter un chemin &agrave; la liste des chemins
812     de recherche des biblioth&egrave;ques partag&eacute;es de lua. Ceci modifie le
813     package.cpath dans les vms lua.</p>
814
815 </usage>
816 </directivesynopsis>
817
818 <!-- Not implemented yet
819 <directivesynopsis>
820 <name>LuaCodeCache</name>
821 <description>Configure le cache de code compil&eacute;.</description>
822 <syntax>LuaCodeCache stat|forever|never</syntax>
823 <default>LuaCodeCache stat</default>
824 <contextlist><context>server config</context><context>virtual host</context>
825 <context>directory</context><context>.htaccess</context>
826 </contextlist>
827 <override>All</override>
828
829 <usage><p>
830     Cette directive permet de d&eacute;finir le comportement du cache de code
831     en m&eacute;moire. La valeur par d&eacute;faut est stat ; dans ce cas, le script
832     du niveau le plus haut (et pas les scripts inclus) est v&eacute;rifi&eacute; &agrave;
833     chaque fois que ce fichier est n&eacute;cessaire, et est recharg&eacute; si la
834     date de modification est plus r&eacute;cente que celle du script d&eacute;j&agrave;
835     charg&eacute;. Les autres valeurs permettent respectivement de garder le
836     fichier en cache perp&eacute;tuellement (forever - jamais v&eacute;rifi&eacute; ni
837     remplac&eacute;), ou de ne jamais le mettre en cache (never).</p>
838
839     <p>En g&eacute;n&eacute;ral, les valeurs stat et forever sont utilis&eacute;es pour un
840     serveur en production, et les valeurs stat ou never pour un serveur
841     en d&eacute;veloppement.</p>
842
843     <example><title>Exemples :</title>
844         <highlight language="config">
845 LuaCodeCache stat
846 LuaCodeCache forever
847 LuaCodeCache never
848     </highlight>
849     </example>
850
851 </usage>
852 </directivesynopsis>
853 -->
854
855 <directivesynopsis>
856 <name>LuaHookTranslateName</name>
857 <description>Fournit un point d'entr&eacute;e &agrave; la phase du nom de
858 traduction du traitement de la requ&ecirc;te</description>
859 <syntax>LuaHookTranslateName  /chemin/vers/lua/script.lua  nom_fonction_hook [early|late]</syntax>
860 <contextlist><context>server config</context><context>virtual host</context>
861 </contextlist>
862 <override>All</override>
863 <compatibility>Le troisi&egrave;me argument optionnel est disponible depuis la
864 version 2.3.15 du serveur HTTP Apache.</compatibility>
865
866 <usage><p>
867     Cette directive permet d'ajouter un point d'entr&eacute;e (&agrave;
868     APR_HOOK_MIDDLE) &agrave; la phase du nom de traduction du traitement de la
869     requ&ecirc;te. La fonction hook accepte un seul argument, le request_rec,
870     et doit renvoyer un code d'&eacute;tat qui est soit un code d'erreur HTTP,
871     ou une constante d&eacute;finie dans le module apache2 :  apache2.OK,
872     apache2.DECLINED, ou apache2.DONE.</p>
873
874     <p>Pour ceux qui ne sont pas familiers avec les points d'entr&eacute;e
875     (hook), en gros, chaque hook sera invoqu&eacute; jusqu'&agrave; ce que l'un
876     d'entre eux renvoie apache2.OK. Si un hook n'effectuer pas la
877     traduction, il doit juste renvoyer apache2.DECLINED. Si le
878     traitement de la requ&ecirc;te doit &ecirc;tre interrompu, la valeur renvoy&eacute;e
879     doit &ecirc;tre apache2.DONE.</p>
880
881     <p>Exemple :</p>
882
883 <highlight language="config">
884 # httpd.conf
885 LuaHookTranslateName /scripts/conf/hooks.lua silly_mapper
886 </highlight>
887
888 <highlight language="lua">
889 -- /scripts/conf/hooks.lua --
890 require "apache2"
891 function silly_mapper(r)
892     if r.uri == "/" then
893         r.filename = "/var/www/home.lua"
894         return apache2.OK
895     else
896         return apache2.DECLINED
897     end
898 end
899 </highlight>
900
901    <note><title>Contexte</title><p>Cette directive ne peut &ecirc;tre
902    utilis&eacute;e ni &agrave; l'int&eacute;rieur d'une section <directive type="section"
903    module="core">Directory</directive> ou <directive type="section"
904    module="core">Files</directive>, ni dans un fichier htaccess.</p></note>
905
906    <note><title>Ordonnancement</title><p>Les arguments optionnels
907    "early" ou "late" permettent de contr&ocirc;ler le moment auquel ce script
908    s'ex&eacute;cute par rapport aux autres modules.</p></note>
909 </usage>
910 </directivesynopsis>
911
912 <directivesynopsis>
913 <name>LuaHookFixups</name>
914 <description>Fournit un point d'entr&eacute;e pour la phase de correction du
915 traitement de la requ&ecirc;te</description>
916 <syntax>LuaHookFixups  /chemin/vers/lua/script.lua hook_function_name</syntax>
917 <contextlist><context>server config</context><context>virtual host</context>
918 <context>directory</context><context>.htaccess</context>
919 </contextlist>
920 <override>All</override>
921 <usage>
922 <p>
923     Idem LuaHookTranslateName, mais s'ex&eacute;cute durant la phase de
924     correction.
925 </p>
926 </usage>
927 </directivesynopsis>
928
929 <directivesynopsis>
930 <name>LuaHookMapToStorage</name>
931 <description>Fournit un point d'entr&eacute;e pour la phase map_to_storage du
932 traitement de la requ&ecirc;te</description>
933 <syntax>LuaHookMapToStorage  /chemin/vers/lua/script.lua hook_function_name</syntax>
934 <contextlist><context>server config</context><context>virtual host</context>
935 <context>directory</context><context>.htaccess</context>
936 </contextlist>
937 <override>All</override>
938     <usage><p>...</p></usage>
939 </directivesynopsis>
940
941 <directivesynopsis>
942 <name>LuaHookCheckUserID</name>
943 <description>Fournit un point d'entr&eacute;e pour la phase check_user_id du
944 traitement de la requ&ecirc;te</description>
945 <syntax>LuaHookCheckUserID  /chemin/vers/lua/script.lua hook_function_name [early|late]</syntax>
946 <contextlist><context>server config</context><context>virtual host</context>
947 <context>directory</context><context>.htaccess</context>
948 </contextlist>
949 <override>All</override>
950 <compatibility>Le troisi&egrave;me argument optionnel est disponible depuis la
951 version 2.3.15 du serveur HTTP Apache.</compatibility>
952 <usage><p>...</p>
953    <note><title>Ordonnancement</title><p>Les arguments optionnels
954    "early" ou "late" permettent de contr&ocirc;ler le moment auquel ce script
955    s'ex&eacute;cute par rapport aux autres modules.</p></note>
956 </usage>
957 </directivesynopsis>
958
959 <directivesynopsis>
960 <name>LuaHookTypeChecker</name>
961 <description>Fournit un point d'entr&eacute;e pour la phase type_checker du
962 traitement de la requ&ecirc;te</description>
963 <syntax>LuaHookTypeChecker  /chemin/vers/lua/script.lua hook_function_name</syntax>
964 <contextlist><context>server config</context><context>virtual host</context>
965 <context>directory</context><context>.htaccess</context>
966 </contextlist>
967 <override>All</override>
968     <usage><p>...</p></usage>
969 </directivesynopsis>
970
971 <directivesynopsis>
972 <name>LuaHookAuthChecker</name>
973 <description>Fournit un point d'entr&eacute;e pour la phase auth_checker du
974 traitement de la requ&ecirc;te</description>
975 <syntax>LuaHookAuthChecker  /chemin/vers/lua/script.lua hook_function_name [early|late]</syntax>
976 <contextlist><context>server config</context><context>virtual host</context>
977 <context>directory</context><context>.htaccess</context>
978 </contextlist>
979 <override>All</override>
980 <compatibility>Le troisi&egrave;me argument optionnel est disponible depuis la
981 version 2.3.15 du serveur HTTP Apache.</compatibility>
982     <usage>
983 <p>Invoque une fonction lua au cours de la phase auth_checker du
984 traitement de la requ&ecirc;te. Cette directive peut s'utiliser pour
985 impl&eacute;menter une v&eacute;rification arbitraire de l'authentification et de
986 l'autorisation. Voici un exemple tr&egrave;s simple :
987 </p>
988 <highlight language="lua">
989 require 'apache2'
990
991 -- fonction d'accroche authcheck fictive
992 -- Si la requ&ecirc;te ne contient aucune donn&eacute;e d'authentification, l'en-t&ecirc;te
993 -- de la r&eacute;ponse est d&eacute;fini et un code 401 est renvoy&eacute; afin de demander au
994 -- navigateur d'effectuer une authentification basique. Si la requ&ecirc;te
995 -- comporte des donn&eacute;es d'authentification, elles ne sont pas vraiment
996 -- consult&eacute;es, mais on admet la prise en compte de l'utilisateur 'foo' et
997 -- on la valide. On v&eacute;rifie ensuite si l'utilisateur est bien 'foo' et on
998 -- accepte la requ&ecirc;te.
999 function authcheck_hook(r)
1000
1001    -- recherche des informations d'authentification
1002    auth = r.headers_in['Authorization']
1003    if auth ~= nil then
1004      -- d&eacute;finition d'un utilisateur par d&eacute;faut
1005      r.user = 'foo'
1006    end
1007
1008    if r.user == nil then
1009       r:debug("authcheck: user is nil, returning 401")
1010       r.err_headers_out['WWW-Authenticate'] = 'Basic realm="WallyWorld"'
1011       return 401
1012    elseif r.user == "foo" then
1013       r:debug('user foo: OK')
1014    else
1015       r:debug("authcheck: user='" .. r.user .. "'")
1016       r.err_headers_out['WWW-Authenticate'] = 'Basic realm="WallyWorld"'
1017       return 401
1018    end
1019    return apache2.OK
1020 end
1021 </highlight>
1022 <note><title>Ordonnancement</title><p>Les arguments optionnels
1023    "early" ou "late" permettent de contr&ocirc;ler le moment auquel ce script
1024    s'ex&eacute;cute par rapport aux autres modules.</p></note>
1025 </usage>
1026 </directivesynopsis>
1027
1028 <directivesynopsis>
1029 <name>LuaHookAccessChecker</name>
1030 <description>Fournit un point d'entr&eacute;e pour la phase access_checker du
1031 traitement de la requ&ecirc;te</description>
1032 <syntax>LuaHookAccessChecker  /chemin/vers/lua/script.lua  hook_function_name [early|late]</syntax>
1033 <contextlist><context>server config</context><context>virtual host</context>
1034 <context>directory</context><context>.htaccess</context>
1035 </contextlist>
1036 <override>All</override>
1037 <compatibility>Le troisi&egrave;me argument optionnel est disponible depuis la
1038 version 2.3.15 du serveur HTTP Apache.</compatibility>
1039
1040 <usage>
1041 <p>Ajoute votre fonction d'accroche &agrave; la phase access_checker. Une
1042 fonction d'accroche access checker renvoie en g&eacute;n&eacute;ral OK, DECLINED, ou
1043 HTTP_FORBIDDEN.</p>
1044 <note><title>Ordonnancement</title><p>Les arguments optionnels
1045    "early" ou "late" permettent de contr&ocirc;ler le moment auquel ce script
1046    s'ex&eacute;cute par rapport aux autres modules.</p></note>
1047 </usage>
1048 </directivesynopsis>
1049 <directivesynopsis>
1050 <name>LuaHookInsertFilter</name>
1051 <description>Fournit un point d'entr&eacute;e pour la phase insert_filter du
1052 traitement de la requ&ecirc;te</description>
1053 <syntax>LuaHookInsertFilter  /chemin/vers/lua/script.lua hook_function_name</syntax>
1054 <contextlist><context>server config</context><context>virtual host</context>
1055 <context>directory</context><context>.htaccess</context>
1056 </contextlist>
1057 <override>All</override>
1058     <usage><p>Non encore impl&eacute;ment&eacute;</p></usage>
1059 </directivesynopsis>
1060
1061 <directivesynopsis>
1062 <name>LuaInherit</name>
1063 <description>Contr&ocirc;le la mani&egrave;re dont les sections de configuration
1064 parentes sont fusionn&eacute;es dans les enfants</description>
1065 <syntax>LuaInherit none|parent-first|parent-last</syntax>
1066 <default>LuaInherit parent-first</default>
1067 <contextlist><context>server config</context><context>virtual host</context>
1068 <context>directory</context><context>.htaccess</context>
1069 </contextlist>
1070 <override>All</override>
1071 <compatibility>Versions 2.4.0 et sup&eacute;rieures</compatibility>
1072     <usage><p>Par d&eacute;faut, si des directives LuaHook* se trouvent dans
1073     des sections de configuration Directory ou Location qui se
1074     chevauchent, les scripts
1075     d&eacute;finis dans les sections les plus sp&eacute;cifiques s'ex&eacute;cutent
1076     <em>apr&egrave;s</em> ceux d&eacute;finis dans les sections plus g&eacute;n&eacute;riques
1077     (LuaInherit parent-first). Vous pouvez inverser cet ordre, ou faire
1078     en sorte que le contexte parent ne s'applique pas du tout.</p>
1079
1080     <p>Jusqu'aux versions 2.3.x, le comportement par d&eacute;faut consistait &agrave;
1081     ignorer les directives LuaHook* situ&eacute;es dans les sections de
1082     configuration parentes.</p></usage>
1083 </directivesynopsis>
1084
1085 <directivesynopsis>
1086 <name>LuaQuickHandler</name>
1087 <description>Fournit un point d'entr&eacute;e pour la gestion rapide du
1088 traitement de la requ&ecirc;te</description>
1089 <syntax>LuaQuickHandler /path/to/script.lua hook_function_name</syntax>
1090 <contextlist><context>server config</context><context>virtual host</context>
1091 </contextlist>
1092 <override>All</override>
1093 <usage><p>...</p>
1094    <note><title>Contexte</title><p>Cette directive ne peut &ecirc;tre
1095    utilis&eacute;e ni &agrave; l'int&eacute;rieur d'une section <directive type="section"
1096    module="core">Directory</directive> ou <directive type="section"
1097    module="core">Files</directive>, ni dans un fichier htaccess.</p></note>
1098 </usage>
1099 </directivesynopsis>
1100
1101 <directivesynopsis>
1102 <name>LuaAuthzProvider</name>
1103 <description>Branche une fonction fournisseur d'autorisation dans <module>mod_authz_core</module>
1104 </description>
1105 <syntax>LuaAuthzProvider provider_name /path/to/lua/script.lua function_name</syntax>
1106 <contextlist><context>server config</context> </contextlist>
1107 <compatibility>Disponible depuis la version 2.4.3 du serveur HTTP Apache</compatibility>
1108
1109 <usage>
1110 <p>Lorsqu'une fonction lua a &eacute;t&eacute; enregistr&eacute;e en tant que fournisseur
1111 d'autorisation, elle peut &ecirc;tre appel&eacute;e via la directive <directive
1112 module="mod_authz_core">Require</directive> :</p>
1113
1114
1115 <example>
1116 <highlight language="config">
1117 LuaRoot /usr/local/apache2/lua
1118 LuaAuthzProvider foo authz.lua authz_check_foo
1119 &lt;Location /&gt;
1120   Require foo bar
1121 &lt;/Location&gt;
1122 </highlight>
1123 </example>
1124
1125 </usage>
1126 </directivesynopsis>
1127
1128 </modulesynopsis>
1129