Portage vers Apache 2.0

En plus de notre présentation précédente sur l’écriture de nouveaux modules pour Apache 2.0, qui est essentiellement identique à l’écriture pour Apache 1.x, nous allons vous montrer ici comment en porter un.

Tout d’abord, il est sûrement plus facile de compiler le module avec apxs (bien que nous n’aimions pas beaucoup cette approche, elle est malheureusement bien plus facile). Vous devrez avoir configuré Apache de la façon suivante :

./configure --enable-so

La compilation de mod_reveal est alors assez simple :

apxs -c mod_reveal.c

Cela produira le fichier .libs/mod_reveal.so (si vous utilisez l’option -i, apxs l’installera gentiment dans /usr/local/apache2/lib ). Cependant, la compilation de la version 1.x de mod_reveal produit un grand nombre d’erreurs (vous pourriez vous économiser beaucoup de soucis en ajoutant -Wc,-Wall et -Wc,-Werror à la ligne de commande). Le premier problème est que certains fichiers en-têtes ont été divisés et déplacés. Nous devons donc ajouter :

#include "http_request.h"

pour disposer de la définition de server_rec.

De plus, de nombreuses structures de données et fonctions d’Apache 1.3 ont des noms qui peuvent provoquer des conflits avec les autres bibliothèques, ils ont donc tous été préfixés pour tenter de les rendre uniques. Les préfixes sont ap_, apr_ et apu_ selon qu’ils appartiennent à Apache, à APR ou à APR-util. Les noms des structures de données ont également été suffixés par _t : ainsi, pool est devenu apr_pool_t. De nombreuses fonctions sont passées de ap_ à apr_ : ap_pstrcat( ), par exemple, est devenu apr_pstrcat( ) et nécessite maintenant l’inclusion du fichier apr_strings.h.

Les fonctions qui ne prenaient pas de paramètres pool doivent maintenant le faire. Ainsi :

ap_add_version_component("Reveal/0.0");

devient :

ap_add_version_component(pPool,"Reveal/0.0");

La structure de commande contrôle maintenant les types et utilise des macros spéciales pour chaque type de commande, en fonction de son nombre de paramètres. Ainsi :

static command_rec aCommands[]=

{

{ "RevealTag", RevealTag, NULL, ACCESS_CONF|OR_ALL, TAKE1,
"a tag for this section"},

{ "RevealServerTag", RevealServerTag, NULL, RSRC_CONF, TAKE1,

"a tag for this server" },

{ NULL }

};

devient :

static command_rec aCommands[]=

{

AP_INIT_TAKE1("RevealTag", RevealTag, NULL, ACCESS_CONF|OR_ALL,

"a tag for this section"),

AP_INIT_TAKE1("RevealServerTag", RevealServerTag, NULL, RSRC_CONF,

"a tag for this server" ),

{ NULL }

};

Une conséquence de cette vérification des types est que l’on ne peut plus utiliser d’astuces. Ainsi :

