+++ /dev/null
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta name="generator" content="HTML Tidy, see www.w3.org" />
-
- <title>Converting Modules from Apache 1.3 to Apache 2.0</title>
- </head>
- <!-- Background white, links blue (unvisited), navy (visited), red (active) -->
-
- <body bgcolor="#FFFFFF" text="#000000" link="#0000FF"
- vlink="#000080" alink="#FF0000">
- <!--#include virtual="header.html" -->
-
- <h1 align="CENTER">From Apache 1.3 to Apache 2.0<br />
- Modules</h1>
-
- <p>This is a first attempt at writing the lessons I learned
- when trying to convert the mod_mmap_static module to Apache
- 2.0. It's by no means definitive and probably won't even be
- correct in some ways, but it's a start.</p>
- <hr />
-
- <h2>The easier changes...</h2>
-
- <h3>Cleanup Routines</h3>
-
- <p>These now need to be of type apr_status_t and return a value
- of that type. Normally the return value will be APR_SUCCESS
- unless there is some need to signal an error in the cleanup. Be
- aware that even though you signal an error not all code yet
- checks and acts upon the error.</p>
-
- <h3>Initialisation Routines</h3>
-
- <p>These should now be renamed to better signify where they sit
- in the overall process. So the name gets a small change from
- mmap_init to mmap_post_config. The arguments passed have
- undergone a radical change and now look like</p>
-
- <ul style="list-style:none">
- <li>apr_pool_t *p,</li>
-
- <li>apr_pool_t *plog,</li>
-
- <li>apr_pool_t *ptemp,</li>
-
- <li>server_rec *s</li>
- </ul>
-
- <h3>Data Types</h3>
-
- <p>A lot of the data types have been moved into the APR. This
- means that some have had a name change, such as the one shown
- above. The following is a brief list of some of the changes
- that you are likely to have to make.</p>
-
- <ul style="list-style:none">
- <li>pool becomes apr_pool_t</li>
-
- <li>table becomes apr_table_t</li>
- </ul>
- <hr />
-
- <h2>The <em>messier</em> changes...</h2>
-
- <h3>Register Hooks</h3>
-
- <p>The new architecture uses a series of hooks to provide for
- calling your functions. These you'll need to add to your module
- by way of a new function, static void register_hooks(void). The
- function is really reasonably straightforward once you
- understand what needs to be done. Each function that needs
- calling at some stage in the processing of a request needs to
- be registered, handlers do not. There are a number of phases
- where functions can be added, and for each you can specify with
- a high degree of control the relative order that the function
- will be called in.</p>
-
- <p>This is the code that was added to mod_mmap_static:</p>
-<pre>
-static void register_hooks(void)
-{
- static const char * const aszPre[]={ "http_core.c",NULL };
- ap_hook_post_config(mmap_post_config,NULL,NULL,HOOK_MIDDLE);
- ap_hook_translate_name(mmap_static_xlat,aszPre,NULL,HOOK_LAST);
-};
-</pre>
-
- <p>This registers 2 functions that need to be called, one in
- the post_config stage (virtually every module will need this
- one) and one for the translate_name phase. note that while
- there are different function names the format of each is
- identical. So what is the format?</p>
-
- <p><strong>ap_hook_[phase_name](function_name, predecessors,
- successors, position);</strong></p>
-
- <p>There are 3 hook positions defined...</p>
-
- <ul style="list-style:none">
- <li>HOOK_FIRST</li>
-
- <li>HOOK_MIDDLE</li>
-
- <li>HOOK_LAST</li>
- </ul>
-
- <p>To define the position you use the position and then modify
- it with the predecessors and successors. Each of the modifiers
- can be a list of functions that should be called, either before
- the function is run (predecessors) or after the function has
- run (successors).</p>
-
- <p>In the mod_mmap_static case I didn't care about the
- post_config stage, but the mmap_static_xlat MUST be called
- after the core module had done it's name translation, hence the
- use of the aszPre to define a modifier to the position
- HOOK_LAST.</p>
-
- <h3>Module Definition</h3>
-
- <p>There are now a lot fewer stages to worry about when
- creating your module definition. The old defintion looked
- like</p>
-<pre>
-module MODULE_VAR_EXPORT [module_name]_module =
-{
- STANDARD_MODULE_STUFF,
- /* initializer */
- /* dir config creater */
- /* dir merger --- default is to override */
- /* server config */
- /* merge server config */
- /* command handlers */
- /* handlers */
- /* filename translation */
- /* check_user_id */
- /* check auth */
- /* check access */
- /* type_checker */
- /* fixups */
- /* logger */
- /* header parser */
- /* child_init */
- /* child_exit */
- /* post read-request */
-};
-</pre>
-
- <p>The new structure is a great deal simpler...</p>
-<pre>
-module MODULE_VAR_EXPORT [module_name]_module =
-{
- STANDARD20_MODULE_STUFF,
- /* create per-directory config structures */
- /* merge per-directory config structures */
- /* create per-server config structures */
- /* merge per-server config structures */
- /* command handlers */
- /* handlers */
- /* register hooks */
- };
-</pre>
-
- <p>Some of these read directly across, some don't. I'll try to
- summarise what should be done below.</p>
-
- <p>The stages that read directly across :</p>
-
- <ul style="list-style:none">
- <li>/* dir config creater */ ==> /* create per-directory
- config structures */</li>
-
- <li>/* server config */ ==> /* create per-server config
- structures */</li>
-
- <li>/* dir merger */ ==> /* merge per-directory config
- structures */</li>
-
- <li>/* merge server config */ ==> /* merge per-server
- config structures */</li>
-
- <li>/* command table */ ==> /* command apr_table_t */</li>
-
- <li>/* handlers */ ==> /* handlers */</li>
- </ul>
-
- <p>The remainder of the old functions should be registered as
- hooks. There are the following hook stages defined so
- far...</p>
-
- <ul style="list-style:none">
- <li>ap_hook_post_config <em>(this is where the old _init
- routines get registered)</em></li>
-
- <li>ap_hook_http_method <em>(retrieve the http method from a
- request. (legacy))</em></li>
-
- <li>ap_hook_open_logs <em>(open any specified logs)</em></li>
-
- <li>ap_hook_auth_checker <em>(check if the resource requires
- authorization)</em></li>
-
- <li>ap_hook_access_checker <em>(check for module-specific
- restrictions)</em></li>
-
- <li>ap_hook_check_user_id <em>(check the user-id and
- password)</em></li>
-
- <li>ap_hook_default_port <em>(retrieve the default port for
- the server)</em></li>
-
- <li>ap_hook_pre_connection <em>(do any setup required just
- before processing, but after accepting)</em></li>
-
- <li>ap_hook_process_connection <em>(run the correct
- protocol)</em></li>
-
- <li>ap_hook_child_init <em>(call as soon as the child is
- started)</em></li>
-
- <li>ap_hook_create_request <em>(??)</em></li>
-
- <li>ap_hook_fixups <em>(last chance to modify things before
- generating content)</em></li>
-
- <li>ap_hook_handler <em>(generate the content)</em></li>
-
- <li>ap_hook_header_parser <em>(let's modules look at the
- headers, not used by most modules, because they use
- post_read_request for this.)</em></li>
-
- <li>ap_hook_insert_filter <em>(to insert filters into the
- filter chain)</em></li>
-
- <li>ap_hook_log_transaction <em>(log information about the
- request)</em></li>
-
- <li>ap_hook_optional_fn_retrieve <em>(retrieve any functions
- registered as optional)</em></li>
-
- <li>ap_hook_post_read_request <em>(called after reading the
- request, before any other phase)</em></li>
-
- <li>ap_hook_quick_handler <em>(??)</em></li>
-
- <li>ap_hook_translate_name <em>(translate the URI into a
- filename)</em></li>
-
- <li>ap_hook_type_checker <em>(determine and/or set the doc
- type)</em> <!--#include virtual="footer.html" -->
- </li>
- </ul>
- </body>
-</html>
-
--- /dev/null
+<?xml version="1.0" encoding="iso-2022-jp"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <head>
+
+ <title>\e$B%b%8%e!<%k$N\e(B Apache 1.3 \e$B$+$i\e(B Apache 2.0 \e$B$X$N0\?"\e(B</title>
+ </head>
+ <!-- English revision: 1.7 -->
+ <!-- Background white, links blue (unvisited), navy (visited), red (active) -->
+
+ <body bgcolor="#FFFFFF" text="#000000" link="#0000FF"
+ vlink="#000080" alink="#FF0000">
+ <!--#include virtual="header.html" -->
+
+ <h1 align="center">\e$B%b%8%e!<%k$r\e(B Apache 1.3 \e$B$+$i\e(B Apache 2.0 \e$B$X\e(B</h1>
+
+ <p>\e$B$3$NJ8=q$O\e(B mod_mmap_static \e$B%b%8%e!<%k$r\e(B Apache 2.0 \e$BMQ$K0\?"$7$?;~$K\e(B
+ \e$B3X$s$@7P83$r$b$H$K=q$$$?!":G=i$N<j0z$-=q$G$9!#$^$@$^$@40A4$8$c$J$$$7!"\e(B
+ \e$B$R$g$C$H$9$k$H4V0c$C$F$$$kItJ,$b$"$k$+$b$7$l$^$;$s$,!"\e(B
+ \e$B<h$C3]$j$K$O$J$k$G$7$g$&!#\e(B</p>
+ <hr />
+
+ <h2>\e$B4JC1$JJQ99E@!D\e(B</h2>
+
+ <h3>\e$B%/%j!<%s%J%C%W\e(B \e$B%k!<%A%s\e(B</h3>
+
+ <p>\e$B%/%j!<%s%J%C%W%k!<%A%s$O\e(B apr_status_t \e$B7?$G$"$kI,MW$,$"$j$^$9!#\e(B
+ \e$B$=$7$F!"\e(Bapr_status_t \e$B7?$NCM$rJV$5$J$/$F$O$J$j$^$;$s!#\e(B
+ \e$B%/%j!<%s%J%C%WCf$N%(%i!<$rDLCN$9$kI,MW$,$J$1$l$P!"JV$jCM$OIaDL!"\e(B
+ ARP_SUCCESS \e$B$G$9!#$?$H$(%(%i!<$rDLCN$7$?$H$7$F$b!"\e(B
+ \e$B$9$Y$F$N%3!<%I$,$=$NDLCN$r%A%'%C%/$7$?$j!"\e(B
+ \e$B%(%i!<$K1~$8$?F0:n$r$9$k$o$1$G$O$J$$$3$H$K5$$r$D$1$F$/$@$5$$!#\e(B</p>
+
+ <h3>\e$B=i4|2=%k!<%A%s\e(B</h3>
+
+ <p>\e$B=i4|2=%k!<%A%s$O=hM}A4BN$+$i8+$F$7$C$/$j$/$k$h$&$J0UL#$rI=$9$h$&$K!"\e(B
+ \e$BL>A0$,JQ99$5$l$^$7$?!#$G$9$+$i!"\e(Bmmap_init \e$B$+$i\e(B mmap_post_config
+ \e$B$N$h$&$K$A$g$C$HJQ99$5$l$^$7$?!#\e(B
+ \e$BEO$5$l$k0z?t$OBgI}$KJQ99$5$l!"<!$N$h$&$K$J$j$^$7$?!#\e(B</p>
+
+ <ul style="list-style:none">
+ <li>apr_pool_t *p,</li>
+
+ <li>apr_pool_t *plog,</li>
+
+ <li>apr_pool_t *ptemp,</li>
+
+ <li>server_rec *s</li>
+ </ul>
+
+ <h3>\e$B%G!<%?7?\e(B</h3>
+
+ <p>\e$B%G!<%?7?$N$[$H$s$I$O\e(B APR \e$B$K0\$5$l$^$7$?!#$D$^$j!"\e(B
+ \e$B$$$/$D$+$NL>A0$,A0=R$N$h$&$KJQ99$5$l$F$$$^$9!#\e(B
+ \e$B;\$9$Y$-JQ99E@$N4JC1$J0lMw$r0J2<$K<($7$^$9!#\e(B</p>
+
+ <ul style="list-style:none">
+ <li>pool \e$B$O\e(B apr_pool_t \e$B$K$J$j$^$9\e(B</li>
+
+ <li>table \e$B$O\e(B apr_table_t \e$B$K$J$j$^$9\e(B</li>
+ </ul>
+
+ <hr />
+
+ <h2><em>\e$B$b$C$HLq2p$J\e(B</em>\e$BJQ99E@!D\e(B</h2>
+
+ <h3>\e$B%U%C%/$NEPO?\e(B</h3>
+
+ <p>\e$B?7$7$$%"!<%-%F%/%A%c$G$O:n@.$7$?4X?t$r8F$S=P$9$N$K\e(B
+ \e$B0lO"$N%U%C%/$r;HMQ$7$^$9!#$3$N%U%C%/$O!"?7$7$$4X?t\e(B
+ static void register_hooks(void) \e$B$r;H$C$FEPO?$9$k$h$&!"\e(B
+ \e$B%b%8%e!<%k$K=q$-B-$5$J$/$F$O$J$j$^$;$s!#\e(B
+ \e$B$3$N4X?t$O!"$J$K$r$9$Y$-$+0lC6M}2r$7$F$7$^$($P!"\e(B
+ \e$B==J,$K$o$+$j$d$9$$$b$N$G$9!#\e(B
+ \e$B%j%/%(%9%H$N=hM}$N$"$k%9%F!<%8$G8F$S=P$5$J$/$F$O$J$i$J$$\e(B
+ \e$B4X?t$OEPO?$9$kI,MW$,$"$j$^$9!#%O%s%I%i$OEPO?$9$kI,MW$O$"$j$^$;$s!#\e(B
+ \e$B4X?t$rEPO?$G$-$k%U%'!<%:$O$?$/$5$s$"$j$^$9!#\e(B
+ \e$B$=$l$>$l$N%U%'!<%:$G!"4X?t$r8F$S=P$9AjBPE*$J=gHV$O!"\e(B
+ \e$B$+$J$j$NDxEY@)8f$G$-$^$9!#\e(B</p>
+
+ <p>\e$B0J2<$O!"\e(Bmod_mmap_static \e$B$KDI2C$7$?%3!<%I$G$9\e(B:</p>
+
+<pre>
+static void register_hooks(void)
+{
+ static const char * const aszPre[]={ "http_core.c",NULL };
+ ap_hook_post_config(mmap_post_config,NULL,NULL,HOOK_MIDDLE);
+ ap_hook_translate_name(mmap_static_xlat,aszPre,NULL,HOOK_LAST);
+};
+</pre>
+
+ <p>\e$B$3$3$G$O8F$S$@$9$Y$-Fs$D$N4X?t$rEPO?$7$F$$$^$9!#0l$D$O\e(B
+ post_config \e$B%9%F!<%8MQ\e(B (\e$B$[$H$s$I$9$Y$F$N%b%8%e!<%k$O$3$l$,I,MW$G$9\e(B) \e$B$G!"\e(B
+ \e$B$b$&0l$D$O\e(B translate_name \e$B%U%'!<%:MQ$G$9!#\e(B
+ \e$B$=$l$>$l$N4X?t$OL>A0$O0c$&$1$l$I$b7A<0$OF1$8$G$"$k$3$H$KCm0U$7$F$/$@$5$$!#\e(B
+ \e$B$=$l$G$O!"7A<0$O$I$N$h$&$K$J$C$F$$$k$G$7$g$&$+\e(B?</p>
+
+ <p><code><strong>ap_hook_[\e$B%U%'!<%:L>\e(B](\e$B4X?tL>\e(B, \e$B@h9T\e(B, \e$B8e9T\e(B, \e$B0LCV\e(B);</strong></code></p>
+
+ <p>3\e$B$D$N0LCV$,Dj5A$5$l$F$$$^$9!D\e(B</p>
+
+ <ul style="list-style:none">
+ <li>HOOK_FIRST</li>
+
+ <li>HOOK_MIDDLE</li>
+
+ <li>HOOK_LAST</li>
+ </ul>
+
+ <p>\e$B0LCV$rDj5A$9$k$K$O!">e5-$N!V0LCV!W$r;XDj$7!"\e(B
+ \e$B=$>~;R$G$"$k!V@h9T!W$H!V8e9T!W$G<j$r2C$($^$9!#\e(B
+ \e$B!V@h9T!W!V8e9T!W$O!"8F$P$l$k$Y$-4X?t$N%j%9%H$G$9!#\e(B
+ \e$B!V@h9T!W$O4X?t$N<B9TA0$K8F$P$l$k$b$N$G!"\e(B
+ \e$B!V8e9T!W$O<B9T8e$K8F$P$l$k$b$N$G$9!#\e(B</p>
+
+ <p>mod_mmap_static \e$B$N>l9g!"\e(Bpost_config \e$B%9%F!<%8$G$OI,MW$"$j$^$;$s$,!"\e(B
+ mmap_static_xlat \e$B$,\e(B core \e$B%b%8%e!<%k$,L>A0$NJQ49$r<B9T$7$?8e$K\e(B
+ \e$B8F$P$l$J$1$l$P$J$j$^$;$s!#\e(B
+ \e$B$=$3$G\e(B aszPre \e$B$r;H$C$F\e(B HOOK_LAST \e$B$N=$>~;R$rDj5A$7$F$$$^$9!#\e(B</p>
+
+ <h3>\e$B%b%8%e!<%k$NDj5A\e(B</h3>
+
+ <p>\e$B%b%8%e!<%k$NDj5A$r:n@.$9$k:]$KCm0U$7$J$1$l$P$J$i$J$$\e(B
+ \e$B%9%F!<%8$N?t$O7c8:$7$F$$$^$9!#8E$$Dj5A$O<!$N$h$&$K$J$C$F$$$^$7$?!#\e(B</p>
+
+<pre>
+module MODULE_VAR_EXPORT [\e$B%b%8%e!<%kL>\e(B]_module =
+{
+ STANDARD_MODULE_STUFF,
+ /* \e$B=i4|2=4X?t\e(B */
+ /* \e$B%G%#%l%/%H%j@_Dj:n@.4X?t\e(B */
+ /* \e$B%G%#%l%/%H%j@_Dj%^!<%84X?t\e(B \e$B!=\e(B \e$B%G%U%)%k%H$O!V>e=q$-!W\e(B */
+ /* \e$B%5!<%P@_Dj:n@.4X?t\e(B */
+ /* \e$B%5!<%P@_Dj%^!<%84X?t\e(B */
+ /* \e$B%3%^%s%I!&%O%s%I%i\e(B */
+ /* \e$B%O%s%I%i\e(B */
+ /* \e$B%U%!%$%kL>JQ49\e(B */
+ /* check_user_id */
+ /* \e$BG'>Z%A%'%C%/\e(B */
+ /* \e$B%"%/%;%9@)8B%A%'%C%/\e(B */
+ /* MIME \e$B7?%A%'%C%/\e(B */
+ /* \e$BD4@0\e(B */
+ /* \e$B%m%0=PNO\e(B */
+ /* \e$B%X%C%@%Q!<%5\e(B */
+ /* \e$B;R%W%m%;%9=i4|2=\e(B */
+ /* \e$B;R%W%m%;%9=*N;\e(B */
+ /* read-request \e$B8e\e(B */
+};
+</pre>
+
+ <p>\e$B?7$7$$9=B$BN$O$H$C$F$b%7%s%W%k$G$9!D\e(B</p>
+
+<pre>
+module MODULE_VAR_EXPORT [\e$B%b%8%e!<%kL>\e(B]_module =
+{
+ STANDARD20_MODULE_STUFF,
+ /* \e$B%G%#%l%/%H%jKh@_Dj9=B$BN:n@.\e(B */
+ /* \e$B%G%#%l%/%H%jKh@_Dj9=B$BN%^!<%8\e(B */
+ /* \e$B%5!<%PKh@_Dj9=B$BN:n@.\e(B */
+ /* \e$B%5!<%PKh@_Dj9=B$BN:n@.%^!<%8\e(B */
+ /* \e$B%3%^%s%I!&%O%s%I%i\e(B */
+ /* \e$B%O%s%I%i\e(B */
+ /* \e$B%U%C%/EPO?\e(B */
+ };
+</pre>
+
+ <p>\e$B$3$N$&$A$N$$$/$D$+$O8E$$$b$N$+$i?7$7$$$b$N$KD>@\FI$_BX$($i$l$k$b$N$G!"\e(B
+ \e$B$$$/$D$+$O$=$&$G$O$"$j$^$;$s!#$I$&$9$l$P$$$$$N$+$rMWLs$7$F$_$^$9!#\e(B</p>
+
+ <p>\e$BD>@\FI$_BX$($i$l$k%9%F!<%8\e(B:</p>
+
+ <ul style="list-style:none">
+ <li>/* \e$B%G%#%l%/%H%j@_Dj:n@.4X?t\e(B */ ==>
+ /* \e$B%G%#%l%/%H%jKh@_Dj9=B$BN:n@.\e(B */</li>
+
+ <li>/* \e$B%5!<%P@_Dj:n@.4X?t\e(B */ ==> /* \e$B%5!<%PKh@_Dj9=B$BN:n@.\e(B */</li>
+
+ <li>/* \e$B%G%#%l%/%H%j@_Dj%^!<%84X?t\e(B */ ==>
+ /* \e$B%G%#%l%/%H%jKh@_Dj9=B$BN%^!<%8\e(B */</li>
+
+ <li>/* \e$B%5!<%P@_Dj%^!<%84X?t\e(B */ ==>
+ /* \e$B%5!<%PKh@_Dj9=B$BN:n@.%^!<%8\e(B */</li>
+
+ <li>/* \e$B%3%^%s%I!&%F!<%V%k\e(B */ ==> /* \e$B%3%^%s%I\e(B apr_table_t */</li>
+
+ <li>/* \e$B%O%s%I%i\e(B */ ==> /* \e$B%O%s%I%i\e(B */</li>
+ </ul>
+
+ <p>\e$B8E$$4X?t$N;D$j$N$b$N$O%U%C%/$H$7$FEPO?$5$l$k$Y$-$G$9!#\e(B
+ \e$B8=;~E@$G<!$N$h$&$J%U%C%/!&%9%F!<%8$,Dj5A$5$l$F$$$^$9!D\e(B</p>
+
+ <ul style="list-style:none">
+ <li>ap_hook_post_config <em>(\e$B0JA0$N\e(B _init \e$B%k!<%A%s$,EPO?$5$l$k$Y$->l=j$G$9\e(B)</em></li>
+
+ <li>ap_hook_http_method <em>(\e$B%j%/%(%9%H$+$i\e(B HTTP \e$B%a%=%C%I$r<hF@$7$^$9\e(B (\e$B8_49MQ\e(B))</em></li>
+
+ <li>ap_hook_open_logs <em>(\e$BFCDj$N%m%0$N%*!<%W%s\e(B)</em></li>
+
+ <li>ap_hook_auth_checker <em>(\e$B%j%=!<%9$,8"8B$rI,MW$H$9$k$+$I$&$+$N3NG'\e(B)</em></li>
+
+ <li>ap_hook_access_checker <em>(\e$B%b%8%e!<%k8GM-$N@)Ls$N3NG'\e(B)</em></li>
+
+ <li>ap_hook_check_user_id <em>(\e$B%f!<%6\e(B ID \e$B$H%Q%9%o!<%I$N3NG'\e(B)</em></li>
+
+ <li>ap_hook_default_port <em>(\e$B%5!<%P$N%G%U%)%k%H!&%]!<%H$N<hF@\e(B)</em></li>
+
+ <li>ap_hook_pre_connection <em>(\e$B=hM}$ND>A0$KI,MW$J$3$H$r<B9T!#$?$@$7\e(B accept \e$BD>8e$K8F$P$l$k\e(B)</em></li>
+
+ <li>ap_hook_process_connection <em>(\e$B%W%m%H%3%k$N=hM}\e(B)</em></li>
+
+ <li>ap_hook_child_init <em>(\e$B;R%W%m%;%k5/F0D>8e\e(B)</em></li>
+
+ <li>ap_hook_create_request <em>(??)</em></li>
+
+ <li>ap_hook_fixups <em>(\e$B1~EzFbMF$N@8@.$rJQ99$9$k%i%9%H!&%A%c%s%9\e(B)</em></li>
+
+ <li>ap_hook_handler <em>(\e$B1~EzFbMF$N@8@.\e(B)</em></li>
+
+ <li>ap_hook_header_parser <em>(\e$B%b%8%e!<%k$K%X%C%@$N>H2q$r$5$;$k!#$[$H$s$I$N%b%8%e!<%k$G$O;H$o$l$^$;$s!#\e(Bpost_read_request \e$B$r;H$$$^$9\e(B)</em></li>
+
+ <li>ap_hook_insert_filter <em>(\e$B%U%#%k%?!&%A%'%$%s$K%U%#%k%?$rA^F~\e(B)</em></li>
+
+ <li>ap_hook_log_transaction <em>(\e$B%j%/%(%9%H$K$D$$$F$N>pJs$r5-O?$9$k\e(B)</em></li>
+
+ <li>ap_hook_optional_fn_retrieve <em>(\e$B%*%W%7%g%s$H$7$FEPO?$5$l$?4X?t$N<hF@\e(B)</em></li>
+
+ <li>ap_hook_post_read_request <em>(\e$B%j%/%(%9%H$rFI$_$3$s$@8e!"B>$N%U%'!<%:$NA0$K8F$P$l$k\e(B)</em></li>
+
+ <li>ap_hook_quick_handler <em>(??)</em></li>
+
+ <li>ap_hook_translate_name <em>(URI \e$B$r%U%!%$%kL>$KJQ49$9$k\e(B)</em></li>
+
+ <li>ap_hook_type_checker <em>(\e$BJ8=q7?$N7hDj$H@_Dj!#$"$k$$$O$=$NJRJ}\e(B)</em></li>
+ </ul>
+ <!--#include virtual="footer.html" -->
+ </body>
+</html>
+