modules.xml revision 5ed79423e33397bb3f142d4c17b5026c90b647c2
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd<?xml version="1.0" encoding="UTF-8" ?>
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd<!DOCTYPE manualpage SYSTEM "/style/manualpage.dtd">
fd9abdda70912b99b24e3bf1a38f26fde908a74cnd<?xml-stylesheet type="text/xsl" href="/style/manual.en.xsl"?>
fd9abdda70912b99b24e3bf1a38f26fde908a74cnd<!-- $Revision: 1.7 $ -->
fd9abdda70912b99b24e3bf1a38f26fde908a74cnd
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd<!--
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd Copyright 2003-2004 The Apache Software Foundation
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd Licensed under the Apache License, Version 2.0 (the "License");
96ad5d81ee4a2cc66a4ae19893efc8aa6d06fae7jailletc you may not use this file except in compliance with the License.
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd You may obtain a copy of the License at
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd
d29d9ab4614ff992b0e8de6e2b88d52b6f1f153erbowen http://www.apache.org/licenses/LICENSE-2.0
2e545ce2450a9953665f701bb05350f0d3f26275nd
d29d9ab4614ff992b0e8de6e2b88d52b6f1f153erbowen Unless required by applicable law or agreed to in writing, software
d29d9ab4614ff992b0e8de6e2b88d52b6f1f153erbowen distributed under the License is distributed on an "AS IS" BASIS,
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd See the License for the specific language governing permissions and
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd limitations under the License.
af33a4994ae2ff15bc67d19ff1a7feb906745bf8rbowen-->
3f08db06526d6901aa08c110b5bc7dde6bc39905nd
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd<manualpage metafile="modules.xml.meta">
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd<parentdocument href="./">Developer Documentation</parentdocument>
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd
3f08db06526d6901aa08c110b5bc7dde6bc39905nd<title>Converting Modules from Apache 1.3 to Apache 2.0</title>
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd<summary>
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd <p>This is a first attempt at writing the lessons I learned
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd when trying to convert the <code>mod_mmap_static</code> module to Apache
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd 2.0. It's by no means definitive and probably won't even be
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd correct in some ways, but it's a start.</p>
63f06dce77bb2d9b1c5aa5deeb47a1069987fd1end</summary>
d474d8ef01ec5c2a09341cd148851ed383c3287crbowen
d474d8ef01ec5c2a09341cd148851ed383c3287crbowen<section id="easy"><title>The easier changes ...</title>
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd
4b575a6b6704b516f22d65a3ad35696d7b9ba372rpluem <section id="cleanup"><title>Cleanup Routines</title>
4b575a6b6704b516f22d65a3ad35696d7b9ba372rpluem <p>These now need to be of type <code>apr_status_t</code> and return a
4b575a6b6704b516f22d65a3ad35696d7b9ba372rpluem value of that type. Normally the return value will be
4b575a6b6704b516f22d65a3ad35696d7b9ba372rpluem <code>APR_SUCCESS</code> unless there is some need to signal an error in
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd the cleanup. Be aware that even though you signal an error not all code
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd yet checks and acts upon the error.</p>
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd </section>
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd <section id="init"><title>Initialisation Routines</title>
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd <p>These should now be renamed to better signify where they sit
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd in the overall process. So the name gets a small change from
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd <code>mmap_init</code> to <code>mmap_post_config</code>. The arguments
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd passed have undergone a radical change and now look like</p>
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd <ul>
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd <li><code>apr_pool_t *p</code></li>
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd <li><code>apr_pool_t *plog</code></li>
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd <li><code>apr_pool_t *ptemp</code></li>
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd <li><code>server_rec *s</code></li>
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd </ul>
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd </section>
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd
6c4ef4a72d9897e53365b94103f4bd819fd0d3acnd <section id="datatypes"><title>Data Types</title>
25ed62dce99fb4e35a6e8df83b948f877db22393nd <p>A lot of the data types have been moved into the <a
25ed62dce99fb4e35a6e8df83b948f877db22393nd href="http://apr.apache.org/">APR</a>. This means that some have had
25ed62dce99fb4e35a6e8df83b948f877db22393nd a name change, such as the one shown above. The following is a brief
25ed62dce99fb4e35a6e8df83b948f877db22393nd list of some of the changes that you are likely to have to make.</p>
25ed62dce99fb4e35a6e8df83b948f877db22393nd
25ed62dce99fb4e35a6e8df83b948f877db22393nd <ul>
25ed62dce99fb4e35a6e8df83b948f877db22393nd <li><code>pool</code> becomes <code>apr_pool_t</code></li>
25ed62dce99fb4e35a6e8df83b948f877db22393nd <li><code>table</code> becomes <code>apr_table_t</code></li>
25ed62dce99fb4e35a6e8df83b948f877db22393nd </ul>
25ed62dce99fb4e35a6e8df83b948f877db22393nd </section>
25ed62dce99fb4e35a6e8df83b948f877db22393nd</section>
25ed62dce99fb4e35a6e8df83b948f877db22393nd
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd<section id="messy"><title>The messier changes...</title>
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd
d972e4a0688f66b1402473dd9dacfecefa2132a8rbowen <section id="register-hooks"><title>Register Hooks</title>
d972e4a0688f66b1402473dd9dacfecefa2132a8rbowen <p>The new architecture uses a series of hooks to provide for
c3ed174bff42ea3c139df9010d93d94316f3a5abigalic calling your functions. These you'll need to add to your module
ba1761b7cdc483fa8460f183a95b520e789a161and by way of a new function, <code>static void register_hooks(void)</code>.
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd The function is really reasonably straightforward once you
ba1761b7cdc483fa8460f183a95b520e789a161and understand what needs to be done. Each function that needs
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd calling at some stage in the processing of a request needs to
ba1761b7cdc483fa8460f183a95b520e789a161and be registered, handlers do not. There are a number of phases
ba1761b7cdc483fa8460f183a95b520e789a161and where functions can be added, and for each you can specify with
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd a high degree of control the relative order that the function
ba1761b7cdc483fa8460f183a95b520e789a161and will be called in.</p>
ba1761b7cdc483fa8460f183a95b520e789a161and
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd <p>This is the code that was added to <code>mod_mmap_static</code>:</p>
ba1761b7cdc483fa8460f183a95b520e789a161and <example><pre>
ba1761b7cdc483fa8460f183a95b520e789a161andstatic void register_hooks(void)
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd{
ba1761b7cdc483fa8460f183a95b520e789a161and static const char * const aszPre[]={ "http_core.c",NULL };
888b616027180cc8aaa4d2bee5ecc6acec175bc5nd ap_hook_post_config(mmap_post_config,NULL,NULL,HOOK_MIDDLE);
ba1761b7cdc483fa8460f183a95b520e789a161and ap_hook_translate_name(mmap_static_xlat,aszPre,NULL,HOOK_LAST);
ba1761b7cdc483fa8460f183a95b520e789a161and};</pre>
ba1761b7cdc483fa8460f183a95b520e789a161and </example>
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd
ba1761b7cdc483fa8460f183a95b520e789a161and <p>This registers 2 functions that need to be called, one in
ba1761b7cdc483fa8460f183a95b520e789a161and the <code>post_config</code> stage (virtually every module will need this
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd one) and one for the <code>translate_name</code> phase. note that while
ba1761b7cdc483fa8460f183a95b520e789a161and there are different function names the format of each is
ba1761b7cdc483fa8460f183a95b520e789a161and identical. So what is the format?</p>
ba1761b7cdc483fa8460f183a95b520e789a161and
ba1761b7cdc483fa8460f183a95b520e789a161and <example>
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd ap_hook_<var>phase_name</var>(<var>function_name</var>,
ba1761b7cdc483fa8460f183a95b520e789a161and <var>predecessors</var>, <var>successors</var>, <var>position</var>);
ba1761b7cdc483fa8460f183a95b520e789a161and </example>
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd
ba1761b7cdc483fa8460f183a95b520e789a161and <p>There are 3 hook positions defined...</p>
ba1761b7cdc483fa8460f183a95b520e789a161and
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd <ul>
ba1761b7cdc483fa8460f183a95b520e789a161and <li><code>HOOK_FIRST</code></li>
ba1761b7cdc483fa8460f183a95b520e789a161and <li><code>HOOK_MIDDLE</code></li>
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd <li><code>HOOK_LAST</code></li>
ba1761b7cdc483fa8460f183a95b520e789a161and </ul>
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd
ba1761b7cdc483fa8460f183a95b520e789a161and <p>To define the position you use the position and then modify
ba1761b7cdc483fa8460f183a95b520e789a161and it with the predecessors and successors. Each of the modifiers
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd can be a list of functions that should be called, either before
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe the function is run (predecessors) or after the function has
cd34a6fbf0a2619544a72eadb73f309370bf6682wrowe run (successors).</p>
ba1761b7cdc483fa8460f183a95b520e789a161and
ba1761b7cdc483fa8460f183a95b520e789a161and <p>In the <code>mod_mmap_static</code> case I didn't care about the
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd <code>post_config</code> stage, but the <code>mmap_static_xlat</code>
1723928efa40774afc394d9e6b2b974c1f49330dnd <strong>must</strong> be called after the core module had done it's name
1723928efa40774afc394d9e6b2b974c1f49330dnd translation, hence the use of the aszPre to define a modifier to the
ba1761b7cdc483fa8460f183a95b520e789a161and position <code>HOOK_LAST</code>.</p>
ba1761b7cdc483fa8460f183a95b520e789a161and </section>
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd
ba1761b7cdc483fa8460f183a95b520e789a161and <section id="moddef"><title>Module Definition</title>
ba1761b7cdc483fa8460f183a95b520e789a161and <p>There are now a lot fewer stages to worry about when
22d5d84393d960a2027f472036f3fee15d7dbce9nd creating your module definition. The old defintion looked
2d39a41e98476f5235b7c37ce745a4aa0904b1cbrbowen like</p>
2d39a41e98476f5235b7c37ce745a4aa0904b1cbrbowen
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd <example><pre>
ba1761b7cdc483fa8460f183a95b520e789a161andmodule MODULE_VAR_EXPORT <var>module_name</var>_module =
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd{
4b311579b2c8aebac85fb7cb8ac89e6c37b4bc1asf STANDARD_MODULE_STUFF,
4b311579b2c8aebac85fb7cb8ac89e6c37b4bc1asf /* initializer */
4b311579b2c8aebac85fb7cb8ac89e6c37b4bc1asf /* dir config creater */
4b311579b2c8aebac85fb7cb8ac89e6c37b4bc1asf /* dir merger --- default is to override */
4b311579b2c8aebac85fb7cb8ac89e6c37b4bc1asf /* server config */
4b311579b2c8aebac85fb7cb8ac89e6c37b4bc1asf /* merge server config */
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd /* command handlers */
4b311579b2c8aebac85fb7cb8ac89e6c37b4bc1asf /* handlers */
4b311579b2c8aebac85fb7cb8ac89e6c37b4bc1asf /* filename translation */
bed3c2e56e8f3328e780200466b9d009093db468sf /* check_user_id */
4b311579b2c8aebac85fb7cb8ac89e6c37b4bc1asf /* check auth */
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd /* check access */
4b311579b2c8aebac85fb7cb8ac89e6c37b4bc1asf /* type_checker */
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd /* fixups */
4b311579b2c8aebac85fb7cb8ac89e6c37b4bc1asf /* logger */
4b311579b2c8aebac85fb7cb8ac89e6c37b4bc1asf /* header parser */
4b311579b2c8aebac85fb7cb8ac89e6c37b4bc1asf /* child_init */
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd /* child_exit */
4b311579b2c8aebac85fb7cb8ac89e6c37b4bc1asf /* post read-request */
4b311579b2c8aebac85fb7cb8ac89e6c37b4bc1asf};</pre>
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd </example>
7e9d90004f580231e0376880710dc25408950ab9rbowen
aa2ff7f8e8477e2b9d20dc2e72737d6bd5145465sf <p>The new structure is a great deal simpler...</p>
aa2ff7f8e8477e2b9d20dc2e72737d6bd5145465sf <example><pre>
aa2ff7f8e8477e2b9d20dc2e72737d6bd5145465sfmodule MODULE_VAR_EXPORT <var>module_name</var>_module =
acf65805923cf80834c39689cc0e2a8e7201c186sf{
acf65805923cf80834c39689cc0e2a8e7201c186sf STANDARD20_MODULE_STUFF,
909ce17e2bd0faef7b1c294f2307f009793fd493nd /* create per-directory config structures */
acf65805923cf80834c39689cc0e2a8e7201c186sf /* merge per-directory config structures */
acf65805923cf80834c39689cc0e2a8e7201c186sf /* create per-server config structures */
acf65805923cf80834c39689cc0e2a8e7201c186sf /* merge per-server config structures */
acf65805923cf80834c39689cc0e2a8e7201c186sf /* command handlers */
89507e27e4d31a7e97f258994e4ba3904de47652nd /* handlers */
acf65805923cf80834c39689cc0e2a8e7201c186sf /* register hooks */
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd};</pre>
acf65805923cf80834c39689cc0e2a8e7201c186sf </example>
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd
acf65805923cf80834c39689cc0e2a8e7201c186sf <p>Some of these read directly across, some don't. I'll try to
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd summarise what should be done below.</p>
acf65805923cf80834c39689cc0e2a8e7201c186sf
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd <p>The stages that read directly across :</p>
acf65805923cf80834c39689cc0e2a8e7201c186sf
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd <dl>
acf65805923cf80834c39689cc0e2a8e7201c186sf <dt><code>/* dir config creater */</code></dt>
acf65805923cf80834c39689cc0e2a8e7201c186sf <dd><code>/* create per-directory config structures */</code></dd>
acf65805923cf80834c39689cc0e2a8e7201c186sf
acf65805923cf80834c39689cc0e2a8e7201c186sf <dt><code>/* server config */</code></dt>
acf65805923cf80834c39689cc0e2a8e7201c186sf <dd><code>/* create per-server config structures */</code></dd>
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd
acf65805923cf80834c39689cc0e2a8e7201c186sf <dt><code>/* dir merger */</code></dt>
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd <dd><code>/* merge per-directory config structures */</code></dd>
acf65805923cf80834c39689cc0e2a8e7201c186sf
623eebe956d9c2d6d073ed3eae855b56030b40e9noodl <dt><code>/* merge server config */</code></dt>
acf65805923cf80834c39689cc0e2a8e7201c186sf <dd><code>/* merge per-server config structures */</code></dd>
acf65805923cf80834c39689cc0e2a8e7201c186sf
acf65805923cf80834c39689cc0e2a8e7201c186sf <dt><code>/* command table */</code></dt>
acf65805923cf80834c39689cc0e2a8e7201c186sf <dd><code>/* command apr_table_t */</code></dd>
acf65805923cf80834c39689cc0e2a8e7201c186sf
acf65805923cf80834c39689cc0e2a8e7201c186sf <dt><code>/* handlers */</code></dt>
acf65805923cf80834c39689cc0e2a8e7201c186sf <dd><code>/* handlers */</code></dd>
acf65805923cf80834c39689cc0e2a8e7201c186sf </dl>
acf65805923cf80834c39689cc0e2a8e7201c186sf
acf65805923cf80834c39689cc0e2a8e7201c186sf <p>The remainder of the old functions should be registered as
acf65805923cf80834c39689cc0e2a8e7201c186sf hooks. There are the following hook stages defined so
acf65805923cf80834c39689cc0e2a8e7201c186sf far...</p>
acf65805923cf80834c39689cc0e2a8e7201c186sf
acf65805923cf80834c39689cc0e2a8e7201c186sf <dl>
acf65805923cf80834c39689cc0e2a8e7201c186sf <dt><code>ap_hook_post_config</code></dt>
acf65805923cf80834c39689cc0e2a8e7201c186sf <dd>this is where the old <code>_init</code> routines get
89507e27e4d31a7e97f258994e4ba3904de47652nd registered</dd>
acf65805923cf80834c39689cc0e2a8e7201c186sf
b41a0dbe6310c576e96b7ea6910051fd84fb06f5sf <dt><code>ap_hook_http_method</code></dt>
acf65805923cf80834c39689cc0e2a8e7201c186sf <dd>retrieve the http method from a request. (legacy)</dd>
acf65805923cf80834c39689cc0e2a8e7201c186sf
acf65805923cf80834c39689cc0e2a8e7201c186sf <dt><code>ap_hook_open_logs</code></dt>
acf65805923cf80834c39689cc0e2a8e7201c186sf <dd>open any specified logs</dd>
acf65805923cf80834c39689cc0e2a8e7201c186sf
acf65805923cf80834c39689cc0e2a8e7201c186sf <dt><code>ap_hook_auth_checker</code></dt>
acf65805923cf80834c39689cc0e2a8e7201c186sf <dd>check if the resource requires authorization</dd>
acf65805923cf80834c39689cc0e2a8e7201c186sf
89f151d6b9775dd1ae53958d5986ffc7cb8fbba6kess <dt><code>ap_hook_access_checker</code></dt>
acf65805923cf80834c39689cc0e2a8e7201c186sf <dd>check for module-specific restrictions</dd>
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd
acf65805923cf80834c39689cc0e2a8e7201c186sf <dt><code>ap_hook_check_user_id</code></dt>
b41a0dbe6310c576e96b7ea6910051fd84fb06f5sf <dd>check the user-id and password</dd>
acf65805923cf80834c39689cc0e2a8e7201c186sf
b41a0dbe6310c576e96b7ea6910051fd84fb06f5sf <dt><code>ap_hook_default_port</code></dt>
4044e4b6cb07cf7fa8e90676fafffe543c1d439bjim <dd>retrieve the default port for the server</dd>
89f151d6b9775dd1ae53958d5986ffc7cb8fbba6kess
acf65805923cf80834c39689cc0e2a8e7201c186sf <dt><code>ap_hook_pre_connection</code></dt>
bf876fa45c212a18d7aa07504e872cf63a0c247cnd <dd>do any setup required just before processing, but after
acf65805923cf80834c39689cc0e2a8e7201c186sf accepting</dd>
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd
acf65805923cf80834c39689cc0e2a8e7201c186sf <dt><code>ap_hook_process_connection</code></dt>
acf65805923cf80834c39689cc0e2a8e7201c186sf <dd>run the correct protocol</dd>
89f151d6b9775dd1ae53958d5986ffc7cb8fbba6kess
89f151d6b9775dd1ae53958d5986ffc7cb8fbba6kess <dt><code>ap_hook_child_init</code></dt>
acf65805923cf80834c39689cc0e2a8e7201c186sf <dd>call as soon as the child is started</dd>
89f151d6b9775dd1ae53958d5986ffc7cb8fbba6kess
acf65805923cf80834c39689cc0e2a8e7201c186sf <dt><code>ap_hook_create_request</code></dt>
acf65805923cf80834c39689cc0e2a8e7201c186sf <dd>??</dd>
d0828c8a321dc5e9ea60550f052294669c08cf93jim
d0828c8a321dc5e9ea60550f052294669c08cf93jim <dt><code>ap_hook_fixups</code></dt>
acf65805923cf80834c39689cc0e2a8e7201c186sf <dd>last chance to modify things before generating content</dd>
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd
acf65805923cf80834c39689cc0e2a8e7201c186sf <dt><code>ap_hook_handler</code></dt>
acf65805923cf80834c39689cc0e2a8e7201c186sf <dd>generate the content</dd>
acf65805923cf80834c39689cc0e2a8e7201c186sf
abde5157296f0b860f7551d8a80fa5dffa20e6cajim <dt><code>ap_hook_header_parser</code></dt>
acf65805923cf80834c39689cc0e2a8e7201c186sf <dd>lets modules look at the headers, not used by most modules, because
acf65805923cf80834c39689cc0e2a8e7201c186sf they use <code>post_read_request</code> for this</dd>
acf65805923cf80834c39689cc0e2a8e7201c186sf
bc525661d031758c0a4e771543372b4869ca86aand <dt><code>ap_hook_insert_filter</code></dt>
bc525661d031758c0a4e771543372b4869ca86aand <dd>to insert filters into the filter chain</dd>
65a611af7093423efb91e5794b8887a527d4cf63trawick
65a611af7093423efb91e5794b8887a527d4cf63trawick <dt><code>ap_hook_log_transaction</code></dt>
65a611af7093423efb91e5794b8887a527d4cf63trawick <dd>log information about the request</dd>
65a611af7093423efb91e5794b8887a527d4cf63trawick
65a611af7093423efb91e5794b8887a527d4cf63trawick <dt><code>ap_hook_optional_fn_retrieve</code></dt>
65a611af7093423efb91e5794b8887a527d4cf63trawick <dd>retrieve any functions registered as optional</dd>
acf65805923cf80834c39689cc0e2a8e7201c186sf
acf65805923cf80834c39689cc0e2a8e7201c186sf <dt><code>ap_hook_post_read_request</code></dt>
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd <dd>called after reading the request, before any other phase</dd>
acf65805923cf80834c39689cc0e2a8e7201c186sf
6fe26506780e73be2a412d758af77fafdf03291and <dt><code>ap_hook_quick_handler</code></dt>
6fe26506780e73be2a412d758af77fafdf03291and <dd>called before any request processing, used by cache modules.</dd>
acf65805923cf80834c39689cc0e2a8e7201c186sf
acf65805923cf80834c39689cc0e2a8e7201c186sf <dt><code>ap_hook_translate_name</code></dt>
acf65805923cf80834c39689cc0e2a8e7201c186sf <dd>translate the URI into a filename</dd>
5224ff8eae5156a05f676f1dad8add2e2f2efe1dnd
acf65805923cf80834c39689cc0e2a8e7201c186sf <dt><code>ap_hook_type_checker</code></dt>
cd6c8de3bedcc401ee230159b0439fa20f44488etakashi <dd>determine and/or set the doc type</dd>
acf65805923cf80834c39689cc0e2a8e7201c186sf </dl>
cd6c8de3bedcc401ee230159b0439fa20f44488etakashi </section>
cd6c8de3bedcc401ee230159b0439fa20f44488etakashi</section>
acf65805923cf80834c39689cc0e2a8e7201c186sf</manualpage>
bf7a66e941926dc62fd3e0a2b5ba3420ffdc2eb6sf
b05ab3ff5ab54aa22610b13d56eaba6ddfc3db60nd