static const char *RevealServerTag(cmd_parms *cmd, SPerDir *pPerDir, char *arg)
{

devient :

static const char *RevealServerTag(cmd_parms *cmd, void *_pPerDir,
const char *arg)

{

SPerDir *pPerDir=_pPerDir;

Les handlers ont totalement été modifiés et sont maintenant gérés par des hooks. Ainsi, à la place de :

static int RevealHandler(request_rec *pReq)

{

SPerDir *pPerDir=ap_get_module_config(pReq->per_dir_config,

&reveal_module);

SPerServer *pPerServer=ap_get_module_config(pReq->server->

module_config,&reveal_module);

.

.

.

static handler_rec aHandlers[]=

{

{ "reveal", RevealHandler },

{ NULL },

};

nous avons maintenant :

static int RevealHandler(request_rec *pReq)

{

SPerDir *pPerDir;

SPerServer *pPerServer;

 

if(strcmp(pReq->handler,"reveal"))

return DECLINED;

 

pPerDir=ap_get_module_config(pReq->per_dir_config, &reveal_module);

pPerServer=ap_get_module_config(pReq->server->module_config, &reveal_module);

.

.

.

et une entrée ap_hook_handler( ) dans la fonction RegisterHooks( ) mentionnée plus loin.

Évidemment, nous n’avons pas présenté toutes les modifications de l’API mais celle d’Apache 2.0, à la différence de celle d’Apache 1.x, est soigneusement documentée. Cette documentation est disponible à la fois dans les fichiers en-têtes et, via l’utilisation de l’outil doxygen, sur le Web (et, évidemment, dans la distribution). La documentation web d’APR et APR-util est disponible sur http://apr.apache.org/. Pour produire une documentation de tout ce qui est documenté, faites :

make dox

à la racine des sources d’Apache 2.0, bien qu’au moment où ce livre est écrit, il faille légèrement modifier docs/doxygen.conf. Il n’y a, malheureusement, pas d’autres moyens actuellement pour connaître les modifications de l’API que de la parcourir. À ce titre, la commande grep vous sera très utile.

Lorsque les modifications de l’API ont été traitées, le problème suivant consiste à basculer vers le nouveau système de hooks. Dans la version 1.3, nous avions :

module reveal_module = {

STANDARD_MODULE_STUFF,

RevealInit, /* initializer */

RevealCreateDir, /* dir config creater */

RevealMergeDir, /* dir merger --- default is to override */

RevealCreateServer, /* server config */

RevealMergeServer, /* merge server configs */

aCommands, /* command table */ a

Handlers, /* handlers */

RevealTranslate, /* filename translation */

RevealCheckUserID, /* check_user_id */

RevealCheckAuth, /* check auth */

RevealCheckAccess, /* check access */

RevealTypeChecker, /* type_checker */

RevealFixups, /* fixups */

RevealLogger, /* logger */

RevealHeaderParser, /* header parser */

RevealChildInit, /* child init */

RevealChildExit, /* child exit */

RevealPostReadRequest, /* post read request */

};

Dans la version 2.0, cela devient beaucoup plus court car tous les hooks sont maintenant initialisés dans une seule fonction. Tout cela est détaillé dans le chapitre précédent, mais voici ce que cela donnerait :

static void RegisterHooks(apr_pool_t *pPool)

{

ap_hook_post_config(RevealInit,NULL,NULL,APR_HOOK_MIDDLE);

ap_hook_handler(RevealHandler,NULL,NULL,APR_HOOK_MIDDLE);

ap_hook_translate_name(RevealTranslate,NULL,NULL,APR_HOOK_MIDDLE);

ap_hook_check_user_id(RevealCheckUserID,NULL,NULL,APR_HOOK_MIDDLE);

ap_hook_auth_checker(RevealCheckAuth,NULL,NULL,APR_HOOK_MIDDLE);

ap_hook_access_checker(RevealCheckAccess,NULL,NULL,APR_HOOK_MIDDLE);

ap_hook_type_checker(RevealTypeChecker,NULL,NULL,APR_HOOK_MIDDLE);

ap_hook_fixups(RevealFixups,NULL,NULL,APR_HOOK_MIDDLE);

ap_hook_log_transaction(RevealLogger,NULL,NULL,APR_HOOK_MIDDLE);

ap_hook_header_parser(RevealHeaderParser,NULL,NULL,APR_HOOK_MIDDLE);

ap_hook_child_init(RevealChildInit,NULL,NULL,APR_HOOK_MIDDLE);

ap_hook_post_read_request(RevealPostReadRequest,NULL,NULL,APR_HOOK_MIDDLE);

}

 

module reveal_module = {

STANDARD20_MODULE_STUFF,

RevealCreateDir, /* dir config creater */

RevealMergeDir, /* dir merger --- default is to override */

RevealCreateServer, /* server config */

RevealMergeServer, /* merge server configs */

aCommands, /* command table */

RegisterHooks /* hook registration */

};

Un problème mineur est que :

static void RevealChildInit(server_rec *pServer,apr_pool_t *pPool)

doit maintenant être :

static void RevealChildInit(apr_pool_t *pPool,server_rec *pServer)

Et, ce qui est plus effrayant :

static void RevealInit(server_rec *pServer,apr_pool_t *pPool)

devient :

static int RevealInit(apr_pool_t *pPool,apr_pool_t *pLog,apr_pool_t *pTemp,
server_rec *pServer)

et renvoie une valeur OK, ce qui convient très bien à notre cas. Notez également que nous n’avons plus de hook child_exit -- une fonction pool-cleanup peut s’en charger.

C’est tout (pour ce module au moins) ! Il reste maintenant à le charger avec une directive AddModule appropriée :

LoadModule reveal_module .mod_reveal.so

et il se comportera exactement comme la version Apache 1.3.

Apache La référence
titlepage.xhtml
APACHE-la-REF_split_000.htm
APACHE-la-REF_split_001.htm
APACHE-la-REF_split_002.htm
APACHE-la-REF_split_003.htm
APACHE-la-REF_split_004.htm
APACHE-la-REF_split_005.htm
APACHE-la-REF_split_006.htm
APACHE-la-REF_split_007.htm
APACHE-la-REF_split_008.htm
APACHE-la-REF_split_009.htm
APACHE-la-REF_split_010.htm
APACHE-la-REF_split_011.htm
APACHE-la-REF_split_012.htm
APACHE-la-REF_split_013.htm
APACHE-la-REF_split_014.htm
APACHE-la-REF_split_015.htm
APACHE-la-REF_split_016.htm
APACHE-la-REF_split_017.htm
APACHE-la-REF_split_018.htm
APACHE-la-REF_split_019.htm
APACHE-la-REF_split_020.htm
APACHE-la-REF_split_021.htm
APACHE-la-REF_split_022.htm
APACHE-la-REF_split_023.htm
APACHE-la-REF_split_024.htm
APACHE-la-REF_split_025.htm
APACHE-la-REF_split_026.htm
APACHE-la-REF_split_027.htm
APACHE-la-REF_split_028.htm
APACHE-la-REF_split_029.htm
APACHE-la-REF_split_030.htm
APACHE-la-REF_split_031.htm
APACHE-la-REF_split_032.htm
APACHE-la-REF_split_033.htm
APACHE-la-REF_split_034.htm
APACHE-la-REF_split_035.htm
APACHE-la-REF_split_036.htm
APACHE-la-REF_split_037.htm
APACHE-la-REF_split_038.htm
APACHE-la-REF_split_039.htm
APACHE-la-REF_split_040.htm
APACHE-la-REF_split_041.htm
APACHE-la-REF_split_042.htm
APACHE-la-REF_split_043.htm
APACHE-la-REF_split_044.htm
APACHE-la-REF_split_045.htm
APACHE-la-REF_split_046.htm
APACHE-la-REF_split_047.htm
APACHE-la-REF_split_048.htm
APACHE-la-REF_split_049.htm
APACHE-la-REF_split_050.htm
APACHE-la-REF_split_051.htm
APACHE-la-REF_split_052.htm
APACHE-la-REF_split_053.htm
APACHE-la-REF_split_054.htm
APACHE-la-REF_split_055.htm
APACHE-la-REF_split_056.htm
APACHE-la-REF_split_057.htm
APACHE-la-REF_split_058.htm
APACHE-la-REF_split_059.htm
APACHE-la-REF_split_060.htm
APACHE-la-REF_split_061.htm
APACHE-la-REF_split_062.htm
APACHE-la-REF_split_063.htm
APACHE-la-REF_split_064.htm
APACHE-la-REF_split_065.htm
APACHE-la-REF_split_066.htm
APACHE-la-REF_split_067.htm
APACHE-la-REF_split_068.htm
APACHE-la-REF_split_069.htm
APACHE-la-REF_split_070.htm
APACHE-la-REF_split_071.htm
APACHE-la-REF_split_072.htm
APACHE-la-REF_split_073.htm
APACHE-la-REF_split_074.htm
APACHE-la-REF_split_075.htm
APACHE-la-REF_split_076.htm
APACHE-la-REF_split_077.htm
APACHE-la-REF_split_078.htm
APACHE-la-REF_split_079.htm
APACHE-la-REF_split_080.htm
APACHE-la-REF_split_081.htm
APACHE-la-REF_split_082.htm
APACHE-la-REF_split_083.htm
APACHE-la-REF_split_084.htm
APACHE-la-REF_split_085.htm
APACHE-la-REF_split_086.htm
APACHE-la-REF_split_087.htm
APACHE-la-REF_split_088.htm
APACHE-la-REF_split_089.htm
APACHE-la-REF_split_090.htm
APACHE-la-REF_split_091.htm
APACHE-la-REF_split_092.htm
APACHE-la-REF_split_093.htm
APACHE-la-REF_split_094.htm
APACHE-la-REF_split_095.htm
APACHE-la-REF_split_096.htm
APACHE-la-REF_split_097.htm
APACHE-la-REF_split_098.htm
APACHE-la-REF_split_099.htm
APACHE-la-REF_split_100.htm
APACHE-la-REF_split_101.htm
APACHE-la-REF_split_102.htm
APACHE-la-REF_split_103.htm
APACHE-la-REF_split_104.htm
APACHE-la-REF_split_105.htm
APACHE-la-REF_split_106.htm
APACHE-la-REF_split_107.htm
APACHE-la-REF_split_108.htm
APACHE-la-REF_split_109.htm
APACHE-la-REF_split_110.htm
APACHE-la-REF_split_111.htm
APACHE-la-REF_split_112.htm
APACHE-la-REF_split_113.htm
APACHE-la-REF_split_114.htm
APACHE-la-REF_split_115.htm
APACHE-la-REF_split_116.htm
APACHE-la-REF_split_117.htm
APACHE-la-REF_split_118.htm
APACHE-la-REF_split_119.htm
APACHE-la-REF_split_120.htm
APACHE-la-REF_split_121.htm
APACHE-la-REF_split_122.htm
APACHE-la-REF_split_123.htm
APACHE-la-REF_split_124.htm
APACHE-la-REF_split_125.htm
APACHE-la-REF_split_126.htm
APACHE-la-REF_split_127.htm
APACHE-la-REF_split_128.htm
APACHE-la-REF_split_129.htm
APACHE-la-REF_split_130.htm
APACHE-la-REF_split_131.htm
APACHE-la-REF_split_132.htm
APACHE-la-REF_split_133.htm
APACHE-la-REF_split_134.htm
APACHE-la-REF_split_135.htm
APACHE-la-REF_split_136.htm
APACHE-la-REF_split_137.htm
APACHE-la-REF_split_138.htm
APACHE-la-REF_split_139.htm
APACHE-la-REF_split_140.htm
APACHE-la-REF_split_141.htm
APACHE-la-REF_split_142.htm
APACHE-la-REF_split_143.htm
APACHE-la-REF_split_144.htm
APACHE-la-REF_split_145.htm
APACHE-la-REF_split_146.htm
APACHE-la-REF_split_147.htm
APACHE-la-REF_split_148.htm
APACHE-la-REF_split_149.htm
APACHE-la-REF_split_150.htm
APACHE-la-REF_split_151.htm
APACHE-la-REF_split_152.htm
APACHE-la-REF_split_153.htm
APACHE-la-REF_split_154.htm
APACHE-la-REF_split_155.htm
APACHE-la-REF_split_156.htm
APACHE-la-REF_split_157.htm
APACHE-la-REF_split_158.htm
APACHE-la-REF_split_159.htm
APACHE-la-REF_split_160.htm
APACHE-la-REF_split_161.htm
APACHE-la-REF_split_162.htm
APACHE-la-REF_split_163.htm
APACHE-la-REF_split_164.htm
APACHE-la-REF_split_165.htm
APACHE-la-REF_split_166.htm
APACHE-la-REF_split_167.htm
APACHE-la-REF_split_168.htm
APACHE-la-REF_split_169.htm
APACHE-la-REF_split_170.htm
APACHE-la-REF_split_171.htm
APACHE-la-REF_split_172.htm
APACHE-la-REF_split_173.htm
APACHE-la-REF_split_174.htm