README for Apache 2.0 Example Module
[April, 1997, updated May 2000]

The files in the src/modules/example directory under the Apache
distribution directory tree are provided as an example to those that
wish to write modules that use the Apache API.

The main file is mod_example.c, which illustrates all the different
callback mechanisms and call syntaces.  By no means does an add-on
module need to include routines for all of the callbacks - quite the
contrary!

The example module is an actual working module.  If you link it into
your server, enable the "example-handler" handler for a location, and then
browse to that location, you will see a display of some of the tracing
the example module did as the various callbacks were made.

To include the example module in your server run `./configure
--enable-example` in the src directory before running `make`.

To add another module of your own:

    A. mkdir src/modules/mymodule
    B. cp src/modules/example/* src/modules/mymodule
    C. Modify the files in the new directory
    D. Build the server as above, with appropriate changes.

To activate the example module, include a block similar to the
following in your httpd.conf file:

    <Location /example-info>
	SetHandler example-handler
    </Location>

As an alternative, you can put the following into a .htaccess file and
then request the file "test.example" from that location:

    AddHandler example-handler .example

After reloading/restarting your server, you should be able to browse
to this location and see the brief display mentioned earlier.
