]> granicus.if.org Git - apache/commitdiff
Rebuilds transformations.
authorRich Bowen <rbowen@apache.org>
Tue, 24 Apr 2012 17:15:08 +0000 (17:15 +0000)
committerRich Bowen <rbowen@apache.org>
Tue, 24 Apr 2012 17:15:08 +0000 (17:15 +0000)
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1329864 13f79535-47bb-0310-9956-ffa450edef68

26 files changed:
docs/manual/developer/modguide.html.en
docs/manual/mod/mod_alias.html.tr.utf8
docs/manual/mod/mod_alias.xml.meta
docs/manual/mod/mod_dir.html.tr.utf8
docs/manual/mod/mod_dir.xml.meta
docs/manual/mod/mod_expires.html.fr
docs/manual/mod/mod_expires.xml.fr
docs/manual/mod/mod_expires.xml.ja
docs/manual/mod/mod_expires.xml.ko
docs/manual/mod/mod_expires.xml.meta
docs/manual/mod/mod_lbmethod_byrequests.html.en
docs/manual/mod/mod_vhost_alias.html.tr.utf8
docs/manual/mod/mpm_common.html.tr.utf8
docs/manual/mod/mpmt_os2.html.en
docs/manual/mod/quickreference.html.de
docs/manual/mod/quickreference.html.es
docs/manual/mod/quickreference.html.ja.utf8
docs/manual/mod/quickreference.html.ko.euc-kr
docs/manual/mod/quickreference.html.zh-cn
docs/manual/programs/index.html.en
docs/manual/programs/index.xml
docs/manual/rewrite/avoid.xml.meta
docs/manual/rewrite/index.html.tr.utf8
docs/manual/rewrite/index.xml.meta
docs/manual/rewrite/tech.html.fr
docs/manual/rewrite/tech.xml.meta

index 944f1ce9c17e3924a2417abab6b372473492bfd1..0067dd0fde7095eb1c5d943c7d536a5e46a952f6 100644 (file)
-<?xml version="1.0" encoding="ISO-8859-1"?>\r
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head><!--\r
-        XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\r
-              This file is generated from xml source: DO NOT EDIT\r
-        XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\r
-      -->\r
-<title>Developing modules for the Apache HTTP Server 2.4 - Apache HTTP Server</title>\r
-<link href="../style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />\r
-<link href="../style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />\r
-<link href="../style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" />\r
-<link href="../images/favicon.ico" rel="shortcut icon" /></head>\r
-<body id="manual-page"><div id="page-header">\r
-<p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/directives.html">Directives</a> | <a href="../faq/">FAQ</a> | <a href="../glossary.html">Glossary</a> | <a href="../sitemap.html">Sitemap</a></p>\r
-<p class="apache">Apache HTTP Server Version 2.4</p>\r
-<img alt="" src="../images/feather.gif" /></div>\r
-<div class="up"><a href="./"><img title="&lt;-" alt="&lt;-" src="../images/left.gif" /></a></div>\r
-<div id="path">\r
-<a href="http://www.apache.org/">Apache</a> &gt; <a href="http://httpd.apache.org/">HTTP Server</a> &gt; <a href="http://httpd.apache.org/docs/">Documentation</a> &gt; <a href="../">Version 2.4</a> &gt; <a href="./">Developer</a></div><div id="page-content"><div id="preamble"><h1>Developing modules for the Apache HTTP Server 2.4</h1>\r
-<div class="toplang">\r
-<p><span>Available Languages: </span><a href="../en/developer/modguide.html" title="English">&nbsp;en&nbsp;</a></p>\r
-</div>\r
-\r
-<p>This document explains how you can develop modules for the Apache HTTP \r
-Server 2.4</p>\r
-</div>\r
-<div id="quickview"><ul id="toc"><li><img alt="" src="../images/down.gif" /> <a href="#introduction">Introduction</a></li>\r
-<li><img alt="" src="../images/down.gif" /> <a href="#basics">Defining a module</a></li>\r
-<li><img alt="" src="../images/down.gif" /> <a href="#hooking">Getting started: Hooking into the server</a></li>\r
-<li><img alt="" src="../images/down.gif" /> <a href="#handling">Building a handler</a></li>\r
-<li><img alt="" src="../images/down.gif" /> <a href="#configuration">Adding configuration options</a></li>\r
-<li><img alt="" src="../images/down.gif" /> <a href="#context">Context aware configurations</a></li>\r
-<li><img alt="" src="../images/down.gif" /> <a href="#summary">Summing up</a></li>\r
-<li><img alt="" src="../images/down.gif" /> <a href="#snippets">Some useful snippets of code</a></li>\r
-</ul><h3>See also</h3><ul class="seealso"><li><a href="request.html">Request Processing in Apache 2.4</a></li><li><a href="hooks.html">Apache 2.x Hook Functions</a></li></ul></div>\r
-<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>\r
-<div class="section">\r
-<h2><a name="introduction" id="introduction">Introduction</a></h2>\r
-<h3><a name="what" id="what">What we will be discussing in this document</a></h3>\r
-<p>\r
-This document will discuss how you can easily create modules for the Apache \r
-HTTP Server 2.4, by exploring an example module called \r
-<code>mod_example</code>. In the first part of this document, the purpose \r
-of this module will be to calculate and print out various digest values for \r
-existing files on your web server, whenever we access the URL <code>\r
-http://hostname/filename.sum</code>. For instance, if we want to know the \r
-MD5 digest value of the file located at <code>\r
-http://www.example.com/index.html</code>, we would visit <code>\r
-http://www.example.com/index.html.sum</code>. \r
-</p>\r
-<p>\r
-In the second part of this document, which deals with configuration \r
-directive and context awareness, we will be looking at a module that simply \r
-write out its own configuration to the client.\r
-</p>\r
-\r
-<h3><a name="prerequisites" id="prerequisites">Prerequisites</a></h3>\r
-<p>\r
-First and foremost, you are expected to have a basic knowledge of how the C \r
-programming language works. In most cases, we will try to be as pedagogical \r
-as possible and link to documents describing the functions used in the \r
-examples, but there are also many cases where it is necessary to either \r
-just assume that "it works" or do some digging yourself into what the hows \r
-and whys of various function calls. \r
-</p>\r
-<p>\r
-Lastly, you will need to have a basic understanding of how modules are \r
-loaded and configured in the Apache HTTP Server, as well as how to get the headers for \r
-Apache if you do not have them already, as these are needed for compiling \r
-new modules.\r
-</p>\r
-\r
-<h3><a name="compiling" id="compiling">Compiling your module</a></h3>\r
-<p>\r
-To compile the source code we are building in this document, we will be \r
-using <a href="../programs/apxs.html">APXS</a>. Assuming your source file \r
-is called mod_example.c, compiling, installing and activating the module is \r
-as simple as: \r
-<div class="example"><pre>\r
-apxs -i -a -c mod_example.c\r
-</pre></div>\r
-</p>\r
-\r
-</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>\r
-<div class="section">\r
-<h2><a name="basics" id="basics">Defining a module</a></h2>\r
-<img src="../images/build_a_mod_3.png" /><br />\r
-<p>Every module starts with the same declaration, or name tag if you will, \r
-that defines a module as <em>a separate entity within Apache</em>:\r
-\r
-\r
-\r
-<pre style="color:#000000;background:#ffffef;border: 1px dashed #333; padding: 0.5em; margin: 1em 2em 1em 1em;">\r
-module AP_MODULE_DECLARE_DATA   example_module <code style="color:#806030; ">=</code>\r
-<code style="color:#806030; ">{</code>\r
-    STANDARD20_MODULE_STUFF<code style="color:#806030; ">,</code>\r
-    create_dir_conf<code style="color:#806030; ">,</code> <code style="color:#c34e00; ">/* Per-directory configuration handler */</code>\r
-    merge_dir_conf<code style="color:#806030; ">,</code>  <code style="color:#c34e00; ">/* Merge handler for per-directory configurations */</code>\r
-    create_svr_conf<code style="color:#806030; ">,</code> <code style="color:#c34e00; ">/* Per-server configuration handler */</code>\r
-    merge_svr_conf<code style="color:#806030; ">,</code>  <code style="color:#c34e00; ">/* Merge handler for per-server configurations */</code>\r
-    directives<code style="color:#806030; ">,</code>      <code style="color:#c34e00; ">/* Any directives we may have for httpd */</code>\r
-    register_hooks   <code style="color:#c34e00; ">/* Our hook registering function */</code>\r
-<code style="color:#806030; ">}</code><code style="color:#806030; ">;</code>\r
-</pre>\r
-\r
-\r
-\r
-This bit of code lets the server know that we have now registered a new module \r
-in the system, and that its name is <code>example_module</code>. The name \r
-of the module is used primarily for two things:<br />\r
-<ul>\r
-<li>Letting the server know how to load the module using the LoadModule</li>\r
-<li>Setting up a namespace for the module to use in configurations</li>\r
-</ul>\r
-For now, we're only concerned with the first purpose of the module name, \r
-which comes into play when we need to load the module:<br />\r
-<div class="example"><pre><a href="../mod/mod_so.html#LoadModule">LoadModule</a> example_module modules/mod_example.so</pre></div>\r
-In essence, this tells the server to open up <code>mod_example.so</code> and look for a module \r
-called <code>example_module</code>.\r
-</p>\r
-<p>\r
-Within this name tag of ours is also a bunch of references to how we would \r
-like to handle things: Which directives do we respond to in a configuration \r
-file or .htaccess, how do we operate within specific contexts, and what \r
-handlers are we interested in registering with the Apache HTTP service. We'll \r
-return to all these elements later in this document.\r
-</p>\r
-</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>\r
-<div class="section">\r
-<h2><a name="hooking" id="hooking">Getting started: Hooking into the server</a></h2>\r
-<h3><a name="hook_intro" id="hook_intro">An introduction to hooks</a></h3>\r
-<p>\r
-When handling requests in Apache HTTP Server 2.4, the first thing you will need to do is \r
-create a hook into the request handling process. A hook is essentially a \r
-message telling the server that you are willing to either serve or at least \r
-take a glance at certain requests given by clients. All handlers, whether \r
-it's mod_rewrite, mod_authn_*, mod_proxy and so on, are hooked into \r
-specific parts of the request process. As you are probably aware, modules \r
-serve different purposes; Some are authentication/authorization handlers, \r
-others are file or script handlers while some third modules rewrite URIs or \r
-proxies content. Furthermore, in the end, it is up to the user of the server \r
-how and when each module will come into place. Thus, the server itself does not \r
-presume to know which module is responsible for handling a specific \r
-request, and will ask each module whether they have an interest in a given \r
-request or not. It is then up to each module to either gently decline \r
-serving a request, accept serving it or flat out deny the request from \r
-being served, as authentication/authorization modules do: <br />\r
-<img src="../images/build_a_mod_2.png" /><br />\r
-To make it a bit easier for handlers such as our mod_example to know \r
-whether the client is requesting content we should handle or not, the server \r
-has directives for hinting to modules whether their assistance is needed or \r
-not. Two of these are <code class="directive"><a href="../mod/mod_mime.html#addhandler">AddHandler</a></code> \r
-and <code class="directive"><a href="../mod/core.html#sethandler">SetHandler</a></code>. Let's take a look at \r
-an example using <code class="directive"><a href="../mod/mod_mime.html#addhandler">AddHandler</a></code>. In \r
-our example case, we want every request ending with .sum to be served by \r
-<code>mod_example</code>, so we'll add a configuration directive that tells \r
-the server to do just that:\r
-<div class="example"><pre>\r
-AddHandler example-handler .sum\r
-</pre></div>\r
-What this tells the server is the following: <em>Whenever we receive a request \r
-for a URI ending in .sum, we are to let all modules know that we are \r
-looking for whoever goes by the name of "example-handler" </em>. \r
-Thus, when a request is being served that ends in .sum, the server will let all \r
-modules know, that this request should be served by "example-handler\r
-". As you will see later, when we start building mod_example, we will \r
-check for this handler tag relayed by <code>AddHandler</code> and reply to \r
-the server based on the value of this tag.\r
-</p>\r
-\r
-<h3><a name="hook_declaration" id="hook_declaration">Hooking into httpd</a></h3>\r
-<p>\r
-To begin with, we only want to create a simple handler, that replies to the \r
-client browser when a specific URL is requested, so we won't bother setting \r
-up configuration handlers and directives just yet. Our initial module \r
-definition will look like this:<br />\r
-\r
-\r
-\r
-<pre style="color:#000000;background:#ffffef;border: 1px dashed #333; padding: 0.5em; margin: 1em 2em 1em 1em;">\r
-module AP_MODULE_DECLARE_DATA   example_module =\r
-{\r
-    STANDARD20_MODULE_STUFF,\r
-    <code style="color:#7f0055; font-weight:bold; ">NULL</code>,\r
-    <code style="color:#7f0055; font-weight:bold; ">NULL</code>,\r
-    <code style="color:#7f0055; font-weight:bold; ">NULL</code>,\r
-    <code style="color:#7f0055; font-weight:bold; ">NULL</code>,\r
-    <code style="color:#7f0055; font-weight:bold; ">NULL</code>,\r
-    <code style="color:#800040; ">register_hooks</code>   <code style="color:#c34e00; "><code style="color:#c34e00; ">/* Our hook registering function */</code></code>\r
-};\r
-</pre>\r
-\r
-\r
-\r
-This lets the server know that we are not interesting in anything fancy, we \r
-just want to hook onto the requests and possibly handle some of them. </p> \r
-<p> The reference in our example declaration, <code>register_hooks</code> \r
-is the name of a function we will create to manage how we hook onto the \r
-request process. In this example module, the function has just one purpose; \r
-To create a simple hook that gets called after all the rewrites, access \r
-control etc has been handled. Thus, we will let the server know, that we want \r
-to hook into its process as one of the last modules: \r
-\r
-\r
-\r
-<pre style="color:#000000;background:#ffffef;border: 1px dashed #333; padding: 0.5em; margin: 1em 2em 1em 1em;">\r
-<code style="color:#400000; font-weight:bold; ">static</code> <code style="color:#400000; font-weight:bold; ">void</code> register_hooks<code style="color:#806030; ">(</code>apr_pool_t <code style="color:#806030; ">*</code>pool<code style="color:#806030; ">)</code>\r
-<code style="color:#806030; ">{</code>\r
-    <code style="color:#c34e00; ">/* Create a hook in the request handler, so we get called when a request arrives */</code>\r
-    <code style="color:#800040; ">ap_hook_handler</code><code style="color:#806030; ">(</code>example_handler<code style="color:#806030; ">,</code> <code style="color:#7f0055; font-weight:bold; ">NULL</code><code style="color:#806030; ">,</code> <code style="color:#7f0055; font-weight:bold; ">NULL</code><code style="color:#806030; ">,</code> APR_HOOK_LAST<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-<code style="color:#806030; ">}</code>\r
-</pre>\r
-\r
-\r
-\r
-The <code>example_handler</code> reference is the function that will handle \r
-the request. We will discuss how to create a handler in the next chapter.\r
-</p>\r
-\r
-<h3><a name="hook_others" id="hook_others">Other useful hooks</a></h3>\r
-<p>\r
-Hooking into the request handling phase is but one of many hooks that you \r
-can create. Some other ways of hooking are:\r
-<ul>\r
-<li><code>ap_hook_child_init</code>: Place a hook that executes when a child process is spawned (commonly used for initializing modules after the server has forked)</li>\r
-<li><code>ap_hook_pre_config</code>: Place a hook that executes before any configuration data has been read (very early hook)</li>\r
-<li><code>ap_hook_post_config</code>: Place a hook that executes after configuration has been parsed, but before the server has forked</li>\r
-<li><code>ap_hook_translate_name</code>: Place a hook that executes when a URI needs to be translated into a filename on the server (think <code>mod_rewrite</code>)</li>\r
-</ul>\r
-</p>\r
-\r
-</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>\r
-<div class="section">\r
-<h2><a name="handling" id="handling">Building a handler</a></h2>\r
-<p>\r
-A handler is essentially a function that receives a callback when a request \r
-to the server is made. It is passed a record of the current request (how it was \r
-made, which headers and requests were passed along, who's giving the \r
-request and so on), and is put in charge of either telling the server that it's \r
-not interested in the request or handle the request with the tools provided.\r
-</p>\r
-<h3><a name="simple_handler" id="simple_handler">A simple "Hello, world!" \r
-handler</a></h3> Let's start off by making a very simple request handler \r
-that does the following: <br />\r
-<ol>\r
-<li>Check that this is a request that should be served by "example-handler"</li>\r
-<li>Set the content type of our output to <code>text/html</code></li>\r
-<li>Write "Hello, world!" back to the client browser</li>\r
-<li>Let the server know that we took care of this request and everything went fine</li>\r
-</ol>\r
-In C code, our example handler will now look like this:<br />\r
-\r
-\r
-\r
-<pre style="color:#000000;background:#ffffef;border: 1px dashed #333; padding: 0.5em; margin: 1em 2em 1em 1em;">\r
-<code style="color:#400000; font-weight:bold; ">static</code> <code style="color:#400000; font-weight:bold; ">int</code> example_handler<code style="color:#806030; ">(</code>request_rec <code style="color:#806030; ">*</code>r<code style="color:#806030; ">)</code>\r
-<code style="color:#806030; ">{</code>\r
-    <code style="color:#c34e00; ">/* First off, we need to check if this is a call for the "example-handler" handler.</code>\r
-<code style="color:#c34e00; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* If it is, we accept it and do our things, if not, we simply return DECLINED,</code>\r
-<code style="color:#c34e00; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* and the server will try somewhere else.</code>\r
-<code style="color:#c34e00; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</code>\r
-    <code style="color:#400000; font-weight:bold; ">if</code> <code style="color:#806030; ">(</code><code style="color:#806030; ">!</code>r<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">handler</code> <code style="color:#806030; ">|</code><code style="color:#806030; ">|</code> <code style="color:#800040; ">strcmp</code><code style="color:#806030; ">(</code>r<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">handler</code><code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">example-handler</code><code style="color:#800000; ">"</code><code style="color:#806030; ">)</code><code style="color:#806030; ">)</code> <code style="color:#400000; font-weight:bold; ">return</code> <code style="color:#806030; ">(</code>DECLINED<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    \r
-    <code style="color:#c34e00; ">/* Now that we are handling this request, we'll write out "Hello, world!" to the client.</code>\r
-<code style="color:#c34e00; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* To do so, we must first set the appropriate content type, followed by our output.</code>\r
-<code style="color:#c34e00; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</code>\r
-    <a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__APACHE__CORE__PROTO.html#gaa2f8412c400197338ec509f4a45e4579">ap_set_content_type</a><code style="color:#806030; ">(</code>r<code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">text/html</code><code style="color:#800000; ">"</code><code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    <a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__APACHE__CORE__PROTO.html#ga5e91eb6ca777c9a427b2e82bf1eeb81d">ap_rprintf</a><code style="color:#806030; ">(</code>r<code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">Hello, world!</code><code style="color:#800000; ">"</code><code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    \r
-    <code style="color:#c34e00; ">/* Lastly, we must tell the server that we took care of this request and everything went fine.</code>\r
-<code style="color:#c34e00; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* We do so by simply returning the value OK to the server.</code>\r
-<code style="color:#c34e00; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</code>\r
-    <code style="color:#400000; font-weight:bold; ">return</code> OK<code style="color:#806030; ">;</code>\r
-<code style="color:#806030; ">}</code>\r
-</pre>\r
-\r
-\r
-\r
-Now, we put all we have learned together and end up with a program that \r
-looks like \r
-<a href="http://people.apache.org/~humbedooh/mods/examples/mod_example_1.c">mod_example_1.c</a>\r
-. The functions used in this example will be explained later in the section \r
-<a href="#functions">"Some useful functions you should know"</a>\r
-.  <h3><a name="request_rec" id="request_rec">The request_rec structure \r
-</a></h3> <p>The most essential part of any request is the <em>request record\r
-</em>. In a call to a handler function, this is represented by the <code>\r
-request_req* </code> structure passed along with every call that is made. \r
-This struct, typically just refered to as <code>r</code> in modules, \r
-contains all the information you need for your module to fully process any \r
-HTTP request and respond accordingly.</p> <p>Some key elements of the <code>\r
-request_req </code> structure are:\r
-<ul>\r
-<li><code><code style="color:#008833">r-&gt;handler</code> (char*)</code>: Contains the name of the handler the server is currently asking to do the handling of this request</li>\r
-<li><code><code style="color:#008833">r-&gt;method</code> (char*)</code>: Contains the HTTP method being used, f.x. GET or POST</li>\r
-<li><code><code style="color:#008833">r-&gt;filename</code> (char*)</code>: Contains the translated filename the client is requesting</li>\r
-<li><code><code style="color:#008833">r-&gt;args</code> (char*)</code>: Contains the query string of the request, if any</li>\r
-<li><code><code style="color:#008833">r-&gt;headers_in</code> (apr_table_t*)</code>: Contains all the headers sent by the client</li>\r
-<li><code><code style="color:#008833">r-&gt;connection</code> (conn_rec*)</code>: A record containing information about the current connection</li>\r
-<li><code><code style="color:#008833">r-&gt;useragent_ip</code> (char*)</code>: The IP address of the client connecting to us</li>\r
-<li><code><code style="color:#008833">r-&gt;pool</code> (apr_pool_t*)</code>: The memory pool of this request. We'll discuss this in the "\r
-<a href="#memory">Memory management</a>" chapter.</li>\r
-</ul>\r
-A complete list of all the values contained with in the <code>request_req</code> structure can be found in \r
-the <a href="http://svn.apache.org/repos/asf/httpd/httpd/trunk/include/httpd.h"><code>httpd.h</code></a> header \r
-file or at <a href="http://ci.apache.org/projects/httpd/trunk/doxygen/structrequest__rec.html">http://ci.apache.org/projects/httpd/trunk/doxygen/structrequest__rec.html</a>.\r
-</p>\r
-<p>\r
-Let's try out some of these variables in another example handler:<br />\r
-\r
-\r
-\r
-<pre style="color:#000000;background:#ffffef;border: 1px dashed #333; padding: 0.5em; margin: 1em 2em 1em 1em;">\r
-<code style="color:#400000; font-weight:bold; ">static</code> <code style="color:#400000; font-weight:bold; ">int</code> example_handler<code style="color:#806030; ">(</code>request_rec <code style="color:#806030; ">*</code>r<code style="color:#806030; ">)</code>\r
-<code style="color:#806030; ">{</code>\r
-    <code style="color:#c34e00; ">/* Set the appropriate content type */</code>\r
-    <a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__APACHE__CORE__PROTO.html#gaa2f8412c400197338ec509f4a45e4579">ap_set_content_type</a><code style="color:#806030; ">(</code>r<code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">text/html</code><code style="color:#800000; ">"</code><code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-\r
-    <code style="color:#c34e00; ">/* Print out the IP address of the client connecting to us: */</code>\r
-    <a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__APACHE__CORE__PROTO.html#ga5e91eb6ca777c9a427b2e82bf1eeb81d">ap_rprintf</a><code style="color:#806030; ">(</code>r<code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">&lt;h2&gt;Hello, </code><code style="color:#0f6900; ">%s</code><code style="color:#e60000; ">!&lt;/h2&gt;</code><code style="color:#800000; ">"</code><code style="color:#806030; ">,</code> r<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">useragent_ip</code><code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    \r
-    <code style="color:#c34e00; ">/* If we were reached through a GET or a POST request, be happy, else sad. */</code>\r
-    <code style="color:#400000; font-weight:bold; ">if</code> <code style="color:#806030; ">(</code> <code style="color:#806030; ">!</code><code style="color:#800040; ">strcmp</code><code style="color:#806030; ">(</code>r<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">method</code><code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">POST</code><code style="color:#800000; ">"</code><code style="color:#806030; ">)</code> <code style="color:#806030; ">|</code><code style="color:#806030; ">|</code> <code style="color:#806030; ">!</code><code style="color:#800040; ">strcmp</code><code style="color:#806030; ">(</code>r<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">method</code><code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">GET</code><code style="color:#800000; ">"</code><code style="color:#806030; ">)</code> <code style="color:#806030; ">)</code> <code style="color:#806030; ">{</code>\r
-        ap_rputs<code style="color:#806030; ">(</code><code style="color:#800000; ">"</code><code style="color:#e60000; ">You used a GET or a POST method, that makes us happy!&lt;br&gt;</code><code style="color:#800000; ">"</code><code style="color:#806030; ">,</code> r<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    <code style="color:#806030; ">}</code>\r
-    <code style="color:#400000; font-weight:bold; ">else</code> <code style="color:#806030; ">{</code>\r
-        ap_rputs<code style="color:#806030; ">(</code><code style="color:#800000; ">"</code><code style="color:#e60000; ">You did not use POST or GET, that makes us sad :(&lt;br&gt;</code><code style="color:#800000; ">"</code><code style="color:#806030; ">,</code> r<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    <code style="color:#806030; ">}</code>\r
-\r
-    <code style="color:#c34e00; ">/* Lastly, if there was a query string, let's print that too! */</code>\r
-    <code style="color:#400000; font-weight:bold; ">if</code> <code style="color:#806030; ">(</code>r<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">args</code><code style="color:#806030; ">)</code> <code style="color:#806030; ">{</code>\r
-        <a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__APACHE__CORE__PROTO.html#ga5e91eb6ca777c9a427b2e82bf1eeb81d">ap_rprintf</a><code style="color:#806030; ">(</code>r<code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">Your query string was: </code><code style="color:#0f6900; ">%s</code><code style="color:#800000; ">"</code><code style="color:#806030; ">,</code> r<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">args</code><code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    <code style="color:#806030; ">}</code>\r
-    <code style="color:#400000; font-weight:bold; ">return</code> OK<code style="color:#806030; ">;</code>\r
-<code style="color:#806030; ">}</code>\r
-</pre>\r
-\r
-\r
-\r
-</p>\r
-\r
-\r
-<h3><a name="return_value" id="return_value">Return values</a></h3>\r
-<p>\r
-Apache relies on return values from handlers to signify whether a request \r
-was handled or not, and if so, whether the request went well or not. If a \r
-module is not interested in handling a specific request, it should always \r
-return the value <code>DECLINED</code>. If it is handling a request, it \r
-should either return the generic value <code>OK</code>, or a specific HTTP \r
-status code, for example:\r
-\r
-\r
-\r
-<pre style="color:#000000;background:#ffffef;border: 1px dashed #333; padding: 0.5em; margin: 1em 2em 1em 1em;">\r
-<code style="color:#400000; font-weight:bold; ">static</code> <code style="color:#400000; font-weight:bold; ">int</code> example_handler<code style="color:#806030; ">(</code>request_rec <code style="color:#806030; ">*</code>r<code style="color:#806030; ">)</code>\r
-<code style="color:#806030; ">{</code>\r
-    <code style="color:#c34e00; ">/* Return 404: Not found */</code>\r
-    <code style="color:#400000; font-weight:bold; ">return</code> HTTP_NOT_FOUND<code style="color:#806030; ">;</code>\r
-<code style="color:#806030; ">}</code>\r
-</pre>\r
-\r
-\r
-\r
-Returning <code>OK</code> or a HTTP status code does not necessarily mean \r
-that the request will end. The server may still have other handlers that are \r
-interested in this request, for instance the logging modules which, upon a \r
-successful request, will write down a summary of what was requested and how \r
-it went. To do a full stop and prevent any further processing after your \r
-module is done, you can return the value <code>DONE</code> to let the server \r
-know that it should cease all activity on this request and carry on with \r
-the next, without informing other handlers.\r
-<br />\r
-<strong>General response codes:</strong>\r
-<ul>\r
-<li><code>DECLINED</code>: We are not handling this request</li>\r
-<li><code>OK</code>: We handled this request and it went well</li>\r
-<li><code>DONE</code>: We handled this request and the server should just close this thread without further processing</li>\r
-</ul><br />\r
-<strong>HTTP specific return codes (excerpt):</strong>\r
-<ul>\r
-<li><code>HTTP_OK (200)</code>: Request was okay</li>\r
-<li><code>HTTP_MOVED_PERMANENTLY (301)</code>: The resource has moved to a new URL</li>\r
-<li><code>HTTP_UNAUTHORIZED (401)</code>: Client is not authorized to visit this page</li>\r
-<li><code>HTTP_FORBIDDEN (403)</code>: Permission denied</li>\r
-<li><code>HTTP_NOT_FOUND (404)</code>: File not found</li>\r
-<li><code>HTTP_INTERNAL_SERVER_ERROR (500)</code>: Internal server error (self explanatory)</li>\r
-</ul>\r
-</p>\r
-\r
-\r
-<h3><a name="functions" id="functions">Some useful functions you should know</a></h3>\r
-\r
-<ul>\r
-<li>\r
-    <code>ap_rputs(const char *string, request_req *r)</code>: <br />\r
-    Sends a string of text to the client. This is a shorthand version of <a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__APACHE__CORE__PROTO.html#gac827cd0537d2b6213a7c06d7c26cc36e">\r
-    ap_rwrite</a>.\r
-    \r
-\r
-\r
-<pre style="color:#000000;background:#ffffef;border: 1px dashed #333; padding: 0.5em; margin: 1em 2em 1em 1em;">ap_rputs<code style="color:#806030; ">(</code><code style="color:#800000; ">"</code><code style="color:#e60000; ">Hello, world!</code><code style="color:#800000; ">"</code><code style="color:#806030; ">,</code> r<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code></pre>\r
-\r
-\r
-\r
-</li>\r
-<li>\r
-    <code>\r
-    <a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__APACHE__CORE__PROTO.html#ga5e91eb6ca777c9a427b2e82bf1eeb81d">ap_rprintf</a></code>: <br />\r
-    This function works just like <code>printf</code>, except it sends the result to the client. \r
-    \r
-\r
-\r
-<pre style="color:#000000;background:#ffffef;border: 1px dashed #333; padding: 0.5em; margin: 1em 2em 1em 1em;"><code style="color:#2e8800; "><a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__APACHE__CORE__PROTO.html#ga5e91eb6ca777c9a427b2e82bf1eeb81d">ap_rprintf</a></code><code style="color:#806030; ">(</code>r<code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">Hello, </code><code style="color:#0f6900; ">%s</code><code style="color:#e60000; ">!</code><code style="color:#800000; ">"</code><code style="color:#806030; ">,</code> r<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">useragent_ip</code><code style="color:#806030; ">)</code><code style="color:#806030; ">;</code></pre>\r
-\r
-\r
-</li>\r
-<li>\r
-    <code>\r
-    <a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__APACHE__CORE__PROTO.html#gaa2f8412c400197338ec509f4a45e4579">ap_set_content_type</a>(request_req *r, const char *type)</code>: <br />\r
-    Sets the content type of the output you are sending.\r
-    \r
-\r
-\r
-<pre style="color:#000000;background:#ffffef;border: 1px dashed #333; padding: 0.5em; margin: 1em 2em 1em 1em;"><code style="color:#2e8800; "><a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__APACHE__CORE__PROTO.html#gaa2f8412c400197338ec509f4a45e4579">ap_set_content_type</a></code><code style="color:#806030; ">(</code>r<code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">text/plain</code><code style="color:#800000; ">"</code><code style="color:#806030; ">)</code><code style="color:#806030; ">;</code> <code style="color:#c34e00; ">/* force a raw text output */</code></pre>\r
-\r
-\r
-</li>\r
-\r
-\r
-</ul>\r
-\r
-\r
-<h3><a name="memory" id="memory">Memory management</a></h3>\r
-<p>\r
-Managing your resources in Apache HTTP Server 2.4 is quite easy, thanks to the memory pool \r
-system. In essence, each server, connection and request have their own \r
-memory pool that gets cleaned up when its scope ends, e.g. when a request \r
-is done or when a server process shuts down. All your module needs to do is \r
-latch onto this memory pool, and you won't have to worry about having to \r
-clean up after yourself - pretty neat, huh?\r
-</p>\r
-\r
-<p>\r
-In our module, we will primarily be allocating memory for each request, so \r
-it's appropriate to use the <code style="color:#008833">r-&gt;pool</code> \r
-reference when creating new objects. A few of the functions for allocating \r
-memory within a pool are:\r
-<ul>\r
-<li><code>void* <a href="http://apr.apache.org/docs/apr/1.4/group__apr__pools.html#ga85f1e193c31d109affda72f9a92c6915">apr_palloc</a>(\r
-apr_pool_t *p, apr_size_t size)</code>: Allocates <code>size</code> number of bytes in the pool for you</li>\r
-<li><code>void* <a href="http://apr.apache.org/docs/apr/1.4/group__apr__pools.html#gaf61c098ad258069d64cdf8c0a9369f9e">apr_pcalloc</a>(\r
-apr_pool_t *p, apr_size_t size)</code>: Allocates <code>size</code> number of bytes in the pool for you and sets all bytes to 0</li>\r
-<li><code>char* <a href="http://apr.apache.org/docs/apr/1.4/group__apr__strings.html#gabc79e99ff19abbd7cfd18308c5f85d47">apr_pstrdup</a>(\r
-apr_pool_t *p, const char *s)</code>: Creates a duplicate of the string <code>s</code>. This is useful for copying constant values so you can edit them</li>\r
-<li><code>char* <a href="http://apr.apache.org/docs/apr/1.4/group__apr__strings.html#ga3eca76b8d293c5c3f8021e45eda813d8">apr_psprintf</a>(\r
-apr_pool_t *p, const char *fmt, ...)</code>: Similar to <code>sprintf</code>, except the server supplies you with an appropriately allocated target variable</li>\r
-\r
-</ul>\r
-Let's put these functions into an example handler:<br />\r
-\r
-\r
-\r
-<pre style="color:#000000;background:#ffffef;border: 1px dashed #333; padding: 0.5em; margin: 1em 2em 1em 1em;">\r
-<code style="color:#400000; font-weight:bold; ">static</code> <code style="color:#400000; font-weight:bold; ">int</code> example_handler<code style="color:#806030; ">(</code>request_rec <code style="color:#806030; ">*</code>r<code style="color:#806030; ">)</code>\r
-<code style="color:#806030; ">{</code>\r
-    <code style="color:#400000; font-weight:bold; ">const</code> <code style="color:#400000; font-weight:bold; ">char</code><code style="color:#806030; ">*</code> original <code style="color:#806030; ">=</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">You can't edit this!</code><code style="color:#800000; ">"</code><code style="color:#806030; ">;</code>\r
-    <code style="color:#400000; font-weight:bold; ">char</code><code style="color:#806030; ">*</code> copy<code style="color:#806030; ">;</code>\r
-    <code style="color:#400000; font-weight:bold; ">int</code><code style="color:#806030; ">*</code> integers<code style="color:#806030; ">;</code>\r
-    \r
-    <code style="color:#c34e00; ">/* Allocate space for 10 integer values and set them all to zero. */</code>\r
-    integers <code style="color:#806030; ">=</code> apr_pcalloc<code style="color:#806030; ">(</code>r<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code>pool<code style="color:#806030; ">,</code> <code style="color:#400000; font-weight:bold; ">sizeof</code><code style="color:#806030; ">(</code><code style="color:#400000; font-weight:bold; ">int</code><code style="color:#806030; ">)</code><code style="color:#806030; ">*</code><code style="color:#c00000; ">10</code><code style="color:#806030; ">)</code><code style="color:#806030; ">;</code> \r
-    \r
-    <code style="color:#c34e00; ">/* Create a copy of the 'original' variable that we can edit. */</code>\r
-    copy <code style="color:#806030; ">=</code> apr_pstrdup<code style="color:#806030; ">(</code>r<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code>pool<code style="color:#806030; ">,</code> original<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    <code style="color:#400000; font-weight:bold; ">return</code> OK<code style="color:#806030; ">;</code>\r
-<code style="color:#806030; ">}</code>\r
-</pre>\r
-\r
-\r
-This is all well and good for our module, which won't need any \r
-pre-initialized variables or structures. However, if we wanted to \r
-initialize something early on, before the requests come rolling in, we \r
-could simply add a call to a function in our <code>register_hooks</code> \r
-function to sort it out:\r
-\r
-\r
-<pre style="color:#000000;background:#ffffef;border: 1px dashed #333; padding: 0.5em; margin: 1em 2em 1em 1em;">\r
-<code style="color:#400000; font-weight:bold; ">static</code> <code style="color:#400000; font-weight:bold; ">void</code> register_hooks<code style="color:#806030; ">(</code>apr_pool_t <code style="color:#806030; ">*</code>pool<code style="color:#806030; ">)</code>\r
-<code style="color:#806030; ">{</code>\r
-    <code style="color:#c34e00; ">/* Call a function that initializes some stuff */</code>\r
-    <code style="color:#800040; ">example_init_function</code><code style="color:#806030; ">(</code>pool<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    <code style="color:#c34e00; ">/* Create a hook in the request handler, so we get called when a request arrives */</code>\r
-    <code style="color:#800040; ">ap_hook_handler</code><code style="color:#806030; ">(</code>example_handler<code style="color:#806030; ">,</code> <code style="color:#7f0055; font-weight:bold; ">NULL</code><code style="color:#806030; ">,</code> <code style="color:#7f0055; font-weight:bold; ">NULL</code><code style="color:#806030; ">,</code> APR_HOOK_LAST<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-<code style="color:#806030; ">}</code>\r
-</pre>\r
-\r
-\r
-In this pre-request initialization function we would not be using the \r
-same pool as we did when allocating resources for request-based functions. \r
-Instead, we would use the pool given to us by the server for allocating memory \r
-on a per-process based level.\r
-\r
-</p>\r
-\r
-\r
-<h3><a name="parsing" id="parsing">Parsing request data</a></h3>\r
-<p>\r
-In our example module, we would like to add a feature, that checks which \r
-type of digest, MD5 or SHA1 the client would like to see. This could be \r
-solved by adding a query string to the request. A query string is typically \r
-comprised of several keys and values put together in a string, for instance \r
-<code>valueA=yes&amp;valueB=no&amp;valueC=maybe</code>. It is up to the \r
-module itself to parse these and get the data it requires. In our example, \r
-we'll be looking for a key called <code>digest</code>, and if set to <code>\r
-md5</code>, we'll produce an MD5 digest, otherwise we'll produce a SHA1 \r
-digest.\r
-</p>\r
-<p>\r
-Since the introduction of Apache HTTP Server 2.4, parsing request data from GET and \r
-POST requests have never been easier. All we require to parse both GET and \r
-POST data is four simple lines: \r
-\r
-\r
-\r
-<pre style="color:#000000;background:#ffffef;border: 1px dashed #333; padding: 0.5em; margin: 1em 2em 1em 1em;">\r
-<a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__apr__tables.html#gad7ea82d6608a4a633fc3775694ab71e4">apr_table_t</a> *GET;\r
-<a href="http://ci.apache.org/projects/httpd/trunk/doxygen/structapr__array__header__t.html">apr_array_header_t</a> *POST;\r
-\r
-<a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__APACHE__CORE__SCRIPT.html#gaed25877b529623a4d8f99f819ba1b7bd">ap_args_to_table</a>(r, &amp;GET);\r
-<a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__APACHE__CORE__DAEMON.html#ga9d426b6382b49754d4f87c55f65af202">ap_parse_form_data</a>(r, <code style="color:#7f0055; font-weight:bold; ">NULL</code>, &amp;POST, -1, 8192);\r
-</pre>\r
-\r
-\r
-\r
-In our specific example module, we're looking for the <code>digest</code> \r
-value from the query string, which now resides inside a table called <code>\r
-GET</code>. To extract this value, we need only perform a simple operation:\r
-<br />\r
-\r
-\r
-\r
-<pre style="color:#000000;background:#ffffef;border: 1px dashed #333; padding: 0.5em; margin: 1em 2em 1em 1em;">\r
-<code style="color:#c34e00; ">/* Get the "digest" key from the query string, if any. */</code>\r
-<code style="color:#400000; font-weight:bold; ">const</code> <code style="color:#400000; font-weight:bold; ">char</code><code style="color:#806030; "> *</code>digestType <code style="color:#806030; ">=</code> <a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__apr__tables.html#ga4db13e3915c6b9a3142b175d4c15d915">apr_table_get</a><code style="color:#806030; ">(</code>GET<code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">digest</code><code style="color:#800000; ">"</code><code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-\r
-<code style="color:#c34e00; ">/* If no key was returned, we will set a default value instead. */</code>\r
-<code style="color:#400000; font-weight:bold; ">if</code> <code style="color:#806030; ">(</code><code style="color:#806030; ">!</code>digestType<code style="color:#806030; ">)</code> digestType <code style="color:#806030; ">=</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">sha1</code><code style="color:#800000; ">"</code><code style="color:#806030; ">;</code>\r
-\r
-</pre>\r
-\r
-\r
-\r
-The structures used for the POST and GET data are not exactly the same, so \r
-if we were to fetch a value from POST data instead of the query string, we \r
-would have to resort to a few more lines, as outlined in <a href="#get_post">this example</a> in the last chapter of this document.\r
-</p>\r
-\r
-\r
-<h3><a name="advanced_handler" id="advanced_handler">Making an advanced handler</a></h3>\r
-Now that we have learned how to parse form data and manage our resources, \r
-we can move on to creating an advanced version of our module, that spits \r
-out the MD5 or SHA1 digest of files:<br />\r
-\r
-\r
-\r
-<pre style="color:#000000;background:#ffffef;border: 1px dashed #333; padding: 0.5em; margin: 1em 2em 1em 1em;">\r
-<code style="color:#400000; font-weight:bold; ">static</code> <code style="color:#400000; font-weight:bold; ">int</code> example_handler<code style="color:#806030; ">(</code>request_rec <code style="color:#806030; ">*</code>r<code style="color:#806030; ">)</code>\r
-<code style="color:#806030; ">{</code>\r
-    <code style="color:#400000; font-weight:bold; ">int</code> rc<code style="color:#806030; ">,</code> exists<code style="color:#806030; ">;</code>\r
-    apr_finfo_t finfo<code style="color:#806030; ">;</code>\r
-    apr_file_t<code style="color:#806030; "> *</code>file<code style="color:#806030; ">;</code>\r
-    <code style="color:#400000; font-weight:bold; ">char</code> <code style="color:#806030; ">*</code>filename<code style="color:#806030; ">;</code>\r
-    <code style="color:#400000; font-weight:bold; ">char</code> buffer<code style="color:#806030; ">[</code><code style="color:#c00000; ">256</code><code style="color:#806030; ">]</code><code style="color:#806030; ">;</code>\r
-    apr_size_t readBytes<code style="color:#806030; ">;</code>\r
-    <code style="color:#400000; font-weight:bold; ">int</code> n<code style="color:#806030; ">;</code>\r
-    apr_table_t<code style="color:#806030; "> *</code>GET<code style="color:#806030; ">;</code>\r
-    apr_array_header_t<code style="color:#806030; "> *</code>POST<code style="color:#806030; ">;</code>\r
-    <code style="color:#400000; font-weight:bold; ">const</code> <code style="color:#400000; font-weight:bold; ">char</code><code style="color:#806030; "> *</code>digestType<code style="color:#806030; ">;</code>\r
-    \r
-    \r
-    <code style="color:#c34e00; ">/* Check that the "example-handler" handler is being called. */</code>\r
-    <code style="color:#400000; font-weight:bold; ">if</code> <code style="color:#806030; ">(</code><code style="color:#806030; ">!</code>r<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">handler</code> <code style="color:#806030; ">|</code><code style="color:#806030; ">|</code> <code style="color:#800040; ">strcmp</code><code style="color:#806030; ">(</code>r<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">handler</code><code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">example-handler</code><code style="color:#800000; ">"</code><code style="color:#806030; ">)</code><code style="color:#806030; ">)</code> <code style="color:#400000; font-weight:bold; ">return</code> <code style="color:#806030; ">(</code>DECLINED<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    \r
-    <code style="color:#c34e00; ">/* Figure out which file is being requested by removing the .sum from it */</code>\r
-    filename <code style="color:#806030; ">=</code> apr_pstrdup<code style="color:#806030; ">(</code>r<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">pool</code><code style="color:#806030; ">,</code> r<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">filename</code><code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    filename<code style="color:#806030; ">[</code><code style="color:#800040; ">strlen</code><code style="color:#806030; ">(</code>filename<code style="color:#806030; ">)</code><code style="color:#806030; ">-</code><code style="color:#c00000; ">4</code><code style="color:#806030; ">]</code> <code style="color:#806030; ">=</code> <code style="color:#c00000; ">0</code><code style="color:#806030; ">;</code> <code style="color:#c34e00; ">/* Cut off the last 4 characters. */</code>\r
-    \r
-    <code style="color:#c34e00; ">/* Figure out if the file we request a sum on exists and isn't a directory */</code>\r
-    rc <code style="color:#806030; ">=</code> apr_stat<code style="color:#806030; ">(</code><code style="color:#806030; ">&amp;</code>finfo<code style="color:#806030; ">,</code> filename<code style="color:#806030; ">,</code> APR_FINFO_MIN<code style="color:#806030; ">,</code> r<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">pool</code><code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    <code style="color:#400000; font-weight:bold; ">if</code> <code style="color:#806030; ">(</code>rc <code style="color:#806030; ">=</code><code style="color:#806030; ">=</code> APR_SUCCESS<code style="color:#806030; ">)</code> <code style="color:#806030; ">{</code>\r
-        exists <code style="color:#806030; ">=</code>\r
-        <code style="color:#806030; ">(</code>\r
-            <code style="color:#806030; ">(</code>finfo<code style="color:#806030; ">.</code>filetype <code style="color:#806030; ">!</code><code style="color:#806030; ">=</code> APR_NOFILE<code style="color:#806030; ">)</code>\r
-        <code style="color:#806030; ">&amp;</code><code style="color:#806030; ">&amp;</code>  <code style="color:#806030; ">!</code><code style="color:#806030; ">(</code>finfo<code style="color:#806030; ">.</code>filetype <code style="color:#806030; ">&amp;</code> APR_DIR<code style="color:#806030; ">)</code>\r
-        <code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-        <code style="color:#400000; font-weight:bold; ">if</code> <code style="color:#806030; ">(</code><code style="color:#806030; ">!</code>exists<code style="color:#806030; ">)</code> <code style="color:#400000; font-weight:bold; ">return</code> HTTP_NOT_FOUND<code style="color:#806030; ">;</code> <code style="color:#c34e00; ">/* Return a 404 if not found. */</code>\r
-    <code style="color:#806030; ">}</code>\r
-    <code style="color:#c34e00; ">/* If apr_stat failed, we're probably not allowed to check this file. */</code>\r
-    <code style="color:#400000; font-weight:bold; ">else</code> <code style="color:#400000; font-weight:bold; ">return</code> HTTP_FORBIDDEN<code style="color:#806030; ">;</code>\r
-    \r
-    <code style="color:#c34e00; ">/* Parse the GET and, optionally, the POST data sent to us */</code>\r
-    \r
-    ap_args_to_table<code style="color:#806030; ">(</code>r<code style="color:#806030; ">,</code> <code style="color:#806030; ">&amp;</code>GET<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    ap_parse_form_data<code style="color:#806030; ">(</code>r<code style="color:#806030; ">,</code> <code style="color:#007d45; ">NULL</code><code style="color:#806030; ">,</code> <code style="color:#806030; ">&amp;</code>POST<code style="color:#806030; ">,</code> <code style="color:#806030; ">-</code><code style="color:#c00000; ">1</code><code style="color:#806030; ">,</code> <code style="color:#c00000; ">8192</code><code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    \r
-    <code style="color:#c34e00; ">/* Set the appropriate content type */</code>\r
-    ap_set_content_type<code style="color:#806030; ">(</code>r<code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">text/html</code><code style="color:#800000; ">"</code><code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    \r
-    <code style="color:#c34e00; ">/* Print a title and some general information */</code>\r
-    ap_rprintf<code style="color:#806030; ">(</code>r<code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">&lt;h2&gt;Information on </code><code style="color:#0f6900; ">%s</code><code style="color:#e60000; ">:&lt;/h2&gt;</code><code style="color:#800000; ">"</code><code style="color:#806030; ">,</code> filename<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    ap_rprintf<code style="color:#806030; ">(</code>r<code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">&lt;b&gt;Size:&lt;/b&gt; </code><code style="color:#0f6900; ">%u</code><code style="color:#e60000; "> bytes&lt;br/&gt;</code><code style="color:#800000; ">"</code><code style="color:#806030; ">,</code> finfo<code style="color:#806030; ">.</code>size<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    \r
-    <code style="color:#c34e00; ">/* Get the digest type the client wants to see */</code>\r
-    digestType <code style="color:#806030; ">=</code> apr_table_get<code style="color:#806030; ">(</code>GET<code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">digest</code><code style="color:#800000; ">"</code><code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    <code style="color:#400000; font-weight:bold; ">if</code> <code style="color:#806030; ">(</code><code style="color:#806030; ">!</code>digestType<code style="color:#806030; ">)</code> digestType <code style="color:#806030; ">=</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">MD5</code><code style="color:#800000; ">"</code><code style="color:#806030; ">;</code>\r
-    \r
-    \r
-    rc <code style="color:#806030; ">=</code> apr_file_open<code style="color:#806030; ">(</code><code style="color:#806030; ">&amp;</code>file<code style="color:#806030; ">,</code> filename<code style="color:#806030; ">,</code> APR_READ<code style="color:#806030; ">,</code> APR_OS_DEFAULT<code style="color:#806030; ">,</code> r<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">pool</code><code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    <code style="color:#400000; font-weight:bold; ">if</code> <code style="color:#806030; ">(</code>rc <code style="color:#806030; ">=</code><code style="color:#806030; ">=</code> APR_SUCCESS<code style="color:#806030; ">)</code> <code style="color:#806030; ">{</code>\r
-        \r
-        <code style="color:#c34e00; ">/* Are we trying to calculate the MD5 or the SHA1 digest? */</code>\r
-        <code style="color:#400000; font-weight:bold; ">if</code> <code style="color:#806030; ">(</code><code style="color:#806030; ">!</code>strcasecmp<code style="color:#806030; ">(</code>digestType<code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">md5</code><code style="color:#800000; ">"</code><code style="color:#806030; ">)</code><code style="color:#806030; ">)</code> <code style="color:#806030; ">{</code>\r
-            <code style="color:#c34e00; ">/* Calculate the MD5 sum of the file */</code>\r
-            <code style="color:#400000; font-weight:bold; ">union</code> <code style="color:#806030; ">{</code>\r
-                <code style="color:#400000; font-weight:bold; ">char</code>      chr<code style="color:#806030; ">[</code><code style="color:#c00000; ">16</code><code style="color:#806030; ">]</code><code style="color:#806030; ">;</code>\r
-                uint32_t  num<code style="color:#806030; ">[</code><code style="color:#c00000; ">4</code><code style="color:#806030; ">]</code><code style="color:#806030; ">;</code>\r
-            <code style="color:#806030; ">}</code> digest<code style="color:#806030; ">;</code>\r
-            apr_md5_ctx_t md5<code style="color:#806030; ">;</code>\r
-            apr_md5_init<code style="color:#806030; ">(</code><code style="color:#806030; ">&amp;</code>md5<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-            readBytes <code style="color:#806030; ">=</code> <code style="color:#c00000; ">256</code><code style="color:#806030; ">;</code>\r
-            <code style="color:#400000; font-weight:bold; ">while</code> <code style="color:#806030; ">(</code> apr_file_read<code style="color:#806030; ">(</code>file<code style="color:#806030; ">,</code> buffer<code style="color:#806030; ">,</code> <code style="color:#806030; ">&amp;</code>readBytes<code style="color:#806030; ">)</code> <code style="color:#806030; ">=</code><code style="color:#806030; ">=</code> APR_SUCCESS <code style="color:#806030; ">)</code> <code style="color:#806030; ">{</code>\r
-                apr_md5_update<code style="color:#806030; ">(</code><code style="color:#806030; ">&amp;</code>md5<code style="color:#806030; ">,</code> buffer<code style="color:#806030; ">,</code> readBytes<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-            <code style="color:#806030; ">}</code>\r
-            apr_md5_final<code style="color:#806030; ">(</code>digest<code style="color:#806030; ">.</code>chr<code style="color:#806030; ">,</code> <code style="color:#806030; ">&amp;</code>md5<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-            \r
-            <code style="color:#c34e00; ">/* Print out the MD5 digest */</code>\r
-            ap_rputs<code style="color:#806030; ">(</code><code style="color:#800000; ">"</code><code style="color:#e60000; ">&lt;b&gt;MD5: &lt;/b&gt;&lt;code&gt;</code><code style="color:#800000; ">"</code><code style="color:#806030; ">,</code> r<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-            <code style="color:#400000; font-weight:bold; ">for</code> <code style="color:#806030; ">(</code>n <code style="color:#806030; ">=</code> <code style="color:#c00000; ">0</code><code style="color:#806030; ">;</code> n <code style="color:#806030; ">&lt;</code> APR_MD5_DIGESTSIZE<code style="color:#806030; ">/</code><code style="color:#c00000; ">4</code><code style="color:#806030; ">;</code> n<code style="color:#806030; ">+</code><code style="color:#806030; ">+</code><code style="color:#806030; ">)</code> <code style="color:#806030; ">{</code>\r
-                ap_rprintf<code style="color:#806030; ">(</code>r<code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#0f6900; ">%08x</code><code style="color:#800000; ">"</code><code style="color:#806030; ">,</code> digest<code style="color:#806030; ">.</code>num<code style="color:#806030; ">[</code>n<code style="color:#806030; ">]</code><code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-            <code style="color:#806030; ">}</code>\r
-            ap_rputs<code style="color:#806030; ">(</code><code style="color:#800000; ">"</code><code style="color:#e60000; ">&lt;/code&gt;</code><code style="color:#800000; ">"</code><code style="color:#806030; ">,</code> r<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-            <code style="color:#c34e00; ">/* Print a link to the SHA1 version */</code>\r
-            ap_rputs<code style="color:#806030; ">(</code><code style="color:#800000; ">"</code><code style="color:#e60000; ">&lt;br/&gt;&lt;a href='?digest=sha1'&gt;View the SHA1 hash instead&lt;/a&gt;</code><code style="color:#800000; ">"</code><code style="color:#806030; ">,</code> r<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-        <code style="color:#806030; ">}</code>\r
-        <code style="color:#400000; font-weight:bold; ">else</code> <code style="color:#806030; ">{</code>\r
-            <code style="color:#c34e00; ">/* Calculate the SHA1 sum of the file */</code>\r
-            <code style="color:#400000; font-weight:bold; ">union</code> <code style="color:#806030; ">{</code>\r
-                <code style="color:#400000; font-weight:bold; ">char</code>      chr<code style="color:#806030; ">[</code><code style="color:#c00000; ">20</code><code style="color:#806030; ">]</code><code style="color:#806030; ">;</code>\r
-                uint32_t  num<code style="color:#806030; ">[</code><code style="color:#c00000; ">5</code><code style="color:#806030; ">]</code><code style="color:#806030; ">;</code>\r
-            <code style="color:#806030; ">}</code> digest<code style="color:#806030; ">;</code>\r
-            apr_sha1_ctx_t sha1<code style="color:#806030; ">;</code>\r
-            apr_sha1_init<code style="color:#806030; ">(</code><code style="color:#806030; ">&amp;</code>sha1<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-            readBytes <code style="color:#806030; ">=</code> <code style="color:#c00000; ">256</code><code style="color:#806030; ">;</code>\r
-            <code style="color:#400000; font-weight:bold; ">while</code> <code style="color:#806030; ">(</code> apr_file_read<code style="color:#806030; ">(</code>file<code style="color:#806030; ">,</code> buffer<code style="color:#806030; ">,</code> <code style="color:#806030; ">&amp;</code>readBytes<code style="color:#806030; ">)</code> <code style="color:#806030; ">=</code><code style="color:#806030; ">=</code> APR_SUCCESS <code style="color:#806030; ">)</code> <code style="color:#806030; ">{</code>\r
-                apr_sha1_update<code style="color:#806030; ">(</code><code style="color:#806030; ">&amp;</code>sha1<code style="color:#806030; ">,</code> buffer<code style="color:#806030; ">,</code> readBytes<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-            <code style="color:#806030; ">}</code>\r
-            apr_sha1_final<code style="color:#806030; ">(</code>digest<code style="color:#806030; ">.</code>chr<code style="color:#806030; ">,</code> <code style="color:#806030; ">&amp;</code>sha1<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-            \r
-            <code style="color:#c34e00; ">/* Print out the SHA1 digest */</code>\r
-            ap_rputs<code style="color:#806030; ">(</code><code style="color:#800000; ">"</code><code style="color:#e60000; ">&lt;b&gt;SHA1: &lt;/b&gt;&lt;code&gt;</code><code style="color:#800000; ">"</code><code style="color:#806030; ">,</code> r<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-            <code style="color:#400000; font-weight:bold; ">for</code> <code style="color:#806030; ">(</code>n <code style="color:#806030; ">=</code> <code style="color:#c00000; ">0</code><code style="color:#806030; ">;</code> n <code style="color:#806030; ">&lt;</code> APR_SHA1_DIGESTSIZE<code style="color:#806030; ">/</code><code style="color:#c00000; ">4</code><code style="color:#806030; ">;</code> n<code style="color:#806030; ">+</code><code style="color:#806030; ">+</code><code style="color:#806030; ">)</code> <code style="color:#806030; ">{</code>\r
-                ap_rprintf<code style="color:#806030; ">(</code>r<code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#0f6900; ">%08x</code><code style="color:#800000; ">"</code><code style="color:#806030; ">,</code> digest<code style="color:#806030; ">.</code>num<code style="color:#806030; ">[</code>n<code style="color:#806030; ">]</code><code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-            <code style="color:#806030; ">}</code>\r
-            ap_rputs<code style="color:#806030; ">(</code><code style="color:#800000; ">"</code><code style="color:#e60000; ">&lt;/code&gt;</code><code style="color:#800000; ">"</code><code style="color:#806030; ">,</code> r<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-            \r
-            <code style="color:#c34e00; ">/* Print a link to the MD5 version */</code>\r
-            ap_rputs<code style="color:#806030; ">(</code><code style="color:#800000; ">"</code><code style="color:#e60000; ">&lt;br/&gt;&lt;a href='?digest=md5'&gt;View the MD5 hash instead&lt;/a&gt;</code><code style="color:#800000; ">"</code><code style="color:#806030; ">,</code> r<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-        <code style="color:#806030; ">}</code>\r
-        apr_file_close<code style="color:#806030; ">(</code>file<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-        \r
-    <code style="color:#806030; ">}</code>\r
-    \r
-    \r
-    \r
-    <code style="color:#c34e00; ">/* Let the server know that we responded to this request. */</code>\r
-    <code style="color:#400000; font-weight:bold; ">return</code> OK<code style="color:#806030; ">;</code>\r
-<code style="color:#806030; ">}</code>\r
-</pre>\r
-\r
-\r
-\r
-This version in its entirity can be found here: \r
-<a href="http://people.apache.org/~humbedooh/mods/examples/mod_example_2.c">mod_example_2.c</a>.\r
-\r
-\r
-</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>\r
-<div class="section">\r
-<h2><a name="configuration" id="configuration">Adding configuration options</a></h2>\r
-<p>\r
-In this next segment of this document, we will turn our eyes away from the \r
-digest module and create a new example module, whose only function is to \r
-write out its own configuration. The purpose of this is to examine how \r
-the server works with configuration, and what happens when you start writing \r
-advanced configurations \r
-for your modules.\r
-</p>\r
-<h3><a name="config_intro" id="config_intro">An introduction to configuration \r
-directives</a></h3> If you are reading this, then you probably already know \r
-what a configuration directive is. Simply put, a directive is a way of \r
-telling an individual module (or a set of modules) how to behave, such as \r
-these directives control how <code>mod_rewrite</code> works:\r
-<div class="example"><pre>\r
-RewriteEngine On\r
-RewriteCond %{REQUEST_URI} ^/foo/bar\r
-RewriteRule ^/foo/bar/(.*)$ /foobar?page=$1\r
-</pre></div>\r
-Each of these configuration directives are handled by a separate function, \r
-that parses the parameters given and sets up a configuration accordingly.\r
-\r
-<h3><a name="config_simple" id="config_simple">Making an example configuration</a></h3>\r
-To begin with, we'll create a basic configuration in C-space:\r
-\r
-\r
-\r
-<pre style="color:#000000;background:#ffffef;border: 1px dashed #333; padding: 0.5em; margin: 1em 2em 1em 1em;">\r
-<code style="color:#400000; font-weight:bold; ">typedef</code> <code style="color:#400000; font-weight:bold; ">struct</code> <code style="color:#806030; ">{</code>\r
-    <code style="color:#400000; font-weight:bold; ">int</code>         enabled<code style="color:#806030; ">;</code>      <code style="color:#c34e00; ">/* Enable or disable our module */</code>\r
-    <code style="color:#400000; font-weight:bold; ">const</code> <code style="color:#400000; font-weight:bold; ">char</code> <code style="color:#806030; ">*</code>path<code style="color:#806030; ">;</code>         <code style="color:#c34e00; ">/* Some path to...something */</code>\r
-    <code style="color:#400000; font-weight:bold; ">int</code>         typeOfAction<code style="color:#806030; ">;</code> <code style="color:#c34e00; ">/* 1 means action A, 2 means action B and so on */</code>\r
-<code style="color:#806030; ">}</code> example_config<code style="color:#806030; ">;</code>\r
-</pre>\r
-\r
-\r
-\r
-Now, let's put this into perspective by creating a very small module that \r
-just prints out a hard-coded configuration. You'll notice that we use the \r
-<code>register_hooks</code> function for initializing the configuration \r
-values to their defaults:\r
-\r
-\r
-\r
-<pre style="color:#000000;background:#ffffef;border: 1px dashed #333; padding: 0.5em; margin: 1em 2em 1em 1em;">\r
-<code style="color:#400000; font-weight:bold; ">typedef</code> <code style="color:#400000; font-weight:bold; ">struct</code> <code style="color:#806030; ">{</code>\r
-    <code style="color:#400000; font-weight:bold; ">int</code>         enabled<code style="color:#806030; ">;</code>      <code style="color:#c34e00; ">/* Enable or disable our module */</code>\r
-    <code style="color:#400000; font-weight:bold; ">const</code> <code style="color:#400000; font-weight:bold; ">char</code> <code style="color:#806030; ">*</code>path<code style="color:#806030; ">;</code>         <code style="color:#c34e00; ">/* Some path to...something */</code>\r
-    <code style="color:#400000; font-weight:bold; ">int</code>         typeOfAction<code style="color:#806030; ">;</code> <code style="color:#c34e00; ">/* 1 means action A, 2 means action B and so on */</code>\r
-<code style="color:#806030; ">}</code> example_config<code style="color:#806030; ">;</code>\r
-\r
-<code style="color:#400000; font-weight:bold; ">static</code> example_config config<code style="color:#806030; ">;</code>\r
-\r
-<code style="color:#400000; font-weight:bold; ">static</code> <code style="color:#400000; font-weight:bold; ">int</code> example_handler<code style="color:#806030; ">(</code>request_rec <code style="color:#806030; ">*</code>r<code style="color:#806030; ">)</code>\r
-<code style="color:#806030; ">{</code>\r
-    <code style="color:#400000; font-weight:bold; ">if</code> <code style="color:#806030; ">(</code><code style="color:#806030; ">!</code>r<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">handler</code> <code style="color:#806030; ">|</code><code style="color:#806030; ">|</code> <code style="color:#800040; ">strcmp</code><code style="color:#806030; ">(</code>r<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">handler</code><code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">example-handler</code><code style="color:#800000; ">"</code><code style="color:#806030; ">)</code><code style="color:#806030; ">)</code> <code style="color:#400000; font-weight:bold; ">return</code><code style="color:#806030; ">(</code>DECLINED<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    ap_set_content_type<code style="color:#806030; ">(</code>r<code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">text/plain</code><code style="color:#800000; ">"</code><code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    ap_rprintf<code style="color:#806030; ">(r, </code><code style="color:#800000; ">"</code><code style="color:#e60000; ">Enabled: </code><code style="color:#0f6900; ">%u</code><code style="color:#0f6900; ">\n</code><code style="color:#800000; ">"</code><code style="color:#806030; ">,</code> config<code style="color:#806030; ">.</code>enabled<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    ap_rprintf<code style="color:#806030; ">(r, </code><code style="color:#800000; ">"</code><code style="color:#e60000; ">Path: </code><code style="color:#0f6900; ">%s</code><code style="color:#0f6900; ">\n</code><code style="color:#800000; ">"</code><code style="color:#806030; ">,</code> config<code style="color:#806030; ">.</code>path<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    ap_rprintf<code style="color:#806030; ">(r, </code><code style="color:#800000; ">"</code><code style="color:#e60000; ">TypeOfAction: </code><code style="color:#0f6900; ">%x</code><code style="color:#0f6900; ">\n</code><code style="color:#800000; ">"</code><code style="color:#806030; ">,</code> config<code style="color:#806030; ">.</code>typeOfAction<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    <code style="color:#400000; font-weight:bold; ">return</code> OK<code style="color:#806030; ">;</code>\r
-<code style="color:#806030; ">}</code>\r
-\r
-<code style="color:#400000; font-weight:bold; ">static</code> <code style="color:#400000; font-weight:bold; ">void</code> register_hooks<code style="color:#806030; ">(</code>apr_pool_t <code style="color:#806030; ">*</code>pool<code style="color:#806030; ">)</code> \r
-<code style="color:#806030; ">{</code>\r
-    config<code style="color:#806030; ">.</code>enabled <code style="color:#806030; ">=</code> <code style="color:#c00000; ">1</code><code style="color:#806030; ">;</code>\r
-    config<code style="color:#806030; ">.</code>path <code style="color:#806030; ">=</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">/foo/bar</code><code style="color:#800000; ">"</code><code style="color:#806030; ">;</code>\r
-    config<code style="color:#806030; ">.</code>typeOfAction <code style="color:#806030; ">=</code> <code style="color:#c00000; ">0x00</code><code style="color:#806030; ">;</code>\r
-    ap_hook_handler<code style="color:#806030; ">(</code>example_handler<code style="color:#806030; ">,</code> <code style="color:#007d45; ">NULL</code><code style="color:#806030; ">,</code> <code style="color:#007d45; ">NULL</code><code style="color:#806030; ">,</code> APR_HOOK_LAST<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-<code style="color:#806030; ">}</code>\r
-\r
-<code style="color:#c34e00; ">/* Define our module as an entity and assign a function for registering hooks  */</code>\r
-\r
-module AP_MODULE_DECLARE_DATA   example_module <code style="color:#806030; ">=</code>\r
-<code style="color:#806030; ">{</code>\r
-    STANDARD20_MODULE_STUFF<code style="color:#806030; ">,</code>\r
-    <code style="color:#007d45; ">NULL</code><code style="color:#806030; ">,</code>            <code style="color:#c34e00; ">/* Per-directory configuration handler */</code>\r
-    <code style="color:#007d45; ">NULL</code><code style="color:#806030; ">,</code>            <code style="color:#c34e00; ">/* Merge handler for per-directory configurations */</code>\r
-    <code style="color:#007d45; ">NULL</code><code style="color:#806030; ">,</code>            <code style="color:#c34e00; ">/* Per-server configuration handler */</code>\r
-    <code style="color:#007d45; ">NULL</code><code style="color:#806030; ">,</code>            <code style="color:#c34e00; ">/* Merge handler for per-server configurations */</code>\r
-    <code style="color:#007d45; ">NULL</code><code style="color:#806030; ">,</code>            <code style="color:#c34e00; ">/* Any directives we may have for httpd */</code>\r
-    register_hooks   <code style="color:#c34e00; ">/* Our hook registering function */</code>\r
-<code style="color:#806030; ">}</code><code style="color:#806030; ">;</code>\r
-</pre>\r
-\r
-\r
-\r
-So far so good. To access our new handler, we could add the following to \r
-our configuration:\r
-<div class="example"><pre>\r
-&lt;Location /example&gt;\r
-    SetHandler example-handler\r
-&lt;/Location&gt;\r
-</pre></div>\r
-When we visit, we'll see our current configuration being spit out by our \r
-module. \r
-\r
-\r
-<h3><a name="register_directive" id="register_directive">Registering directives with the server</a></h3>\r
-What if we want to change our configuration, not by hard-coding new values \r
-into the module, but by using either the httpd.conf file or possibly a \r
-.htaccess file? It's time to let the server know that we want this to be \r
-possible. To do so, we must first change our <em>name tag</em> to include a \r
-reference to the configuration directives we want to register with the server:\r
-\r
-\r
-\r
-<pre style="color:#000000;background:#ffffef;border: 1px dashed #333; padding: 0.5em; margin: 1em 2em 1em 1em;">\r
-module AP_MODULE_DECLARE_DATA   example_module =\r
-{\r
-    STANDARD20_MODULE_STUFF,\r
-    <code style="color:#7f0055; font-weight:bold; ">NULL</code>,               <code style="color:#c34e00; ">/* Per-directory configuration handler */</code>\r
-    <code style="color:#7f0055; font-weight:bold; ">NULL</code>,               <code style="color:#c34e00; ">/* Merge handler for per-directory configurations */</code>\r
-    <code style="color:#7f0055; font-weight:bold; ">NULL</code>,               <code style="color:#c34e00; ">/* Per-server configuration handler */</code>\r
-    <code style="color:#7f0055; font-weight:bold; ">NULL</code>,               <code style="color:#c34e00; ">/* Merge handler for per-server configurations */</code>\r
-    example_directives, <code style="color:#c34e00; ">/* Any directives we may have for httpd */</code>\r
-    register_hooks      <code style="color:#c34e00; ">/* Our hook registering function */</code>\r
-};\r
-</pre>\r
-\r
-\r
-\r
-This will tell the server that we are now accepting directives from the \r
-configuration files, and that the structure called <code>example_directives\r
-</code> holds information on what our directives are and how they work. \r
-Since we have three different variables in our module configuration, we \r
-will add a structure with three directives and a NULL at the end:\r
-\r
-\r
-\r
-<pre style="color:#000000;background:#ffffef;border: 1px dashed #333; padding: 0.5em; margin: 1em 2em 1em 1em;">\r
-static const command_rec        example_directives[] =\r
-{\r
-    <code style="color:#2e8800; "><a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__APACHE__CORE__CONFIG.html#ga07c7d22ae17805e61204463326cf9c34">AP_INIT_TAKE1</a></code>("exampleEnabled", example_set_enabled, <code style="color:#7f0055; font-weight:bold; ">NULL</code>, RSRC_CONF, "Enable or disable mod_example"),\r
-    <code style="color:#2e8800; "><a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__APACHE__CORE__CONFIG.html#ga07c7d22ae17805e61204463326cf9c34">AP_INIT_TAKE1</a></code>("examplePath", example_set_path, <code style="color:#7f0055; font-weight:bold; ">NULL</code>, RSRC_CONF, "The path to whatever"),\r
-    <code style="color:#2e8800; "><a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__APACHE__CORE__CONFIG.html#gafaec43534fcf200f37d9fecbf9247c21">AP_INIT_TAKE2</a></code>("exampleAction", example_set_action, <code style="color:#7f0055; font-weight:bold; ">NULL</code>, RSRC_CONF, "Special action value!"),\r
-    { <code style="color:#7f0055; font-weight:bold; ">NULL</code> }\r
-};\r
-</pre>\r
-\r
-\r
-\r
-<img src="../images/build_a_mod_4.png" border="1" /><br />\r
-<p>\r
-As you can see, each directive needs at least 5 parameters set:\r
-<ol>\r
-<li><code><a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__APACHE__CORE__CONFIG.html#ga07c7d22ae17805e61204463326cf9c34">AP_INIT_TAKE1</a></code>: This is a macro that tells the server that this directive takes one and only one argument. \r
-If we required two arguments, we could use the macro <code><a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__APACHE__CORE__CONFIG.html#gafaec43534fcf200f37d9fecbf9247c21">AP_INIT_TAKE2</a></code> and so on (refer to httpd_conf.h \r
-for more macros).</li>\r
-<li><code>exampleEnabled</code>: This is the name of our directive. More precisely, it is what the user must put in his/her \r
-configuration in order to invoke a configuration change in our module.</li>\r
-<li><code>example_set_enabled</code>: This is a reference to a C function that parses the directive and sets the configuration \r
-accordingly. We will discuss how to make this in the following paragraph.</li>\r
-<li><code>RSRC_CONF</code>: This tells the server where the directive is permitted. We'll go into details on this value in the \r
-later chapters, but for now, <code>RSRC_CONF</code> means that the server will only accept these directives in a server context.</li>\r
-<li><code>"Enable or disable...."</code>: This is simply a brief description of what the directive does.</li>\r
-</ol>\r
-(<em>The "missing" parameter in our definition, which is usually set to \r
-<code>NULL</code>, is an optional function that can be run after the \r
-initial function to parse the arguments have been run. This is usually \r
-omitted, as the function for verifying arguments might as well be used to \r
-set them.</em>)\r
-</p>\r
-\r
-<h3><a name="directive_handler" id="directive_handler">The directive handler function</a></h3>\r
-<p>\r
-Now that we've told the server to expect some directives for our module, it's \r
-time to make a few functions for handling these. What the server reads in the \r
-configuration file(s) is text, and so naturally, what it passes along to \r
-our directive handler is one or more strings, that we ourselves need to \r
-recognize and act upon. You'll notice, that since we set our <code>\r
-exampleAction</code> directive to accept two arguments, its C function also \r
-has an additional parameter defined:<br /> \r
-\r
-\r
-<pre style="color:#000000;background:#ffffef;border: 1px dashed #333; padding: 0.5em; margin: 1em 2em 1em 1em;">\r
-<code style="color:#c34e00; ">/* Handler for the "exambleEnabled" directive */</code>\r
-<code style="color:#400000; font-weight:bold; ">const</code> <code style="color:#400000; font-weight:bold; ">char</code><code style="color:#806030; "> *</code>example_set_enabled<code style="color:#806030; ">(</code>cmd_parms <code style="color:#806030; ">*</code>cmd<code style="color:#806030; ">,</code> <code style="color:#400000; font-weight:bold; ">void</code> <code style="color:#806030; ">*</code>cfg<code style="color:#806030; ">,</code> <code style="color:#400000; font-weight:bold; ">const</code> <code style="color:#400000; font-weight:bold; ">char</code> <code style="color:#806030; ">*</code>arg<code style="color:#806030; ">)</code>\r
-<code style="color:#806030; ">{</code>\r
-    <code style="color:#400000; font-weight:bold; ">if</code><code style="color:#806030; ">(</code><code style="color:#806030; ">!</code>strcasecmp<code style="color:#806030; ">(</code>arg<code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">on</code><code style="color:#800000; ">"</code><code style="color:#806030; ">)</code><code style="color:#806030; ">)</code> config<code style="color:#806030; ">.</code>enabled <code style="color:#806030; ">=</code> <code style="color:#c00000; ">1</code><code style="color:#806030; ">;</code>\r
-    <code style="color:#400000; font-weight:bold; ">else</code> config<code style="color:#806030; ">.</code>enabled <code style="color:#806030; ">=</code> <code style="color:#c00000; ">0</code><code style="color:#806030; ">;</code>\r
-    <code style="color:#400000; font-weight:bold; ">return</code> <code style="color:#007d45; ">NULL</code><code style="color:#806030; ">;</code>\r
-<code style="color:#806030; ">}</code>\r
-\r
-<code style="color:#c34e00; ">/* Handler for the "examplePath" directive */</code>\r
-<code style="color:#400000; font-weight:bold; ">const</code> <code style="color:#400000; font-weight:bold; ">char</code><code style="color:#806030; "> *</code>example_set_path<code style="color:#806030; ">(</code>cmd_parms <code style="color:#806030; ">*</code>cmd<code style="color:#806030; ">,</code> <code style="color:#400000; font-weight:bold; ">void</code> <code style="color:#806030; ">*</code>cfg<code style="color:#806030; ">,</code> <code style="color:#400000; font-weight:bold; ">const</code> <code style="color:#400000; font-weight:bold; ">char</code> <code style="color:#806030; ">*</code>arg<code style="color:#806030; ">)</code>\r
-<code style="color:#806030; ">{</code>\r
-    config<code style="color:#806030; ">.</code>path <code style="color:#806030; ">=</code> arg<code style="color:#806030; ">;</code>\r
-    <code style="color:#400000; font-weight:bold; ">return</code> <code style="color:#007d45; ">NULL</code><code style="color:#806030; ">;</code>\r
-<code style="color:#806030; ">}</code>\r
-\r
-<code style="color:#c34e00; ">/* Handler for the "exampleAction" directive */</code>\r
-<code style="color:#c34e00; ">/* Let's pretend this one takes one argument (file or db), and a second (deny or allow), */</code>\r
-<code style="color:#c34e00; ">/* and we store it in a bit-wise manner. */</code>\r
-<code style="color:#400000; font-weight:bold; ">const</code> <code style="color:#400000; font-weight:bold; ">char</code><code style="color:#806030; "> *</code>example_set_action<code style="color:#806030; ">(</code>cmd_parms <code style="color:#806030; ">*</code>cmd<code style="color:#806030; ">,</code> <code style="color:#400000; font-weight:bold; ">void</code> <code style="color:#806030; ">*</code>cfg<code style="color:#806030; ">,</code> <code style="color:#400000; font-weight:bold; ">const</code> <code style="color:#400000; font-weight:bold; ">char</code> <code style="color:#806030; ">*</code>arg1<code style="color:#806030; ">,</code> <code style="color:#400000; font-weight:bold; ">const</code> <code style="color:#400000; font-weight:bold; ">char</code><code style="color:#806030; ">*</code> arg2<code style="color:#806030; ">)</code>\r
-<code style="color:#806030; ">{</code>\r
-    <code style="color:#400000; font-weight:bold; ">if</code><code style="color:#806030; ">(</code><code style="color:#806030; ">!</code>strcasecmp<code style="color:#806030; ">(</code>arg1<code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">file</code><code style="color:#800000; ">"</code><code style="color:#806030; ">)</code><code style="color:#806030; ">)</code> config<code style="color:#806030; ">.</code>typeOfAction <code style="color:#806030; ">=</code> <code style="color:#c00000; ">0x01</code><code style="color:#806030; ">;</code>\r
-    <code style="color:#400000; font-weight:bold; ">else</code> config<code style="color:#806030; ">.</code>typeOfAction <code style="color:#806030; ">=</code> <code style="color:#c00000; ">0x02</code><code style="color:#806030; ">;</code>\r
-    \r
-    <code style="color:#400000; font-weight:bold; ">if</code><code style="color:#806030; ">(</code><code style="color:#806030; ">!</code>strcasecmp<code style="color:#806030; ">(</code>arg2<code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">deny</code><code style="color:#800000; ">"</code><code style="color:#806030; ">)</code><code style="color:#806030; ">)</code> config<code style="color:#806030; ">.</code>typeOfAction <code style="color:#806030; ">+</code><code style="color:#806030; ">=</code> <code style="color:#c00000; ">0x10</code><code style="color:#806030; ">;</code>\r
-    <code style="color:#400000; font-weight:bold; ">else</code> config<code style="color:#806030; ">.</code>typeOfAction <code style="color:#806030; ">+</code><code style="color:#806030; ">=</code> <code style="color:#c00000; ">0x20</code><code style="color:#806030; ">;</code>\r
-    <code style="color:#400000; font-weight:bold; ">return</code> <code style="color:#007d45; ">NULL</code><code style="color:#806030; ">;</code>\r
-<code style="color:#806030; ">}</code>\r
-</pre>\r
-\r
-\r
-\r
-</p>\r
-\r
-<h3><a name="directive_complete" id="directive_complete">Putting it all together</a></h3>\r
-<p>\r
-Now that we have our directives set up, and handlers configured for them, \r
-we can assemble our module into one big file:\r
-\r
-\r
-\r
-<pre style="color:#000000;background:#ffffef;border: 1px dashed #333; padding: 0.5em; margin: 1em 2em 1em 1em;">\r
-<code style="color:#c34e00; ">/* mod_example_config_simple.c: */</code>\r
-<code style="color:#004a43; ">#</code><code style="color:#004a43; ">include </code><code style="color:#800000; ">&lt;</code><code style="color:#40015a; ">stdio.h</code><code style="color:#800000; ">&gt;</code>\r
-<code style="color:#004a43; ">#</code><code style="color:#004a43; ">include </code><code style="color:#800000; ">"</code><code style="color:#40015a; ">apr_hash.h</code><code style="color:#800000; ">"</code>\r
-<code style="color:#004a43; ">#</code><code style="color:#004a43; ">include </code><code style="color:#800000; ">"</code><code style="color:#40015a; ">ap_config.h</code><code style="color:#800000; ">"</code>\r
-<code style="color:#004a43; ">#</code><code style="color:#004a43; ">include </code><code style="color:#800000; ">"</code><code style="color:#40015a; ">ap_provider.h</code><code style="color:#800000; ">"</code>\r
-<code style="color:#004a43; ">#</code><code style="color:#004a43; ">include </code><code style="color:#800000; ">"</code><code style="color:#40015a; ">httpd.h</code><code style="color:#800000; ">"</code>\r
-<code style="color:#004a43; ">#</code><code style="color:#004a43; ">include </code><code style="color:#800000; ">"</code><code style="color:#40015a; ">http_core.h</code><code style="color:#800000; ">"</code>\r
-<code style="color:#004a43; ">#</code><code style="color:#004a43; ">include </code><code style="color:#800000; ">"</code><code style="color:#40015a; ">http_config.h</code><code style="color:#800000; ">"</code>\r
-<code style="color:#004a43; ">#</code><code style="color:#004a43; ">include </code><code style="color:#800000; ">"</code><code style="color:#40015a; ">http_log.h</code><code style="color:#800000; ">"</code>\r
-<code style="color:#004a43; ">#</code><code style="color:#004a43; ">include </code><code style="color:#800000; ">"</code><code style="color:#40015a; ">http_protocol.h</code><code style="color:#800000; ">"</code>\r
-<code style="color:#004a43; ">#</code><code style="color:#004a43; ">include </code><code style="color:#800000; ">"</code><code style="color:#40015a; ">http_request.h</code><code style="color:#800000; ">"</code>\r
-\r
-<code style="color:#c34e00; ">/*</code>\r
-<code style="color:#c34e00; ">&nbsp;==============================================================================</code>\r
-<code style="color:#c34e00; ">&nbsp;Our configuration prototype and declaration:</code>\r
-<code style="color:#c34e00; ">&nbsp;==============================================================================</code>\r
-<code style="color:#c34e00; ">&nbsp;*/</code>\r
-<code style="color:#400000; font-weight:bold; ">typedef</code> <code style="color:#400000; font-weight:bold; ">struct</code> <code style="color:#806030; ">{</code>\r
-    <code style="color:#400000; font-weight:bold; ">int</code>         enabled<code style="color:#806030; ">;</code>      <code style="color:#c34e00; ">/* Enable or disable our module */</code>\r
-    <code style="color:#400000; font-weight:bold; ">const</code> <code style="color:#400000; font-weight:bold; ">char</code> <code style="color:#806030; ">*</code>path<code style="color:#806030; ">;</code>         <code style="color:#c34e00; ">/* Some path to...something */</code>\r
-    <code style="color:#400000; font-weight:bold; ">int</code>         typeOfAction<code style="color:#806030; ">;</code> <code style="color:#c34e00; ">/* 1 means action A, 2 means action B and so on */</code>\r
-<code style="color:#806030; ">}</code> example_config<code style="color:#806030; ">;</code>\r
-\r
-<code style="color:#400000; font-weight:bold; ">static</code> example_config config<code style="color:#806030; ">;</code>\r
-\r
-<code style="color:#c34e00; ">/*</code>\r
-<code style="color:#c34e00; ">&nbsp;==============================================================================</code>\r
-<code style="color:#c34e00; ">&nbsp;Our directive handlers:</code>\r
-<code style="color:#c34e00; ">&nbsp;==============================================================================</code>\r
-<code style="color:#c34e00; ">&nbsp;*/</code>\r
-<code style="color:#c34e00; ">/* Handler for the "exambleEnabled" directive */</code>\r
-<code style="color:#400000; font-weight:bold; ">const</code> <code style="color:#400000; font-weight:bold; ">char</code><code style="color:#806030; "> *</code>example_set_enabled<code style="color:#806030; ">(</code>cmd_parms <code style="color:#806030; ">*</code>cmd<code style="color:#806030; ">,</code> <code style="color:#400000; font-weight:bold; ">void</code> <code style="color:#806030; ">*</code>cfg<code style="color:#806030; ">,</code> <code style="color:#400000; font-weight:bold; ">const</code> <code style="color:#400000; font-weight:bold; ">char</code> <code style="color:#806030; ">*</code>arg<code style="color:#806030; ">)</code>\r
-<code style="color:#806030; ">{</code>\r
-    <code style="color:#400000; font-weight:bold; ">if</code><code style="color:#806030; ">(</code><code style="color:#806030; ">!</code>strcasecmp<code style="color:#806030; ">(</code>arg<code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">on</code><code style="color:#800000; ">"</code><code style="color:#806030; ">)</code><code style="color:#806030; ">)</code> config<code style="color:#806030; ">.</code>enabled <code style="color:#806030; ">=</code> <code style="color:#c00000; ">1</code><code style="color:#806030; ">;</code>\r
-    <code style="color:#400000; font-weight:bold; ">else</code> config<code style="color:#806030; ">.</code>enabled <code style="color:#806030; ">=</code> <code style="color:#c00000; ">0</code><code style="color:#806030; ">;</code>\r
-    <code style="color:#400000; font-weight:bold; ">return</code> <code style="color:#007d45; ">NULL</code><code style="color:#806030; ">;</code>\r
-<code style="color:#806030; ">}</code>\r
-\r
-<code style="color:#c34e00; ">/* Handler for the "examplePath" directive */</code>\r
-<code style="color:#400000; font-weight:bold; ">const</code> <code style="color:#400000; font-weight:bold; ">char</code><code style="color:#806030; "> *</code>example_set_path<code style="color:#806030; ">(</code>cmd_parms <code style="color:#806030; ">*</code>cmd<code style="color:#806030; ">,</code> <code style="color:#400000; font-weight:bold; ">void</code> <code style="color:#806030; ">*</code>cfg<code style="color:#806030; ">,</code> <code style="color:#400000; font-weight:bold; ">const</code> <code style="color:#400000; font-weight:bold; ">char</code> <code style="color:#806030; ">*</code>arg<code style="color:#806030; ">)</code>\r
-<code style="color:#806030; ">{</code>\r
-    config<code style="color:#806030; ">.</code>path <code style="color:#806030; ">=</code> arg<code style="color:#806030; ">;</code>\r
-    <code style="color:#400000; font-weight:bold; ">return</code> <code style="color:#007d45; ">NULL</code><code style="color:#806030; ">;</code>\r
-<code style="color:#806030; ">}</code>\r
-\r
-<code style="color:#c34e00; ">/* Handler for the "exampleAction" directive */</code>\r
-<code style="color:#c34e00; ">/* Let's pretend this one takes one argument (file or db), and a second (deny or allow), */</code>\r
-<code style="color:#c34e00; ">/* and we store it in a bit-wise manner. */</code>\r
-<code style="color:#400000; font-weight:bold; ">const</code> <code style="color:#400000; font-weight:bold; ">char</code><code style="color:#806030; "> *</code>example_set_action<code style="color:#806030; ">(</code>cmd_parms <code style="color:#806030; ">*</code>cmd<code style="color:#806030; ">,</code> <code style="color:#400000; font-weight:bold; ">void</code> <code style="color:#806030; ">*</code>cfg<code style="color:#806030; ">,</code> <code style="color:#400000; font-weight:bold; ">const</code> <code style="color:#400000; font-weight:bold; ">char</code> <code style="color:#806030; ">*</code>arg1<code style="color:#806030; ">,</code> <code style="color:#400000; font-weight:bold; ">const</code> <code style="color:#400000; font-weight:bold; ">char</code><code style="color:#806030; ">*</code> arg2<code style="color:#806030; ">)</code>\r
-<code style="color:#806030; ">{</code>\r
-    <code style="color:#400000; font-weight:bold; ">if</code><code style="color:#806030; ">(</code><code style="color:#806030; ">!</code>strcasecmp<code style="color:#806030; ">(</code>arg1<code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">file</code><code style="color:#800000; ">"</code><code style="color:#806030; ">)</code><code style="color:#806030; ">)</code> config<code style="color:#806030; ">.</code>typeOfAction <code style="color:#806030; ">=</code> <code style="color:#c00000; ">0x01</code><code style="color:#806030; ">;</code>\r
-    <code style="color:#400000; font-weight:bold; ">else</code> config<code style="color:#806030; ">.</code>typeOfAction <code style="color:#806030; ">=</code> <code style="color:#c00000; ">0x02</code><code style="color:#806030; ">;</code>\r
-    \r
-    <code style="color:#400000; font-weight:bold; ">if</code><code style="color:#806030; ">(</code><code style="color:#806030; ">!</code>strcasecmp<code style="color:#806030; ">(</code>arg2<code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">deny</code><code style="color:#800000; ">"</code><code style="color:#806030; ">)</code><code style="color:#806030; ">)</code> config<code style="color:#806030; ">.</code>typeOfAction <code style="color:#806030; ">+</code><code style="color:#806030; ">=</code> <code style="color:#c00000; ">0x10</code><code style="color:#806030; ">;</code>\r
-    <code style="color:#400000; font-weight:bold; ">else</code> config<code style="color:#806030; ">.</code>typeOfAction <code style="color:#806030; ">+</code><code style="color:#806030; ">=</code> <code style="color:#c00000; ">0x20</code><code style="color:#806030; ">;</code>\r
-    <code style="color:#400000; font-weight:bold; ">return</code> <code style="color:#007d45; ">NULL</code><code style="color:#806030; ">;</code>\r
-<code style="color:#806030; ">}</code>\r
-\r
-<code style="color:#c34e00; ">/*</code>\r
-<code style="color:#c34e00; ">&nbsp;==============================================================================</code>\r
-<code style="color:#c34e00; ">&nbsp;The directive structure for our name tag:</code>\r
-<code style="color:#c34e00; ">&nbsp;==============================================================================</code>\r
-<code style="color:#c34e00; ">&nbsp;*/</code>\r
-<code style="color:#400000; font-weight:bold; ">static</code> <code style="color:#400000; font-weight:bold; ">const</code> command_rec        example_directives<code style="color:#806030; ">[</code><code style="color:#806030; ">]</code> <code style="color:#806030; ">=</code>\r
-<code style="color:#806030; ">{</code>\r
-    <a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__APACHE__CORE__CONFIG.html#ga07c7d22ae17805e61204463326cf9c34">AP_INIT_TAKE1</a><code style="color:#806030; ">(</code><code style="color:#800000; ">"</code><code style="color:#e60000; ">exampleEnabled</code><code style="color:#800000; ">"</code><code style="color:#806030; ">,</code> example_set_enabled<code style="color:#806030; ">,</code> <code style="color:#007d45; ">NULL</code><code style="color:#806030; ">,</code> RSRC_CONF<code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">Enable or disable mod_example</code><code style="color:#800000; ">"</code><code style="color:#806030; ">)</code><code style="color:#806030; ">,</code>\r
-    <a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__APACHE__CORE__CONFIG.html#ga07c7d22ae17805e61204463326cf9c34">AP_INIT_TAKE1</a><code style="color:#806030; ">(</code><code style="color:#800000; ">"</code><code style="color:#e60000; ">examplePath</code><code style="color:#800000; ">"</code><code style="color:#806030; ">,</code> example_set_path<code style="color:#806030; ">,</code> <code style="color:#007d45; ">NULL</code><code style="color:#806030; ">,</code> RSRC_CONF<code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">The path to whatever</code><code style="color:#800000; ">"</code><code style="color:#806030; ">)</code><code style="color:#806030; ">,</code>\r
-    <a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__APACHE__CORE__CONFIG.html#gafaec43534fcf200f37d9fecbf9247c21">AP_INIT_TAKE2</a><code style="color:#806030; ">(</code><code style="color:#800000; ">"</code><code style="color:#e60000; ">exampleAction</code><code style="color:#800000; ">"</code><code style="color:#806030; ">,</code> example_set_action<code style="color:#806030; ">,</code> <code style="color:#007d45; ">NULL</code><code style="color:#806030; ">,</code> RSRC_CONF<code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">Special action value!</code><code style="color:#800000; ">"</code><code style="color:#806030; ">)</code><code style="color:#806030; ">,</code>\r
-    <code style="color:#806030; ">{</code> <code style="color:#007d45; ">NULL</code> <code style="color:#806030; ">}</code>\r
-<code style="color:#806030; ">}</code><code style="color:#806030; ">;</code>\r
-<code style="color:#c34e00; ">/*</code>\r
-<code style="color:#c34e00; ">&nbsp;==============================================================================</code>\r
-<code style="color:#c34e00; ">&nbsp;Our module handler:</code>\r
-<code style="color:#c34e00; ">&nbsp;==============================================================================</code>\r
-<code style="color:#c34e00; ">&nbsp;*/</code>\r
-<code style="color:#400000; font-weight:bold; ">static</code> <code style="color:#400000; font-weight:bold; ">int</code> example_handler<code style="color:#806030; ">(</code>request_rec <code style="color:#806030; ">*</code>r<code style="color:#806030; ">)</code>\r
-<code style="color:#806030; ">{</code>\r
-    <code style="color:#400000; font-weight:bold; ">if</code><code style="color:#806030; ">(</code><code style="color:#806030; ">!</code>r<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">handler</code> <code style="color:#806030; ">|</code><code style="color:#806030; ">|</code> <code style="color:#800040; ">strcmp</code><code style="color:#806030; ">(</code>r<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">handler</code><code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">example-handler</code><code style="color:#800000; ">"</code><code style="color:#806030; ">)</code><code style="color:#806030; ">)</code> <code style="color:#400000; font-weight:bold; ">return</code><code style="color:#806030; ">(</code>DECLINED<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    ap_set_content_type<code style="color:#806030; ">(</code>r<code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">text/plain</code><code style="color:#800000; ">"</code><code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    ap_rprintf<code style="color:#806030; ">(</code>r<code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">Enabled: </code><code style="color:#0f6900; ">%u</code><code style="color:#0f6900; ">\n</code><code style="color:#800000; ">"</code><code style="color:#806030; ">,</code> config<code style="color:#806030; ">.</code>enabled<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    ap_rprintf<code style="color:#806030; ">(</code>r<code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">Path: </code><code style="color:#0f6900; ">%s</code><code style="color:#0f6900; ">\n</code><code style="color:#800000; ">"</code><code style="color:#806030; ">,</code> config<code style="color:#806030; ">.</code>path<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    ap_rprintf<code style="color:#806030; ">(</code>r<code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">TypeOfAction: </code><code style="color:#0f6900; ">%x</code><code style="color:#0f6900; ">\n</code><code style="color:#800000; ">"</code><code style="color:#806030; ">,</code> config<code style="color:#806030; ">.</code>typeOfAction<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    <code style="color:#400000; font-weight:bold; ">return</code> OK<code style="color:#806030; ">;</code>\r
-<code style="color:#806030; ">}</code>\r
-\r
-<code style="color:#c34e00; ">/*</code>\r
-<code style="color:#c34e00; ">&nbsp;==============================================================================</code>\r
-<code style="color:#c34e00; ">&nbsp;The hook registration function (also initializes the default config values):</code>\r
-<code style="color:#c34e00; ">&nbsp;==============================================================================</code>\r
-<code style="color:#c34e00; ">&nbsp;*/</code>\r
-<code style="color:#400000; font-weight:bold; ">static</code> <code style="color:#400000; font-weight:bold; ">void</code> register_hooks<code style="color:#806030; ">(</code>apr_pool_t <code style="color:#806030; ">*</code>pool<code style="color:#806030; ">)</code> \r
-<code style="color:#806030; ">{</code>\r
-    config<code style="color:#806030; ">.</code>enabled <code style="color:#806030; ">=</code> <code style="color:#c00000; ">1</code><code style="color:#806030; ">;</code>\r
-    config<code style="color:#806030; ">.</code>path <code style="color:#806030; ">=</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">/foo/bar</code><code style="color:#800000; ">"</code><code style="color:#806030; ">;</code>\r
-    config<code style="color:#806030; ">.</code>typeOfAction <code style="color:#806030; ">=</code> <code style="color:#c00000; ">3</code><code style="color:#806030; ">;</code>\r
-    ap_hook_handler<code style="color:#806030; ">(</code>example_handler<code style="color:#806030; ">,</code> <code style="color:#007d45; ">NULL</code><code style="color:#806030; ">,</code> <code style="color:#007d45; ">NULL</code><code style="color:#806030; ">,</code> APR_HOOK_LAST<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-<code style="color:#806030; ">}</code>\r
-<code style="color:#c34e00; ">/*</code>\r
-<code style="color:#c34e00; ">&nbsp;==============================================================================</code>\r
-<code style="color:#c34e00; ">&nbsp;Our module name tag:</code>\r
-<code style="color:#c34e00; ">&nbsp;==============================================================================</code>\r
-<code style="color:#c34e00; ">&nbsp;*/</code>\r
-module AP_MODULE_DECLARE_DATA   example_module <code style="color:#806030; ">=</code>\r
-<code style="color:#806030; ">{</code>\r
-    STANDARD20_MODULE_STUFF<code style="color:#806030; ">,</code>\r
-    <code style="color:#007d45; ">NULL</code><code style="color:#806030; ">,</code>               <code style="color:#c34e00; ">/* Per-directory configuration handler */</code>\r
-    <code style="color:#007d45; ">NULL</code><code style="color:#806030; ">,</code>               <code style="color:#c34e00; ">/* Merge handler for per-directory configurations */</code>\r
-    <code style="color:#007d45; ">NULL</code><code style="color:#806030; ">,</code>               <code style="color:#c34e00; ">/* Per-server configuration handler */</code>\r
-    <code style="color:#007d45; ">NULL</code><code style="color:#806030; ">,</code>               <code style="color:#c34e00; ">/* Merge handler for per-server configurations */</code>\r
-    example_directives<code style="color:#806030; ">,</code> <code style="color:#c34e00; ">/* Any directives we may have for httpd */</code>\r
-    register_hooks      <code style="color:#c34e00; ">/* Our hook registering function */</code>\r
-<code style="color:#806030; ">}</code><code style="color:#806030; ">;</code>\r
-</pre>\r
-\r
-\r
-\r
-</p>\r
-<p>\r
-In our httpd.conf file, we can now change the hard-coded configuration by \r
-adding a few lines:\r
-<div class="example"><pre>\r
-ExampleEnabled On\r
-ExamplePath "/usr/bin/foo"\r
-ExampleAction file allow\r
-</pre></div>\r
-And thus we apply the configuration, visit <code>/example</code> on our \r
-web site, and we see the configuration has adapted to what we wrote in our \r
-configuration file.\r
-</p>\r
-\r
-\r
-\r
-</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>\r
-<div class="section">\r
-<h2><a name="context" id="context">Context aware configurations</a></h2>\r
-<h3><a name="context_intro" id="context_intro">Introduction to context aware configurations</a></h3>\r
-<p>\r
-In Apache HTTP Server 2.4, different URLs, virtual hosts, directories etc can have very \r
-different meanings to the user of the server, and thus different contexts \r
-within which modules must operate. For example, let's assume you have this \r
-configuration set up for mod_rewrite:\r
-<div class="example"><pre>\r
-&lt;Directory "/var/www"&gt;\r
-    RewriteCond %{HTTP_HOST} ^example.com$\r
-    RewriteRule (.*) http://www.example.com/$1\r
-&lt;/Directory&gt;\r
-&lt;Directory "/var/www/sub"&gt;\r
-    RewriteRule ^foobar$ index.php?foobar=true\r
-&lt;/Directory&gt;\r
-</pre></div>\r
-In this example, you will have set up two different contexts for \r
-mod_rewrite:\r
-<ol>\r
-<li>Inside <code>/var/www</code>, all requests for <code>http://example.com</code> must go to <code>http://www.example.com</code></li>\r
-<li>Inside <code>/var/www/sub</code>, all requests for <code>foobar</code> must go to <code>index.php?foobar=true</code></li>\r
-</ol>\r
-If mod_rewrite (or the entire server for that matter) wasn't context aware, then \r
-these rewrite rules would just apply to every and any request made, \r
-regardless of where and how they were made, but since the module can pull \r
-the context specific configuration straight from the server, it does not need \r
-to know itself, which of the directives are valid in this context, since \r
-the server takes care of this.</p>\r
-\r
-<p>\r
-So how does a module get the specific configuration for the server, \r
-directory or location in question? It does so by making one simple call:\r
-\r
-\r
-\r
-<pre style="color:#000000;background:#ffffef;border: 1px dashed #333; padding: 0.5em; margin: 1em 2em 1em 1em;">\r
-\r
-\r
-\r
-example_config *config = (example_config*) <a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__APACHE__CORE__CONFIG.html#ga1093a5908a384eacc929b028c79f2a02">ap_get_module_config</a>(<code style="color:#008833">r-&gt;per_dir_config</code>, &amp;example_module);\r
-</pre>\r
-That's it! Of course, a whole lot goes on behind the scenes, which we will \r
-discuss in this chapter, starting with how the server came to know what our \r
-configuration looks like, and how it came to be set up as it is in the \r
-specific context.\r
-</p>\r
-\r
-\r
-<h3><a name="context_base" id="context_base">Our basic configuration setup</a></h3>\r
-<p>In this chapter, we will be working with a slightly modified version of \r
-our previous context structure. We will set a <code>context</code> \r
-variable that we can use to track which context configuration is being \r
-used by the server in various places:\r
-\r
-\r
-\r
-<pre style="color:#000000;background:#ffffef;border: 1px dashed #333; padding: 0.5em; margin: 1em 2em 1em 1em;">\r
-<code style="color:#400000; font-weight:bold; ">typedef</code> <code style="color:#400000; font-weight:bold; ">struct</code> <code style="color:#806030; ">{</code>\r
-    <code style="color:#400000; font-weight:bold; ">char</code>        context<code style="color:#806030; ">[</code><code style="color:#c00000; ">256</code><code style="color:#806030; ">]</code><code style="color:#806030; ">;</code>\r
-    <code style="color:#400000; font-weight:bold; ">char</code>        path<code style="color:#806030; ">[</code><code style="color:#c00000; ">256</code><code style="color:#806030; ">]</code><code style="color:#806030; ">;</code>\r
-    <code style="color:#400000; font-weight:bold; ">int</code>         typeOfAction<code style="color:#806030; ">;</code>\r
-    <code style="color:#400000; font-weight:bold; ">int</code>         enabled<code style="color:#806030; ">;</code>\r
-<code style="color:#806030; ">}</code> example_config<code style="color:#806030; ">;</code>\r
-</pre>\r
-\r
-\r
-\r
-</p>\r
-\r
-<p>Our handler for requests will also be modified, yet still very simple:\r
-\r
-\r
-\r
-<pre style="color:#000000;background:#ffffef;border: 1px dashed #333; padding: 0.5em; margin: 1em 2em 1em 1em;">\r
-<code style="color:#400000; font-weight:bold; ">static</code> <code style="color:#400000; font-weight:bold; ">int</code> example_handler<code style="color:#806030; ">(</code>request_rec <code style="color:#806030; ">*</code>r<code style="color:#806030; ">)</code>\r
-<code style="color:#806030; ">{</code>\r
-    <code style="color:#400000; font-weight:bold; ">if</code><code style="color:#806030; ">(</code><code style="color:#806030; ">!</code>r<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">handler</code> <code style="color:#806030; ">|</code><code style="color:#806030; ">|</code> <code style="color:#800040; ">strcmp</code><code style="color:#806030; ">(</code>r<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">handler</code><code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">example-handler</code><code style="color:#800000; ">"</code><code style="color:#806030; ">)</code><code style="color:#806030; ">)</code> <code style="color:#400000; font-weight:bold; ">return</code><code style="color:#806030; ">(</code>DECLINED<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    example_config<code style="color:#806030; "> *</code>config <code style="color:#806030; ">=</code> <code style="color:#806030; ">(</code>example_config<code style="color:#806030; ">*</code><code style="color:#806030; ">)</code> ap_get_module_config<code style="color:#806030; ">(</code>r<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">per_dir_config</code><code style="color:#806030; ">,</code> <code style="color:#806030; ">&amp;</code>example_module<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    ap_set_content_type<code style="color:#806030; ">(</code>r<code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">text/plain</code><code style="color:#800000; ">"</code><code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    ap_rprintf<code style="color:#806030; ">(</code><code style="color:#800000; ">"</code><code style="color:#e60000; ">Enabled: </code><code style="color:#0f6900; ">%u</code><code style="color:#0f6900; ">\n</code><code style="color:#800000; ">"</code><code style="color:#806030; ">,</code> config<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">enabled</code><code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    ap_rprintf<code style="color:#806030; ">(</code><code style="color:#800000; ">"</code><code style="color:#e60000; ">Path: </code><code style="color:#0f6900; ">%s</code><code style="color:#0f6900; ">\n</code><code style="color:#800000; ">"</code><code style="color:#806030; ">,</code> config<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">path</code><code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    ap_rprintf<code style="color:#806030; ">(</code><code style="color:#800000; ">"</code><code style="color:#e60000; ">TypeOfAction: </code><code style="color:#0f6900; ">%x</code><code style="color:#0f6900; ">\n</code><code style="color:#800000; ">"</code><code style="color:#806030; ">,</code> config<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">typeOfAction</code><code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    ap_rprintf<code style="color:#806030; ">(</code><code style="color:#800000; ">"</code><code style="color:#e60000; ">Context: </code><code style="color:#0f6900; ">%s</code><code style="color:#0f6900; ">\n</code><code style="color:#800000; ">"</code><code style="color:#806030; ">,</code> config<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">context</code><code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    <code style="color:#400000; font-weight:bold; ">return</code> OK<code style="color:#806030; ">;</code>\r
-<code style="color:#806030; ">}</code>\r
-</pre>\r
-\r
-\r
-\r
-</p>\r
-\r
-\r
-\r
-<h3><a name="context_which" id="context_which">Choosing a context</a></h3>\r
-<p>\r
-Before we can start making our module context aware, we must first define, \r
-which contexts we will accept. As we saw in the previous chapter, defining \r
-a directive required five elements be set:\r
-\r
-\r
-\r
-<pre style="color:#000000;background:#ffffef;border: 1px dashed #333; padding: 0.5em; margin: 1em 2em 1em 1em;">\r
-<code style="color:#2e8800; "><a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__APACHE__CORE__CONFIG.html#ga07c7d22ae17805e61204463326cf9c34">AP_INIT_TAKE1</a></code>("exampleEnabled", example_set_enabled, <code style="color:#7f0055; font-weight:bold; ">NULL</code>, RSRC_CONF, "Enable or disable mod_example"),\r
-</pre>\r
-\r
-\r
-\r
-The <code>RSRC_CONF</code> definition told the server that we would only allow \r
-this directive in a global server context, but since we are now trying out \r
-a context aware version of our module, we should set this to something \r
-more lenient, namely the value <code>ACCESS_CONF</code>, which lets us use \r
-the directive inside &lt;Directory&gt; and &lt;Location&gt; blocks.\r
-</p>\r
-\r
-\r
-<h3><a name="context_pool" id="context_pool">Using the server to allocate configuration slots</a></h3>\r
-<p> A much smarter way to manage your configurations is by letting the server \r
-help you create them. To do so, we must first start off by changing our \r
-<em>name tag</em> to let the server know, that it should assist us in creating \r
-and managing our configurations. Since we have chosen the per-directory \r
-(or per-location) context for our module configurations, we'll add a \r
-per-directory creator and merger function reference in our tag:\r
-\r
-\r
-<pre style="color:#000000;background:#ffffef;border: 1px dashed #333; padding: 0.5em; margin: 1em 2em 1em 1em;">\r
-module AP_MODULE_DECLARE_DATA   example_module <code style="color:#806030; ">=</code>\r
-<code style="color:#806030; ">{</code>\r
-    STANDARD20_MODULE_STUFF<code style="color:#806030; ">,</code>\r
-    create_dir_conf<code style="color:#806030; ">,</code> <code style="color:#c34e00; ">/* Per-directory configuration handler */</code>\r
-    merge_dir_conf<code style="color:#806030; ">,</code>  <code style="color:#c34e00; ">/* Merge handler for per-directory configurations */</code>\r
-    <code style="color:#007d45; ">NULL</code><code style="color:#806030; ">,</code>            <code style="color:#c34e00; ">/* Per-server configuration handler */</code>\r
-    <code style="color:#007d45; ">NULL</code><code style="color:#806030; ">,</code>            <code style="color:#c34e00; ">/* Merge handler for per-server configurations */</code>\r
-    directives<code style="color:#806030; ">,</code>      <code style="color:#c34e00; ">/* Any directives we may have for httpd */</code>\r
-    register_hooks   <code style="color:#c34e00; ">/* Our hook registering function */</code>\r
-<code style="color:#806030; ">}</code><code style="color:#806030; ">;</code>\r
-</pre>\r
-\r
-\r
-\r
-</p>\r
-\r
-\r
-\r
-\r
-\r
-<h3><a name="context_which" id="context_which">Creating new context configurations</a></h3>\r
-<p>\r
-Now that we have told the server to help us create and manage configurations, \r
-our first step is to make a function for creating new, blank \r
-configurations. We do so by creating the function we just referenced in \r
-our name tag as the Per-directory configuration handler:\r
-\r
-<pre style="color:#000000;background:#ffffef;border: 1px dashed #333; padding: 0.5em; margin: 1em 2em 1em 1em;">\r
-<code style="color:#400000; font-weight:bold; ">void</code><code style="color:#806030; ">*</code> example_create_dir_conf<code style="color:#806030; ">(</code>apr_pool_t<code style="color:#806030; ">*</code> pool<code style="color:#806030; ">,</code> <code style="color:#400000; font-weight:bold; ">char</code><code style="color:#806030; ">*</code> context<code style="color:#806030; ">)</code> <code style="color:#806030; ">{</code>\r
-    context <code style="color:#806030; ">=</code> context <code style="color:#806030; ">?</code> context <code style="color:#806030; ">:</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">(undefined context)</code><code style="color:#800000; ">"</code><code style="color:#806030; ">;</code>\r
-    example_config<code style="color:#806030; "> *</code>cfg <code style="color:#806030; ">=</code> apr_pcalloc<code style="color:#806030; ">(</code>pool<code style="color:#806030; ">,</code> <code style="color:#400000; font-weight:bold; ">sizeof</code><code style="color:#806030; ">(</code>example_config<code style="color:#806030; ">)</code><code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    <code style="color:#400000; font-weight:bold; ">if</code><code style="color:#806030; ">(</code>cfg<code style="color:#806030; ">)</code> <code style="color:#806030; ">{</code>\r
-        <code style="color:#c34e00; ">/* Set some default values */</code>\r
-        <code style="color:#800040; ">strcpy</code><code style="color:#806030; ">(</code>cfg<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">context</code><code style="color:#806030; ">,</code> x<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-        cfg<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">enabled</code> <code style="color:#806030; ">=</code> <code style="color:#c00000; ">0</code><code style="color:#806030; ">;</code>\r
-        cfg<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">path</code> <code style="color:#806030; ">=</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">/foo/bar</code><code style="color:#800000; ">"</code><code style="color:#806030; ">;</code>\r
-        cfg<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">typeOfAction</code> <code style="color:#806030; ">=</code> <code style="color:#c00000; ">0x11</code><code style="color:#806030; ">;</code>\r
-    <code style="color:#806030; ">}</code>\r
-    <code style="color:#400000; font-weight:bold; ">return</code> cfg<code style="color:#806030; ">;</code>\r
-<code style="color:#806030; ">}</code>\r
-</pre>\r
-\r
-\r
-\r
-</p>\r
-\r
-\r
-<h3><a name="context_which" id="context_which">Merging configurations</a></h3>\r
-<p>\r
-Our next step in creating a context aware configuration is merging \r
-configurations. This part of the process particularly apply to scenarios \r
-where you have a parent configuration and a child, such as the following: \r
-<div class="example"><pre>\r
-&lt;Directory "/var/www"&gt;\r
-    ExampleEnable On\r
-    ExamplePath /foo/bar\r
-    ExampleAction file allow\r
-&lt;/Directory&gt;\r
-&lt;Directory "/var/www/subdir"&gt;\r
-    ExampleAction file deny\r
-&lt;/Directory&gt;\r
-</pre></div>\r
-In this example, it is natural to assume that the directory <code>\r
-/var/www/subdir</code> should inherit the value set for the <code>/var/www\r
-</code> directory, as we did not specify a <code>ExampleEnable</code> nor \r
-an <code>ExamplePath</code> for this directory. The server does not presume to \r
-know if this is true, but cleverly does the following:\r
-<ol>\r
-<li>Creates a new configuration for <code>/var/www</code></li>\r
-<li>Sets the configuration values according to the directives given for <code>/var/www</code></li>\r
-<li>Creates a new configuration for <code>/var/www/subdir</code></li>\r
-<li>Sets the configuration values according to the directives given for <code>/var/www/subdir</code></li>\r
-<li><strong>Proposes a merge</strong> of the two configurations into a new configuration for <code>/var/www/subdir</code></li>\r
-</ol>\r
-This proposal is handled by the <code>merge_dir_conf</code> function we \r
-referenced in our name tag. The purpose of this function is to assess the \r
-two configurations and decide how they are to be merged:\r
-\r
-\r
-\r
-<pre style="color:#000000;background:#ffffef;border: 1px dashed #333; padding: 0.5em; margin: 1em 2em 1em 1em;">\r
-<code style="color:#400000; font-weight:bold; ">void</code><code style="color:#806030; ">*</code> merge_dir_conf<code style="color:#806030; ">(</code>apr_pool_t<code style="color:#806030; ">*</code> pool<code style="color:#806030; ">,</code> <code style="color:#400000; font-weight:bold; ">void</code><code style="color:#806030; ">*</code> BASE<code style="color:#806030; ">,</code> <code style="color:#400000; font-weight:bold; ">void</code><code style="color:#806030; ">*</code> ADD<code style="color:#806030; ">)</code> <code style="color:#806030; ">{</code>\r
-    example_config<code style="color:#806030; ">*</code> base <code style="color:#806030; ">=</code> <code style="color:#806030; ">(</code>example_config <code style="color:#806030; ">*</code><code style="color:#806030; ">)</code> BASE <code style="color:#806030; ">;</code>\r
-    example_config<code style="color:#806030; ">*</code> add <code style="color:#806030; ">=</code> <code style="color:#806030; ">(</code>example_config <code style="color:#806030; ">*</code><code style="color:#806030; ">)</code> ADD <code style="color:#806030; ">;</code>\r
-    example_config<code style="color:#806030; ">*</code> conf <code style="color:#806030; ">=</code> <code style="color:#806030; ">(</code>example_config <code style="color:#806030; ">*</code><code style="color:#806030; ">)</code> create_dir_conf<code style="color:#806030; ">(</code>pool<code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">Merged configuration</code><code style="color:#800000; ">"</code><code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    \r
-    conf<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">enabled</code> <code style="color:#806030; ">=</code> <code style="color:#806030; ">(</code> add<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">enabled</code> <code style="color:#806030; ">=</code><code style="color:#806030; ">=</code> <code style="color:#c00000; ">0</code> <code style="color:#806030; ">)</code> <code style="color:#806030; ">?</code> base<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">enabled</code> <code style="color:#806030; ">:</code> add<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">enabled</code> <code style="color:#806030; ">;</code>\r
-    conf<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">typeOfAction</code> <code style="color:#806030; ">=</code> add<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">typeOfAction</code> <code style="color:#806030; ">?</code> add<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">typeOfAction</code> <code style="color:#806030; ">:</code> base<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">typeOfAction</code><code style="color:#806030; ">;</code>\r
-    <code style="color:#800040; ">strcpy</code><code style="color:#806030; ">(</code>conf<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">path</code><code style="color:#806030; ">,</code> <code style="color:#800040; ">strlen</code><code style="color:#806030; ">(</code>add<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">path</code><code style="color:#806030; ">)</code> <code style="color:#806030; ">?</code> add<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">path</code> <code style="color:#806030; ">:</code> base<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">path</code><code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    \r
-    <code style="color:#400000; font-weight:bold; ">return</code> conf <code style="color:#806030; ">;</code>\r
-<code style="color:#806030; ">}</code>\r
-</pre>\r
-\r
-\r
-</p>\r
-\r
-\r
-<h3><a name="context_which" id="context_which">Trying out our new context aware configurations</a></h3>\r
-<p>\r
-Now, let's try putting it all together to create a new module that is \r
-context aware. First off, we'll create a configuration that lets us test \r
-how the module works:\r
-<div class="example"><pre>\r
-&lt;Location "/a"&gt;\r
-    SetHandler example-handler\r
-    ExampleEnabled on\r
-    ExamplePath "/foo/bar"\r
-    ExampleAction file allow\r
-&lt;/Location&gt;\r
-\r
-&lt;Location "/a/b"&gt;\r
-    ExampleAction file deny\r
-    ExampleEnabled off\r
-&lt;/Location&gt;\r
-\r
-&lt;Location "/a/b/c"&gt;\r
-    ExampleAction db deny\r
-    ExamplePath "/foo/bar/baz"\r
-    ExampleEnabled on\r
-&lt;/Location&gt;\r
-</pre></div>\r
-Then we'll assemble our module code. Note, that since we are now using our \r
-name tag as reference when fetching configurations in our handler, I have \r
-added some prototypes to keep the compiler happy:\r
-</p>\r
-\r
-\r
-<pre style="color:#000000;background:#ffffef;border: 1px dashed #333; padding: 0.5em; margin: 1em 2em 1em 1em;">\r
-<code style="color:#c34e00; ">/*$6</code>\r
-<code style="color:#c34e00; ">&nbsp;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++</code>\r
-<code style="color:#c34e00; ">&nbsp;* mod_example_config.c</code>\r
-<code style="color:#c34e00; ">&nbsp;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++</code>\r
-<code style="color:#c34e00; ">&nbsp;*/</code>\r
-\r
-\r
-<code style="color:#004a43; ">#</code><code style="color:#004a43; ">include </code><code style="color:#800000; ">&lt;</code><code style="color:#40015a; ">stdio.h</code><code style="color:#800000; ">&gt;</code>\r
-<code style="color:#004a43; ">#</code><code style="color:#004a43; ">include </code><code style="color:#800000; ">"</code><code style="color:#40015a; ">apr_hash.h</code><code style="color:#800000; ">"</code>\r
-<code style="color:#004a43; ">#</code><code style="color:#004a43; ">include </code><code style="color:#800000; ">"</code><code style="color:#40015a; ">ap_config.h</code><code style="color:#800000; ">"</code>\r
-<code style="color:#004a43; ">#</code><code style="color:#004a43; ">include </code><code style="color:#800000; ">"</code><code style="color:#40015a; ">ap_provider.h</code><code style="color:#800000; ">"</code>\r
-<code style="color:#004a43; ">#</code><code style="color:#004a43; ">include </code><code style="color:#800000; ">"</code><code style="color:#40015a; ">httpd.h</code><code style="color:#800000; ">"</code>\r
-<code style="color:#004a43; ">#</code><code style="color:#004a43; ">include </code><code style="color:#800000; ">"</code><code style="color:#40015a; ">http_core.h</code><code style="color:#800000; ">"</code>\r
-<code style="color:#004a43; ">#</code><code style="color:#004a43; ">include </code><code style="color:#800000; ">"</code><code style="color:#40015a; ">http_config.h</code><code style="color:#800000; ">"</code>\r
-<code style="color:#004a43; ">#</code><code style="color:#004a43; ">include </code><code style="color:#800000; ">"</code><code style="color:#40015a; ">http_log.h</code><code style="color:#800000; ">"</code>\r
-<code style="color:#004a43; ">#</code><code style="color:#004a43; ">include </code><code style="color:#800000; ">"</code><code style="color:#40015a; ">http_protocol.h</code><code style="color:#800000; ">"</code>\r
-<code style="color:#004a43; ">#</code><code style="color:#004a43; ">include </code><code style="color:#800000; ">"</code><code style="color:#40015a; ">http_request.h</code><code style="color:#800000; ">"</code>\r
-\r
-<code style="color:#c34e00; ">/*$1</code>\r
-<code style="color:#c34e00; ">&nbsp;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</code>\r
-<code style="color:#c34e00; ">&nbsp;&nbsp;&nbsp;&nbsp;Configuration structure</code>\r
-<code style="color:#c34e00; ">&nbsp;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</code>\r
-<code style="color:#c34e00; ">&nbsp;*/</code>\r
-\r
-<code style="color:#400000; font-weight:bold; ">typedef</code> <code style="color:#400000; font-weight:bold; ">struct</code>\r
-<code style="color:#806030; ">{</code>\r
-    <code style="color:#400000; font-weight:bold; ">char</code>    context<code style="color:#806030; ">[</code><code style="color:#c00000; ">256</code><code style="color:#806030; ">]</code><code style="color:#806030; ">;</code>\r
-    <code style="color:#400000; font-weight:bold; ">char</code>    path<code style="color:#806030; ">[</code><code style="color:#c00000; ">256</code><code style="color:#806030; ">]</code><code style="color:#806030; ">;</code>\r
-    <code style="color:#400000; font-weight:bold; ">int</code>     typeOfAction<code style="color:#806030; ">;</code>\r
-    <code style="color:#400000; font-weight:bold; ">int</code>     enabled<code style="color:#806030; ">;</code>\r
-<code style="color:#806030; ">}</code> example_config<code style="color:#806030; ">;</code>\r
-\r
-<code style="color:#c34e00; ">/*$1</code>\r
-<code style="color:#c34e00; ">&nbsp;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</code>\r
-<code style="color:#c34e00; ">&nbsp;&nbsp;&nbsp;&nbsp;Prototypes</code>\r
-<code style="color:#c34e00; ">&nbsp;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</code>\r
-<code style="color:#c34e00; ">&nbsp;*/</code>\r
-\r
-<code style="color:#400000; font-weight:bold; ">static</code> <code style="color:#400000; font-weight:bold; ">int</code>    example_handler<code style="color:#806030; ">(</code>request_rec <code style="color:#806030; ">*</code>r<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-<code style="color:#400000; font-weight:bold; ">const</code> <code style="color:#400000; font-weight:bold; ">char</code>    <code style="color:#806030; ">*</code>example_set_enabled<code style="color:#806030; ">(</code>cmd_parms <code style="color:#806030; ">*</code>cmd<code style="color:#806030; ">,</code> <code style="color:#400000; font-weight:bold; ">void</code> <code style="color:#806030; ">*</code>cfg<code style="color:#806030; ">,</code> <code style="color:#400000; font-weight:bold; ">const</code> <code style="color:#400000; font-weight:bold; ">char</code> <code style="color:#806030; ">*</code>arg<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-<code style="color:#400000; font-weight:bold; ">const</code> <code style="color:#400000; font-weight:bold; ">char</code>    <code style="color:#806030; ">*</code>example_set_path<code style="color:#806030; ">(</code>cmd_parms <code style="color:#806030; ">*</code>cmd<code style="color:#806030; ">,</code> <code style="color:#400000; font-weight:bold; ">void</code> <code style="color:#806030; ">*</code>cfg<code style="color:#806030; ">,</code> <code style="color:#400000; font-weight:bold; ">const</code> <code style="color:#400000; font-weight:bold; ">char</code> <code style="color:#806030; ">*</code>arg<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-<code style="color:#400000; font-weight:bold; ">const</code> <code style="color:#400000; font-weight:bold; ">char</code>    <code style="color:#806030; ">*</code>example_set_action<code style="color:#806030; ">(</code>cmd_parms <code style="color:#806030; ">*</code>cmd<code style="color:#806030; ">,</code> <code style="color:#400000; font-weight:bold; ">void</code> <code style="color:#806030; ">*</code>cfg<code style="color:#806030; ">,</code> <code style="color:#400000; font-weight:bold; ">const</code> <code style="color:#400000; font-weight:bold; ">char</code> <code style="color:#806030; ">*</code>arg1<code style="color:#806030; ">,</code> <code style="color:#400000; font-weight:bold; ">const</code> <code style="color:#400000; font-weight:bold; ">char</code> <code style="color:#806030; ">*</code>arg2<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-<code style="color:#400000; font-weight:bold; ">void</code>          <code style="color:#806030; ">*</code>create_dir_conf<code style="color:#806030; ">(</code>apr_pool_t <code style="color:#806030; ">*</code>pool<code style="color:#806030; ">,</code> <code style="color:#400000; font-weight:bold; ">char</code> <code style="color:#806030; ">*</code>context<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-<code style="color:#400000; font-weight:bold; ">void</code>          <code style="color:#806030; ">*</code>merge_dir_conf<code style="color:#806030; ">(</code>apr_pool_t <code style="color:#806030; ">*</code>pool<code style="color:#806030; ">,</code> <code style="color:#400000; font-weight:bold; ">void</code> <code style="color:#806030; ">*</code>BASE<code style="color:#806030; ">,</code> <code style="color:#400000; font-weight:bold; ">void</code> <code style="color:#806030; ">*</code>ADD<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-<code style="color:#400000; font-weight:bold; ">static</code> <code style="color:#400000; font-weight:bold; ">void</code>   register_hooks<code style="color:#806030; ">(</code>apr_pool_t <code style="color:#806030; ">*</code>pool<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-\r
-<code style="color:#c34e00; ">/*$1</code>\r
-<code style="color:#c34e00; ">&nbsp;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</code>\r
-<code style="color:#c34e00; ">&nbsp;&nbsp;&nbsp;&nbsp;Configuration directives</code>\r
-<code style="color:#c34e00; ">&nbsp;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</code>\r
-<code style="color:#c34e00; ">&nbsp;*/</code>\r
-\r
-<code style="color:#400000; font-weight:bold; ">static</code> <code style="color:#400000; font-weight:bold; ">const</code> command_rec    directives<code style="color:#806030; ">[</code><code style="color:#806030; ">]</code> <code style="color:#806030; ">=</code>\r
-<code style="color:#806030; ">{</code>\r
-    <a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__APACHE__CORE__CONFIG.html#ga07c7d22ae17805e61204463326cf9c34">AP_INIT_TAKE1</a><code style="color:#806030; ">(</code><code style="color:#800000; ">"</code><code style="color:#e60000; ">exampleEnabled</code><code style="color:#800000; ">"</code><code style="color:#806030; ">,</code> example_set_enabled<code style="color:#806030; ">,</code> <code style="color:#007d45; ">NULL</code><code style="color:#806030; ">,</code> ACCESS_CONF<code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">Enable or disable mod_example</code><code style="color:#800000; ">"</code><code style="color:#806030; ">)</code><code style="color:#806030; ">,</code>\r
-    <a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__APACHE__CORE__CONFIG.html#ga07c7d22ae17805e61204463326cf9c34">AP_INIT_TAKE1</a><code style="color:#806030; ">(</code><code style="color:#800000; ">"</code><code style="color:#e60000; ">examplePath</code><code style="color:#800000; ">"</code><code style="color:#806030; ">,</code> example_set_path<code style="color:#806030; ">,</code> <code style="color:#007d45; ">NULL</code><code style="color:#806030; ">,</code> ACCESS_CONF<code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">The path to whatever</code><code style="color:#800000; ">"</code><code style="color:#806030; ">)</code><code style="color:#806030; ">,</code>\r
-    <a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__APACHE__CORE__CONFIG.html#gafaec43534fcf200f37d9fecbf9247c21">AP_INIT_TAKE2</a><code style="color:#806030; ">(</code><code style="color:#800000; ">"</code><code style="color:#e60000; ">exampleAction</code><code style="color:#800000; ">"</code><code style="color:#806030; ">,</code> example_set_action<code style="color:#806030; ">,</code> <code style="color:#007d45; ">NULL</code><code style="color:#806030; ">,</code> ACCESS_CONF<code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">Special action value!</code><code style="color:#800000; ">"</code><code style="color:#806030; ">)</code><code style="color:#806030; ">,</code>\r
-    <code style="color:#806030; ">{</code> <code style="color:#007d45; ">NULL</code> <code style="color:#806030; ">}</code>\r
-<code style="color:#806030; ">}</code><code style="color:#806030; ">;</code>\r
-\r
-<code style="color:#c34e00; ">/*$1</code>\r
-<code style="color:#c34e00; ">&nbsp;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</code>\r
-<code style="color:#c34e00; ">&nbsp;&nbsp;&nbsp;&nbsp;Our name tag</code>\r
-<code style="color:#c34e00; ">&nbsp;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</code>\r
-<code style="color:#c34e00; ">&nbsp;*/</code>\r
-\r
-module AP_MODULE_DECLARE_DATA    example_module <code style="color:#806030; ">=</code>\r
-<code style="color:#806030; ">{</code>\r
-    STANDARD20_MODULE_STUFF<code style="color:#806030; ">,</code>\r
-    create_dir_conf<code style="color:#806030; ">,</code>    <code style="color:#c34e00; ">/* Per-directory configuration handler */</code>\r
-    merge_dir_conf<code style="color:#806030; ">,</code>     <code style="color:#c34e00; ">/* Merge handler for per-directory configurations */</code>\r
-    <code style="color:#007d45; ">NULL</code><code style="color:#806030; ">,</code>               <code style="color:#c34e00; ">/* Per-server configuration handler */</code>\r
-    <code style="color:#007d45; ">NULL</code><code style="color:#806030; ">,</code>               <code style="color:#c34e00; ">/* Merge handler for per-server configurations */</code>\r
-    directives<code style="color:#806030; ">,</code>         <code style="color:#c34e00; ">/* Any directives we may have for httpd */</code>\r
-    register_hooks      <code style="color:#c34e00; ">/* Our hook registering function */</code>\r
-<code style="color:#806030; ">}</code><code style="color:#806030; ">;</code>\r
-\r
-<code style="color:#c34e00; ">/*</code>\r
-<code style="color:#c34e00; ">&nbsp;=======================================================================================================================</code>\r
-<code style="color:#c34e00; ">&nbsp;&nbsp;&nbsp;&nbsp;Hook registration function</code>\r
-<code style="color:#c34e00; ">&nbsp;=======================================================================================================================</code>\r
-<code style="color:#c34e00; ">&nbsp;*/</code>\r
-<code style="color:#400000; font-weight:bold; ">static</code> <code style="color:#400000; font-weight:bold; ">void</code> register_hooks<code style="color:#806030; ">(</code>apr_pool_t <code style="color:#806030; ">*</code>pool<code style="color:#806030; ">)</code>\r
-<code style="color:#806030; ">{</code>\r
-    ap_hook_handler<code style="color:#806030; ">(</code>example_handler<code style="color:#806030; ">,</code> <code style="color:#007d45; ">NULL</code><code style="color:#806030; ">,</code> <code style="color:#007d45; ">NULL</code><code style="color:#806030; ">,</code> APR_HOOK_LAST<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-<code style="color:#806030; ">}</code>\r
-\r
-<code style="color:#c34e00; ">/*</code>\r
-<code style="color:#c34e00; ">&nbsp;=======================================================================================================================</code>\r
-<code style="color:#c34e00; ">&nbsp;&nbsp;&nbsp;&nbsp;Our example web service handler</code>\r
-<code style="color:#c34e00; ">&nbsp;=======================================================================================================================</code>\r
-<code style="color:#c34e00; ">&nbsp;*/</code>\r
-<code style="color:#400000; font-weight:bold; ">static</code> <code style="color:#400000; font-weight:bold; ">int</code> example_handler<code style="color:#806030; ">(</code>request_rec <code style="color:#806030; ">*</code>r<code style="color:#806030; ">)</code>\r
-<code style="color:#806030; ">{</code>\r
-    <code style="color:#400000; font-weight:bold; ">if</code><code style="color:#806030; ">(</code><code style="color:#806030; ">!</code>r<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">handler</code> <code style="color:#806030; ">|</code><code style="color:#806030; ">|</code> <code style="color:#800040; ">strcmp</code><code style="color:#806030; ">(</code>r<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">handler</code><code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">example-handler</code><code style="color:#800000; ">"</code><code style="color:#806030; ">)</code><code style="color:#806030; ">)</code> <code style="color:#400000; font-weight:bold; ">return</code><code style="color:#806030; ">(</code>DECLINED<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-\r
-    <code style="color:#c34e00; ">/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/</code>\r
-    example_config    <code style="color:#806030; ">*</code>config <code style="color:#806030; ">=</code> <code style="color:#806030; ">(</code>example_config <code style="color:#806030; ">*</code><code style="color:#806030; ">)</code> ap_get_module_config<code style="color:#806030; ">(</code>r<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">per_dir_config</code><code style="color:#806030; ">,</code> <code style="color:#806030; ">&amp;</code>example_module<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    <code style="color:#c34e00; ">/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/</code>\r
-\r
-    ap_set_content_type<code style="color:#806030; ">(</code>r<code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">text/plain</code><code style="color:#800000; ">"</code><code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    ap_rprintf<code style="color:#806030; ">(</code>r<code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">Enabled: </code><code style="color:#0f6900; ">%u</code><code style="color:#0f6900; ">\n</code><code style="color:#800000; ">"</code><code style="color:#806030; ">,</code> config<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">enabled</code><code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    ap_rprintf<code style="color:#806030; ">(</code>r<code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">Path: </code><code style="color:#0f6900; ">%s</code><code style="color:#0f6900; ">\n</code><code style="color:#800000; ">"</code><code style="color:#806030; ">,</code> config<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">path</code><code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    ap_rprintf<code style="color:#806030; ">(</code>r<code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">TypeOfAction: </code><code style="color:#0f6900; ">%x</code><code style="color:#0f6900; ">\n</code><code style="color:#800000; ">"</code><code style="color:#806030; ">,</code> config<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">typeOfAction</code><code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    ap_rprintf<code style="color:#806030; ">(</code>r<code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">Context: </code><code style="color:#0f6900; ">%s</code><code style="color:#0f6900; ">\n</code><code style="color:#800000; ">"</code><code style="color:#806030; ">,</code> config<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">context</code><code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    <code style="color:#400000; font-weight:bold; ">return</code> OK<code style="color:#806030; ">;</code>\r
-<code style="color:#806030; ">}</code>\r
-\r
-<code style="color:#c34e00; ">/*</code>\r
-<code style="color:#c34e00; ">&nbsp;=======================================================================================================================</code>\r
-<code style="color:#c34e00; ">&nbsp;&nbsp;&nbsp;&nbsp;Handler for the "exambleEnabled" directive</code>\r
-<code style="color:#c34e00; ">&nbsp;=======================================================================================================================</code>\r
-<code style="color:#c34e00; ">&nbsp;*/</code>\r
-<code style="color:#400000; font-weight:bold; ">const</code> <code style="color:#400000; font-weight:bold; ">char</code> <code style="color:#806030; ">*</code>example_set_enabled<code style="color:#806030; ">(</code>cmd_parms <code style="color:#806030; ">*</code>cmd<code style="color:#806030; ">,</code> <code style="color:#400000; font-weight:bold; ">void</code> <code style="color:#806030; ">*</code>cfg<code style="color:#806030; ">,</code> <code style="color:#400000; font-weight:bold; ">const</code> <code style="color:#400000; font-weight:bold; ">char</code> <code style="color:#806030; ">*</code>arg<code style="color:#806030; ">)</code>\r
-<code style="color:#806030; ">{</code>\r
-    <code style="color:#c34e00; ">/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/</code>\r
-    example_config    <code style="color:#806030; ">*</code>conf <code style="color:#806030; ">=</code> <code style="color:#806030; ">(</code>example_config <code style="color:#806030; ">*</code><code style="color:#806030; ">)</code> cfg<code style="color:#806030; ">;</code>\r
-    <code style="color:#c34e00; ">/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/</code>\r
-\r
-    <code style="color:#400000; font-weight:bold; ">if</code><code style="color:#806030; ">(</code>conf<code style="color:#806030; ">)</code>\r
-    <code style="color:#806030; ">{</code>\r
-        <code style="color:#400000; font-weight:bold; ">if</code><code style="color:#806030; ">(</code><code style="color:#806030; ">!</code>strcasecmp<code style="color:#806030; ">(</code>arg<code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">on</code><code style="color:#800000; ">"</code><code style="color:#806030; ">)</code><code style="color:#806030; ">)</code>\r
-            conf<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">enabled</code> <code style="color:#806030; ">=</code> <code style="color:#c00000; ">1</code><code style="color:#806030; ">;</code>\r
-        <code style="color:#400000; font-weight:bold; ">else</code>\r
-            conf<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">enabled</code> <code style="color:#806030; ">=</code> <code style="color:#c00000; ">0</code><code style="color:#806030; ">;</code>\r
-    <code style="color:#806030; ">}</code>\r
-\r
-    <code style="color:#400000; font-weight:bold; ">return</code> <code style="color:#007d45; ">NULL</code><code style="color:#806030; ">;</code>\r
-<code style="color:#806030; ">}</code>\r
-\r
-<code style="color:#c34e00; ">/*</code>\r
-<code style="color:#c34e00; ">&nbsp;=======================================================================================================================</code>\r
-<code style="color:#c34e00; ">&nbsp;&nbsp;&nbsp;&nbsp;Handler for the "examplePath" directive</code>\r
-<code style="color:#c34e00; ">&nbsp;=======================================================================================================================</code>\r
-<code style="color:#c34e00; ">&nbsp;*/</code>\r
-<code style="color:#400000; font-weight:bold; ">const</code> <code style="color:#400000; font-weight:bold; ">char</code> <code style="color:#806030; ">*</code>example_set_path<code style="color:#806030; ">(</code>cmd_parms <code style="color:#806030; ">*</code>cmd<code style="color:#806030; ">,</code> <code style="color:#400000; font-weight:bold; ">void</code> <code style="color:#806030; ">*</code>cfg<code style="color:#806030; ">,</code> <code style="color:#400000; font-weight:bold; ">const</code> <code style="color:#400000; font-weight:bold; ">char</code> <code style="color:#806030; ">*</code>arg<code style="color:#806030; ">)</code>\r
-<code style="color:#806030; ">{</code>\r
-    <code style="color:#c34e00; ">/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/</code>\r
-    example_config    <code style="color:#806030; ">*</code>conf <code style="color:#806030; ">=</code> <code style="color:#806030; ">(</code>example_config <code style="color:#806030; ">*</code><code style="color:#806030; ">)</code> cfg<code style="color:#806030; ">;</code>\r
-    <code style="color:#c34e00; ">/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/</code>\r
-\r
-    <code style="color:#400000; font-weight:bold; ">if</code><code style="color:#806030; ">(</code>conf<code style="color:#806030; ">)</code>\r
-    <code style="color:#806030; ">{</code>\r
-        <code style="color:#800040; ">strcpy</code><code style="color:#806030; ">(</code>conf<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">path</code><code style="color:#806030; ">,</code> arg<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    <code style="color:#806030; ">}</code>\r
-\r
-    <code style="color:#400000; font-weight:bold; ">return</code> <code style="color:#007d45; ">NULL</code><code style="color:#806030; ">;</code>\r
-<code style="color:#806030; ">}</code>\r
-\r
-<code style="color:#c34e00; ">/*</code>\r
-<code style="color:#c34e00; ">&nbsp;=======================================================================================================================</code>\r
-<code style="color:#c34e00; ">&nbsp;&nbsp;&nbsp;&nbsp;Handler for the "exampleAction" directive ;</code>\r
-<code style="color:#c34e00; ">&nbsp;&nbsp;&nbsp;&nbsp;Let's pretend this one takes one argument (file or db), and a second (deny or allow), ;</code>\r
-<code style="color:#c34e00; ">&nbsp;&nbsp;&nbsp;&nbsp;and we store it in a bit-wise manner.</code>\r
-<code style="color:#c34e00; ">&nbsp;=======================================================================================================================</code>\r
-<code style="color:#c34e00; ">&nbsp;*/</code>\r
-<code style="color:#400000; font-weight:bold; ">const</code> <code style="color:#400000; font-weight:bold; ">char</code> <code style="color:#806030; ">*</code>example_set_action<code style="color:#806030; ">(</code>cmd_parms <code style="color:#806030; ">*</code>cmd<code style="color:#806030; ">,</code> <code style="color:#400000; font-weight:bold; ">void</code> <code style="color:#806030; ">*</code>cfg<code style="color:#806030; ">,</code> <code style="color:#400000; font-weight:bold; ">const</code> <code style="color:#400000; font-weight:bold; ">char</code> <code style="color:#806030; ">*</code>arg1<code style="color:#806030; ">,</code> <code style="color:#400000; font-weight:bold; ">const</code> <code style="color:#400000; font-weight:bold; ">char</code> <code style="color:#806030; ">*</code>arg2<code style="color:#806030; ">)</code>\r
-<code style="color:#806030; ">{</code>\r
-    <code style="color:#c34e00; ">/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/</code>\r
-    example_config    <code style="color:#806030; ">*</code>conf <code style="color:#806030; ">=</code> <code style="color:#806030; ">(</code>example_config <code style="color:#806030; ">*</code><code style="color:#806030; ">)</code> cfg<code style="color:#806030; ">;</code>\r
-    <code style="color:#c34e00; ">/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/</code>\r
-\r
-    <code style="color:#400000; font-weight:bold; ">if</code><code style="color:#806030; ">(</code>conf<code style="color:#806030; ">)</code>\r
-    <code style="color:#806030; ">{</code>\r
-        <code style="color:#806030; ">{</code>\r
-            <code style="color:#400000; font-weight:bold; ">if</code><code style="color:#806030; ">(</code><code style="color:#806030; ">!</code>strcasecmp<code style="color:#806030; ">(</code>arg1<code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">file</code><code style="color:#800000; ">"</code><code style="color:#806030; ">)</code><code style="color:#806030; ">)</code>\r
-                conf<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">typeOfAction</code> <code style="color:#806030; ">=</code> <code style="color:#c00000; ">0x01</code><code style="color:#806030; ">;</code>\r
-            <code style="color:#400000; font-weight:bold; ">else</code>\r
-                conf<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">typeOfAction</code> <code style="color:#806030; ">=</code> <code style="color:#c00000; ">0x02</code><code style="color:#806030; ">;</code>\r
-            <code style="color:#400000; font-weight:bold; ">if</code><code style="color:#806030; ">(</code><code style="color:#806030; ">!</code>strcasecmp<code style="color:#806030; ">(</code>arg2<code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">deny</code><code style="color:#800000; ">"</code><code style="color:#806030; ">)</code><code style="color:#806030; ">)</code>\r
-                conf<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">typeOfAction</code> <code style="color:#806030; ">+</code><code style="color:#806030; ">=</code> <code style="color:#c00000; ">0x10</code><code style="color:#806030; ">;</code>\r
-            <code style="color:#400000; font-weight:bold; ">else</code>\r
-                conf<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">typeOfAction</code> <code style="color:#806030; ">+</code><code style="color:#806030; ">=</code> <code style="color:#c00000; ">0x20</code><code style="color:#806030; ">;</code>\r
-        <code style="color:#806030; ">}</code>\r
-    <code style="color:#806030; ">}</code>\r
-\r
-    <code style="color:#400000; font-weight:bold; ">return</code> <code style="color:#007d45; ">NULL</code><code style="color:#806030; ">;</code>\r
-<code style="color:#806030; ">}</code>\r
-\r
-<code style="color:#c34e00; ">/*</code>\r
-<code style="color:#c34e00; ">&nbsp;=======================================================================================================================</code>\r
-<code style="color:#c34e00; ">&nbsp;&nbsp;&nbsp;&nbsp;Function for creating new configurations for per-directory contexts</code>\r
-<code style="color:#c34e00; ">&nbsp;=======================================================================================================================</code>\r
-<code style="color:#c34e00; ">&nbsp;*/</code>\r
-<code style="color:#400000; font-weight:bold; ">void</code> <code style="color:#806030; ">*</code>create_dir_conf<code style="color:#806030; ">(</code>apr_pool_t <code style="color:#806030; ">*</code>pool<code style="color:#806030; ">,</code> <code style="color:#400000; font-weight:bold; ">char</code> <code style="color:#806030; ">*</code>context<code style="color:#806030; ">)</code>\r
-<code style="color:#806030; ">{</code>\r
-    context <code style="color:#806030; ">=</code> context <code style="color:#806030; ">?</code> context <code style="color:#806030; ">:</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">Newly created configuration</code><code style="color:#800000; ">"</code><code style="color:#806030; ">;</code>\r
-\r
-    <code style="color:#c34e00; ">/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/</code>\r
-    example_config    <code style="color:#806030; ">*</code>cfg <code style="color:#806030; ">=</code> apr_pcalloc<code style="color:#806030; ">(</code>pool<code style="color:#806030; ">,</code> <code style="color:#400000; font-weight:bold; ">sizeof</code><code style="color:#806030; ">(</code>example_config<code style="color:#806030; ">)</code><code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    <code style="color:#c34e00; ">/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/</code>\r
-\r
-    <code style="color:#400000; font-weight:bold; ">if</code><code style="color:#806030; ">(</code>cfg<code style="color:#806030; ">)</code>\r
-    <code style="color:#806030; ">{</code>\r
-        <code style="color:#806030; ">{</code>\r
-            <code style="color:#c34e00; ">/* Set some default values */</code>\r
-            <code style="color:#800040; ">strcpy</code><code style="color:#806030; ">(</code>cfg<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">context</code><code style="color:#806030; ">,</code> context<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-            cfg<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">enabled</code> <code style="color:#806030; ">=</code> <code style="color:#c00000; ">0</code><code style="color:#806030; ">;</code>\r
-            <code style="color:#800040; ">memset</code><code style="color:#806030; ">(</code>cfg<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">path</code><code style="color:#806030; ">,</code> <code style="color:#c00000; ">0</code><code style="color:#806030; ">,</code> <code style="color:#c00000; ">256</code><code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-            cfg<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">typeOfAction</code> <code style="color:#806030; ">=</code> <code style="color:#c00000; ">0x00</code><code style="color:#806030; ">;</code>\r
-        <code style="color:#806030; ">}</code>\r
-    <code style="color:#806030; ">}</code>\r
-\r
-    <code style="color:#400000; font-weight:bold; ">return</code> cfg<code style="color:#806030; ">;</code>\r
-<code style="color:#806030; ">}</code>\r
-\r
-<code style="color:#c34e00; ">/*</code>\r
-<code style="color:#c34e00; ">&nbsp;=======================================================================================================================</code>\r
-<code style="color:#c34e00; ">&nbsp;&nbsp;&nbsp;&nbsp;Merging function for configurations</code>\r
-<code style="color:#c34e00; ">&nbsp;=======================================================================================================================</code>\r
-<code style="color:#c34e00; ">&nbsp;*/</code>\r
-<code style="color:#400000; font-weight:bold; ">void</code> <code style="color:#806030; ">*</code>merge_dir_conf<code style="color:#806030; ">(</code>apr_pool_t <code style="color:#806030; ">*</code>pool<code style="color:#806030; ">,</code> <code style="color:#400000; font-weight:bold; ">void</code> <code style="color:#806030; ">*</code>BASE<code style="color:#806030; ">,</code> <code style="color:#400000; font-weight:bold; ">void</code> <code style="color:#806030; ">*</code>ADD<code style="color:#806030; ">)</code>\r
-<code style="color:#806030; ">{</code>\r
-    <code style="color:#c34e00; ">/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/</code>\r
-    example_config    <code style="color:#806030; ">*</code>base <code style="color:#806030; ">=</code> <code style="color:#806030; ">(</code>example_config <code style="color:#806030; ">*</code><code style="color:#806030; ">)</code> BASE<code style="color:#806030; ">;</code>\r
-    example_config    <code style="color:#806030; ">*</code>add <code style="color:#806030; ">=</code> <code style="color:#806030; ">(</code>example_config <code style="color:#806030; ">*</code><code style="color:#806030; ">)</code> ADD<code style="color:#806030; ">;</code>\r
-    example_config    <code style="color:#806030; ">*</code>conf <code style="color:#806030; ">=</code> <code style="color:#806030; ">(</code>example_config <code style="color:#806030; ">*</code><code style="color:#806030; ">)</code> create_dir_conf<code style="color:#806030; ">(</code>pool<code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">Merged configuration</code><code style="color:#800000; ">"</code><code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    <code style="color:#c34e00; ">/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/</code>\r
-\r
-    conf<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">enabled</code> <code style="color:#806030; ">=</code> <code style="color:#806030; ">(</code>add<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">enabled</code> <code style="color:#806030; ">=</code><code style="color:#806030; ">=</code> <code style="color:#c00000; ">0</code><code style="color:#806030; ">)</code> <code style="color:#806030; ">?</code> base<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">enabled</code> <code style="color:#806030; ">:</code> add<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">enabled</code><code style="color:#806030; ">;</code>\r
-    conf<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">typeOfAction</code> <code style="color:#806030; ">=</code> add<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">typeOfAction</code> <code style="color:#806030; ">?</code> add<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">typeOfAction</code> <code style="color:#806030; ">:</code> base<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">typeOfAction</code><code style="color:#806030; ">;</code>\r
-    <code style="color:#800040; ">strcpy</code><code style="color:#806030; ">(</code>conf<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">path</code><code style="color:#806030; ">,</code> <code style="color:#800040; ">strlen</code><code style="color:#806030; ">(</code>add<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">path</code><code style="color:#806030; ">)</code> <code style="color:#806030; ">?</code> add<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">path</code> <code style="color:#806030; ">:</code> base<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">path</code><code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    <code style="color:#400000; font-weight:bold; ">return</code> conf<code style="color:#806030; ">;</code>\r
-<code style="color:#806030; ">}</code>\r
-</pre>\r
-\r
-\r
-\r
-\r
-\r
-\r
-</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>\r
-<div class="section">\r
-<h2><a name="summary" id="summary">Summing up</a></h2>\r
-<p>\r
-We have now looked at how to create simple modules for Apache HTTP Server 2.4 and \r
-configuring them. What you do next is entirely up to you, but it is my \r
-hope that something valuable has come out of reading this documentation. \r
-If you have questions on how to further develop modules, you are welcome \r
-to join our <a href="http://httpd.apache.org/lists.html">mailing lists</a> \r
-or check out the rest of our documentation for further tips.\r
-</p>\r
-</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>\r
-<div class="section">\r
-<h2><a name="snippets" id="snippets">Some useful snippets of code</a></h2>\r
-\r
-<h3><a name="get_post" id="get_post">Retrieve a variable from POST form data</a></h3>\r
-\r
-\r
-\r
-<pre style="color:#000000;background:#ffffef;border: 1px dashed #333; padding: 0.5em; margin: 1em 2em 1em 1em;">\r
-<code style="color:#400000; font-weight:bold; ">const</code> <code style="color:#400000; font-weight:bold; ">char</code> <code style="color:#806030; ">*</code>read_post_value<code style="color:#806030; ">(</code><code style="color:#400000; font-weight:bold; ">const</code> apr_array_header_t <code style="color:#806030; ">*</code>fields<code style="color:#806030; ">,</code> <code style="color:#400000; font-weight:bold; ">const</code> <code style="color:#400000; font-weight:bold; ">char</code> <code style="color:#806030; ">*</code>key<code style="color:#806030; ">)</code> \r
-<code style="color:#806030; ">{</code>\r
-    <code style="color:#c34e00; ">/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/</code>\r
-    <code style="color:#400000; font-weight:bold; ">int</code>                         i<code style="color:#806030; ">;</code>\r
-    apr_table_entry_t           <code style="color:#806030; ">*</code>e <code style="color:#806030; ">=</code> <code style="color:#c00000; ">0</code><code style="color:#806030; ">;</code>\r
-    <code style="color:#c34e00; ">/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/</code>\r
-    e <code style="color:#806030; ">=</code> <code style="color:#806030; ">(</code>apr_table_entry_t <code style="color:#806030; ">*</code><code style="color:#806030; ">)</code> fields<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code>elts<code style="color:#806030; ">;</code>\r
-    <code style="color:#400000; font-weight:bold; ">for</code><code style="color:#806030; ">(</code>i <code style="color:#806030; ">=</code> <code style="color:#c00000; ">0</code><code style="color:#806030; ">;</code> i <code style="color:#806030; ">&lt;</code> fields<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code>nelts<code style="color:#806030; ">;</code> i<code style="color:#806030; ">+</code><code style="color:#806030; ">+</code><code style="color:#806030; ">)</code> <code style="color:#806030; ">{</code>\r
-        <code style="color:#400000; font-weight:bold; ">if</code><code style="color:#806030; ">(</code><code style="color:#806030; ">!</code><code style="color:#800040; ">strcmp</code><code style="color:#806030; ">(</code>e<code style="color:#806030; ">[</code>i<code style="color:#806030; ">]</code><code style="color:#806030; ">.</code>key<code style="color:#806030; ">,</code> key<code style="color:#806030; ">)</code><code style="color:#806030; ">)</code> <code style="color:#400000; font-weight:bold; ">return</code> e<code style="color:#806030; ">[</code>i<code style="color:#806030; ">]</code><code style="color:#806030; ">.</code>val<code style="color:#806030; ">;</code>\r
-    <code style="color:#806030; ">}</code>\r
-    <code style="color:#400000; font-weight:bold; ">return</code> <code style="color:#c00000; ">0</code><code style="color:#806030; ">;</code>\r
-<code style="color:#806030; ">}</code>\r
-<code style="color:#400000; font-weight:bold; ">static</code> <code style="color:#400000; font-weight:bold; ">int</code> example_handler<code style="color:#806030; ">(</code>request_req <code style="color:#806030; ">*</code>r<code style="color:#806030; ">)</code> \r
-<code style="color:#806030; ">{</code>\r
-    <code style="color:#c34e00; ">/*~~~~~~~~~~~~~~~~~~~~~~*/</code>\r
-    apr_array_header_t <code style="color:#806030; ">*</code>POST<code style="color:#806030; ">;</code>\r
-    <code style="color:#400000; font-weight:bold; ">const</code> <code style="color:#400000; font-weight:bold; ">char</code>         <code style="color:#806030; ">*</code>value<code style="color:#806030; ">;</code>\r
-    <code style="color:#c34e00; ">/*~~~~~~~~~~~~~~~~~~~~~~*/</code>\r
-    ap_parse_form_data<code style="color:#806030; ">(</code>r<code style="color:#806030; ">,</code> <code style="color:#007d45; ">NULL</code><code style="color:#806030; ">,</code> <code style="color:#806030; ">&amp;</code>POST<code style="color:#806030; ">,</code> <code style="color:#806030; ">-</code><code style="color:#c00000; ">1</code><code style="color:#806030; ">,</code> <code style="color:#c00000; ">8192</code><code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    \r
-    value <code style="color:#806030; ">=</code> read_post_value<code style="color:#806030; ">(</code>POST<code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">valueA</code><code style="color:#800000; ">"</code><code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    <code style="color:#400000; font-weight:bold; ">if</code> <code style="color:#806030; ">(</code><code style="color:#806030; ">!</code>value<code style="color:#806030; ">)</code> value <code style="color:#806030; ">=</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">(undefined)</code><code style="color:#800000; ">"</code><code style="color:#806030; ">;</code>\r
-    ap_rprintf<code style="color:#806030; ">(</code>r<code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">The value of valueA is: </code><code style="color:#0f6900; ">%s</code><code style="color:#800000; ">"</code><code style="color:#806030; ">,</code> value<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    <code style="color:#400000; font-weight:bold; ">return</code> OK<code style="color:#806030; ">;</code>\r
-<code style="color:#806030; ">}</code>\r
-    </pre>\r
-\r
-\r
-\r
-    \r
-    \r
-    <h3><a name="headers_out" id="headers_out">Printing out every HTTP header received</a></h3>\r
-    \r
-\r
-\r
-<pre style="color:#000000;background:#ffffef;border: 1px dashed #333; padding: 0.5em; margin: 1em 2em 1em 1em;">\r
-<code style="color:#400000; font-weight:bold; ">static</code> <code style="color:#400000; font-weight:bold; ">int</code> example_handler<code style="color:#806030; ">(</code>request_req <code style="color:#806030; ">*</code>r<code style="color:#806030; ">)</code> \r
-<code style="color:#806030; ">{</code>\r
-    <code style="color:#c34e00; ">/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/</code>\r
-    <code style="color:#400000; font-weight:bold; ">const</code> apr_array_header_t    <code style="color:#806030; ">*</code>fields<code style="color:#806030; ">;</code>\r
-    <code style="color:#400000; font-weight:bold; ">int</code>                         i<code style="color:#806030; ">;</code>\r
-    apr_table_entry_t           <code style="color:#806030; ">*</code>e <code style="color:#806030; ">=</code> <code style="color:#c00000; ">0</code><code style="color:#806030; ">;</code>\r
-    <code style="color:#c34e00; ">/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/</code>\r
-\r
-    fields <code style="color:#806030; ">=</code> <a href="http://apr.apache.org/docs/apr/1.4/group__apr__tables.html#gaea3005541cce67481f48ab201b5c0cf3">apr_table_elts</a><code style="color:#806030; ">(</code>r<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code>headers_in<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    e <code style="color:#806030; ">=</code> <code style="color:#806030; ">(</code>apr_table_entry_t <code style="color:#806030; ">*</code><code style="color:#806030; ">)</code> fields<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code>elts<code style="color:#806030; ">;</code>\r
-    <code style="color:#400000; font-weight:bold; ">for</code><code style="color:#806030; ">(</code>i <code style="color:#806030; ">=</code> <code style="color:#c00000; ">0</code><code style="color:#806030; ">;</code> i <code style="color:#806030; ">&lt;</code> fields<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code>nelts<code style="color:#806030; ">;</code> i<code style="color:#806030; ">+</code><code style="color:#806030; ">+</code><code style="color:#806030; ">)</code> <code style="color:#806030; ">{</code>\r
-        ap_rprintf<code style="color:#806030; ">(</code>r<code style="color:#806030; ">,</code> <code style="color:#800000; ">"</code><code style="color:#e60000; ">&lt;b&gt;</code><code style="color:#0f6900; ">%s</code><code style="color:#e60000; ">&lt;/b&gt;: </code><code style="color:#0f6900; ">%s</code><code style="color:#e60000; ">&lt;br/&gt;</code><code style="color:#800000; ">"</code><code style="color:#806030; ">,</code> e<code style="color:#806030; ">[</code>i<code style="color:#806030; ">]</code><code style="color:#806030; ">.</code>key<code style="color:#806030; ">,</code> e<code style="color:#806030; ">[</code>i<code style="color:#806030; ">]</code><code style="color:#806030; ">.</code>val<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    <code style="color:#806030; ">}</code>\r
-    <code style="color:#400000; font-weight:bold; ">return</code> OK<code style="color:#806030; ">;</code>\r
-<code style="color:#806030; ">}</code>\r
-    </pre>\r
-\r
-\r
-\r
-    \r
-    \r
-    <h3><a name="request_body" id="request_body">Reading the request body into memory</a></h3>\r
-    \r
-\r
-\r
-<pre style="color:#000000;background:#ffffef;border: 1px dashed #333; padding: 0.5em; margin: 1em 2em 1em 1em;">\r
-<code style="color:#400000; font-weight:bold; ">static</code> <code style="color:#400000; font-weight:bold; ">int</code> util_read<code style="color:#806030; ">(</code>request_rec <code style="color:#806030; ">*</code>r<code style="color:#806030; ">,</code> <code style="color:#400000; font-weight:bold; ">const</code> <code style="color:#400000; font-weight:bold; ">char</code> <code style="color:#806030; ">*</code><code style="color:#806030; ">*</code>rbuf<code style="color:#806030; ">,</code> apr_off_t <code style="color:#806030; ">*</code>size<code style="color:#806030; ">)</code>\r
-<code style="color:#806030; ">{</code>\r
-    <code style="color:#c34e00; ">/*~~~~~~~~*/</code>\r
-    <code style="color:#400000; font-weight:bold; ">int</code> rc <code style="color:#806030; ">=</code> OK<code style="color:#806030; ">;</code>\r
-    <code style="color:#c34e00; ">/*~~~~~~~~*/</code>\r
-\r
-    <code style="color:#400000; font-weight:bold; ">if</code><code style="color:#806030; ">(</code><code style="color:#806030; ">(</code>rc <code style="color:#806030; ">=</code> ap_setup_client_block<code style="color:#806030; ">(</code>r<code style="color:#806030; ">,</code> REQUEST_CHUNKED_ERROR<code style="color:#806030; ">)</code><code style="color:#806030; ">)</code><code style="color:#806030; ">)</code> <code style="color:#806030; ">{</code>\r
-        <code style="color:#400000; font-weight:bold; ">return</code><code style="color:#806030; ">(</code>rc<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    <code style="color:#806030; ">}</code>\r
-\r
-    <code style="color:#400000; font-weight:bold; ">if</code><code style="color:#806030; ">(</code>ap_should_client_block<code style="color:#806030; ">(</code>r<code style="color:#806030; ">)</code><code style="color:#806030; ">)</code> <code style="color:#806030; ">{</code>\r
-\r
-        <code style="color:#c34e00; ">/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/</code>\r
-        <code style="color:#400000; font-weight:bold; ">char</code>         argsbuffer<code style="color:#806030; ">[</code>HUGE_STRING_LEN<code style="color:#806030; ">]</code><code style="color:#806030; ">;</code>\r
-        apr_off_t    rsize<code style="color:#806030; ">,</code> len_read<code style="color:#806030; ">,</code> rpos <code style="color:#806030; ">=</code> <code style="color:#c00000; ">0</code><code style="color:#806030; ">;</code>\r
-        apr_off_t length <code style="color:#806030; ">=</code> r<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">remaining</code><code style="color:#806030; ">;</code>\r
-        <code style="color:#c34e00; ">/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/</code>\r
-\r
-        <code style="color:#806030; ">*</code>rbuf <code style="color:#806030; ">=</code> <code style="color:#806030; ">(</code><code style="color:#400000; font-weight:bold; ">const</code> <code style="color:#400000; font-weight:bold; ">char</code> <code style="color:#806030; ">*</code><code style="color:#806030; ">)</code> apr_pcalloc<code style="color:#806030; ">(</code>r<code style="color:#806030; ">-</code><code style="color:#806030; ">&gt;</code><code style="color:#008833">pool</code><code style="color:#806030; ">,</code> <code style="color:#806030; ">(</code>apr_size_t<code style="color:#806030; ">)</code> <code style="color:#806030; ">(</code>length <code style="color:#806030; ">+</code> <code style="color:#c00000; ">1</code><code style="color:#806030; ">)</code><code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-        <code style="color:#806030; ">*</code>size <code style="color:#806030; ">=</code> length<code style="color:#806030; ">;</code>\r
-        <code style="color:#400000; font-weight:bold; ">while</code><code style="color:#806030; ">(</code><code style="color:#806030; ">(</code>len_read <code style="color:#806030; ">=</code> ap_get_client_block<code style="color:#806030; ">(</code>r<code style="color:#806030; ">,</code> argsbuffer<code style="color:#806030; ">,</code> <code style="color:#400000; font-weight:bold; ">sizeof</code><code style="color:#806030; ">(</code>argsbuffer<code style="color:#806030; ">)</code><code style="color:#806030; ">)</code><code style="color:#806030; ">)</code> <code style="color:#806030; ">&gt;</code> <code style="color:#c00000; ">0</code><code style="color:#806030; ">)</code> <code style="color:#806030; ">{</code>\r
-            <code style="color:#400000; font-weight:bold; ">if</code><code style="color:#806030; ">(</code><code style="color:#806030; ">(</code>rpos <code style="color:#806030; ">+</code> len_read<code style="color:#806030; ">)</code> <code style="color:#806030; ">&gt;</code> length<code style="color:#806030; ">)</code> <code style="color:#806030; ">{</code>\r
-                rsize <code style="color:#806030; ">=</code> length <code style="color:#806030; ">-</code> rpos<code style="color:#806030; ">;</code>\r
-            <code style="color:#806030; ">}</code>\r
-            <code style="color:#400000; font-weight:bold; ">else</code> <code style="color:#806030; ">{</code>\r
-                rsize <code style="color:#806030; ">=</code> len_read<code style="color:#806030; ">;</code>\r
-            <code style="color:#806030; ">}</code>\r
-\r
-            <code style="color:#800040; ">memcpy</code><code style="color:#806030; ">(</code><code style="color:#806030; ">(</code><code style="color:#400000; font-weight:bold; ">char</code> <code style="color:#806030; ">*</code><code style="color:#806030; ">)</code> <code style="color:#806030; ">*</code>rbuf <code style="color:#806030; ">+</code> rpos<code style="color:#806030; ">,</code> argsbuffer<code style="color:#806030; ">,</code> <code style="color:#806030; ">(</code><code style="color:#800040; ">size_t</code><code style="color:#806030; ">)</code> rsize<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-            rpos <code style="color:#806030; ">+</code><code style="color:#806030; ">=</code> rsize<code style="color:#806030; ">;</code>\r
-        <code style="color:#806030; ">}</code>\r
-    <code style="color:#806030; ">}</code>\r
-    <code style="color:#400000; font-weight:bold; ">return</code><code style="color:#806030; ">(</code>rc<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-<code style="color:#806030; ">}</code>\r
-\r
-<code style="color:#400000; font-weight:bold; ">static</code> <code style="color:#400000; font-weight:bold; ">int</code> example_handler<code style="color:#806030; ">(</code>request_req<code style="color:#806030; ">*</code> r<code style="color:#806030; ">)</code> \r
-<code style="color:#806030; ">{</code>\r
-    <code style="color:#c34e00; ">/*~~~~~~~~~~~~~~~~*/</code>\r
-    apr_off_t   size<code style="color:#806030; ">;</code>\r
-    <code style="color:#400000; font-weight:bold; ">const</code> <code style="color:#400000; font-weight:bold; ">char</code>  <code style="color:#806030; ">*</code>buffer<code style="color:#806030; ">;</code>\r
-    <code style="color:#c34e00; ">/*~~~~~~~~~~~~~~~~*/</code>\r
-\r
-    <code style="color:#400000; font-weight:bold; ">if</code><code style="color:#806030; ">(</code>util_read<code style="color:#806030; ">(</code>r<code style="color:#806030; ">,</code> <code style="color:#806030; ">&amp;</code>data<code style="color:#806030; ">,</code> <code style="color:#806030; ">&amp;</code>size<code style="color:#806030; ">)</code> <code style="color:#806030; ">=</code><code style="color:#806030; ">=</code> OK<code style="color:#806030; ">)</code> <code style="color:#806030; ">{</code>\r
-        ap_rprintf<code style="color:#806030; ">(</code><code style="color:#800000; ">"</code><code style="color:#e60000; ">We read a request body that was </code><code style="color:#0f6900; ">%u</code><code style="color:#e60000; "> bytes long</code><code style="color:#800000; ">"</code><code style="color:#806030; ">,</code> size<code style="color:#806030; ">)</code><code style="color:#806030; ">;</code>\r
-    <code style="color:#806030; ">}</code>\r
-    <code style="color:#400000; font-weight:bold; ">return</code> OK<code style="color:#806030; ">;</code>\r
-<code style="color:#806030; ">}</code>\r
-    </pre>\r
-\r
-\r
-\r
-    \r
-\r
-</div></div>\r
-<div class="bottomlang">\r
-<p><span>Available Languages: </span><a href="../en/developer/modguide.html" title="English">&nbsp;en&nbsp;</a></p>\r
-</div><div id="footer">\r
-<p class="apache">Copyright 2012 The Apache Software Foundation.<br />Licensed under the <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p>\r
-<p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/directives.html">Directives</a> | <a href="../faq/">FAQ</a> | <a href="../glossary.html">Glossary</a> | <a href="../sitemap.html">Sitemap</a></p></div>\r
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head><!--
+        XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+              This file is generated from xml source: DO NOT EDIT
+        XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+      -->
+<title>Developing modules for the Apache HTTP Server 2.4 - Apache HTTP Server</title>
+<link href="../style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
+<link href="../style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
+<link href="../style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" />
+<link href="../images/favicon.ico" rel="shortcut icon" /></head>
+<body id="manual-page"><div id="page-header">
+<p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/directives.html">Directives</a> | <a href="../faq/">FAQ</a> | <a href="../glossary.html">Glossary</a> | <a href="../sitemap.html">Sitemap</a></p>
+<p class="apache">Apache HTTP Server Version 2.4</p>
+<img alt="" src="../images/feather.gif" /></div>
+<div class="up"><a href="./"><img title="&lt;-" alt="&lt;-" src="../images/left.gif" /></a></div>
+<div id="path">
+<a href="http://www.apache.org/">Apache</a> &gt; <a href="http://httpd.apache.org/">HTTP Server</a> &gt; <a href="http://httpd.apache.org/docs/">Documentation</a> &gt; <a href="../">Version 2.4</a> &gt; <a href="./">Developer</a></div><div id="page-content"><div id="preamble"><h1>Developing modules for the Apache HTTP Server 2.4</h1>
+<div class="toplang">
+<p><span>Available Languages: </span><a href="../en/developer/modguide.html" title="English">&nbsp;en&nbsp;</a></p>
+</div>
+
+<p>This document explains how you can develop modules for the Apache HTTP 
+Server 2.4</p>
+</div>
+<div id="quickview"><ul id="toc"><li><img alt="" src="../images/down.gif" /> <a href="#introduction">Introduction</a></li>
+<li><img alt="" src="../images/down.gif" /> <a href="#basics">Defining a module</a></li>
+<li><img alt="" src="../images/down.gif" /> <a href="#hooking">Getting started: Hooking into the server</a></li>
+<li><img alt="" src="../images/down.gif" /> <a href="#handling">Building a handler</a></li>
+<li><img alt="" src="../images/down.gif" /> <a href="#configuration">Adding configuration options</a></li>
+<li><img alt="" src="../images/down.gif" /> <a href="#context">Context aware configurations</a></li>
+<li><img alt="" src="../images/down.gif" /> <a href="#summary">Summing up</a></li>
+<li><img alt="" src="../images/down.gif" /> <a href="#snippets">Some useful snippets of code</a></li>
+</ul><h3>See also</h3><ul class="seealso"><li><a href="request.html">Request Processing in Apache 2.4</a></li><li><a href="hooks.html">Apache 2.x Hook Functions</a></li></ul></div>
+<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
+<div class="section">
+<h2><a name="introduction" id="introduction">Introduction</a></h2>
+<h3><a name="what" id="what">What we will be discussing in this document</a></h3>
+<p>
+This document will discuss how you can easily create modules for the Apache 
+HTTP Server 2.4, by exploring an example module called 
+<code>mod_example</code>. In the first part of this document, the purpose 
+of this module will be to calculate and print out various digest values for 
+existing files on your web server, whenever we access the URL <code>
+http://hostname/filename.sum</code>. For instance, if we want to know the 
+MD5 digest value of the file located at <code>
+http://www.example.com/index.html</code>, we would visit <code>
+http://www.example.com/index.html.sum</code>. 
+</p>
+
+<p>
+In the second part of this document, which deals with configuration 
+directive and context awareness, we will be looking at a module that simply 
+write out its own configuration to the client.
+</p>
+
+
+<h3><a name="prerequisites" id="prerequisites">Prerequisites</a></h3>
+<p>
+First and foremost, you are expected to have a basic knowledge of how the C 
+programming language works. In most cases, we will try to be as pedagogical 
+as possible and link to documents describing the functions used in the 
+examples, but there are also many cases where it is necessary to either 
+just assume that "it works" or do some digging yourself into what the hows 
+and whys of various function calls. 
+</p>
+<p>
+Lastly, you will need to have a basic understanding of how modules are 
+loaded and configured in the Apache HTTP Server, as well as how to get the headers for 
+Apache if you do not have them already, as these are needed for compiling 
+new modules.
+</p>
+
+<h3><a name="compiling" id="compiling">Compiling your module</a></h3>
+<p>
+To compile the source code we are building in this document, we will be 
+using <a href="../programs/apxs.html">APXS</a>. Assuming your source file 
+is called mod_example.c, compiling, installing and activating the module is 
+as simple as: 
+</p>
+<div class="example"><pre>
+apxs -i -a -c mod_example.c
+</pre></div>
+
+
+</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
+<div class="section">
+<h2><a name="basics" id="basics">Defining a module</a></h2>
+<p>
+<img src="../images/build_a_mod_3.png" alt="Module name tags" /><br />
+Every module starts with the same declaration, or name tag if you will, 
+that defines a module as <em>a separate entity within Apache</em>:</p>
+
+
+
+<p class="source">
+module AP_MODULE_DECLARE_DATA   example_module <code class="sh_misc">=</code>
+<code class="sh_misc">{</code>
+    STANDARD20_MODULE_STUFF<code class="sh_misc">,</code>
+    create_dir_conf<code class="sh_misc">,</code> <code class="sh_comment">/* Per-directory configuration handler */</code>
+    merge_dir_conf<code class="sh_misc">,</code>  <code class="sh_comment">/* Merge handler for per-directory configurations */</code>
+    create_svr_conf<code class="sh_misc">,</code> <code class="sh_comment">/* Per-server configuration handler */</code>
+    merge_svr_conf<code class="sh_misc">,</code>  <code class="sh_comment">/* Merge handler for per-server configurations */</code>
+    directives<code class="sh_misc">,</code>      <code class="sh_comment">/* Any directives we may have for httpd */</code>
+    register_hooks   <code class="sh_comment">/* Our hook registering function */</code>
+<code class="sh_misc">}</code><code class="sh_misc">;</code>
+</p>
+
+
+<p>
+This bit of code lets the server know that we have now registered a new module 
+in the system, and that its name is <code>example_module</code>. The name 
+of the module is used primarily for two things:<br />
+</p>
+<ul>
+<li>Letting the server know how to load the module using the LoadModule</li>
+<li>Setting up a namespace for the module to use in configurations</li>
+</ul>
+<p>
+For now, we're only concerned with the first purpose of the module name, 
+which comes into play when we need to load the module:
+</p>
+<div class="example"><pre><a href="../mod/mod_so.html#LoadModule">LoadModule</a> example_module modules/mod_example.so</pre></div>
+<p>
+In essence, this tells the server to open up <code>mod_example.so</code> and look for a module 
+called <code>example_module</code>.
+</p>
+<p>
+Within this name tag of ours is also a bunch of references to how we would 
+like to handle things: Which directives do we respond to in a configuration 
+file or .htaccess, how do we operate within specific contexts, and what 
+handlers are we interested in registering with the Apache HTTP service. We'll 
+return to all these elements later in this document.
+</p>
+</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
+<div class="section">
+<h2><a name="hooking" id="hooking">Getting started: Hooking into the server</a></h2>
+<h3><a name="hook_intro" id="hook_intro">An introduction to hooks</a></h3>
+<p>
+When handling requests in Apache HTTP Server 2.4, the first thing you will need to do is 
+create a hook into the request handling process. A hook is essentially a 
+message telling the server that you are willing to either serve or at least 
+take a glance at certain requests given by clients. All handlers, whether 
+it's mod_rewrite, mod_authn_*, mod_proxy and so on, are hooked into 
+specific parts of the request process. As you are probably aware, modules 
+serve different purposes; Some are authentication/authorization handlers, 
+others are file or script handlers while some third modules rewrite URIs or 
+proxies content. Furthermore, in the end, it is up to the user of the server 
+how and when each module will come into place. Thus, the server itself does not 
+presume to know which module is responsible for handling a specific 
+request, and will ask each module whether they have an interest in a given 
+request or not. It is then up to each module to either gently decline 
+serving a request, accept serving it or flat out deny the request from 
+being served, as authentication/authorization modules do: <br />
+<img src="../images/build_a_mod_2.png" alt="Hook handling in httpd" /><br />
+To make it a bit easier for handlers such as our mod_example to know 
+whether the client is requesting content we should handle or not, the server 
+has directives for hinting to modules whether their assistance is needed or 
+not. Two of these are <code class="directive"><a href="../mod/mod_mime.html#addhandler">AddHandler</a></code> 
+and <code class="directive"><a href="../mod/core.html#sethandler">SetHandler</a></code>. Let's take a look at 
+an example using <code class="directive"><a href="../mod/mod_mime.html#addhandler">AddHandler</a></code>. In 
+our example case, we want every request ending with .sum to be served by 
+<code>mod_example</code>, so we'll add a configuration directive that tells 
+the server to do just that:
+</p>
+<div class="example"><pre>
+AddHandler example-handler .sum
+</pre></div>
+<p>
+What this tells the server is the following: <em>Whenever we receive a request 
+for a URI ending in .sum, we are to let all modules know that we are 
+looking for whoever goes by the name of "example-handler" </em>. 
+Thus, when a request is being served that ends in .sum, the server will let all 
+modules know, that this request should be served by "example-handler
+". As you will see later, when we start building mod_example, we will 
+check for this handler tag relayed by <code>AddHandler</code> and reply to 
+the server based on the value of this tag.
+</p>
+
+<h3><a name="hook_declaration" id="hook_declaration">Hooking into httpd</a></h3>
+<p>
+To begin with, we only want to create a simple handler, that replies to the 
+client browser when a specific URL is requested, so we won't bother setting 
+up configuration handlers and directives just yet. Our initial module 
+definition will look like this:</p>
+
+
+
+<p class="source">
+module AP_MODULE_DECLARE_DATA   example_module =
+{
+    STANDARD20_MODULE_STUFF,
+    <code class="sh_constant">NULL</code>,
+    <code class="sh_constant">NULL</code>,
+    <code class="sh_constant">NULL</code>,
+    <code class="sh_constant">NULL</code>,
+    <code class="sh_constant">NULL</code>,
+    <code class="sh_function">register_hooks</code>   <code class="sh_comment"><code class="sh_comment">/* Our hook registering function */</code></code>
+};
+</p>
+
+
+
+<p>This lets the server know that we are not interesting in anything fancy, we 
+just want to hook onto the requests and possibly handle some of them. </p> 
+
+<p> The reference in our example declaration, <code>register_hooks</code> 
+is the name of a function we will create to manage how we hook onto the 
+request process. In this example module, the function has just one purpose; 
+To create a simple hook that gets called after all the rewrites, access 
+control etc has been handled. Thus, we will let the server know, that we want 
+to hook into its process as one of the last modules: 
+</p>
+
+
+<p class="source">
+<code class="sh_declare">static</code> <code class="sh_declare">void</code> register_hooks<code class="sh_misc">(</code>apr_pool_t <code class="sh_misc">*</code>pool<code class="sh_misc">)</code>
+<code class="sh_misc">{</code>
+    <code class="sh_comment">/* Create a hook in the request handler, so we get called when a request arrives */</code>
+    <code class="sh_function">ap_hook_handler</code><code class="sh_misc">(</code>example_handler<code class="sh_misc">,</code> <code class="sh_constant">NULL</code><code class="sh_misc">,</code> <code class="sh_constant">NULL</code><code class="sh_misc">,</code> APR_HOOK_LAST<code class="sh_misc">)</code><code class="sh_misc">;</code>
+<code class="sh_misc">}</code>
+</p>
+
+
+<p>
+The <code>example_handler</code> reference is the function that will handle 
+the request. We will discuss how to create a handler in the next chapter.
+</p>
+
+<h3><a name="hook_others" id="hook_others">Other useful hooks</a></h3>
+<p>
+Hooking into the request handling phase is but one of many hooks that you 
+can create. Some other ways of hooking are:
+</p>
+<ul>
+<li><code>ap_hook_child_init</code>: Place a hook that executes when a child process is spawned (commonly used for initializing modules after the server has forked)</li>
+<li><code>ap_hook_pre_config</code>: Place a hook that executes before any configuration data has been read (very early hook)</li>
+<li><code>ap_hook_post_config</code>: Place a hook that executes after configuration has been parsed, but before the server has forked</li>
+<li><code>ap_hook_translate_name</code>: Place a hook that executes when a URI needs to be translated into a filename on the server (think <code>mod_rewrite</code>)</li>
+</ul>
+
+
+</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
+<div class="section">
+<h2><a name="handling" id="handling">Building a handler</a></h2>
+<p>
+A handler is essentially a function that receives a callback when a request 
+to the server is made. It is passed a record of the current request (how it was 
+made, which headers and requests were passed along, who's giving the 
+request and so on), and is put in charge of either telling the server that it's 
+not interested in the request or handle the request with the tools provided.
+</p>
+<h3><a name="simple_handler" id="simple_handler">A simple "Hello, world!" 
+handler</a></h3> 
+<p>Let's start off by making a very simple request handler 
+that does the following:
+</p>
+<ol>
+<li>Check that this is a request that should be served by "example-handler"</li>
+<li>Set the content type of our output to <code>text/html</code></li>
+<li>Write "Hello, world!" back to the client browser</li>
+<li>Let the server know that we took care of this request and everything went fine</li>
+</ol>
+<p>
+In C code, our example handler will now look like this:
+</p>
+
+
+<p class="source">
+<code class="sh_declare">static</code> <code class="sh_declare">int</code> example_handler<code class="sh_misc">(</code>request_rec <code class="sh_misc">*</code>r<code class="sh_misc">)</code>
+<code class="sh_misc">{</code>
+    <code class="sh_comment">/* First off, we need to check if this is a call for the "example-handler" handler.</code>
+<code class="sh_comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* If it is, we accept it and do our things, if not, we simply return DECLINED,</code>
+<code class="sh_comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* and the server will try somewhere else.</code>
+<code class="sh_comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</code>
+    <code class="sh_declare">if</code> <code class="sh_misc">(</code><code class="sh_misc">!</code>r<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">handler</code> <code class="sh_misc">|</code><code class="sh_misc">|</code> <code class="sh_function">strcmp</code><code class="sh_misc">(</code>r<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">handler</code><code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_value">example-handler</code><code class="sh_character">"</code><code class="sh_misc">)</code><code class="sh_misc">)</code> <code class="sh_declare">return</code> <code class="sh_misc">(</code>DECLINED<code class="sh_misc">)</code><code class="sh_misc">;</code>
+    
+    <code class="sh_comment">/* Now that we are handling this request, we'll write out "Hello, world!" to the client.</code>
+<code class="sh_comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* To do so, we must first set the appropriate content type, followed by our output.</code>
+<code class="sh_comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</code>
+    <a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__APACHE__CORE__PROTO.html#gaa2f8412c400197338ec509f4a45e4579">ap_set_content_type</a><code class="sh_misc">(</code>r<code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_value">text/html</code><code class="sh_character">"</code><code class="sh_misc">)</code><code class="sh_misc">;</code>
+    <a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__APACHE__CORE__PROTO.html#ga5e91eb6ca777c9a427b2e82bf1eeb81d">ap_rprintf</a><code class="sh_misc">(</code>r<code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_value">Hello, world!</code><code class="sh_character">"</code><code class="sh_misc">)</code><code class="sh_misc">;</code>
+    
+    <code class="sh_comment">/* Lastly, we must tell the server that we took care of this request and everything went fine.</code>
+<code class="sh_comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* We do so by simply returning the value OK to the server.</code>
+<code class="sh_comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</code>
+    <code class="sh_declare">return</code> OK<code class="sh_misc">;</code>
+<code class="sh_misc">}</code>
+</p>
+
+
+<p>
+Now, we put all we have learned together and end up with a program that 
+looks like 
+<a href="http://people.apache.org/~humbedooh/mods/examples/mod_example_1.c">mod_example_1.c</a>
+. The functions used in this example will be explained later in the section 
+<a href="#functions">"Some useful functions you should know"</a>. 
+</p>
+<h3><a name="request_rec" id="request_rec">The request_rec structure</a></h3> 
+<p>The most essential part of any request is the <em>request record
+</em>. In a call to a handler function, this is represented by the <code>
+request_req* </code> structure passed along with every call that is made. 
+This struct, typically just refered to as <code>r</code> in modules, 
+contains all the information you need for your module to fully process any 
+HTTP request and respond accordingly.</p> <p>Some key elements of the <code>
+request_req </code> structure are:
+</p>
+<ul>
+<li><code><code class="sh_subobject">r-&gt;handler</code> (char*)</code>: Contains the name of the handler the server is currently asking to do the handling of this request</li>
+<li><code><code class="sh_subobject">r-&gt;method</code> (char*)</code>: Contains the HTTP method being used, f.x. GET or POST</li>
+<li><code><code class="sh_subobject">r-&gt;filename</code> (char*)</code>: Contains the translated filename the client is requesting</li>
+<li><code><code class="sh_subobject">r-&gt;args</code> (char*)</code>: Contains the query string of the request, if any</li>
+<li><code><code class="sh_subobject">r-&gt;headers_in</code> (apr_table_t*)</code>: Contains all the headers sent by the client</li>
+<li><code><code class="sh_subobject">r-&gt;connection</code> (conn_rec*)</code>: A record containing information about the current connection</li>
+<li><code><code class="sh_subobject">r-&gt;useragent_ip</code> (char*)</code>: The IP address of the client connecting to us</li>
+<li><code><code class="sh_subobject">r-&gt;pool</code> (apr_pool_t*)</code>: The memory pool of this request. We'll discuss this in the "
+<a href="#memory">Memory management</a>" chapter.</li>
+</ul>
+<p>
+A complete list of all the values contained with in the <code>request_req</code> structure can be found in 
+the <a href="http://svn.apache.org/repos/asf/httpd/httpd/trunk/include/httpd.h"><code>httpd.h</code></a> header 
+file or at <a href="http://ci.apache.org/projects/httpd/trunk/doxygen/structrequest__rec.html">http://ci.apache.org/projects/httpd/trunk/doxygen/structrequest__rec.html</a>.
+</p>
+
+
+<p>
+Let's try out some of these variables in another example handler:<br />
+</p>
+
+
+<p class="source">
+<code class="sh_declare">static</code> <code class="sh_declare">int</code> example_handler<code class="sh_misc">(</code>request_rec <code class="sh_misc">*</code>r<code class="sh_misc">)</code>
+<code class="sh_misc">{</code>
+    <code class="sh_comment">/* Set the appropriate content type */</code>
+    <a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__APACHE__CORE__PROTO.html#gaa2f8412c400197338ec509f4a45e4579">ap_set_content_type</a><code class="sh_misc">(</code>r<code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_value">text/html</code><code class="sh_character">"</code><code class="sh_misc">)</code><code class="sh_misc">;</code>
+
+    <code class="sh_comment">/* Print out the IP address of the client connecting to us: */</code>
+    <a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__APACHE__CORE__PROTO.html#ga5e91eb6ca777c9a427b2e82bf1eeb81d">ap_rprintf</a><code class="sh_misc">(</code>r<code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_value">&lt;h2&gt;Hello, </code><code class="sh_reference">%s</code><code class="sh_value">!&lt;/h2&gt;</code><code class="sh_character">"</code><code class="sh_misc">,</code> r<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">useragent_ip</code><code class="sh_misc">)</code><code class="sh_misc">;</code>
+    
+    <code class="sh_comment">/* If we were reached through a GET or a POST request, be happy, else sad. */</code>
+    <code class="sh_declare">if</code> <code class="sh_misc">(</code> <code class="sh_misc">!</code><code class="sh_function">strcmp</code><code class="sh_misc">(</code>r<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">method</code><code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_value">POST</code><code class="sh_character">"</code><code class="sh_misc">)</code> <code class="sh_misc">|</code><code class="sh_misc">|</code> <code class="sh_misc">!</code><code class="sh_function">strcmp</code><code class="sh_misc">(</code>r<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">method</code><code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_value">GET</code><code class="sh_character">"</code><code class="sh_misc">)</code> <code class="sh_misc">)</code> <code class="sh_misc">{</code>
+        ap_rputs<code class="sh_misc">(</code><code class="sh_character">"</code><code class="sh_value">You used a GET or a POST method, that makes us happy!&lt;br&gt;</code><code class="sh_character">"</code><code class="sh_misc">,</code> r<code class="sh_misc">)</code><code class="sh_misc">;</code>
+    <code class="sh_misc">}</code>
+    <code class="sh_declare">else</code> <code class="sh_misc">{</code>
+        ap_rputs<code class="sh_misc">(</code><code class="sh_character">"</code><code class="sh_value">You did not use POST or GET, that makes us sad :(&lt;br&gt;</code><code class="sh_character">"</code><code class="sh_misc">,</code> r<code class="sh_misc">)</code><code class="sh_misc">;</code>
+    <code class="sh_misc">}</code>
+
+    <code class="sh_comment">/* Lastly, if there was a query string, let's print that too! */</code>
+    <code class="sh_declare">if</code> <code class="sh_misc">(</code>r<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">args</code><code class="sh_misc">)</code> <code class="sh_misc">{</code>
+        <a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__APACHE__CORE__PROTO.html#ga5e91eb6ca777c9a427b2e82bf1eeb81d">ap_rprintf</a><code class="sh_misc">(</code>r<code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_value">Your query string was: </code><code class="sh_reference">%s</code><code class="sh_character">"</code><code class="sh_misc">,</code> r<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">args</code><code class="sh_misc">)</code><code class="sh_misc">;</code>
+    <code class="sh_misc">}</code>
+    <code class="sh_declare">return</code> OK<code class="sh_misc">;</code>
+<code class="sh_misc">}</code>
+</p>
+
+
+
+
+<h3><a name="return_value" id="return_value">Return values</a></h3>
+<p>
+Apache relies on return values from handlers to signify whether a request 
+was handled or not, and if so, whether the request went well or not. If a 
+module is not interested in handling a specific request, it should always 
+return the value <code>DECLINED</code>. If it is handling a request, it 
+should either return the generic value <code>OK</code>, or a specific HTTP 
+status code, for example:
+</p>
+
+
+<p class="source">
+<code class="sh_declare">static</code> <code class="sh_declare">int</code> example_handler<code class="sh_misc">(</code>request_rec <code class="sh_misc">*</code>r<code class="sh_misc">)</code>
+<code class="sh_misc">{</code>
+    <code class="sh_comment">/* Return 404: Not found */</code>
+    <code class="sh_declare">return</code> HTTP_NOT_FOUND<code class="sh_misc">;</code>
+<code class="sh_misc">}</code>
+</p>
+
+
+<p>
+Returning <code>OK</code> or a HTTP status code does not necessarily mean 
+that the request will end. The server may still have other handlers that are 
+interested in this request, for instance the logging modules which, upon a 
+successful request, will write down a summary of what was requested and how 
+it went. To do a full stop and prevent any further processing after your 
+module is done, you can return the value <code>DONE</code> to let the server 
+know that it should cease all activity on this request and carry on with 
+the next, without informing other handlers.
+<br />
+<strong>General response codes:</strong>
+</p>
+<ul>
+<li><code>DECLINED</code>: We are not handling this request</li>
+<li><code>OK</code>: We handled this request and it went well</li>
+<li><code>DONE</code>: We handled this request and the server should just close this thread without further processing</li>
+</ul>
+<p>
+<strong>HTTP specific return codes (excerpt):</strong>
+</p>
+<ul>
+<li><code>HTTP_OK (200)</code>: Request was okay</li>
+<li><code>HTTP_MOVED_PERMANENTLY (301)</code>: The resource has moved to a new URL</li>
+<li><code>HTTP_UNAUTHORIZED (401)</code>: Client is not authorized to visit this page</li>
+<li><code>HTTP_FORBIDDEN (403)</code>: Permission denied</li>
+<li><code>HTTP_NOT_FOUND (404)</code>: File not found</li>
+<li><code>HTTP_INTERNAL_SERVER_ERROR (500)</code>: Internal server error (self explanatory)</li>
+</ul>
+
+
+<h3><a name="functions" id="functions">Some useful functions you should know</a></h3>
+
+<ul>
+<li>
+    <code>ap_rputs(const char *string, request_req *r)</code>: <br />
+    Sends a string of text to the client. This is a shorthand version of <a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__APACHE__CORE__PROTO.html#gac827cd0537d2b6213a7c06d7c26cc36e">
+    ap_rwrite</a>.
+    
+
+
+<p class="source">ap_rputs<code class="sh_misc">(</code><code class="sh_character">"</code><code class="sh_value">Hello, world!</code><code class="sh_character">"</code><code class="sh_misc">,</code> r<code class="sh_misc">)</code><code class="sh_misc">;</code></p>
+
+
+
+</li>
+<li>
+    <code>
+    <a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__APACHE__CORE__PROTO.html#ga5e91eb6ca777c9a427b2e82bf1eeb81d">ap_rprintf</a></code>: <br />
+    This function works just like <code>printf</code>, except it sends the result to the client. 
+    
+
+
+<p class="source"><code class="sh_declare"><a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__APACHE__CORE__PROTO.html#ga5e91eb6ca777c9a427b2e82bf1eeb81d">ap_rprintf</a></code><code class="sh_misc">(</code>r<code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_value">Hello, </code><code class="sh_reference">%s</code><code class="sh_value">!</code><code class="sh_character">"</code><code class="sh_misc">,</code> r<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">useragent_ip</code><code class="sh_misc">)</code><code class="sh_misc">;</code></p>
+
+
+</li>
+<li>
+    <code>
+    <a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__APACHE__CORE__PROTO.html#gaa2f8412c400197338ec509f4a45e4579">ap_set_content_type</a>(request_req *r, const char *type)</code>: <br />
+    Sets the content type of the output you are sending.
+    
+
+
+<p class="source"><code class="sh_declare"><a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__APACHE__CORE__PROTO.html#gaa2f8412c400197338ec509f4a45e4579">ap_set_content_type</a></code><code class="sh_misc">(</code>r<code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_value">text/plain</code><code class="sh_character">"</code><code class="sh_misc">)</code><code class="sh_misc">;</code> <code class="sh_comment">/* force a raw text output */</code></p>
+
+
+</li>
+
+
+</ul>
+
+
+<h3><a name="memory" id="memory">Memory management</a></h3>
+<p>
+Managing your resources in Apache HTTP Server 2.4 is quite easy, thanks to the memory pool 
+system. In essence, each server, connection and request have their own 
+memory pool that gets cleaned up when its scope ends, e.g. when a request 
+is done or when a server process shuts down. All your module needs to do is 
+latch onto this memory pool, and you won't have to worry about having to 
+clean up after yourself - pretty neat, huh?
+</p>
+
+<p>
+In our module, we will primarily be allocating memory for each request, so 
+it's appropriate to use the <code class="sh_subobject">r-&gt;pool</code> 
+reference when creating new objects. A few of the functions for allocating 
+memory within a pool are:
+</p>
+<ul>
+<li><code>void* <a href="http://apr.apache.org/docs/apr/1.4/group__apr__pools.html#ga85f1e193c31d109affda72f9a92c6915">apr_palloc</a>(
+apr_pool_t *p, apr_size_t size)</code>: Allocates <code>size</code> number of bytes in the pool for you</li>
+<li><code>void* <a href="http://apr.apache.org/docs/apr/1.4/group__apr__pools.html#gaf61c098ad258069d64cdf8c0a9369f9e">apr_pcalloc</a>(
+apr_pool_t *p, apr_size_t size)</code>: Allocates <code>size</code> number of bytes in the pool for you and sets all bytes to 0</li>
+<li><code>char* <a href="http://apr.apache.org/docs/apr/1.4/group__apr__strings.html#gabc79e99ff19abbd7cfd18308c5f85d47">apr_pstrdup</a>(
+apr_pool_t *p, const char *s)</code>: Creates a duplicate of the string <code>s</code>. This is useful for copying constant values so you can edit them</li>
+<li><code>char* <a href="http://apr.apache.org/docs/apr/1.4/group__apr__strings.html#ga3eca76b8d293c5c3f8021e45eda813d8">apr_psprintf</a>(
+apr_pool_t *p, const char *fmt, ...)</code>: Similar to <code>sprintf</code>, except the server supplies you with an appropriately allocated target variable</li>
+</ul>
+
+<p>Let's put these functions into an example handler:</p>
+
+
+
+<p class="source">
+<code class="sh_declare">static</code> <code class="sh_declare">int</code> example_handler<code class="sh_misc">(</code>request_rec <code class="sh_misc">*</code>r<code class="sh_misc">)</code>
+<code class="sh_misc">{</code>
+    <code class="sh_declare">const</code> <code class="sh_declare">char</code><code class="sh_misc">*</code> original <code class="sh_misc">=</code> <code class="sh_character">"</code><code class="sh_value">You can't edit this!</code><code class="sh_character">"</code><code class="sh_misc">;</code>
+    <code class="sh_declare">char</code><code class="sh_misc">*</code> copy<code class="sh_misc">;</code>
+    <code class="sh_declare">int</code><code class="sh_misc">*</code> integers<code class="sh_misc">;</code>
+    
+    <code class="sh_comment">/* Allocate space for 10 integer values and set them all to zero. */</code>
+    integers <code class="sh_misc">=</code> apr_pcalloc<code class="sh_misc">(</code>r<code class="sh_misc">-</code><code class="sh_misc">&gt;</code>pool<code class="sh_misc">,</code> <code class="sh_declare">sizeof</code><code class="sh_misc">(</code><code class="sh_declare">int</code><code class="sh_misc">)</code><code class="sh_misc">*</code><code class="sh_reference">10</code><code class="sh_misc">)</code><code class="sh_misc">;</code> 
+    
+    <code class="sh_comment">/* Create a copy of the 'original' variable that we can edit. */</code>
+    copy <code class="sh_misc">=</code> apr_pstrdup<code class="sh_misc">(</code>r<code class="sh_misc">-</code><code class="sh_misc">&gt;</code>pool<code class="sh_misc">,</code> original<code class="sh_misc">)</code><code class="sh_misc">;</code>
+    <code class="sh_declare">return</code> OK<code class="sh_misc">;</code>
+<code class="sh_misc">}</code>
+</p>
+
+
+<p>
+This is all well and good for our module, which won't need any 
+pre-initialized variables or structures. However, if we wanted to 
+initialize something early on, before the requests come rolling in, we 
+could simply add a call to a function in our <code>register_hooks</code> 
+function to sort it out:
+</p>
+
+
+<p class="source">
+<code class="sh_declare">static</code> <code class="sh_declare">void</code> register_hooks<code class="sh_misc">(</code>apr_pool_t <code class="sh_misc">*</code>pool<code class="sh_misc">)</code>
+<code class="sh_misc">{</code>
+    <code class="sh_comment">/* Call a function that initializes some stuff */</code>
+    <code class="sh_function">example_init_function</code><code class="sh_misc">(</code>pool<code class="sh_misc">)</code><code class="sh_misc">;</code>
+    <code class="sh_comment">/* Create a hook in the request handler, so we get called when a request arrives */</code>
+    <code class="sh_function">ap_hook_handler</code><code class="sh_misc">(</code>example_handler<code class="sh_misc">,</code> <code class="sh_constant">NULL</code><code class="sh_misc">,</code> <code class="sh_constant">NULL</code><code class="sh_misc">,</code> APR_HOOK_LAST<code class="sh_misc">)</code><code class="sh_misc">;</code>
+<code class="sh_misc">}</code>
+</p>
+
+
+<p>
+In this pre-request initialization function we would not be using the 
+same pool as we did when allocating resources for request-based functions. 
+Instead, we would use the pool given to us by the server for allocating memory 
+on a per-process based level.
+</p>
+
+
+<h3><a name="parsing" id="parsing">Parsing request data</a></h3>
+<p>
+In our example module, we would like to add a feature, that checks which 
+type of digest, MD5 or SHA1 the client would like to see. This could be 
+solved by adding a query string to the request. A query string is typically 
+comprised of several keys and values put together in a string, for instance 
+<code>valueA=yes&amp;valueB=no&amp;valueC=maybe</code>. It is up to the 
+module itself to parse these and get the data it requires. In our example, 
+we'll be looking for a key called <code>digest</code>, and if set to <code>
+md5</code>, we'll produce an MD5 digest, otherwise we'll produce a SHA1 
+digest.
+</p>
+<p>
+Since the introduction of Apache HTTP Server 2.4, parsing request data from GET and 
+POST requests have never been easier. All we require to parse both GET and 
+POST data is four simple lines:
+</p> 
+
+
+
+<p class="source">
+<a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__apr__tables.html#gad7ea82d6608a4a633fc3775694ab71e4">apr_table_t</a> *GET;
+<a href="http://ci.apache.org/projects/httpd/trunk/doxygen/structapr__array__header__t.html">apr_array_header_t</a> *POST;
+
+<a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__APACHE__CORE__SCRIPT.html#gaed25877b529623a4d8f99f819ba1b7bd">ap_args_to_table</a>(r, &amp;GET);
+<a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__APACHE__CORE__DAEMON.html#ga9d426b6382b49754d4f87c55f65af202">ap_parse_form_data</a>(r, <code class="sh_constant">NULL</code>, &amp;POST, -1, 8192);
+</p>
+
+
+<p>
+In our specific example module, we're looking for the <code>digest</code> 
+value from the query string, which now resides inside a table called <code>
+GET</code>. To extract this value, we need only perform a simple operation:
+</p>
+
+
+
+<p class="source">
+<code class="sh_comment">/* Get the "digest" key from the query string, if any. */</code>
+<code class="sh_declare">const</code> <code class="sh_declare">char</code><code class="sh_misc"> *</code>digestType <code class="sh_misc">=</code> <a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__apr__tables.html#ga4db13e3915c6b9a3142b175d4c15d915">apr_table_get</a><code class="sh_misc">(</code>GET<code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_value">digest</code><code class="sh_character">"</code><code class="sh_misc">)</code><code class="sh_misc">;</code>
+
+<code class="sh_comment">/* If no key was returned, we will set a default value instead. */</code>
+<code class="sh_declare">if</code> <code class="sh_misc">(</code><code class="sh_misc">!</code>digestType<code class="sh_misc">)</code> digestType <code class="sh_misc">=</code> <code class="sh_character">"</code><code class="sh_value">sha1</code><code class="sh_character">"</code><code class="sh_misc">;</code>
+
+</p>
+
+
+<p>
+The structures used for the POST and GET data are not exactly the same, so 
+if we were to fetch a value from POST data instead of the query string, we 
+would have to resort to a few more lines, as outlined in <a href="#get_post">this example</a> in the last chapter of this document.
+</p>
+
+
+<h3><a name="advanced_handler" id="advanced_handler">Making an advanced handler</a></h3>
+<p>
+Now that we have learned how to parse form data and manage our resources, 
+we can move on to creating an advanced version of our module, that spits 
+out the MD5 or SHA1 digest of files:
+</p>
+
+
+
+<p class="source">
+<code class="sh_declare">static</code> <code class="sh_declare">int</code> example_handler<code class="sh_misc">(</code>request_rec <code class="sh_misc">*</code>r<code class="sh_misc">)</code>
+<code class="sh_misc">{</code>
+    <code class="sh_declare">int</code> rc<code class="sh_misc">,</code> exists<code class="sh_misc">;</code>
+    apr_finfo_t finfo<code class="sh_misc">;</code>
+    apr_file_t<code class="sh_misc"> *</code>file<code class="sh_misc">;</code>
+    <code class="sh_declare">char</code> <code class="sh_misc">*</code>filename<code class="sh_misc">;</code>
+    <code class="sh_declare">char</code> buffer<code class="sh_misc">[</code><code class="sh_reference">256</code><code class="sh_misc">]</code><code class="sh_misc">;</code>
+    apr_size_t readBytes<code class="sh_misc">;</code>
+    <code class="sh_declare">int</code> n<code class="sh_misc">;</code>
+    apr_table_t<code class="sh_misc"> *</code>GET<code class="sh_misc">;</code>
+    apr_array_header_t<code class="sh_misc"> *</code>POST<code class="sh_misc">;</code>
+    <code class="sh_declare">const</code> <code class="sh_declare">char</code><code class="sh_misc"> *</code>digestType<code class="sh_misc">;</code>
+    
+    
+    <code class="sh_comment">/* Check that the "example-handler" handler is being called. */</code>
+    <code class="sh_declare">if</code> <code class="sh_misc">(</code><code class="sh_misc">!</code>r<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">handler</code> <code class="sh_misc">|</code><code class="sh_misc">|</code> <code class="sh_function">strcmp</code><code class="sh_misc">(</code>r<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">handler</code><code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_value">example-handler</code><code class="sh_character">"</code><code class="sh_misc">)</code><code class="sh_misc">)</code> <code class="sh_declare">return</code> <code class="sh_misc">(</code>DECLINED<code class="sh_misc">)</code><code class="sh_misc">;</code>
+    
+    <code class="sh_comment">/* Figure out which file is being requested by removing the .sum from it */</code>
+    filename <code class="sh_misc">=</code> apr_pstrdup<code class="sh_misc">(</code>r<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">pool</code><code class="sh_misc">,</code> r<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">filename</code><code class="sh_misc">)</code><code class="sh_misc">;</code>
+    filename<code class="sh_misc">[</code><code class="sh_function">strlen</code><code class="sh_misc">(</code>filename<code class="sh_misc">)</code><code class="sh_misc">-</code><code class="sh_reference">4</code><code class="sh_misc">]</code> <code class="sh_misc">=</code> <code class="sh_reference">0</code><code class="sh_misc">;</code> <code class="sh_comment">/* Cut off the last 4 characters. */</code>
+    
+    <code class="sh_comment">/* Figure out if the file we request a sum on exists and isn't a directory */</code>
+    rc <code class="sh_misc">=</code> apr_stat<code class="sh_misc">(</code><code class="sh_misc">&amp;</code>finfo<code class="sh_misc">,</code> filename<code class="sh_misc">,</code> APR_FINFO_MIN<code class="sh_misc">,</code> r<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">pool</code><code class="sh_misc">)</code><code class="sh_misc">;</code>
+    <code class="sh_declare">if</code> <code class="sh_misc">(</code>rc <code class="sh_misc">=</code><code class="sh_misc">=</code> APR_SUCCESS<code class="sh_misc">)</code> <code class="sh_misc">{</code>
+        exists <code class="sh_misc">=</code>
+        <code class="sh_misc">(</code>
+            <code class="sh_misc">(</code>finfo<code class="sh_misc">.</code>filetype <code class="sh_misc">!</code><code class="sh_misc">=</code> APR_NOFILE<code class="sh_misc">)</code>
+        <code class="sh_misc">&amp;</code><code class="sh_misc">&amp;</code>  <code class="sh_misc">!</code><code class="sh_misc">(</code>finfo<code class="sh_misc">.</code>filetype <code class="sh_misc">&amp;</code> APR_DIR<code class="sh_misc">)</code>
+        <code class="sh_misc">)</code><code class="sh_misc">;</code>
+        <code class="sh_declare">if</code> <code class="sh_misc">(</code><code class="sh_misc">!</code>exists<code class="sh_misc">)</code> <code class="sh_declare">return</code> HTTP_NOT_FOUND<code class="sh_misc">;</code> <code class="sh_comment">/* Return a 404 if not found. */</code>
+    <code class="sh_misc">}</code>
+    <code class="sh_comment">/* If apr_stat failed, we're probably not allowed to check this file. */</code>
+    <code class="sh_declare">else</code> <code class="sh_declare">return</code> HTTP_FORBIDDEN<code class="sh_misc">;</code>
+    
+    <code class="sh_comment">/* Parse the GET and, optionally, the POST data sent to us */</code>
+    
+    ap_args_to_table<code class="sh_misc">(</code>r<code class="sh_misc">,</code> <code class="sh_misc">&amp;</code>GET<code class="sh_misc">)</code><code class="sh_misc">;</code>
+    ap_parse_form_data<code class="sh_misc">(</code>r<code class="sh_misc">,</code> <code class="sh_constant">NULL</code><code class="sh_misc">,</code> <code class="sh_misc">&amp;</code>POST<code class="sh_misc">,</code> <code class="sh_misc">-</code><code class="sh_reference">1</code><code class="sh_misc">,</code> <code class="sh_reference">8192</code><code class="sh_misc">)</code><code class="sh_misc">;</code>
+    
+    <code class="sh_comment">/* Set the appropriate content type */</code>
+    ap_set_content_type<code class="sh_misc">(</code>r<code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_value">text/html</code><code class="sh_character">"</code><code class="sh_misc">)</code><code class="sh_misc">;</code>
+    
+    <code class="sh_comment">/* Print a title and some general information */</code>
+    ap_rprintf<code class="sh_misc">(</code>r<code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_value">&lt;h2&gt;Information on </code><code class="sh_reference">%s</code><code class="sh_value">:&lt;/h2&gt;</code><code class="sh_character">"</code><code class="sh_misc">,</code> filename<code class="sh_misc">)</code><code class="sh_misc">;</code>
+    ap_rprintf<code class="sh_misc">(</code>r<code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_value">&lt;b&gt;Size:&lt;/b&gt; </code><code class="sh_reference">%u</code><code class="sh_value"> bytes&lt;br/&gt;</code><code class="sh_character">"</code><code class="sh_misc">,</code> finfo<code class="sh_misc">.</code>size<code class="sh_misc">)</code><code class="sh_misc">;</code>
+    
+    <code class="sh_comment">/* Get the digest type the client wants to see */</code>
+    digestType <code class="sh_misc">=</code> apr_table_get<code class="sh_misc">(</code>GET<code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_value">digest</code><code class="sh_character">"</code><code class="sh_misc">)</code><code class="sh_misc">;</code>
+    <code class="sh_declare">if</code> <code class="sh_misc">(</code><code class="sh_misc">!</code>digestType<code class="sh_misc">)</code> digestType <code class="sh_misc">=</code> <code class="sh_character">"</code><code class="sh_value">MD5</code><code class="sh_character">"</code><code class="sh_misc">;</code>
+    
+    
+    rc <code class="sh_misc">=</code> apr_file_open<code class="sh_misc">(</code><code class="sh_misc">&amp;</code>file<code class="sh_misc">,</code> filename<code class="sh_misc">,</code> APR_READ<code class="sh_misc">,</code> APR_OS_DEFAULT<code class="sh_misc">,</code> r<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">pool</code><code class="sh_misc">)</code><code class="sh_misc">;</code>
+    <code class="sh_declare">if</code> <code class="sh_misc">(</code>rc <code class="sh_misc">=</code><code class="sh_misc">=</code> APR_SUCCESS<code class="sh_misc">)</code> <code class="sh_misc">{</code>
+        
+        <code class="sh_comment">/* Are we trying to calculate the MD5 or the SHA1 digest? */</code>
+        <code class="sh_declare">if</code> <code class="sh_misc">(</code><code class="sh_misc">!</code>strcasecmp<code class="sh_misc">(</code>digestType<code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_value">md5</code><code class="sh_character">"</code><code class="sh_misc">)</code><code class="sh_misc">)</code> <code class="sh_misc">{</code>
+            <code class="sh_comment">/* Calculate the MD5 sum of the file */</code>
+            <code class="sh_declare">union</code> <code class="sh_misc">{</code>
+                <code class="sh_declare">char</code>      chr<code class="sh_misc">[</code><code class="sh_reference">16</code><code class="sh_misc">]</code><code class="sh_misc">;</code>
+                uint32_t  num<code class="sh_misc">[</code><code class="sh_reference">4</code><code class="sh_misc">]</code><code class="sh_misc">;</code>
+            <code class="sh_misc">}</code> digest<code class="sh_misc">;</code>
+            apr_md5_ctx_t md5<code class="sh_misc">;</code>
+            apr_md5_init<code class="sh_misc">(</code><code class="sh_misc">&amp;</code>md5<code class="sh_misc">)</code><code class="sh_misc">;</code>
+            readBytes <code class="sh_misc">=</code> <code class="sh_reference">256</code><code class="sh_misc">;</code>
+            <code class="sh_declare">while</code> <code class="sh_misc">(</code> apr_file_read<code class="sh_misc">(</code>file<code class="sh_misc">,</code> buffer<code class="sh_misc">,</code> <code class="sh_misc">&amp;</code>readBytes<code class="sh_misc">)</code> <code class="sh_misc">=</code><code class="sh_misc">=</code> APR_SUCCESS <code class="sh_misc">)</code> <code class="sh_misc">{</code>
+                apr_md5_update<code class="sh_misc">(</code><code class="sh_misc">&amp;</code>md5<code class="sh_misc">,</code> buffer<code class="sh_misc">,</code> readBytes<code class="sh_misc">)</code><code class="sh_misc">;</code>
+            <code class="sh_misc">}</code>
+            apr_md5_final<code class="sh_misc">(</code>digest<code class="sh_misc">.</code>chr<code class="sh_misc">,</code> <code class="sh_misc">&amp;</code>md5<code class="sh_misc">)</code><code class="sh_misc">;</code>
+            
+            <code class="sh_comment">/* Print out the MD5 digest */</code>
+            ap_rputs<code class="sh_misc">(</code><code class="sh_character">"</code><code class="sh_value">&lt;b&gt;MD5: &lt;/b&gt;&lt;code&gt;</code><code class="sh_character">"</code><code class="sh_misc">,</code> r<code class="sh_misc">)</code><code class="sh_misc">;</code>
+            <code class="sh_declare">for</code> <code class="sh_misc">(</code>n <code class="sh_misc">=</code> <code class="sh_reference">0</code><code class="sh_misc">;</code> n <code class="sh_misc">&lt;</code> APR_MD5_DIGESTSIZE<code class="sh_misc">/</code><code class="sh_reference">4</code><code class="sh_misc">;</code> n<code class="sh_misc">+</code><code class="sh_misc">+</code><code class="sh_misc">)</code> <code class="sh_misc">{</code>
+                ap_rprintf<code class="sh_misc">(</code>r<code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_reference">%08x</code><code class="sh_character">"</code><code class="sh_misc">,</code> digest<code class="sh_misc">.</code>num<code class="sh_misc">[</code>n<code class="sh_misc">]</code><code class="sh_misc">)</code><code class="sh_misc">;</code>
+            <code class="sh_misc">}</code>
+            ap_rputs<code class="sh_misc">(</code><code class="sh_character">"</code><code class="sh_value">&lt;/code&gt;</code><code class="sh_character">"</code><code class="sh_misc">,</code> r<code class="sh_misc">)</code><code class="sh_misc">;</code>
+            <code class="sh_comment">/* Print a link to the SHA1 version */</code>
+            ap_rputs<code class="sh_misc">(</code><code class="sh_character">"</code><code class="sh_value">&lt;br/&gt;&lt;a href='?digest=sha1'&gt;View the SHA1 hash instead&lt;/a&gt;</code><code class="sh_character">"</code><code class="sh_misc">,</code> r<code class="sh_misc">)</code><code class="sh_misc">;</code>
+        <code class="sh_misc">}</code>
+        <code class="sh_declare">else</code> <code class="sh_misc">{</code>
+            <code class="sh_comment">/* Calculate the SHA1 sum of the file */</code>
+            <code class="sh_declare">union</code> <code class="sh_misc">{</code>
+                <code class="sh_declare">char</code>      chr<code class="sh_misc">[</code><code class="sh_reference">20</code><code class="sh_misc">]</code><code class="sh_misc">;</code>
+                uint32_t  num<code class="sh_misc">[</code><code class="sh_reference">5</code><code class="sh_misc">]</code><code class="sh_misc">;</code>
+            <code class="sh_misc">}</code> digest<code class="sh_misc">;</code>
+            apr_sha1_ctx_t sha1<code class="sh_misc">;</code>
+            apr_sha1_init<code class="sh_misc">(</code><code class="sh_misc">&amp;</code>sha1<code class="sh_misc">)</code><code class="sh_misc">;</code>
+            readBytes <code class="sh_misc">=</code> <code class="sh_reference">256</code><code class="sh_misc">;</code>
+            <code class="sh_declare">while</code> <code class="sh_misc">(</code> apr_file_read<code class="sh_misc">(</code>file<code class="sh_misc">,</code> buffer<code class="sh_misc">,</code> <code class="sh_misc">&amp;</code>readBytes<code class="sh_misc">)</code> <code class="sh_misc">=</code><code class="sh_misc">=</code> APR_SUCCESS <code class="sh_misc">)</code> <code class="sh_misc">{</code>
+                apr_sha1_update<code class="sh_misc">(</code><code class="sh_misc">&amp;</code>sha1<code class="sh_misc">,</code> buffer<code class="sh_misc">,</code> readBytes<code class="sh_misc">)</code><code class="sh_misc">;</code>
+            <code class="sh_misc">}</code>
+            apr_sha1_final<code class="sh_misc">(</code>digest<code class="sh_misc">.</code>chr<code class="sh_misc">,</code> <code class="sh_misc">&amp;</code>sha1<code class="sh_misc">)</code><code class="sh_misc">;</code>
+            
+            <code class="sh_comment">/* Print out the SHA1 digest */</code>
+            ap_rputs<code class="sh_misc">(</code><code class="sh_character">"</code><code class="sh_value">&lt;b&gt;SHA1: &lt;/b&gt;&lt;code&gt;</code><code class="sh_character">"</code><code class="sh_misc">,</code> r<code class="sh_misc">)</code><code class="sh_misc">;</code>
+            <code class="sh_declare">for</code> <code class="sh_misc">(</code>n <code class="sh_misc">=</code> <code class="sh_reference">0</code><code class="sh_misc">;</code> n <code class="sh_misc">&lt;</code> APR_SHA1_DIGESTSIZE<code class="sh_misc">/</code><code class="sh_reference">4</code><code class="sh_misc">;</code> n<code class="sh_misc">+</code><code class="sh_misc">+</code><code class="sh_misc">)</code> <code class="sh_misc">{</code>
+                ap_rprintf<code class="sh_misc">(</code>r<code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_reference">%08x</code><code class="sh_character">"</code><code class="sh_misc">,</code> digest<code class="sh_misc">.</code>num<code class="sh_misc">[</code>n<code class="sh_misc">]</code><code class="sh_misc">)</code><code class="sh_misc">;</code>
+            <code class="sh_misc">}</code>
+            ap_rputs<code class="sh_misc">(</code><code class="sh_character">"</code><code class="sh_value">&lt;/code&gt;</code><code class="sh_character">"</code><code class="sh_misc">,</code> r<code class="sh_misc">)</code><code class="sh_misc">;</code>
+            
+            <code class="sh_comment">/* Print a link to the MD5 version */</code>
+            ap_rputs<code class="sh_misc">(</code><code class="sh_character">"</code><code class="sh_value">&lt;br/&gt;&lt;a href='?digest=md5'&gt;View the MD5 hash instead&lt;/a&gt;</code><code class="sh_character">"</code><code class="sh_misc">,</code> r<code class="sh_misc">)</code><code class="sh_misc">;</code>
+        <code class="sh_misc">}</code>
+        apr_file_close<code class="sh_misc">(</code>file<code class="sh_misc">)</code><code class="sh_misc">;</code>
+        
+    <code class="sh_misc">}</code>
+    
+    
+    
+    <code class="sh_comment">/* Let the server know that we responded to this request. */</code>
+    <code class="sh_declare">return</code> OK<code class="sh_misc">;</code>
+<code class="sh_misc">}</code>
+</p>
+
+
+<p>
+This version in its entirity can be found here: 
+<a href="http://people.apache.org/~humbedooh/mods/examples/mod_example_2.c">mod_example_2.c</a>.
+</p>
+
+
+</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
+<div class="section">
+<h2><a name="configuration" id="configuration">Adding configuration options</a></h2>
+<p>
+In this next segment of this document, we will turn our eyes away from the 
+digest module and create a new example module, whose only function is to 
+write out its own configuration. The purpose of this is to examine how 
+the server works with configuration, and what happens when you start writing 
+advanced configurations 
+for your modules.
+</p>
+<h3><a name="config_intro" id="config_intro">An introduction to configuration 
+directives</a></h3>
+<p>
+If you are reading this, then you probably already know 
+what a configuration directive is. Simply put, a directive is a way of 
+telling an individual module (or a set of modules) how to behave, such as 
+these directives control how <code>mod_rewrite</code> works:
+</p>
+<div class="example"><pre>
+RewriteEngine On
+RewriteCond %{REQUEST_URI} ^/foo/bar
+RewriteRule ^/foo/bar/(.*)$ /foobar?page=$1
+</pre></div>
+<p>
+Each of these configuration directives are handled by a separate function, 
+that parses the parameters given and sets up a configuration accordingly.
+</p>
+
+<h3><a name="config_simple" id="config_simple">Making an example configuration</a></h3>
+<p>To begin with, we'll create a basic configuration in C-space:</p>
+
+
+
+<p class="source">
+<code class="sh_declare">typedef</code> <code class="sh_declare">struct</code> <code class="sh_misc">{</code>
+    <code class="sh_declare">int</code>         enabled<code class="sh_misc">;</code>      <code class="sh_comment">/* Enable or disable our module */</code>
+    <code class="sh_declare">const</code> <code class="sh_declare">char</code> <code class="sh_misc">*</code>path<code class="sh_misc">;</code>         <code class="sh_comment">/* Some path to...something */</code>
+    <code class="sh_declare">int</code>         typeOfAction<code class="sh_misc">;</code> <code class="sh_comment">/* 1 means action A, 2 means action B and so on */</code>
+<code class="sh_misc">}</code> example_config<code class="sh_misc">;</code>
+</p>
+
+
+<p>
+Now, let's put this into perspective by creating a very small module that 
+just prints out a hard-coded configuration. You'll notice that we use the 
+<code>register_hooks</code> function for initializing the configuration 
+values to their defaults:
+</p>
+
+
+<p class="source">
+<code class="sh_declare">typedef</code> <code class="sh_declare">struct</code> <code class="sh_misc">{</code>
+    <code class="sh_declare">int</code>         enabled<code class="sh_misc">;</code>      <code class="sh_comment">/* Enable or disable our module */</code>
+    <code class="sh_declare">const</code> <code class="sh_declare">char</code> <code class="sh_misc">*</code>path<code class="sh_misc">;</code>         <code class="sh_comment">/* Some path to...something */</code>
+    <code class="sh_declare">int</code>         typeOfAction<code class="sh_misc">;</code> <code class="sh_comment">/* 1 means action A, 2 means action B and so on */</code>
+<code class="sh_misc">}</code> example_config<code class="sh_misc">;</code>
+
+<code class="sh_declare">static</code> example_config config<code class="sh_misc">;</code>
+
+<code class="sh_declare">static</code> <code class="sh_declare">int</code> example_handler<code class="sh_misc">(</code>request_rec <code class="sh_misc">*</code>r<code class="sh_misc">)</code>
+<code class="sh_misc">{</code>
+    <code class="sh_declare">if</code> <code class="sh_misc">(</code><code class="sh_misc">!</code>r<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">handler</code> <code class="sh_misc">|</code><code class="sh_misc">|</code> <code class="sh_function">strcmp</code><code class="sh_misc">(</code>r<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">handler</code><code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_value">example-handler</code><code class="sh_character">"</code><code class="sh_misc">)</code><code class="sh_misc">)</code> <code class="sh_declare">return</code><code class="sh_misc">(</code>DECLINED<code class="sh_misc">)</code><code class="sh_misc">;</code>
+    ap_set_content_type<code class="sh_misc">(</code>r<code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_value">text/plain</code><code class="sh_character">"</code><code class="sh_misc">)</code><code class="sh_misc">;</code>
+    ap_rprintf<code class="sh_misc">(r, </code><code class="sh_character">"</code><code class="sh_value">Enabled: </code><code class="sh_reference">%u</code><code class="sh_reference">\n</code><code class="sh_character">"</code><code class="sh_misc">,</code> config<code class="sh_misc">.</code>enabled<code class="sh_misc">)</code><code class="sh_misc">;</code>
+    ap_rprintf<code class="sh_misc">(r, </code><code class="sh_character">"</code><code class="sh_value">Path: </code><code class="sh_reference">%s</code><code class="sh_reference">\n</code><code class="sh_character">"</code><code class="sh_misc">,</code> config<code class="sh_misc">.</code>path<code class="sh_misc">)</code><code class="sh_misc">;</code>
+    ap_rprintf<code class="sh_misc">(r, </code><code class="sh_character">"</code><code class="sh_value">TypeOfAction: </code><code class="sh_reference">%x</code><code class="sh_reference">\n</code><code class="sh_character">"</code><code class="sh_misc">,</code> config<code class="sh_misc">.</code>typeOfAction<code class="sh_misc">)</code><code class="sh_misc">;</code>
+    <code class="sh_declare">return</code> OK<code class="sh_misc">;</code>
+<code class="sh_misc">}</code>
+
+<code class="sh_declare">static</code> <code class="sh_declare">void</code> register_hooks<code class="sh_misc">(</code>apr_pool_t <code class="sh_misc">*</code>pool<code class="sh_misc">)</code> 
+<code class="sh_misc">{</code>
+    config<code class="sh_misc">.</code>enabled <code class="sh_misc">=</code> <code class="sh_reference">1</code><code class="sh_misc">;</code>
+    config<code class="sh_misc">.</code>path <code class="sh_misc">=</code> <code class="sh_character">"</code><code class="sh_value">/foo/bar</code><code class="sh_character">"</code><code class="sh_misc">;</code>
+    config<code class="sh_misc">.</code>typeOfAction <code class="sh_misc">=</code> <code class="sh_reference">0x00</code><code class="sh_misc">;</code>
+    ap_hook_handler<code class="sh_misc">(</code>example_handler<code class="sh_misc">,</code> <code class="sh_constant">NULL</code><code class="sh_misc">,</code> <code class="sh_constant">NULL</code><code class="sh_misc">,</code> APR_HOOK_LAST<code class="sh_misc">)</code><code class="sh_misc">;</code>
+<code class="sh_misc">}</code>
+
+<code class="sh_comment">/* Define our module as an entity and assign a function for registering hooks  */</code>
+
+module AP_MODULE_DECLARE_DATA   example_module <code class="sh_misc">=</code>
+<code class="sh_misc">{</code>
+    STANDARD20_MODULE_STUFF<code class="sh_misc">,</code>
+    <code class="sh_constant">NULL</code><code class="sh_misc">,</code>            <code class="sh_comment">/* Per-directory configuration handler */</code>
+    <code class="sh_constant">NULL</code><code class="sh_misc">,</code>            <code class="sh_comment">/* Merge handler for per-directory configurations */</code>
+    <code class="sh_constant">NULL</code><code class="sh_misc">,</code>            <code class="sh_comment">/* Per-server configuration handler */</code>
+    <code class="sh_constant">NULL</code><code class="sh_misc">,</code>            <code class="sh_comment">/* Merge handler for per-server configurations */</code>
+    <code class="sh_constant">NULL</code><code class="sh_misc">,</code>            <code class="sh_comment">/* Any directives we may have for httpd */</code>
+    register_hooks   <code class="sh_comment">/* Our hook registering function */</code>
+<code class="sh_misc">}</code><code class="sh_misc">;</code>
+</p>
+
+
+<p>
+So far so good. To access our new handler, we could add the following to 
+our configuration:
+</p>
+<div class="example"><pre>
+&lt;Location /example&gt;
+    SetHandler example-handler
+&lt;/Location&gt;
+</pre></div>
+<p>
+When we visit, we'll see our current configuration being spit out by our 
+module. 
+</p>
+
+
+<h3><a name="register_directive" id="register_directive">Registering directives with the server</a></h3>
+<p>
+What if we want to change our configuration, not by hard-coding new values 
+into the module, but by using either the httpd.conf file or possibly a 
+.htaccess file? It's time to let the server know that we want this to be 
+possible. To do so, we must first change our <em>name tag</em> to include a 
+reference to the configuration directives we want to register with the server:
+</p>
+
+
+<p class="source">
+module AP_MODULE_DECLARE_DATA   example_module =
+{
+    STANDARD20_MODULE_STUFF,
+    <code class="sh_constant">NULL</code>,               <code class="sh_comment">/* Per-directory configuration handler */</code>
+    <code class="sh_constant">NULL</code>,               <code class="sh_comment">/* Merge handler for per-directory configurations */</code>
+    <code class="sh_constant">NULL</code>,               <code class="sh_comment">/* Per-server configuration handler */</code>
+    <code class="sh_constant">NULL</code>,               <code class="sh_comment">/* Merge handler for per-server configurations */</code>
+    example_directives, <code class="sh_comment">/* Any directives we may have for httpd */</code>
+    register_hooks      <code class="sh_comment">/* Our hook registering function */</code>
+};
+</p>
+
+
+<p>
+This will tell the server that we are now accepting directives from the 
+configuration files, and that the structure called <code>example_directives
+</code> holds information on what our directives are and how they work. 
+Since we have three different variables in our module configuration, we 
+will add a structure with three directives and a NULL at the end:
+</p>
+
+
+<p class="source">
+static const command_rec        example_directives[] =
+{
+    <code class="sh_declare"><a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__APACHE__CORE__CONFIG.html#ga07c7d22ae17805e61204463326cf9c34">AP_INIT_TAKE1</a></code>("exampleEnabled", example_set_enabled, <code class="sh_constant">NULL</code>, RSRC_CONF, "Enable or disable mod_example"),
+    <code class="sh_declare"><a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__APACHE__CORE__CONFIG.html#ga07c7d22ae17805e61204463326cf9c34">AP_INIT_TAKE1</a></code>("examplePath", example_set_path, <code class="sh_constant">NULL</code>, RSRC_CONF, "The path to whatever"),
+    <code class="sh_declare"><a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__APACHE__CORE__CONFIG.html#gafaec43534fcf200f37d9fecbf9247c21">AP_INIT_TAKE2</a></code>("exampleAction", example_set_action, <code class="sh_constant">NULL</code>, RSRC_CONF, "Special action value!"),
+    { <code class="sh_constant">NULL</code> }
+};
+</p>
+
+
+<p>
+<img src="../images/build_a_mod_4.png" border="1" alt="Directives structure" /><br />
+As you can see, each directive needs at least 5 parameters set:
+</p>
+<ol>
+<li><code><a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__APACHE__CORE__CONFIG.html#ga07c7d22ae17805e61204463326cf9c34">AP_INIT_TAKE1</a></code>: This is a macro that tells the server that this directive takes one and only one argument. 
+If we required two arguments, we could use the macro <code><a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__APACHE__CORE__CONFIG.html#gafaec43534fcf200f37d9fecbf9247c21">AP_INIT_TAKE2</a></code> and so on (refer to httpd_conf.h 
+for more macros).</li>
+<li><code>exampleEnabled</code>: This is the name of our directive. More precisely, it is what the user must put in his/her 
+configuration in order to invoke a configuration change in our module.</li>
+<li><code>example_set_enabled</code>: This is a reference to a C function that parses the directive and sets the configuration 
+accordingly. We will discuss how to make this in the following paragraph.</li>
+<li><code>RSRC_CONF</code>: This tells the server where the directive is permitted. We'll go into details on this value in the 
+later chapters, but for now, <code>RSRC_CONF</code> means that the server will only accept these directives in a server context.</li>
+<li><code>"Enable or disable...."</code>: This is simply a brief description of what the directive does.</li>
+</ol>
+<p>
+(<em>The "missing" parameter in our definition, which is usually set to 
+<code>NULL</code>, is an optional function that can be run after the 
+initial function to parse the arguments have been run. This is usually 
+omitted, as the function for verifying arguments might as well be used to 
+set them.</em>)
+</p>
+
+<h3><a name="directive_handler" id="directive_handler">The directive handler function</a></h3>
+<p>
+Now that we've told the server to expect some directives for our module, it's 
+time to make a few functions for handling these. What the server reads in the 
+configuration file(s) is text, and so naturally, what it passes along to 
+our directive handler is one or more strings, that we ourselves need to 
+recognize and act upon. You'll notice, that since we set our <code>
+exampleAction</code> directive to accept two arguments, its C function also 
+has an additional parameter defined:</p> 
+
+
+<p class="source">
+<code class="sh_comment">/* Handler for the "exambleEnabled" directive */</code>
+<code class="sh_declare">const</code> <code class="sh_declare">char</code><code class="sh_misc"> *</code>example_set_enabled<code class="sh_misc">(</code>cmd_parms <code class="sh_misc">*</code>cmd<code class="sh_misc">,</code> <code class="sh_declare">void</code> <code class="sh_misc">*</code>cfg<code class="sh_misc">,</code> <code class="sh_declare">const</code> <code class="sh_declare">char</code> <code class="sh_misc">*</code>arg<code class="sh_misc">)</code>
+<code class="sh_misc">{</code>
+    <code class="sh_declare">if</code><code class="sh_misc">(</code><code class="sh_misc">!</code>strcasecmp<code class="sh_misc">(</code>arg<code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_value">on</code><code class="sh_character">"</code><code class="sh_misc">)</code><code class="sh_misc">)</code> config<code class="sh_misc">.</code>enabled <code class="sh_misc">=</code> <code class="sh_reference">1</code><code class="sh_misc">;</code>
+    <code class="sh_declare">else</code> config<code class="sh_misc">.</code>enabled <code class="sh_misc">=</code> <code class="sh_reference">0</code><code class="sh_misc">;</code>
+    <code class="sh_declare">return</code> <code class="sh_constant">NULL</code><code class="sh_misc">;</code>
+<code class="sh_misc">}</code>
+
+<code class="sh_comment">/* Handler for the "examplePath" directive */</code>
+<code class="sh_declare">const</code> <code class="sh_declare">char</code><code class="sh_misc"> *</code>example_set_path<code class="sh_misc">(</code>cmd_parms <code class="sh_misc">*</code>cmd<code class="sh_misc">,</code> <code class="sh_declare">void</code> <code class="sh_misc">*</code>cfg<code class="sh_misc">,</code> <code class="sh_declare">const</code> <code class="sh_declare">char</code> <code class="sh_misc">*</code>arg<code class="sh_misc">)</code>
+<code class="sh_misc">{</code>
+    config<code class="sh_misc">.</code>path <code class="sh_misc">=</code> arg<code class="sh_misc">;</code>
+    <code class="sh_declare">return</code> <code class="sh_constant">NULL</code><code class="sh_misc">;</code>
+<code class="sh_misc">}</code>
+
+<code class="sh_comment">/* Handler for the "exampleAction" directive */</code>
+<code class="sh_comment">/* Let's pretend this one takes one argument (file or db), and a second (deny or allow), */</code>
+<code class="sh_comment">/* and we store it in a bit-wise manner. */</code>
+<code class="sh_declare">const</code> <code class="sh_declare">char</code><code class="sh_misc"> *</code>example_set_action<code class="sh_misc">(</code>cmd_parms <code class="sh_misc">*</code>cmd<code class="sh_misc">,</code> <code class="sh_declare">void</code> <code class="sh_misc">*</code>cfg<code class="sh_misc">,</code> <code class="sh_declare">const</code> <code class="sh_declare">char</code> <code class="sh_misc">*</code>arg1<code class="sh_misc">,</code> <code class="sh_declare">const</code> <code class="sh_declare">char</code><code class="sh_misc">*</code> arg2<code class="sh_misc">)</code>
+<code class="sh_misc">{</code>
+    <code class="sh_declare">if</code><code class="sh_misc">(</code><code class="sh_misc">!</code>strcasecmp<code class="sh_misc">(</code>arg1<code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_value">file</code><code class="sh_character">"</code><code class="sh_misc">)</code><code class="sh_misc">)</code> config<code class="sh_misc">.</code>typeOfAction <code class="sh_misc">=</code> <code class="sh_reference">0x01</code><code class="sh_misc">;</code>
+    <code class="sh_declare">else</code> config<code class="sh_misc">.</code>typeOfAction <code class="sh_misc">=</code> <code class="sh_reference">0x02</code><code class="sh_misc">;</code>
+    
+    <code class="sh_declare">if</code><code class="sh_misc">(</code><code class="sh_misc">!</code>strcasecmp<code class="sh_misc">(</code>arg2<code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_value">deny</code><code class="sh_character">"</code><code class="sh_misc">)</code><code class="sh_misc">)</code> config<code class="sh_misc">.</code>typeOfAction <code class="sh_misc">+</code><code class="sh_misc">=</code> <code class="sh_reference">0x10</code><code class="sh_misc">;</code>
+    <code class="sh_declare">else</code> config<code class="sh_misc">.</code>typeOfAction <code class="sh_misc">+</code><code class="sh_misc">=</code> <code class="sh_reference">0x20</code><code class="sh_misc">;</code>
+    <code class="sh_declare">return</code> <code class="sh_constant">NULL</code><code class="sh_misc">;</code>
+<code class="sh_misc">}</code>
+</p>
+
+
+
+
+<h3><a name="directive_complete" id="directive_complete">Putting it all together</a></h3>
+<p>
+Now that we have our directives set up, and handlers configured for them, 
+we can assemble our module into one big file:
+</p>
+
+
+<p class="source">
+<code class="sh_comment">/* mod_example_config_simple.c: */</code>
+<code class="sh_function">#</code><code class="sh_function">include </code><code class="sh_character">&lt;</code><code class="sh_reference">stdio.h</code><code class="sh_character">&gt;</code>
+<code class="sh_function">#</code><code class="sh_function">include </code><code class="sh_character">"</code><code class="sh_reference">apr_hash.h</code><code class="sh_character">"</code>
+<code class="sh_function">#</code><code class="sh_function">include </code><code class="sh_character">"</code><code class="sh_reference">ap_config.h</code><code class="sh_character">"</code>
+<code class="sh_function">#</code><code class="sh_function">include </code><code class="sh_character">"</code><code class="sh_reference">ap_provider.h</code><code class="sh_character">"</code>
+<code class="sh_function">#</code><code class="sh_function">include </code><code class="sh_character">"</code><code class="sh_reference">httpd.h</code><code class="sh_character">"</code>
+<code class="sh_function">#</code><code class="sh_function">include </code><code class="sh_character">"</code><code class="sh_reference">http_core.h</code><code class="sh_character">"</code>
+<code class="sh_function">#</code><code class="sh_function">include </code><code class="sh_character">"</code><code class="sh_reference">http_config.h</code><code class="sh_character">"</code>
+<code class="sh_function">#</code><code class="sh_function">include </code><code class="sh_character">"</code><code class="sh_reference">http_log.h</code><code class="sh_character">"</code>
+<code class="sh_function">#</code><code class="sh_function">include </code><code class="sh_character">"</code><code class="sh_reference">http_protocol.h</code><code class="sh_character">"</code>
+<code class="sh_function">#</code><code class="sh_function">include </code><code class="sh_character">"</code><code class="sh_reference">http_request.h</code><code class="sh_character">"</code>
+
+<code class="sh_comment">/*</code>
+<code class="sh_comment">&nbsp;==============================================================================</code>
+<code class="sh_comment">&nbsp;Our configuration prototype and declaration:</code>
+<code class="sh_comment">&nbsp;==============================================================================</code>
+<code class="sh_comment">&nbsp;*/</code>
+<code class="sh_declare">typedef</code> <code class="sh_declare">struct</code> <code class="sh_misc">{</code>
+    <code class="sh_declare">int</code>         enabled<code class="sh_misc">;</code>      <code class="sh_comment">/* Enable or disable our module */</code>
+    <code class="sh_declare">const</code> <code class="sh_declare">char</code> <code class="sh_misc">*</code>path<code class="sh_misc">;</code>         <code class="sh_comment">/* Some path to...something */</code>
+    <code class="sh_declare">int</code>         typeOfAction<code class="sh_misc">;</code> <code class="sh_comment">/* 1 means action A, 2 means action B and so on */</code>
+<code class="sh_misc">}</code> example_config<code class="sh_misc">;</code>
+
+<code class="sh_declare">static</code> example_config config<code class="sh_misc">;</code>
+
+<code class="sh_comment">/*</code>
+<code class="sh_comment">&nbsp;==============================================================================</code>
+<code class="sh_comment">&nbsp;Our directive handlers:</code>
+<code class="sh_comment">&nbsp;==============================================================================</code>
+<code class="sh_comment">&nbsp;*/</code>
+<code class="sh_comment">/* Handler for the "exambleEnabled" directive */</code>
+<code class="sh_declare">const</code> <code class="sh_declare">char</code><code class="sh_misc"> *</code>example_set_enabled<code class="sh_misc">(</code>cmd_parms <code class="sh_misc">*</code>cmd<code class="sh_misc">,</code> <code class="sh_declare">void</code> <code class="sh_misc">*</code>cfg<code class="sh_misc">,</code> <code class="sh_declare">const</code> <code class="sh_declare">char</code> <code class="sh_misc">*</code>arg<code class="sh_misc">)</code>
+<code class="sh_misc">{</code>
+    <code class="sh_declare">if</code><code class="sh_misc">(</code><code class="sh_misc">!</code>strcasecmp<code class="sh_misc">(</code>arg<code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_value">on</code><code class="sh_character">"</code><code class="sh_misc">)</code><code class="sh_misc">)</code> config<code class="sh_misc">.</code>enabled <code class="sh_misc">=</code> <code class="sh_reference">1</code><code class="sh_misc">;</code>
+    <code class="sh_declare">else</code> config<code class="sh_misc">.</code>enabled <code class="sh_misc">=</code> <code class="sh_reference">0</code><code class="sh_misc">;</code>
+    <code class="sh_declare">return</code> <code class="sh_constant">NULL</code><code class="sh_misc">;</code>
+<code class="sh_misc">}</code>
+
+<code class="sh_comment">/* Handler for the "examplePath" directive */</code>
+<code class="sh_declare">const</code> <code class="sh_declare">char</code><code class="sh_misc"> *</code>example_set_path<code class="sh_misc">(</code>cmd_parms <code class="sh_misc">*</code>cmd<code class="sh_misc">,</code> <code class="sh_declare">void</code> <code class="sh_misc">*</code>cfg<code class="sh_misc">,</code> <code class="sh_declare">const</code> <code class="sh_declare">char</code> <code class="sh_misc">*</code>arg<code class="sh_misc">)</code>
+<code class="sh_misc">{</code>
+    config<code class="sh_misc">.</code>path <code class="sh_misc">=</code> arg<code class="sh_misc">;</code>
+    <code class="sh_declare">return</code> <code class="sh_constant">NULL</code><code class="sh_misc">;</code>
+<code class="sh_misc">}</code>
+
+<code class="sh_comment">/* Handler for the "exampleAction" directive */</code>
+<code class="sh_comment">/* Let's pretend this one takes one argument (file or db), and a second (deny or allow), */</code>
+<code class="sh_comment">/* and we store it in a bit-wise manner. */</code>
+<code class="sh_declare">const</code> <code class="sh_declare">char</code><code class="sh_misc"> *</code>example_set_action<code class="sh_misc">(</code>cmd_parms <code class="sh_misc">*</code>cmd<code class="sh_misc">,</code> <code class="sh_declare">void</code> <code class="sh_misc">*</code>cfg<code class="sh_misc">,</code> <code class="sh_declare">const</code> <code class="sh_declare">char</code> <code class="sh_misc">*</code>arg1<code class="sh_misc">,</code> <code class="sh_declare">const</code> <code class="sh_declare">char</code><code class="sh_misc">*</code> arg2<code class="sh_misc">)</code>
+<code class="sh_misc">{</code>
+    <code class="sh_declare">if</code><code class="sh_misc">(</code><code class="sh_misc">!</code>strcasecmp<code class="sh_misc">(</code>arg1<code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_value">file</code><code class="sh_character">"</code><code class="sh_misc">)</code><code class="sh_misc">)</code> config<code class="sh_misc">.</code>typeOfAction <code class="sh_misc">=</code> <code class="sh_reference">0x01</code><code class="sh_misc">;</code>
+    <code class="sh_declare">else</code> config<code class="sh_misc">.</code>typeOfAction <code class="sh_misc">=</code> <code class="sh_reference">0x02</code><code class="sh_misc">;</code>
+    
+    <code class="sh_declare">if</code><code class="sh_misc">(</code><code class="sh_misc">!</code>strcasecmp<code class="sh_misc">(</code>arg2<code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_value">deny</code><code class="sh_character">"</code><code class="sh_misc">)</code><code class="sh_misc">)</code> config<code class="sh_misc">.</code>typeOfAction <code class="sh_misc">+</code><code class="sh_misc">=</code> <code class="sh_reference">0x10</code><code class="sh_misc">;</code>
+    <code class="sh_declare">else</code> config<code class="sh_misc">.</code>typeOfAction <code class="sh_misc">+</code><code class="sh_misc">=</code> <code class="sh_reference">0x20</code><code class="sh_misc">;</code>
+    <code class="sh_declare">return</code> <code class="sh_constant">NULL</code><code class="sh_misc">;</code>
+<code class="sh_misc">}</code>
+
+<code class="sh_comment">/*</code>
+<code class="sh_comment">&nbsp;==============================================================================</code>
+<code class="sh_comment">&nbsp;The directive structure for our name tag:</code>
+<code class="sh_comment">&nbsp;==============================================================================</code>
+<code class="sh_comment">&nbsp;*/</code>
+<code class="sh_declare">static</code> <code class="sh_declare">const</code> command_rec        example_directives<code class="sh_misc">[</code><code class="sh_misc">]</code> <code class="sh_misc">=</code>
+<code class="sh_misc">{</code>
+    <a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__APACHE__CORE__CONFIG.html#ga07c7d22ae17805e61204463326cf9c34">AP_INIT_TAKE1</a><code class="sh_misc">(</code><code class="sh_character">"</code><code class="sh_value">exampleEnabled</code><code class="sh_character">"</code><code class="sh_misc">,</code> example_set_enabled<code class="sh_misc">,</code> <code class="sh_constant">NULL</code><code class="sh_misc">,</code> RSRC_CONF<code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_value">Enable or disable mod_example</code><code class="sh_character">"</code><code class="sh_misc">)</code><code class="sh_misc">,</code>
+    <a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__APACHE__CORE__CONFIG.html#ga07c7d22ae17805e61204463326cf9c34">AP_INIT_TAKE1</a><code class="sh_misc">(</code><code class="sh_character">"</code><code class="sh_value">examplePath</code><code class="sh_character">"</code><code class="sh_misc">,</code> example_set_path<code class="sh_misc">,</code> <code class="sh_constant">NULL</code><code class="sh_misc">,</code> RSRC_CONF<code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_value">The path to whatever</code><code class="sh_character">"</code><code class="sh_misc">)</code><code class="sh_misc">,</code>
+    <a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__APACHE__CORE__CONFIG.html#gafaec43534fcf200f37d9fecbf9247c21">AP_INIT_TAKE2</a><code class="sh_misc">(</code><code class="sh_character">"</code><code class="sh_value">exampleAction</code><code class="sh_character">"</code><code class="sh_misc">,</code> example_set_action<code class="sh_misc">,</code> <code class="sh_constant">NULL</code><code class="sh_misc">,</code> RSRC_CONF<code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_value">Special action value!</code><code class="sh_character">"</code><code class="sh_misc">)</code><code class="sh_misc">,</code>
+    <code class="sh_misc">{</code> <code class="sh_constant">NULL</code> <code class="sh_misc">}</code>
+<code class="sh_misc">}</code><code class="sh_misc">;</code>
+<code class="sh_comment">/*</code>
+<code class="sh_comment">&nbsp;==============================================================================</code>
+<code class="sh_comment">&nbsp;Our module handler:</code>
+<code class="sh_comment">&nbsp;==============================================================================</code>
+<code class="sh_comment">&nbsp;*/</code>
+<code class="sh_declare">static</code> <code class="sh_declare">int</code> example_handler<code class="sh_misc">(</code>request_rec <code class="sh_misc">*</code>r<code class="sh_misc">)</code>
+<code class="sh_misc">{</code>
+    <code class="sh_declare">if</code><code class="sh_misc">(</code><code class="sh_misc">!</code>r<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">handler</code> <code class="sh_misc">|</code><code class="sh_misc">|</code> <code class="sh_function">strcmp</code><code class="sh_misc">(</code>r<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">handler</code><code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_value">example-handler</code><code class="sh_character">"</code><code class="sh_misc">)</code><code class="sh_misc">)</code> <code class="sh_declare">return</code><code class="sh_misc">(</code>DECLINED<code class="sh_misc">)</code><code class="sh_misc">;</code>
+    ap_set_content_type<code class="sh_misc">(</code>r<code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_value">text/plain</code><code class="sh_character">"</code><code class="sh_misc">)</code><code class="sh_misc">;</code>
+    ap_rprintf<code class="sh_misc">(</code>r<code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_value">Enabled: </code><code class="sh_reference">%u</code><code class="sh_reference">\n</code><code class="sh_character">"</code><code class="sh_misc">,</code> config<code class="sh_misc">.</code>enabled<code class="sh_misc">)</code><code class="sh_misc">;</code>
+    ap_rprintf<code class="sh_misc">(</code>r<code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_value">Path: </code><code class="sh_reference">%s</code><code class="sh_reference">\n</code><code class="sh_character">"</code><code class="sh_misc">,</code> config<code class="sh_misc">.</code>path<code class="sh_misc">)</code><code class="sh_misc">;</code>
+    ap_rprintf<code class="sh_misc">(</code>r<code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_value">TypeOfAction: </code><code class="sh_reference">%x</code><code class="sh_reference">\n</code><code class="sh_character">"</code><code class="sh_misc">,</code> config<code class="sh_misc">.</code>typeOfAction<code class="sh_misc">)</code><code class="sh_misc">;</code>
+    <code class="sh_declare">return</code> OK<code class="sh_misc">;</code>
+<code class="sh_misc">}</code>
+
+<code class="sh_comment">/*</code>
+<code class="sh_comment">&nbsp;==============================================================================</code>
+<code class="sh_comment">&nbsp;The hook registration function (also initializes the default config values):</code>
+<code class="sh_comment">&nbsp;==============================================================================</code>
+<code class="sh_comment">&nbsp;*/</code>
+<code class="sh_declare">static</code> <code class="sh_declare">void</code> register_hooks<code class="sh_misc">(</code>apr_pool_t <code class="sh_misc">*</code>pool<code class="sh_misc">)</code> 
+<code class="sh_misc">{</code>
+    config<code class="sh_misc">.</code>enabled <code class="sh_misc">=</code> <code class="sh_reference">1</code><code class="sh_misc">;</code>
+    config<code class="sh_misc">.</code>path <code class="sh_misc">=</code> <code class="sh_character">"</code><code class="sh_value">/foo/bar</code><code class="sh_character">"</code><code class="sh_misc">;</code>
+    config<code class="sh_misc">.</code>typeOfAction <code class="sh_misc">=</code> <code class="sh_reference">3</code><code class="sh_misc">;</code>
+    ap_hook_handler<code class="sh_misc">(</code>example_handler<code class="sh_misc">,</code> <code class="sh_constant">NULL</code><code class="sh_misc">,</code> <code class="sh_constant">NULL</code><code class="sh_misc">,</code> APR_HOOK_LAST<code class="sh_misc">)</code><code class="sh_misc">;</code>
+<code class="sh_misc">}</code>
+<code class="sh_comment">/*</code>
+<code class="sh_comment">&nbsp;==============================================================================</code>
+<code class="sh_comment">&nbsp;Our module name tag:</code>
+<code class="sh_comment">&nbsp;==============================================================================</code>
+<code class="sh_comment">&nbsp;*/</code>
+module AP_MODULE_DECLARE_DATA   example_module <code class="sh_misc">=</code>
+<code class="sh_misc">{</code>
+    STANDARD20_MODULE_STUFF<code class="sh_misc">,</code>
+    <code class="sh_constant">NULL</code><code class="sh_misc">,</code>               <code class="sh_comment">/* Per-directory configuration handler */</code>
+    <code class="sh_constant">NULL</code><code class="sh_misc">,</code>               <code class="sh_comment">/* Merge handler for per-directory configurations */</code>
+    <code class="sh_constant">NULL</code><code class="sh_misc">,</code>               <code class="sh_comment">/* Per-server configuration handler */</code>
+    <code class="sh_constant">NULL</code><code class="sh_misc">,</code>               <code class="sh_comment">/* Merge handler for per-server configurations */</code>
+    example_directives<code class="sh_misc">,</code> <code class="sh_comment">/* Any directives we may have for httpd */</code>
+    register_hooks      <code class="sh_comment">/* Our hook registering function */</code>
+<code class="sh_misc">}</code><code class="sh_misc">;</code>
+</p>
+
+
+
+<p>
+In our httpd.conf file, we can now change the hard-coded configuration by 
+adding a few lines:
+</p>
+<div class="example"><pre>
+ExampleEnabled On
+ExamplePath "/usr/bin/foo"
+ExampleAction file allow
+</pre></div>
+<p>
+And thus we apply the configuration, visit <code>/example</code> on our 
+web site, and we see the configuration has adapted to what we wrote in our 
+configuration file.
+</p>
+
+
+
+</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
+<div class="section">
+<h2><a name="context" id="context">Context aware configurations</a></h2>
+<h3><a name="context_intro" id="context_intro">Introduction to context aware configurations</a></h3>
+<p>
+In Apache HTTP Server 2.4, different URLs, virtual hosts, directories etc can have very 
+different meanings to the user of the server, and thus different contexts 
+within which modules must operate. For example, let's assume you have this 
+configuration set up for mod_rewrite:
+</p>
+<div class="example"><pre>
+&lt;Directory "/var/www"&gt;
+    RewriteCond %{HTTP_HOST} ^example.com$
+    RewriteRule (.*) http://www.example.com/$1
+&lt;/Directory&gt;
+&lt;Directory "/var/www/sub"&gt;
+    RewriteRule ^foobar$ index.php?foobar=true
+&lt;/Directory&gt;
+</pre></div>
+<p>
+In this example, you will have set up two different contexts for 
+mod_rewrite:</p>
+<ol>
+<li>Inside <code>/var/www</code>, all requests for <code>http://example.com</code> must go to <code>http://www.example.com</code></li>
+<li>Inside <code>/var/www/sub</code>, all requests for <code>foobar</code> must go to <code>index.php?foobar=true</code></li>
+</ol>
+<p>
+If mod_rewrite (or the entire server for that matter) wasn't context aware, then 
+these rewrite rules would just apply to every and any request made, 
+regardless of where and how they were made, but since the module can pull 
+the context specific configuration straight from the server, it does not need 
+to know itself, which of the directives are valid in this context, since 
+the server takes care of this.</p>
+
+<p>
+So how does a module get the specific configuration for the server, 
+directory or location in question? It does so by making one simple call:
+</p>
+
+
+<p class="source">
+
+example_config *config = (example_config*) <a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__APACHE__CORE__CONFIG.html#ga1093a5908a384eacc929b028c79f2a02">ap_get_module_config</a>(<code class="sh_subobject">r-&gt;per_dir_config</code>, &amp;example_module);
+</p>
+<p>
+That's it! Of course, a whole lot goes on behind the scenes, which we will 
+discuss in this chapter, starting with how the server came to know what our 
+configuration looks like, and how it came to be set up as it is in the 
+specific context.
+</p>
+
+
+<h3><a name="context_base" id="context_base">Our basic configuration setup</a></h3>
+<p>In this chapter, we will be working with a slightly modified version of 
+our previous context structure. We will set a <code>context</code> 
+variable that we can use to track which context configuration is being 
+used by the server in various places:
+</p>
+
+<p class="source">
+<code class="sh_declare">typedef</code> <code class="sh_declare">struct</code> <code class="sh_misc">{</code>
+    <code class="sh_declare">char</code>        context<code class="sh_misc">[</code><code class="sh_reference">256</code><code class="sh_misc">]</code><code class="sh_misc">;</code>
+    <code class="sh_declare">char</code>        path<code class="sh_misc">[</code><code class="sh_reference">256</code><code class="sh_misc">]</code><code class="sh_misc">;</code>
+    <code class="sh_declare">int</code>         typeOfAction<code class="sh_misc">;</code>
+    <code class="sh_declare">int</code>         enabled<code class="sh_misc">;</code>
+<code class="sh_misc">}</code> example_config<code class="sh_misc">;</code>
+</p>
+
+
+<p>Our handler for requests will also be modified, yet still very simple:</p>
+
+
+
+<p class="source">
+<code class="sh_declare">static</code> <code class="sh_declare">int</code> example_handler<code class="sh_misc">(</code>request_rec <code class="sh_misc">*</code>r<code class="sh_misc">)</code>
+<code class="sh_misc">{</code>
+    <code class="sh_declare">if</code><code class="sh_misc">(</code><code class="sh_misc">!</code>r<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">handler</code> <code class="sh_misc">|</code><code class="sh_misc">|</code> <code class="sh_function">strcmp</code><code class="sh_misc">(</code>r<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">handler</code><code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_value">example-handler</code><code class="sh_character">"</code><code class="sh_misc">)</code><code class="sh_misc">)</code> <code class="sh_declare">return</code><code class="sh_misc">(</code>DECLINED<code class="sh_misc">)</code><code class="sh_misc">;</code>
+    example_config<code class="sh_misc"> *</code>config <code class="sh_misc">=</code> <code class="sh_misc">(</code>example_config<code class="sh_misc">*</code><code class="sh_misc">)</code> ap_get_module_config<code class="sh_misc">(</code>r<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">per_dir_config</code><code class="sh_misc">,</code> <code class="sh_misc">&amp;</code>example_module<code class="sh_misc">)</code><code class="sh_misc">;</code>
+    ap_set_content_type<code class="sh_misc">(</code>r<code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_value">text/plain</code><code class="sh_character">"</code><code class="sh_misc">)</code><code class="sh_misc">;</code>
+    ap_rprintf<code class="sh_misc">(</code><code class="sh_character">"</code><code class="sh_value">Enabled: </code><code class="sh_reference">%u</code><code class="sh_reference">\n</code><code class="sh_character">"</code><code class="sh_misc">,</code> config<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">enabled</code><code class="sh_misc">)</code><code class="sh_misc">;</code>
+    ap_rprintf<code class="sh_misc">(</code><code class="sh_character">"</code><code class="sh_value">Path: </code><code class="sh_reference">%s</code><code class="sh_reference">\n</code><code class="sh_character">"</code><code class="sh_misc">,</code> config<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">path</code><code class="sh_misc">)</code><code class="sh_misc">;</code>
+    ap_rprintf<code class="sh_misc">(</code><code class="sh_character">"</code><code class="sh_value">TypeOfAction: </code><code class="sh_reference">%x</code><code class="sh_reference">\n</code><code class="sh_character">"</code><code class="sh_misc">,</code> config<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">typeOfAction</code><code class="sh_misc">)</code><code class="sh_misc">;</code>
+    ap_rprintf<code class="sh_misc">(</code><code class="sh_character">"</code><code class="sh_value">Context: </code><code class="sh_reference">%s</code><code class="sh_reference">\n</code><code class="sh_character">"</code><code class="sh_misc">,</code> config<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">context</code><code class="sh_misc">)</code><code class="sh_misc">;</code>
+    <code class="sh_declare">return</code> OK<code class="sh_misc">;</code>
+<code class="sh_misc">}</code>
+</p>
+
+
+
+
+<h3><a name="context_which" id="context_which">Choosing a context</a></h3>
+<p>
+Before we can start making our module context aware, we must first define, 
+which contexts we will accept. As we saw in the previous chapter, defining 
+a directive required five elements be set:</p>
+
+
+
+<p class="source">
+<code class="sh_declare"><a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__APACHE__CORE__CONFIG.html#ga07c7d22ae17805e61204463326cf9c34">AP_INIT_TAKE1</a></code>("exampleEnabled", example_set_enabled, <code class="sh_constant">NULL</code>, RSRC_CONF, "Enable or disable mod_example"),
+</p>
+
+
+
+<p>The <code>RSRC_CONF</code> definition told the server that we would only allow 
+this directive in a global server context, but since we are now trying out 
+a context aware version of our module, we should set this to something 
+more lenient, namely the value <code>ACCESS_CONF</code>, which lets us use 
+the directive inside &lt;Directory&gt; and &lt;Location&gt; blocks.
+</p>
+
+
+<h3><a name="context_pool" id="context_pool">Using the server to allocate configuration slots</a></h3>
+<p> A much smarter way to manage your configurations is by letting the server 
+help you create them. To do so, we must first start off by changing our 
+<em>name tag</em> to let the server know, that it should assist us in creating 
+and managing our configurations. Since we have chosen the per-directory 
+(or per-location) context for our module configurations, we'll add a 
+per-directory creator and merger function reference in our tag:</p>
+
+
+<p class="source">
+module AP_MODULE_DECLARE_DATA   example_module <code class="sh_misc">=</code>
+<code class="sh_misc">{</code>
+    STANDARD20_MODULE_STUFF<code class="sh_misc">,</code>
+    create_dir_conf<code class="sh_misc">,</code> <code class="sh_comment">/* Per-directory configuration handler */</code>
+    merge_dir_conf<code class="sh_misc">,</code>  <code class="sh_comment">/* Merge handler for per-directory configurations */</code>
+    <code class="sh_constant">NULL</code><code class="sh_misc">,</code>            <code class="sh_comment">/* Per-server configuration handler */</code>
+    <code class="sh_constant">NULL</code><code class="sh_misc">,</code>            <code class="sh_comment">/* Merge handler for per-server configurations */</code>
+    directives<code class="sh_misc">,</code>      <code class="sh_comment">/* Any directives we may have for httpd */</code>
+    register_hooks   <code class="sh_comment">/* Our hook registering function */</code>
+<code class="sh_misc">}</code><code class="sh_misc">;</code>
+</p>
+
+
+
+
+
+
+<h3><a name="context_new" id="context_new">Creating new context configurations</a></h3>
+<p>
+Now that we have told the server to help us create and manage configurations, 
+our first step is to make a function for creating new, blank 
+configurations. We do so by creating the function we just referenced in 
+our name tag as the Per-directory configuration handler:</p>
+
+<p class="source">
+<code class="sh_declare">void</code><code class="sh_misc">*</code> example_create_dir_conf<code class="sh_misc">(</code>apr_pool_t<code class="sh_misc">*</code> pool<code class="sh_misc">,</code> <code class="sh_declare">char</code><code class="sh_misc">*</code> context<code class="sh_misc">)</code> <code class="sh_misc">{</code>
+    context <code class="sh_misc">=</code> context <code class="sh_misc">?</code> context <code class="sh_misc">:</code> <code class="sh_character">"</code><code class="sh_value">(undefined context)</code><code class="sh_character">"</code><code class="sh_misc">;</code>
+    example_config<code class="sh_misc"> *</code>cfg <code class="sh_misc">=</code> apr_pcalloc<code class="sh_misc">(</code>pool<code class="sh_misc">,</code> <code class="sh_declare">sizeof</code><code class="sh_misc">(</code>example_config<code class="sh_misc">)</code><code class="sh_misc">)</code><code class="sh_misc">;</code>
+    <code class="sh_declare">if</code><code class="sh_misc">(</code>cfg<code class="sh_misc">)</code> <code class="sh_misc">{</code>
+        <code class="sh_comment">/* Set some default values */</code>
+        <code class="sh_function">strcpy</code><code class="sh_misc">(</code>cfg<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">context</code><code class="sh_misc">,</code> x<code class="sh_misc">)</code><code class="sh_misc">;</code>
+        cfg<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">enabled</code> <code class="sh_misc">=</code> <code class="sh_reference">0</code><code class="sh_misc">;</code>
+        cfg<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">path</code> <code class="sh_misc">=</code> <code class="sh_character">"</code><code class="sh_value">/foo/bar</code><code class="sh_character">"</code><code class="sh_misc">;</code>
+        cfg<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">typeOfAction</code> <code class="sh_misc">=</code> <code class="sh_reference">0x11</code><code class="sh_misc">;</code>
+    <code class="sh_misc">}</code>
+    <code class="sh_declare">return</code> cfg<code class="sh_misc">;</code>
+<code class="sh_misc">}</code>
+</p>
+
+
+
+
+
+<h3><a name="context_merge" id="context_merge">Merging configurations</a></h3>
+<p>
+Our next step in creating a context aware configuration is merging 
+configurations. This part of the process particularly apply to scenarios 
+where you have a parent configuration and a child, such as the following: 
+</p>
+<div class="example"><pre>
+&lt;Directory "/var/www"&gt;
+    ExampleEnable On
+    ExamplePath /foo/bar
+    ExampleAction file allow
+&lt;/Directory&gt;
+&lt;Directory "/var/www/subdir"&gt;
+    ExampleAction file deny
+&lt;/Directory&gt;
+</pre></div>
+<p>
+In this example, it is natural to assume that the directory <code>
+/var/www/subdir</code> should inherit the value set for the <code>/var/www
+</code> directory, as we did not specify a <code>ExampleEnable</code> nor 
+an <code>ExamplePath</code> for this directory. The server does not presume to 
+know if this is true, but cleverly does the following:
+</p>
+<ol>
+<li>Creates a new configuration for <code>/var/www</code></li>
+<li>Sets the configuration values according to the directives given for <code>/var/www</code></li>
+<li>Creates a new configuration for <code>/var/www/subdir</code></li>
+<li>Sets the configuration values according to the directives given for <code>/var/www/subdir</code></li>
+<li><strong>Proposes a merge</strong> of the two configurations into a new configuration for <code>/var/www/subdir</code></li>
+</ol>
+<p>
+This proposal is handled by the <code>merge_dir_conf</code> function we 
+referenced in our name tag. The purpose of this function is to assess the 
+two configurations and decide how they are to be merged:</p>
+
+
+
+<p class="source">
+<code class="sh_declare">void</code><code class="sh_misc">*</code> merge_dir_conf<code class="sh_misc">(</code>apr_pool_t<code class="sh_misc">*</code> pool<code class="sh_misc">,</code> <code class="sh_declare">void</code><code class="sh_misc">*</code> BASE<code class="sh_misc">,</code> <code class="sh_declare">void</code><code class="sh_misc">*</code> ADD<code class="sh_misc">)</code> <code class="sh_misc">{</code>
+    example_config<code class="sh_misc">*</code> base <code class="sh_misc">=</code> <code class="sh_misc">(</code>example_config <code class="sh_misc">*</code><code class="sh_misc">)</code> BASE <code class="sh_misc">;</code>
+    example_config<code class="sh_misc">*</code> add <code class="sh_misc">=</code> <code class="sh_misc">(</code>example_config <code class="sh_misc">*</code><code class="sh_misc">)</code> ADD <code class="sh_misc">;</code>
+    example_config<code class="sh_misc">*</code> conf <code class="sh_misc">=</code> <code class="sh_misc">(</code>example_config <code class="sh_misc">*</code><code class="sh_misc">)</code> create_dir_conf<code class="sh_misc">(</code>pool<code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_value">Merged configuration</code><code class="sh_character">"</code><code class="sh_misc">)</code><code class="sh_misc">;</code>
+    
+    conf<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">enabled</code> <code class="sh_misc">=</code> <code class="sh_misc">(</code> add<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">enabled</code> <code class="sh_misc">=</code><code class="sh_misc">=</code> <code class="sh_reference">0</code> <code class="sh_misc">)</code> <code class="sh_misc">?</code> base<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">enabled</code> <code class="sh_misc">:</code> add<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">enabled</code> <code class="sh_misc">;</code>
+    conf<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">typeOfAction</code> <code class="sh_misc">=</code> add<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">typeOfAction</code> <code class="sh_misc">?</code> add<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">typeOfAction</code> <code class="sh_misc">:</code> base<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">typeOfAction</code><code class="sh_misc">;</code>
+    <code class="sh_function">strcpy</code><code class="sh_misc">(</code>conf<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">path</code><code class="sh_misc">,</code> <code class="sh_function">strlen</code><code class="sh_misc">(</code>add<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">path</code><code class="sh_misc">)</code> <code class="sh_misc">?</code> add<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">path</code> <code class="sh_misc">:</code> base<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">path</code><code class="sh_misc">)</code><code class="sh_misc">;</code>
+    
+    <code class="sh_declare">return</code> conf <code class="sh_misc">;</code>
+<code class="sh_misc">}</code>
+</p>
+
+
+
+
+
+<h3><a name="context_example" id="context_example">Trying out our new context aware configurations</a></h3>
+<p>
+Now, let's try putting it all together to create a new module that is 
+context aware. First off, we'll create a configuration that lets us test 
+how the module works:
+</p>
+<div class="example"><pre>
+&lt;Location "/a"&gt;
+    SetHandler example-handler
+    ExampleEnabled on
+    ExamplePath "/foo/bar"
+    ExampleAction file allow
+&lt;/Location&gt;
+
+&lt;Location "/a/b"&gt;
+    ExampleAction file deny
+    ExampleEnabled off
+&lt;/Location&gt;
+
+&lt;Location "/a/b/c"&gt;
+    ExampleAction db deny
+    ExamplePath "/foo/bar/baz"
+    ExampleEnabled on
+&lt;/Location&gt;
+</pre></div>
+<p>
+Then we'll assemble our module code. Note, that since we are now using our 
+name tag as reference when fetching configurations in our handler, I have 
+added some prototypes to keep the compiler happy:
+</p>
+
+
+<p class="source">
+<code class="sh_comment">/*$6</code>
+<code class="sh_comment">&nbsp;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++</code>
+<code class="sh_comment">&nbsp;* mod_example_config.c</code>
+<code class="sh_comment">&nbsp;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++</code>
+<code class="sh_comment">&nbsp;*/</code>
+
+
+<code class="sh_function">#</code><code class="sh_function">include </code><code class="sh_character">&lt;</code><code class="sh_reference">stdio.h</code><code class="sh_character">&gt;</code>
+<code class="sh_function">#</code><code class="sh_function">include </code><code class="sh_character">"</code><code class="sh_reference">apr_hash.h</code><code class="sh_character">"</code>
+<code class="sh_function">#</code><code class="sh_function">include </code><code class="sh_character">"</code><code class="sh_reference">ap_config.h</code><code class="sh_character">"</code>
+<code class="sh_function">#</code><code class="sh_function">include </code><code class="sh_character">"</code><code class="sh_reference">ap_provider.h</code><code class="sh_character">"</code>
+<code class="sh_function">#</code><code class="sh_function">include </code><code class="sh_character">"</code><code class="sh_reference">httpd.h</code><code class="sh_character">"</code>
+<code class="sh_function">#</code><code class="sh_function">include </code><code class="sh_character">"</code><code class="sh_reference">http_core.h</code><code class="sh_character">"</code>
+<code class="sh_function">#</code><code class="sh_function">include </code><code class="sh_character">"</code><code class="sh_reference">http_config.h</code><code class="sh_character">"</code>
+<code class="sh_function">#</code><code class="sh_function">include </code><code class="sh_character">"</code><code class="sh_reference">http_log.h</code><code class="sh_character">"</code>
+<code class="sh_function">#</code><code class="sh_function">include </code><code class="sh_character">"</code><code class="sh_reference">http_protocol.h</code><code class="sh_character">"</code>
+<code class="sh_function">#</code><code class="sh_function">include </code><code class="sh_character">"</code><code class="sh_reference">http_request.h</code><code class="sh_character">"</code>
+
+<code class="sh_comment">/*$1</code>
+<code class="sh_comment">&nbsp;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</code>
+<code class="sh_comment">&nbsp;&nbsp;&nbsp;&nbsp;Configuration structure</code>
+<code class="sh_comment">&nbsp;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</code>
+<code class="sh_comment">&nbsp;*/</code>
+
+<code class="sh_declare">typedef</code> <code class="sh_declare">struct</code>
+<code class="sh_misc">{</code>
+    <code class="sh_declare">char</code>    context<code class="sh_misc">[</code><code class="sh_reference">256</code><code class="sh_misc">]</code><code class="sh_misc">;</code>
+    <code class="sh_declare">char</code>    path<code class="sh_misc">[</code><code class="sh_reference">256</code><code class="sh_misc">]</code><code class="sh_misc">;</code>
+    <code class="sh_declare">int</code>     typeOfAction<code class="sh_misc">;</code>
+    <code class="sh_declare">int</code>     enabled<code class="sh_misc">;</code>
+<code class="sh_misc">}</code> example_config<code class="sh_misc">;</code>
+
+<code class="sh_comment">/*$1</code>
+<code class="sh_comment">&nbsp;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</code>
+<code class="sh_comment">&nbsp;&nbsp;&nbsp;&nbsp;Prototypes</code>
+<code class="sh_comment">&nbsp;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</code>
+<code class="sh_comment">&nbsp;*/</code>
+
+<code class="sh_declare">static</code> <code class="sh_declare">int</code>    example_handler<code class="sh_misc">(</code>request_rec <code class="sh_misc">*</code>r<code class="sh_misc">)</code><code class="sh_misc">;</code>
+<code class="sh_declare">const</code> <code class="sh_declare">char</code>    <code class="sh_misc">*</code>example_set_enabled<code class="sh_misc">(</code>cmd_parms <code class="sh_misc">*</code>cmd<code class="sh_misc">,</code> <code class="sh_declare">void</code> <code class="sh_misc">*</code>cfg<code class="sh_misc">,</code> <code class="sh_declare">const</code> <code class="sh_declare">char</code> <code class="sh_misc">*</code>arg<code class="sh_misc">)</code><code class="sh_misc">;</code>
+<code class="sh_declare">const</code> <code class="sh_declare">char</code>    <code class="sh_misc">*</code>example_set_path<code class="sh_misc">(</code>cmd_parms <code class="sh_misc">*</code>cmd<code class="sh_misc">,</code> <code class="sh_declare">void</code> <code class="sh_misc">*</code>cfg<code class="sh_misc">,</code> <code class="sh_declare">const</code> <code class="sh_declare">char</code> <code class="sh_misc">*</code>arg<code class="sh_misc">)</code><code class="sh_misc">;</code>
+<code class="sh_declare">const</code> <code class="sh_declare">char</code>    <code class="sh_misc">*</code>example_set_action<code class="sh_misc">(</code>cmd_parms <code class="sh_misc">*</code>cmd<code class="sh_misc">,</code> <code class="sh_declare">void</code> <code class="sh_misc">*</code>cfg<code class="sh_misc">,</code> <code class="sh_declare">const</code> <code class="sh_declare">char</code> <code class="sh_misc">*</code>arg1<code class="sh_misc">,</code> <code class="sh_declare">const</code> <code class="sh_declare">char</code> <code class="sh_misc">*</code>arg2<code class="sh_misc">)</code><code class="sh_misc">;</code>
+<code class="sh_declare">void</code>          <code class="sh_misc">*</code>create_dir_conf<code class="sh_misc">(</code>apr_pool_t <code class="sh_misc">*</code>pool<code class="sh_misc">,</code> <code class="sh_declare">char</code> <code class="sh_misc">*</code>context<code class="sh_misc">)</code><code class="sh_misc">;</code>
+<code class="sh_declare">void</code>          <code class="sh_misc">*</code>merge_dir_conf<code class="sh_misc">(</code>apr_pool_t <code class="sh_misc">*</code>pool<code class="sh_misc">,</code> <code class="sh_declare">void</code> <code class="sh_misc">*</code>BASE<code class="sh_misc">,</code> <code class="sh_declare">void</code> <code class="sh_misc">*</code>ADD<code class="sh_misc">)</code><code class="sh_misc">;</code>
+<code class="sh_declare">static</code> <code class="sh_declare">void</code>   register_hooks<code class="sh_misc">(</code>apr_pool_t <code class="sh_misc">*</code>pool<code class="sh_misc">)</code><code class="sh_misc">;</code>
+
+<code class="sh_comment">/*$1</code>
+<code class="sh_comment">&nbsp;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</code>
+<code class="sh_comment">&nbsp;&nbsp;&nbsp;&nbsp;Configuration directives</code>
+<code class="sh_comment">&nbsp;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</code>
+<code class="sh_comment">&nbsp;*/</code>
+
+<code class="sh_declare">static</code> <code class="sh_declare">const</code> command_rec    directives<code class="sh_misc">[</code><code class="sh_misc">]</code> <code class="sh_misc">=</code>
+<code class="sh_misc">{</code>
+    <a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__APACHE__CORE__CONFIG.html#ga07c7d22ae17805e61204463326cf9c34">AP_INIT_TAKE1</a><code class="sh_misc">(</code><code class="sh_character">"</code><code class="sh_value">exampleEnabled</code><code class="sh_character">"</code><code class="sh_misc">,</code> example_set_enabled<code class="sh_misc">,</code> <code class="sh_constant">NULL</code><code class="sh_misc">,</code> ACCESS_CONF<code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_value">Enable or disable mod_example</code><code class="sh_character">"</code><code class="sh_misc">)</code><code class="sh_misc">,</code>
+    <a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__APACHE__CORE__CONFIG.html#ga07c7d22ae17805e61204463326cf9c34">AP_INIT_TAKE1</a><code class="sh_misc">(</code><code class="sh_character">"</code><code class="sh_value">examplePath</code><code class="sh_character">"</code><code class="sh_misc">,</code> example_set_path<code class="sh_misc">,</code> <code class="sh_constant">NULL</code><code class="sh_misc">,</code> ACCESS_CONF<code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_value">The path to whatever</code><code class="sh_character">"</code><code class="sh_misc">)</code><code class="sh_misc">,</code>
+    <a href="http://ci.apache.org/projects/httpd/trunk/doxygen/group__APACHE__CORE__CONFIG.html#gafaec43534fcf200f37d9fecbf9247c21">AP_INIT_TAKE2</a><code class="sh_misc">(</code><code class="sh_character">"</code><code class="sh_value">exampleAction</code><code class="sh_character">"</code><code class="sh_misc">,</code> example_set_action<code class="sh_misc">,</code> <code class="sh_constant">NULL</code><code class="sh_misc">,</code> ACCESS_CONF<code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_value">Special action value!</code><code class="sh_character">"</code><code class="sh_misc">)</code><code class="sh_misc">,</code>
+    <code class="sh_misc">{</code> <code class="sh_constant">NULL</code> <code class="sh_misc">}</code>
+<code class="sh_misc">}</code><code class="sh_misc">;</code>
+
+<code class="sh_comment">/*$1</code>
+<code class="sh_comment">&nbsp;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</code>
+<code class="sh_comment">&nbsp;&nbsp;&nbsp;&nbsp;Our name tag</code>
+<code class="sh_comment">&nbsp;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</code>
+<code class="sh_comment">&nbsp;*/</code>
+
+module AP_MODULE_DECLARE_DATA    example_module <code class="sh_misc">=</code>
+<code class="sh_misc">{</code>
+    STANDARD20_MODULE_STUFF<code class="sh_misc">,</code>
+    create_dir_conf<code class="sh_misc">,</code>    <code class="sh_comment">/* Per-directory configuration handler */</code>
+    merge_dir_conf<code class="sh_misc">,</code>     <code class="sh_comment">/* Merge handler for per-directory configurations */</code>
+    <code class="sh_constant">NULL</code><code class="sh_misc">,</code>               <code class="sh_comment">/* Per-server configuration handler */</code>
+    <code class="sh_constant">NULL</code><code class="sh_misc">,</code>               <code class="sh_comment">/* Merge handler for per-server configurations */</code>
+    directives<code class="sh_misc">,</code>         <code class="sh_comment">/* Any directives we may have for httpd */</code>
+    register_hooks      <code class="sh_comment">/* Our hook registering function */</code>
+<code class="sh_misc">}</code><code class="sh_misc">;</code>
+
+<code class="sh_comment">/*</code>
+<code class="sh_comment">&nbsp;=======================================================================================================================</code>
+<code class="sh_comment">&nbsp;&nbsp;&nbsp;&nbsp;Hook registration function</code>
+<code class="sh_comment">&nbsp;=======================================================================================================================</code>
+<code class="sh_comment">&nbsp;*/</code>
+<code class="sh_declare">static</code> <code class="sh_declare">void</code> register_hooks<code class="sh_misc">(</code>apr_pool_t <code class="sh_misc">*</code>pool<code class="sh_misc">)</code>
+<code class="sh_misc">{</code>
+    ap_hook_handler<code class="sh_misc">(</code>example_handler<code class="sh_misc">,</code> <code class="sh_constant">NULL</code><code class="sh_misc">,</code> <code class="sh_constant">NULL</code><code class="sh_misc">,</code> APR_HOOK_LAST<code class="sh_misc">)</code><code class="sh_misc">;</code>
+<code class="sh_misc">}</code>
+
+<code class="sh_comment">/*</code>
+<code class="sh_comment">&nbsp;=======================================================================================================================</code>
+<code class="sh_comment">&nbsp;&nbsp;&nbsp;&nbsp;Our example web service handler</code>
+<code class="sh_comment">&nbsp;=======================================================================================================================</code>
+<code class="sh_comment">&nbsp;*/</code>
+<code class="sh_declare">static</code> <code class="sh_declare">int</code> example_handler<code class="sh_misc">(</code>request_rec <code class="sh_misc">*</code>r<code class="sh_misc">)</code>
+<code class="sh_misc">{</code>
+    <code class="sh_declare">if</code><code class="sh_misc">(</code><code class="sh_misc">!</code>r<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">handler</code> <code class="sh_misc">|</code><code class="sh_misc">|</code> <code class="sh_function">strcmp</code><code class="sh_misc">(</code>r<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">handler</code><code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_value">example-handler</code><code class="sh_character">"</code><code class="sh_misc">)</code><code class="sh_misc">)</code> <code class="sh_declare">return</code><code class="sh_misc">(</code>DECLINED<code class="sh_misc">)</code><code class="sh_misc">;</code>
+
+    <code class="sh_comment">/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/</code>
+    example_config    <code class="sh_misc">*</code>config <code class="sh_misc">=</code> <code class="sh_misc">(</code>example_config <code class="sh_misc">*</code><code class="sh_misc">)</code> ap_get_module_config<code class="sh_misc">(</code>r<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">per_dir_config</code><code class="sh_misc">,</code> <code class="sh_misc">&amp;</code>example_module<code class="sh_misc">)</code><code class="sh_misc">;</code>
+    <code class="sh_comment">/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/</code>
+
+    ap_set_content_type<code class="sh_misc">(</code>r<code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_value">text/plain</code><code class="sh_character">"</code><code class="sh_misc">)</code><code class="sh_misc">;</code>
+    ap_rprintf<code class="sh_misc">(</code>r<code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_value">Enabled: </code><code class="sh_reference">%u</code><code class="sh_reference">\n</code><code class="sh_character">"</code><code class="sh_misc">,</code> config<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">enabled</code><code class="sh_misc">)</code><code class="sh_misc">;</code>
+    ap_rprintf<code class="sh_misc">(</code>r<code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_value">Path: </code><code class="sh_reference">%s</code><code class="sh_reference">\n</code><code class="sh_character">"</code><code class="sh_misc">,</code> config<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">path</code><code class="sh_misc">)</code><code class="sh_misc">;</code>
+    ap_rprintf<code class="sh_misc">(</code>r<code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_value">TypeOfAction: </code><code class="sh_reference">%x</code><code class="sh_reference">\n</code><code class="sh_character">"</code><code class="sh_misc">,</code> config<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">typeOfAction</code><code class="sh_misc">)</code><code class="sh_misc">;</code>
+    ap_rprintf<code class="sh_misc">(</code>r<code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_value">Context: </code><code class="sh_reference">%s</code><code class="sh_reference">\n</code><code class="sh_character">"</code><code class="sh_misc">,</code> config<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">context</code><code class="sh_misc">)</code><code class="sh_misc">;</code>
+    <code class="sh_declare">return</code> OK<code class="sh_misc">;</code>
+<code class="sh_misc">}</code>
+
+<code class="sh_comment">/*</code>
+<code class="sh_comment">&nbsp;=======================================================================================================================</code>
+<code class="sh_comment">&nbsp;&nbsp;&nbsp;&nbsp;Handler for the "exambleEnabled" directive</code>
+<code class="sh_comment">&nbsp;=======================================================================================================================</code>
+<code class="sh_comment">&nbsp;*/</code>
+<code class="sh_declare">const</code> <code class="sh_declare">char</code> <code class="sh_misc">*</code>example_set_enabled<code class="sh_misc">(</code>cmd_parms <code class="sh_misc">*</code>cmd<code class="sh_misc">,</code> <code class="sh_declare">void</code> <code class="sh_misc">*</code>cfg<code class="sh_misc">,</code> <code class="sh_declare">const</code> <code class="sh_declare">char</code> <code class="sh_misc">*</code>arg<code class="sh_misc">)</code>
+<code class="sh_misc">{</code>
+    <code class="sh_comment">/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/</code>
+    example_config    <code class="sh_misc">*</code>conf <code class="sh_misc">=</code> <code class="sh_misc">(</code>example_config <code class="sh_misc">*</code><code class="sh_misc">)</code> cfg<code class="sh_misc">;</code>
+    <code class="sh_comment">/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/</code>
+
+    <code class="sh_declare">if</code><code class="sh_misc">(</code>conf<code class="sh_misc">)</code>
+    <code class="sh_misc">{</code>
+        <code class="sh_declare">if</code><code class="sh_misc">(</code><code class="sh_misc">!</code>strcasecmp<code class="sh_misc">(</code>arg<code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_value">on</code><code class="sh_character">"</code><code class="sh_misc">)</code><code class="sh_misc">)</code>
+            conf<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">enabled</code> <code class="sh_misc">=</code> <code class="sh_reference">1</code><code class="sh_misc">;</code>
+        <code class="sh_declare">else</code>
+            conf<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">enabled</code> <code class="sh_misc">=</code> <code class="sh_reference">0</code><code class="sh_misc">;</code>
+    <code class="sh_misc">}</code>
+
+    <code class="sh_declare">return</code> <code class="sh_constant">NULL</code><code class="sh_misc">;</code>
+<code class="sh_misc">}</code>
+
+<code class="sh_comment">/*</code>
+<code class="sh_comment">&nbsp;=======================================================================================================================</code>
+<code class="sh_comment">&nbsp;&nbsp;&nbsp;&nbsp;Handler for the "examplePath" directive</code>
+<code class="sh_comment">&nbsp;=======================================================================================================================</code>
+<code class="sh_comment">&nbsp;*/</code>
+<code class="sh_declare">const</code> <code class="sh_declare">char</code> <code class="sh_misc">*</code>example_set_path<code class="sh_misc">(</code>cmd_parms <code class="sh_misc">*</code>cmd<code class="sh_misc">,</code> <code class="sh_declare">void</code> <code class="sh_misc">*</code>cfg<code class="sh_misc">,</code> <code class="sh_declare">const</code> <code class="sh_declare">char</code> <code class="sh_misc">*</code>arg<code class="sh_misc">)</code>
+<code class="sh_misc">{</code>
+    <code class="sh_comment">/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/</code>
+    example_config    <code class="sh_misc">*</code>conf <code class="sh_misc">=</code> <code class="sh_misc">(</code>example_config <code class="sh_misc">*</code><code class="sh_misc">)</code> cfg<code class="sh_misc">;</code>
+    <code class="sh_comment">/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/</code>
+
+    <code class="sh_declare">if</code><code class="sh_misc">(</code>conf<code class="sh_misc">)</code>
+    <code class="sh_misc">{</code>
+        <code class="sh_function">strcpy</code><code class="sh_misc">(</code>conf<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">path</code><code class="sh_misc">,</code> arg<code class="sh_misc">)</code><code class="sh_misc">;</code>
+    <code class="sh_misc">}</code>
+
+    <code class="sh_declare">return</code> <code class="sh_constant">NULL</code><code class="sh_misc">;</code>
+<code class="sh_misc">}</code>
+
+<code class="sh_comment">/*</code>
+<code class="sh_comment">&nbsp;=======================================================================================================================</code>
+<code class="sh_comment">&nbsp;&nbsp;&nbsp;&nbsp;Handler for the "exampleAction" directive ;</code>
+<code class="sh_comment">&nbsp;&nbsp;&nbsp;&nbsp;Let's pretend this one takes one argument (file or db), and a second (deny or allow), ;</code>
+<code class="sh_comment">&nbsp;&nbsp;&nbsp;&nbsp;and we store it in a bit-wise manner.</code>
+<code class="sh_comment">&nbsp;=======================================================================================================================</code>
+<code class="sh_comment">&nbsp;*/</code>
+<code class="sh_declare">const</code> <code class="sh_declare">char</code> <code class="sh_misc">*</code>example_set_action<code class="sh_misc">(</code>cmd_parms <code class="sh_misc">*</code>cmd<code class="sh_misc">,</code> <code class="sh_declare">void</code> <code class="sh_misc">*</code>cfg<code class="sh_misc">,</code> <code class="sh_declare">const</code> <code class="sh_declare">char</code> <code class="sh_misc">*</code>arg1<code class="sh_misc">,</code> <code class="sh_declare">const</code> <code class="sh_declare">char</code> <code class="sh_misc">*</code>arg2<code class="sh_misc">)</code>
+<code class="sh_misc">{</code>
+    <code class="sh_comment">/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/</code>
+    example_config    <code class="sh_misc">*</code>conf <code class="sh_misc">=</code> <code class="sh_misc">(</code>example_config <code class="sh_misc">*</code><code class="sh_misc">)</code> cfg<code class="sh_misc">;</code>
+    <code class="sh_comment">/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/</code>
+
+    <code class="sh_declare">if</code><code class="sh_misc">(</code>conf<code class="sh_misc">)</code>
+    <code class="sh_misc">{</code>
+        <code class="sh_misc">{</code>
+            <code class="sh_declare">if</code><code class="sh_misc">(</code><code class="sh_misc">!</code>strcasecmp<code class="sh_misc">(</code>arg1<code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_value">file</code><code class="sh_character">"</code><code class="sh_misc">)</code><code class="sh_misc">)</code>
+                conf<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">typeOfAction</code> <code class="sh_misc">=</code> <code class="sh_reference">0x01</code><code class="sh_misc">;</code>
+            <code class="sh_declare">else</code>
+                conf<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">typeOfAction</code> <code class="sh_misc">=</code> <code class="sh_reference">0x02</code><code class="sh_misc">;</code>
+            <code class="sh_declare">if</code><code class="sh_misc">(</code><code class="sh_misc">!</code>strcasecmp<code class="sh_misc">(</code>arg2<code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_value">deny</code><code class="sh_character">"</code><code class="sh_misc">)</code><code class="sh_misc">)</code>
+                conf<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">typeOfAction</code> <code class="sh_misc">+</code><code class="sh_misc">=</code> <code class="sh_reference">0x10</code><code class="sh_misc">;</code>
+            <code class="sh_declare">else</code>
+                conf<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">typeOfAction</code> <code class="sh_misc">+</code><code class="sh_misc">=</code> <code class="sh_reference">0x20</code><code class="sh_misc">;</code>
+        <code class="sh_misc">}</code>
+    <code class="sh_misc">}</code>
+
+    <code class="sh_declare">return</code> <code class="sh_constant">NULL</code><code class="sh_misc">;</code>
+<code class="sh_misc">}</code>
+
+<code class="sh_comment">/*</code>
+<code class="sh_comment">&nbsp;=======================================================================================================================</code>
+<code class="sh_comment">&nbsp;&nbsp;&nbsp;&nbsp;Function for creating new configurations for per-directory contexts</code>
+<code class="sh_comment">&nbsp;=======================================================================================================================</code>
+<code class="sh_comment">&nbsp;*/</code>
+<code class="sh_declare">void</code> <code class="sh_misc">*</code>create_dir_conf<code class="sh_misc">(</code>apr_pool_t <code class="sh_misc">*</code>pool<code class="sh_misc">,</code> <code class="sh_declare">char</code> <code class="sh_misc">*</code>context<code class="sh_misc">)</code>
+<code class="sh_misc">{</code>
+    context <code class="sh_misc">=</code> context <code class="sh_misc">?</code> context <code class="sh_misc">:</code> <code class="sh_character">"</code><code class="sh_value">Newly created configuration</code><code class="sh_character">"</code><code class="sh_misc">;</code>
+
+    <code class="sh_comment">/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/</code>
+    example_config    <code class="sh_misc">*</code>cfg <code class="sh_misc">=</code> apr_pcalloc<code class="sh_misc">(</code>pool<code class="sh_misc">,</code> <code class="sh_declare">sizeof</code><code class="sh_misc">(</code>example_config<code class="sh_misc">)</code><code class="sh_misc">)</code><code class="sh_misc">;</code>
+    <code class="sh_comment">/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/</code>
+
+    <code class="sh_declare">if</code><code class="sh_misc">(</code>cfg<code class="sh_misc">)</code>
+    <code class="sh_misc">{</code>
+        <code class="sh_misc">{</code>
+            <code class="sh_comment">/* Set some default values */</code>
+            <code class="sh_function">strcpy</code><code class="sh_misc">(</code>cfg<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">context</code><code class="sh_misc">,</code> context<code class="sh_misc">)</code><code class="sh_misc">;</code>
+            cfg<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">enabled</code> <code class="sh_misc">=</code> <code class="sh_reference">0</code><code class="sh_misc">;</code>
+            <code class="sh_function">memset</code><code class="sh_misc">(</code>cfg<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">path</code><code class="sh_misc">,</code> <code class="sh_reference">0</code><code class="sh_misc">,</code> <code class="sh_reference">256</code><code class="sh_misc">)</code><code class="sh_misc">;</code>
+            cfg<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">typeOfAction</code> <code class="sh_misc">=</code> <code class="sh_reference">0x00</code><code class="sh_misc">;</code>
+        <code class="sh_misc">}</code>
+    <code class="sh_misc">}</code>
+
+    <code class="sh_declare">return</code> cfg<code class="sh_misc">;</code>
+<code class="sh_misc">}</code>
+
+<code class="sh_comment">/*</code>
+<code class="sh_comment">&nbsp;=======================================================================================================================</code>
+<code class="sh_comment">&nbsp;&nbsp;&nbsp;&nbsp;Merging function for configurations</code>
+<code class="sh_comment">&nbsp;=======================================================================================================================</code>
+<code class="sh_comment">&nbsp;*/</code>
+<code class="sh_declare">void</code> <code class="sh_misc">*</code>merge_dir_conf<code class="sh_misc">(</code>apr_pool_t <code class="sh_misc">*</code>pool<code class="sh_misc">,</code> <code class="sh_declare">void</code> <code class="sh_misc">*</code>BASE<code class="sh_misc">,</code> <code class="sh_declare">void</code> <code class="sh_misc">*</code>ADD<code class="sh_misc">)</code>
+<code class="sh_misc">{</code>
+    <code class="sh_comment">/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/</code>
+    example_config    <code class="sh_misc">*</code>base <code class="sh_misc">=</code> <code class="sh_misc">(</code>example_config <code class="sh_misc">*</code><code class="sh_misc">)</code> BASE<code class="sh_misc">;</code>
+    example_config    <code class="sh_misc">*</code>add <code class="sh_misc">=</code> <code class="sh_misc">(</code>example_config <code class="sh_misc">*</code><code class="sh_misc">)</code> ADD<code class="sh_misc">;</code>
+    example_config    <code class="sh_misc">*</code>conf <code class="sh_misc">=</code> <code class="sh_misc">(</code>example_config <code class="sh_misc">*</code><code class="sh_misc">)</code> create_dir_conf<code class="sh_misc">(</code>pool<code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_value">Merged configuration</code><code class="sh_character">"</code><code class="sh_misc">)</code><code class="sh_misc">;</code>
+    <code class="sh_comment">/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/</code>
+
+    conf<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">enabled</code> <code class="sh_misc">=</code> <code class="sh_misc">(</code>add<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">enabled</code> <code class="sh_misc">=</code><code class="sh_misc">=</code> <code class="sh_reference">0</code><code class="sh_misc">)</code> <code class="sh_misc">?</code> base<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">enabled</code> <code class="sh_misc">:</code> add<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">enabled</code><code class="sh_misc">;</code>
+    conf<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">typeOfAction</code> <code class="sh_misc">=</code> add<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">typeOfAction</code> <code class="sh_misc">?</code> add<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">typeOfAction</code> <code class="sh_misc">:</code> base<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">typeOfAction</code><code class="sh_misc">;</code>
+    <code class="sh_function">strcpy</code><code class="sh_misc">(</code>conf<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">path</code><code class="sh_misc">,</code> <code class="sh_function">strlen</code><code class="sh_misc">(</code>add<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">path</code><code class="sh_misc">)</code> <code class="sh_misc">?</code> add<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">path</code> <code class="sh_misc">:</code> base<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">path</code><code class="sh_misc">)</code><code class="sh_misc">;</code>
+    <code class="sh_declare">return</code> conf<code class="sh_misc">;</code>
+<code class="sh_misc">}</code>
+</p>
+
+
+
+
+
+
+</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
+<div class="section">
+<h2><a name="summary" id="summary">Summing up</a></h2>
+<p>
+We have now looked at how to create simple modules for Apache HTTP Server 2.4 and 
+configuring them. What you do next is entirely up to you, but it is my 
+hope that something valuable has come out of reading this documentation. 
+If you have questions on how to further develop modules, you are welcome 
+to join our <a href="http://httpd.apache.org/lists.html">mailing lists</a> 
+or check out the rest of our documentation for further tips.
+</p>
+</div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
+<div class="section">
+<h2><a name="snippets" id="snippets">Some useful snippets of code</a></h2>
+
+<h3><a name="get_post" id="get_post">Retrieve a variable from POST form data</a></h3>
+
+
+
+<p class="source">
+<code class="sh_declare">const</code> <code class="sh_declare">char</code> <code class="sh_misc">*</code>read_post_value<code class="sh_misc">(</code><code class="sh_declare">const</code> apr_array_header_t <code class="sh_misc">*</code>fields<code class="sh_misc">,</code> <code class="sh_declare">const</code> <code class="sh_declare">char</code> <code class="sh_misc">*</code>key<code class="sh_misc">)</code> 
+<code class="sh_misc">{</code>
+    <code class="sh_comment">/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/</code>
+    <code class="sh_declare">int</code>                         i<code class="sh_misc">;</code>
+    apr_table_entry_t           <code class="sh_misc">*</code>e <code class="sh_misc">=</code> <code class="sh_reference">0</code><code class="sh_misc">;</code>
+    <code class="sh_comment">/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/</code>
+    e <code class="sh_misc">=</code> <code class="sh_misc">(</code>apr_table_entry_t <code class="sh_misc">*</code><code class="sh_misc">)</code> fields<code class="sh_misc">-</code><code class="sh_misc">&gt;</code>elts<code class="sh_misc">;</code>
+    <code class="sh_declare">for</code><code class="sh_misc">(</code>i <code class="sh_misc">=</code> <code class="sh_reference">0</code><code class="sh_misc">;</code> i <code class="sh_misc">&lt;</code> fields<code class="sh_misc">-</code><code class="sh_misc">&gt;</code>nelts<code class="sh_misc">;</code> i<code class="sh_misc">+</code><code class="sh_misc">+</code><code class="sh_misc">)</code> <code class="sh_misc">{</code>
+        <code class="sh_declare">if</code><code class="sh_misc">(</code><code class="sh_misc">!</code><code class="sh_function">strcmp</code><code class="sh_misc">(</code>e<code class="sh_misc">[</code>i<code class="sh_misc">]</code><code class="sh_misc">.</code>key<code class="sh_misc">,</code> key<code class="sh_misc">)</code><code class="sh_misc">)</code> <code class="sh_declare">return</code> e<code class="sh_misc">[</code>i<code class="sh_misc">]</code><code class="sh_misc">.</code>val<code class="sh_misc">;</code>
+    <code class="sh_misc">}</code>
+    <code class="sh_declare">return</code> <code class="sh_reference">0</code><code class="sh_misc">;</code>
+<code class="sh_misc">}</code>
+<code class="sh_declare">static</code> <code class="sh_declare">int</code> example_handler<code class="sh_misc">(</code>request_req <code class="sh_misc">*</code>r<code class="sh_misc">)</code> 
+<code class="sh_misc">{</code>
+    <code class="sh_comment">/*~~~~~~~~~~~~~~~~~~~~~~*/</code>
+    apr_array_header_t <code class="sh_misc">*</code>POST<code class="sh_misc">;</code>
+    <code class="sh_declare">const</code> <code class="sh_declare">char</code>         <code class="sh_misc">*</code>value<code class="sh_misc">;</code>
+    <code class="sh_comment">/*~~~~~~~~~~~~~~~~~~~~~~*/</code>
+    ap_parse_form_data<code class="sh_misc">(</code>r<code class="sh_misc">,</code> <code class="sh_constant">NULL</code><code class="sh_misc">,</code> <code class="sh_misc">&amp;</code>POST<code class="sh_misc">,</code> <code class="sh_misc">-</code><code class="sh_reference">1</code><code class="sh_misc">,</code> <code class="sh_reference">8192</code><code class="sh_misc">)</code><code class="sh_misc">;</code>
+    
+    value <code class="sh_misc">=</code> read_post_value<code class="sh_misc">(</code>POST<code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_value">valueA</code><code class="sh_character">"</code><code class="sh_misc">)</code><code class="sh_misc">;</code>
+    <code class="sh_declare">if</code> <code class="sh_misc">(</code><code class="sh_misc">!</code>value<code class="sh_misc">)</code> value <code class="sh_misc">=</code> <code class="sh_character">"</code><code class="sh_value">(undefined)</code><code class="sh_character">"</code><code class="sh_misc">;</code>
+    ap_rprintf<code class="sh_misc">(</code>r<code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_value">The value of valueA is: </code><code class="sh_reference">%s</code><code class="sh_character">"</code><code class="sh_misc">,</code> value<code class="sh_misc">)</code><code class="sh_misc">;</code>
+    <code class="sh_declare">return</code> OK<code class="sh_misc">;</code>
+<code class="sh_misc">}</code>
+</p>
+
+
+
+    
+    
+    <h3><a name="headers_out" id="headers_out">Printing out every HTTP header received</a></h3>
+    
+
+
+<p class="source">
+<code class="sh_declare">static</code> <code class="sh_declare">int</code> example_handler<code class="sh_misc">(</code>request_req <code class="sh_misc">*</code>r<code class="sh_misc">)</code> 
+<code class="sh_misc">{</code>
+    <code class="sh_comment">/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/</code>
+    <code class="sh_declare">const</code> apr_array_header_t    <code class="sh_misc">*</code>fields<code class="sh_misc">;</code>
+    <code class="sh_declare">int</code>                         i<code class="sh_misc">;</code>
+    apr_table_entry_t           <code class="sh_misc">*</code>e <code class="sh_misc">=</code> <code class="sh_reference">0</code><code class="sh_misc">;</code>
+    <code class="sh_comment">/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/</code>
+
+    fields <code class="sh_misc">=</code> <a href="http://apr.apache.org/docs/apr/1.4/group__apr__tables.html#gaea3005541cce67481f48ab201b5c0cf3">apr_table_elts</a><code class="sh_misc">(</code>r<code class="sh_misc">-</code><code class="sh_misc">&gt;</code>headers_in<code class="sh_misc">)</code><code class="sh_misc">;</code>
+    e <code class="sh_misc">=</code> <code class="sh_misc">(</code>apr_table_entry_t <code class="sh_misc">*</code><code class="sh_misc">)</code> fields<code class="sh_misc">-</code><code class="sh_misc">&gt;</code>elts<code class="sh_misc">;</code>
+    <code class="sh_declare">for</code><code class="sh_misc">(</code>i <code class="sh_misc">=</code> <code class="sh_reference">0</code><code class="sh_misc">;</code> i <code class="sh_misc">&lt;</code> fields<code class="sh_misc">-</code><code class="sh_misc">&gt;</code>nelts<code class="sh_misc">;</code> i<code class="sh_misc">+</code><code class="sh_misc">+</code><code class="sh_misc">)</code> <code class="sh_misc">{</code>
+        ap_rprintf<code class="sh_misc">(</code>r<code class="sh_misc">,</code> <code class="sh_character">"</code><code class="sh_value">&lt;b&gt;</code><code class="sh_reference">%s</code><code class="sh_value">&lt;/b&gt;: </code><code class="sh_reference">%s</code><code class="sh_value">&lt;br/&gt;</code><code class="sh_character">"</code><code class="sh_misc">,</code> e<code class="sh_misc">[</code>i<code class="sh_misc">]</code><code class="sh_misc">.</code>key<code class="sh_misc">,</code> e<code class="sh_misc">[</code>i<code class="sh_misc">]</code><code class="sh_misc">.</code>val<code class="sh_misc">)</code><code class="sh_misc">;</code>
+    <code class="sh_misc">}</code>
+    <code class="sh_declare">return</code> OK<code class="sh_misc">;</code>
+<code class="sh_misc">}</code>
+</p>
+
+
+
+    
+    
+    <h3><a name="request_body" id="request_body">Reading the request body into memory</a></h3>
+    
+
+
+<p class="source">
+<code class="sh_declare">static</code> <code class="sh_declare">int</code> util_read<code class="sh_misc">(</code>request_rec <code class="sh_misc">*</code>r<code class="sh_misc">,</code> <code class="sh_declare">const</code> <code class="sh_declare">char</code> <code class="sh_misc">*</code><code class="sh_misc">*</code>rbuf<code class="sh_misc">,</code> apr_off_t <code class="sh_misc">*</code>size<code class="sh_misc">)</code>
+<code class="sh_misc">{</code>
+    <code class="sh_comment">/*~~~~~~~~*/</code>
+    <code class="sh_declare">int</code> rc <code class="sh_misc">=</code> OK<code class="sh_misc">;</code>
+    <code class="sh_comment">/*~~~~~~~~*/</code>
+
+    <code class="sh_declare">if</code><code class="sh_misc">(</code><code class="sh_misc">(</code>rc <code class="sh_misc">=</code> ap_setup_client_block<code class="sh_misc">(</code>r<code class="sh_misc">,</code> REQUEST_CHUNKED_ERROR<code class="sh_misc">)</code><code class="sh_misc">)</code><code class="sh_misc">)</code> <code class="sh_misc">{</code>
+        <code class="sh_declare">return</code><code class="sh_misc">(</code>rc<code class="sh_misc">)</code><code class="sh_misc">;</code>
+    <code class="sh_misc">}</code>
+
+    <code class="sh_declare">if</code><code class="sh_misc">(</code>ap_should_client_block<code class="sh_misc">(</code>r<code class="sh_misc">)</code><code class="sh_misc">)</code> <code class="sh_misc">{</code>
+
+        <code class="sh_comment">/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/</code>
+        <code class="sh_declare">char</code>         argsbuffer<code class="sh_misc">[</code>HUGE_STRING_LEN<code class="sh_misc">]</code><code class="sh_misc">;</code>
+        apr_off_t    rsize<code class="sh_misc">,</code> len_read<code class="sh_misc">,</code> rpos <code class="sh_misc">=</code> <code class="sh_reference">0</code><code class="sh_misc">;</code>
+        apr_off_t length <code class="sh_misc">=</code> r<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">remaining</code><code class="sh_misc">;</code>
+        <code class="sh_comment">/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/</code>
+
+        <code class="sh_misc">*</code>rbuf <code class="sh_misc">=</code> <code class="sh_misc">(</code><code class="sh_declare">const</code> <code class="sh_declare">char</code> <code class="sh_misc">*</code><code class="sh_misc">)</code> apr_pcalloc<code class="sh_misc">(</code>r<code class="sh_misc">-</code><code class="sh_misc">&gt;</code><code class="sh_subobject">pool</code><code class="sh_misc">,</code> <code class="sh_misc">(</code>apr_size_t<code class="sh_misc">)</code> <code class="sh_misc">(</code>length <code class="sh_misc">+</code> <code class="sh_reference">1</code><code class="sh_misc">)</code><code class="sh_misc">)</code><code class="sh_misc">;</code>
+        <code class="sh_misc">*</code>size <code class="sh_misc">=</code> length<code class="sh_misc">;</code>
+        <code class="sh_declare">while</code><code class="sh_misc">(</code><code class="sh_misc">(</code>len_read <code class="sh_misc">=</code> ap_get_client_block<code class="sh_misc">(</code>r<code class="sh_misc">,</code> argsbuffer<code class="sh_misc">,</code> <code class="sh_declare">sizeof</code><code class="sh_misc">(</code>argsbuffer<code class="sh_misc">)</code><code class="sh_misc">)</code><code class="sh_misc">)</code> <code class="sh_misc">&gt;</code> <code class="sh_reference">0</code><code class="sh_misc">)</code> <code class="sh_misc">{</code>
+            <code class="sh_declare">if</code><code class="sh_misc">(</code><code class="sh_misc">(</code>rpos <code class="sh_misc">+</code> len_read<code class="sh_misc">)</code> <code class="sh_misc">&gt;</code> length<code class="sh_misc">)</code> <code class="sh_misc">{</code>
+                rsize <code class="sh_misc">=</code> length <code class="sh_misc">-</code> rpos<code class="sh_misc">;</code>
+            <code class="sh_misc">}</code>
+            <code class="sh_declare">else</code> <code class="sh_misc">{</code>
+                rsize <code class="sh_misc">=</code> len_read<code class="sh_misc">;</code>
+            <code class="sh_misc">}</code>
+
+            <code class="sh_function">memcpy</code><code class="sh_misc">(</code><code class="sh_misc">(</code><code class="sh_declare">char</code> <code class="sh_misc">*</code><code class="sh_misc">)</code> <code class="sh_misc">*</code>rbuf <code class="sh_misc">+</code> rpos<code class="sh_misc">,</code> argsbuffer<code class="sh_misc">,</code> <code class="sh_misc">(</code><code class="sh_function">size_t</code><code class="sh_misc">)</code> rsize<code class="sh_misc">)</code><code class="sh_misc">;</code>
+            rpos <code class="sh_misc">+</code><code class="sh_misc">=</code> rsize<code class="sh_misc">;</code>
+        <code class="sh_misc">}</code>
+    <code class="sh_misc">}</code>
+    <code class="sh_declare">return</code><code class="sh_misc">(</code>rc<code class="sh_misc">)</code><code class="sh_misc">;</code>
+<code class="sh_misc">}</code>
+
+<code class="sh_declare">static</code> <code class="sh_declare">int</code> example_handler<code class="sh_misc">(</code>request_req<code class="sh_misc">*</code> r<code class="sh_misc">)</code> 
+<code class="sh_misc">{</code>
+    <code class="sh_comment">/*~~~~~~~~~~~~~~~~*/</code>
+    apr_off_t   size<code class="sh_misc">;</code>
+    <code class="sh_declare">const</code> <code class="sh_declare">char</code>  <code class="sh_misc">*</code>buffer<code class="sh_misc">;</code>
+    <code class="sh_comment">/*~~~~~~~~~~~~~~~~*/</code>
+
+    <code class="sh_declare">if</code><code class="sh_misc">(</code>util_read<code class="sh_misc">(</code>r<code class="sh_misc">,</code> <code class="sh_misc">&amp;</code>data<code class="sh_misc">,</code> <code class="sh_misc">&amp;</code>size<code class="sh_misc">)</code> <code class="sh_misc">=</code><code class="sh_misc">=</code> OK<code class="sh_misc">)</code> <code class="sh_misc">{</code>
+        ap_rprintf<code class="sh_misc">(</code><code class="sh_character">"</code><code class="sh_value">We read a request body that was </code><code class="sh_reference">%u</code><code class="sh_value"> bytes long</code><code class="sh_character">"</code><code class="sh_misc">,</code> size<code class="sh_misc">)</code><code class="sh_misc">;</code>
+    <code class="sh_misc">}</code>
+    <code class="sh_declare">return</code> OK<code class="sh_misc">;</code>
+<code class="sh_misc">}</code>
+    </p>
+
+
+
+    
+
+</div></div>
+<div class="bottomlang">
+<p><span>Available Languages: </span><a href="../en/developer/modguide.html" title="English">&nbsp;en&nbsp;</a></p>
+</div><div id="footer">
+<p class="apache">Copyright 2012 The Apache Software Foundation.<br />Licensed under the <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p>
+<p class="menu"><a href="../mod/">Modules</a> | <a href="../mod/directives.html">Directives</a> | <a href="../faq/">FAQ</a> | <a href="../glossary.html">Glossary</a> | <a href="../sitemap.html">Sitemap</a></p></div>
 </body></html>
\ No newline at end of file
index bd3dbfe731ec32eaf73cbdcff2f7c1ab72486925..8c1f313d5333505cdca8ee271e6a3b540cfd7c19 100644 (file)
@@ -27,6 +27,7 @@
 <a href="../ko/mod/mod_alias.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a> |
 <a href="../tr/mod/mod_alias.html" title="Türkçe">&nbsp;tr&nbsp;</a></p>
 </div>
+<div class="outofdate">Bu çeviri güncel olmayabilir. Son değişiklikler için İngilizce sürüm geçerlidir.</div>
 <table class="module"><tr><th><a href="module-dict.html#Description">Açıklama:</a></th><td>Belge ağacının parçalarının dosya sisteminin parçalarıyla
 eşlenmesini sağlar ve URL yönlendirmesi yapar.</td></tr>
 <tr><th><a href="module-dict.html#Status">Durum:</a></th><td>Temel</td></tr>
index d83657f9fafbe81d751ed120da80c0c98357d5ef..547a2db7730dd46f16c2efb9093f87bd098e5028 100644 (file)
@@ -8,7 +8,7 @@
 
   <variants>
     <variant>en</variant>
-    <variant outdated="yes">fr</variant>
+    <variant>fr</variant>
     <variant outdated="yes">ja</variant>
     <variant outdated="yes">ko</variant>
     <variant outdated="yes">tr</variant>
index ec0748447de25da4b613e0f0a91765b0b88dd4d6..ad71964c7bce071e4823c7b225c52fda44a1918e 100644 (file)
@@ -27,6 +27,7 @@
 <a href="../ko/mod/mod_dir.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a> |
 <a href="../tr/mod/mod_dir.html" title="Türkçe">&nbsp;tr&nbsp;</a></p>
 </div>
+<div class="outofdate">Bu çeviri güncel olmayabilir. Son değişiklikler için İngilizce sürüm geçerlidir.</div>
 <table class="module"><tr><th><a href="module-dict.html#Description">Açıklama:</a></th><td>Bölü çizgisiyle biten yönlendirmeleri yapar ve dizin içeriği dosyalarını sunar.</td></tr>
 <tr><th><a href="module-dict.html#Status">Durum:</a></th><td>Temel</td></tr>
 <tr><th><a href="module-dict.html#ModuleIdentifier">Modül Betimleyici:</a></th><td>dir_module</td></tr>
index 0fa52ec5c84b59e2da1b3614244a2f2ea058f911..e8a3ce0549251bd4366fc92d6eb4794dc559d7a5 100644 (file)
@@ -8,7 +8,7 @@
 
   <variants>
     <variant>en</variant>
-    <variant outdated="yes">fr</variant>
+    <variant>fr</variant>
     <variant outdated="yes">ja</variant>
     <variant outdated="yes">ko</variant>
     <variant outdated="yes">tr</variant>
index 346fdf1cde5cafb2bd249d1d3f8a3ed434c3ddcf..1d1f9b313ca7ddc7678267e9b290669925686295 100644 (file)
@@ -26,6 +26,8 @@
 <a href="../ja/mod/mod_expires.html" hreflang="ja" rel="alternate" title="Japanese">&nbsp;ja&nbsp;</a> |
 <a href="../ko/mod/mod_expires.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a></p>
 </div>
+<div class="outofdate">Cette traduction peut être périmée. Vérifiez la version
+            anglaise pour les changements récents.</div>
 <table class="module"><tr><th><a href="module-dict.html#Description">Description:</a></th><td>Génération des en-têtes HTTP <code>Expires</code> et
 <code>Cache-Control</code> en fonction de critères spécifiés par
 l'utilisateur</td></tr>
index 0d4e49498eb67421f3e0e4a14dd233550c63572d..c77d49253c3a6b5571ba02b4971ffae6fac8c5dd 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0"?>
 <!DOCTYPE modulesynopsis SYSTEM "../style/modulesynopsis.dtd">
 <?xml-stylesheet type="text/xsl" href="../style/manual.fr.xsl"?>
-<!-- English Revision : 1307367 -->
+<!-- English Revision: 1307367:1174747 (outdated) -->
 <!-- French translation : Lucien GENTIS -->
 <!-- Reviewed by : Vincent Deffontaines -->
 
index ab628dbe067154951b30fdf7cc08432543f71dcb..f07ca79a8d65ed7d4fe5ad70d81b1dc28edd31db 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE modulesynopsis SYSTEM "../style/modulesynopsis.dtd">
 <?xml-stylesheet type="text/xsl" href="../style/manual.ja.xsl"?>
-<!-- English Revision: 420990:1307367 (outdated) -->
+<!-- English Revision: 420990:1174747 (outdated) -->
 
 <!--
  Licensed to the Apache Software Foundation (ASF) under one or more
index 30cf5e1eb1f3cc01c82e1d16b77455d8d09082b2..159e38c43b88e0a073183e3c75b0e30f3a41e4f7 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="EUC-KR" ?>
 <!DOCTYPE modulesynopsis SYSTEM "../style/modulesynopsis.dtd">
 <?xml-stylesheet type="text/xsl" href="../style/manual.ko.xsl"?>
-<!-- English Revision: 420990:1307367 (outdated) -->
+<!-- English Revision: 420990:1174747 (outdated) -->
 
 <!--
  Licensed to the Apache Software Foundation (ASF) under one or more
index 1480cdc891706e22b38ff1f4abc583502acf4819..ef8780eb20d7751ddf989786281a956f2ea4e67d 100644 (file)
@@ -8,7 +8,7 @@
 
   <variants>
     <variant>en</variant>
-    <variant>fr</variant>
+    <variant outdated="yes">fr</variant>
     <variant outdated="yes">ja</variant>
     <variant outdated="yes">ko</variant>
   </variants>
index 80d323e1f8940a37e65066437b12d956eca88ea4..6196d75922158bd37e4c50d42ed52d9aa3a316c4 100644 (file)
@@ -55,7 +55,7 @@ provides the <code>byrequests</code> load balancing method..</p>
     of the number of requests. It works as follows:</p>
 
     <p><dfn>lbfactor</dfn> is <em>how much we expect this worker
-    to work</em>, or <em>the workers's work quota</em>. This is
+    to work</em>, or <em>the workers' work quota</em>. This is
     a normalized value representing their "share" of the amount of
     work to be done.</p>
 
index dc6a4b0a36344de8b255a8e01b9c732a7354f485..01427b2e731e7f32045aaa1b5a200056e90701dc 100644 (file)
@@ -24,6 +24,7 @@
 <p><span>Mevcut Diller: </span><a href="../en/mod/mod_vhost_alias.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
 <a href="../tr/mod/mod_vhost_alias.html" title="Türkçe">&nbsp;tr&nbsp;</a></p>
 </div>
+<div class="outofdate">Bu çeviri güncel olmayabilir. Son değişiklikler için İngilizce sürüm geçerlidir.</div>
 <table class="module"><tr><th><a href="module-dict.html#Description">Açıklama:</a></th><td>Kitlesel sanal konakların devingen olarak yapılandırılmasını sağlar</td></tr>
 <tr><th><a href="module-dict.html#Status">Durum:</a></th><td>Eklenti</td></tr>
 <tr><th><a href="module-dict.html#ModuleIdentifier">Modül Betimleyici:</a></th><td>vhost_alias_module</td></tr>
index d4e292b042d06a93520cb4b2eef881eb42d2256a..7355505e4a763b363e04825b1bb34af8267551d7 100644 (file)
@@ -26,6 +26,7 @@
 <a href="../ja/mod/mpm_common.html" hreflang="ja" rel="alternate" title="Japanese">&nbsp;ja&nbsp;</a> |
 <a href="../tr/mod/mpm_common.html" title="Türkçe">&nbsp;tr&nbsp;</a></p>
 </div>
+<div class="outofdate">Bu çeviri güncel olmayabilir. Son değişiklikler için İngilizce sürüm geçerlidir.</div>
 <table class="module"><tr><th><a href="module-dict.html#Description">Açıklama:</a></th><td>Birden fazla Çok Süreçlilik Modülü (MPM) tarafından gerçeklenmiş
   yönergeler bütünü.</td></tr>
 <tr><th><a href="module-dict.html#Status">Durum:</a></th><td>MPM</td></tr></table>
index b84468658d1014f0fdcad187bf7de30f996fb1c9..822f9463be2b5bfd8c9530a61bf80b8ebc3ee2c2 100644 (file)
@@ -32,7 +32,7 @@
     <p>The Server consists of a main, parent process and a small, static
     number of child processes.</p>
 
-    <p>The parent process's job is to manage the child processes. This
+    <p>The parent process' job is to manage the child processes. This
     involves spawning children as required to ensure there are always
     <code class="directive"><a href="../mod/mpm_common.html#startservers">StartServers</a></code> processes
     accepting connections.</p>
index abb6476d0c8b7b63bedda8f4b9ce3f7a4f067349..4eb2a3fa4804288029f11cefdad365c0c22feb3b 100644 (file)
@@ -1010,7 +1010,7 @@ for a given virtual host</td></tr>
 IP-Adressen angewendet werden</td></tr>
 <tr><td><a href="mod_vhost_alias.html#virtualscriptalias">VirtualScriptAlias <em>interpolated-directory</em>|none</a></td><td> none </td><td>sv</td><td>E</td></tr><tr><td class="descr" colspan="4">Dynamically configure the location of the CGI directory for
 a given virtual host</td></tr>
-<tr class="odd"><td><a href="mod_vhost_alias.html#virtualscriptaliasip">VirtualScriptAliasIP <em>interpolated-directory</em>|none</a></td><td> none </td><td>sv</td><td>E</td></tr><tr class="odd"><td class="descr" colspan="4">Dynamically configure the location of the cgi directory for
+<tr class="odd"><td><a href="mod_vhost_alias.html#virtualscriptaliasip">VirtualScriptAliasIP <em>interpolated-directory</em>|none</a></td><td> none </td><td>sv</td><td>E</td></tr><tr class="odd"><td class="descr" colspan="4">Dynamically configure the location of the CGI directory for
 a given virtual host</td></tr>
 <tr><td><a href="mod_watchdog.html#watchdoginterval" id="W" name="W">WatchdogInterval <var>number-of-seconds</var></a></td><td> 1 </td><td>s</td><td>B</td></tr><tr><td class="descr" colspan="4">Watchdog interval in seconds</td></tr>
 <tr class="odd"><td><a href="mod_include.html#xbithack" id="X" name="X">XBitHack on|off|full</a></td><td> off </td><td>svdh</td><td>B</td></tr><tr class="odd"><td class="descr" colspan="4">Parse SSI directives in files with the execute bit
index 92290ff12d43851cc93593898864716976c91e5c..366b4e1f416f24fc5c4cc7e7716632669dfb63ed 100644 (file)
@@ -1000,7 +1000,7 @@ for a given virtual host</td></tr>
 hostname or IP address</td></tr>
 <tr><td><a href="mod_vhost_alias.html#virtualscriptalias">VirtualScriptAlias <em>interpolated-directory</em>|none</a></td><td> none </td><td>sv</td><td>E</td></tr><tr><td class="descr" colspan="4">Dynamically configure the location of the CGI directory for
 a given virtual host</td></tr>
-<tr class="odd"><td><a href="mod_vhost_alias.html#virtualscriptaliasip">VirtualScriptAliasIP <em>interpolated-directory</em>|none</a></td><td> none </td><td>sv</td><td>E</td></tr><tr class="odd"><td class="descr" colspan="4">Dynamically configure the location of the cgi directory for
+<tr class="odd"><td><a href="mod_vhost_alias.html#virtualscriptaliasip">VirtualScriptAliasIP <em>interpolated-directory</em>|none</a></td><td> none </td><td>sv</td><td>E</td></tr><tr class="odd"><td class="descr" colspan="4">Dynamically configure the location of the CGI directory for
 a given virtual host</td></tr>
 <tr><td><a href="mod_watchdog.html#watchdoginterval" id="W" name="W">WatchdogInterval <var>number-of-seconds</var></a></td><td> 1 </td><td>s</td><td>B</td></tr><tr><td class="descr" colspan="4">Watchdog interval in seconds</td></tr>
 <tr class="odd"><td><a href="mod_include.html#xbithack" id="X" name="X">XBitHack on|off|full</a></td><td> off </td><td>svdh</td><td>B</td></tr><tr class="odd"><td class="descr" colspan="4">Parse SSI directives in files with the execute bit
index 357803ec9cda377948a113e08c373ae2bc2090ff..a838b2c54333ec5a40115bc8f79b0ae88d6a1090 100644 (file)
@@ -930,7 +930,7 @@ for a given virtual host</td></tr>
 囲む</td></tr>
 <tr><td><a href="mod_vhost_alias.html#virtualscriptalias">VirtualScriptAlias <em>interpolated-directory</em>|none</a></td><td> none </td><td>sv</td><td>E</td></tr><tr><td class="descr" colspan="4">Dynamically configure the location of the CGI directory for
 a given virtual host</td></tr>
-<tr class="odd"><td><a href="mod_vhost_alias.html#virtualscriptaliasip">VirtualScriptAliasIP <em>interpolated-directory</em>|none</a></td><td> none </td><td>sv</td><td>E</td></tr><tr class="odd"><td class="descr" colspan="4">Dynamically configure the location of the cgi directory for
+<tr class="odd"><td><a href="mod_vhost_alias.html#virtualscriptaliasip">VirtualScriptAliasIP <em>interpolated-directory</em>|none</a></td><td> none </td><td>sv</td><td>E</td></tr><tr class="odd"><td class="descr" colspan="4">Dynamically configure the location of the CGI directory for
 a given virtual host</td></tr>
 <tr><td><a href="mod_watchdog.html#watchdoginterval" id="W" name="W">WatchdogInterval <var>number-of-seconds</var></a></td><td> 1 </td><td>s</td><td>B</td></tr><tr><td class="descr" colspan="4">Watchdog interval in seconds</td></tr>
 <tr class="odd"><td><a href="mod_include.html#xbithack" id="X" name="X">XBitHack on|off|full</a></td><td> off </td><td>svdh</td><td>B</td></tr><tr class="odd"><td class="descr" colspan="4">実行ビットが設定されたファイルの SSI ディレクティブを
index 330c338977869fa96df4ca296ed24ef85a000a70..e9a2099d5607c4ae4590501c0bd14531d7167afd 100644 (file)
@@ -953,7 +953,7 @@ for a given virtual host</td></tr>
 hostname or IP address</td></tr>
 <tr><td><a href="mod_vhost_alias.html#virtualscriptalias">VirtualScriptAlias <em>interpolated-directory</em>|none</a></td><td> none </td><td>sv</td><td>E</td></tr><tr><td class="descr" colspan="4">Dynamically configure the location of the CGI directory for
 a given virtual host</td></tr>
-<tr class="odd"><td><a href="mod_vhost_alias.html#virtualscriptaliasip">VirtualScriptAliasIP <em>interpolated-directory</em>|none</a></td><td> none </td><td>sv</td><td>E</td></tr><tr class="odd"><td class="descr" colspan="4">Dynamically configure the location of the cgi directory for
+<tr class="odd"><td><a href="mod_vhost_alias.html#virtualscriptaliasip">VirtualScriptAliasIP <em>interpolated-directory</em>|none</a></td><td> none </td><td>sv</td><td>E</td></tr><tr class="odd"><td class="descr" colspan="4">Dynamically configure the location of the CGI directory for
 a given virtual host</td></tr>
 <tr><td><a href="mod_watchdog.html#watchdoginterval" id="W" name="W">WatchdogInterval <var>number-of-seconds</var></a></td><td> 1 </td><td>s</td><td>B</td></tr><tr><td class="descr" colspan="4">Watchdog interval in seconds</td></tr>
 <tr class="odd"><td><a href="mod_include.html#xbithack" id="X" name="X">XBitHack on|off|full</a></td><td> off </td><td>svdh</td><td>B</td></tr><tr class="odd"><td class="descr" colspan="4">Parse SSI directives in files with the execute bit
index 6d0bedbe3fd3d853f69a7a933a54dde40a3c22e7..faeff86f3fe9e3df53f78ce08d18449525be0b18 100644 (file)
@@ -987,7 +987,7 @@ for a given virtual host</td></tr>
 hostname or IP address</td></tr>
 <tr><td><a href="mod_vhost_alias.html#virtualscriptalias">VirtualScriptAlias <em>interpolated-directory</em>|none</a></td><td> none </td><td>sv</td><td>E</td></tr><tr><td class="descr" colspan="4">Dynamically configure the location of the CGI directory for
 a given virtual host</td></tr>
-<tr class="odd"><td><a href="mod_vhost_alias.html#virtualscriptaliasip">VirtualScriptAliasIP <em>interpolated-directory</em>|none</a></td><td> none </td><td>sv</td><td>E</td></tr><tr class="odd"><td class="descr" colspan="4">Dynamically configure the location of the cgi directory for
+<tr class="odd"><td><a href="mod_vhost_alias.html#virtualscriptaliasip">VirtualScriptAliasIP <em>interpolated-directory</em>|none</a></td><td> none </td><td>sv</td><td>E</td></tr><tr class="odd"><td class="descr" colspan="4">Dynamically configure the location of the CGI directory for
 a given virtual host</td></tr>
 <tr><td><a href="mod_watchdog.html#watchdoginterval" id="W" name="W">WatchdogInterval <var>number-of-seconds</var></a></td><td> 1 </td><td>s</td><td>B</td></tr><tr><td class="descr" colspan="4">Watchdog interval in seconds</td></tr>
 <tr class="odd"><td><a href="mod_include.html#xbithack" id="X" name="X">XBitHack on|off|full</a></td><td> off </td><td>svdh</td><td>B</td></tr><tr class="odd"><td class="descr" colspan="4">Parse SSI directives in files with the execute bit
index ef6abef70b22b22eb0c005d625c91cfcb7499149..83c5e6f263a138a8c01e80d94ebc4373ed3a347f 100644 (file)
@@ -89,7 +89,7 @@
       <dd>Resolve hostnames for IP-addresses in Apache
       logfiles</dd>
 
-      <dt><a href="other.html#log_server_status">log_server_status</a></dt>
+      <dt><code class="program"><a href="../programs/log_server_status.html">log_server_status</a></code></dt>
 
       <dd>Periodically log the server's status</dd>
 
@@ -97,7 +97,7 @@
 
       <dd>Rotate Apache logs without having to kill the server</dd>
 
-      <dt><a href="other.html#split-logfile">split-logfile</a></dt>
+      <dt><code class="program"><a href="../programs/split-logfile.html">split-logfile</a></code></dt>
 
       <dd>Split a multi-vhost logfile into per-host logfiles</dd>
 
index edd42b13e1f46e9d7b426ca91f1fa60fb3d95f1e..5cffa9bea89e40fafa7d2d681e141a3ba33d5738 100644 (file)
@@ -89,8 +89,7 @@
       <dd>Resolve hostnames for IP-addresses in Apache
       logfiles</dd>
 
-      <dt><a
-      href="other.html#log_server_status">log_server_status</a></dt>
+      <dt><program>log_server_status</program></dt>
 
       <dd>Periodically log the server's status</dd>
 
@@ -98,7 +97,7 @@
 
       <dd>Rotate Apache logs without having to kill the server</dd>
 
-      <dt><a href="other.html#split-logfile">split-logfile</a></dt>
+      <dt><program>split-logfile</program></dt>
 
       <dd>Split a multi-vhost logfile into per-host logfiles</dd>
 
index 405691d6afdac15a8a350f21394095642d2e90a5..9d51904e7ba4e9ebe97a0d41df9da5f173c74222 100644 (file)
@@ -8,6 +8,6 @@
 
   <variants>
     <variant>en</variant>
-    <variant outdated="yes">fr</variant>
+    <variant>fr</variant>
   </variants>
 </metafile>
index 4aaf18c10e4932e710cc8073c57cca4edfdf6fb9..7b111f2826b2994234561986568abbdcb4a515e1 100644 (file)
@@ -23,6 +23,7 @@
 <a href="../tr/rewrite/" title="Türkçe">&nbsp;tr&nbsp;</a> |
 <a href="../zh-cn/rewrite/" hreflang="zh-cn" rel="alternate" title="Simplified Chinese">&nbsp;zh-cn&nbsp;</a></p>
 </div>
+<div class="outofdate">Bu çeviri güncel olmayabilir. Son değişiklikler için İngilizce sürüm geçerlidir.</div>
 
     <p><code class="module"><a href="../mod/mod_rewrite.html">mod_rewrite</a></code> modülü gelen URL isteklerinde değişiklik
       yapabilmek için <a href="intro.html#regex">düzenli ifade</a> kurallarına
index 96567025f086a6a208ce625d2f5661389b6349c8..25046eafe9eadc6ffc0a8f5972183a2cfa1713b3 100644 (file)
@@ -8,7 +8,7 @@
 
   <variants>
     <variant>en</variant>
-    <variant outdated="yes">fr</variant>
+    <variant>fr</variant>
     <variant outdated="yes">tr</variant>
     <variant outdated="yes">zh-cn</variant>
   </variants>
index bb07094238110ba97c62b545c2f4cb8d9640cee1..e3d1a6abf883ffc968f02cde0d0bf3b24e2b5388 100644 (file)
@@ -21,8 +21,6 @@
 <p><span>Langues Disponibles: </span><a href="../en/rewrite/tech.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
 <a href="../fr/rewrite/tech.html" title="Français">&nbsp;fr&nbsp;</a></p>
 </div>
-<div class="outofdate">Cette traduction peut être périmée. Vérifiez la version
-            anglaise pour les changements récents.</div>
 
 <p>Ce document passe en revue certains détails techniques à propos du
 module mod_rewrite et de la mise en correspondance des URLs</p>
@@ -160,7 +158,7 @@ correspondance</a></li><li><a href="access.html">Contr
       contrôle est un peu compliqué. Voir la figure 1 pour plus de
       détails.</p>
 <p class="figure">
-      <img src="../images/rewrite_rule_flow.png" alt="Flux des comparaisons des directives RewriteRule et RewriteCond" /><br />
+      <img src="../images/rewrite_process_uri.png" alt="Flux des comparaisons des directives RewriteRule et RewriteCond" /><br />
       <dfn>Figure 1:</dfn>Déroulement du contrôle à travers le jeu de
       règles de réécriture
 </p>
index f8fb2f4fda6e95795ba44d1ff66ee522d4b44474..09c2c3974647fdd2672ca8170ad926be08bb7228 100644 (file)
@@ -8,6 +8,6 @@
 
   <variants>
     <variant>en</variant>
-    <variant outdated="yes">fr</variant>
+    <variant>fr</variant>
   </variants>
 </metafile>