
                    Apache HTTP Server Request Library

  What is it?
  -----------
  httpd-apreq is subproject of the Apache HTTP Server Project 
  whose committers develop and maintain the libapreq C library
  and its language bindings for Perl (contributions for additional 
  language bindings are most welcome).

  libapreq is a safe, standards-compliant, high-performance library 
  used for parsing HTTP cookies, query-strings and POST data.  The 
  original version (libapreq-1.X) was designed by Lincoln Stein and Doug 
  MacEachern.  The perl APIs Apache::Request and Apache::Cookie are the
  lightweight mod_perl analogs of the CGI and CGI::Cookie perl modules.

  Version 2 of libapreq is an improved codebase designed around APR
  and Apache-2's input filter API.  The C codebase is separated into
  two independent components:

        1) libapreq2, the shared library.  This library is based 
           solely on libapr and libaprutil, and requires linking
           applications to provide stub code for the apreq_env
           interface (defined by the "apreq_env.h" header file).
           The source files for libapreq2 are in the src/ directory.

        2) A collection of "environment" modules which provide the
           aforementioned supporting functions for the apreq_env API.
           The modules' source files are in the env/ directory.
           Two supported modules are now available

                1) an Apache 2 filter module - mod_apreq.c,

                2) the default CGI module included in libapreq2.

  Version 2 also includes the perl APIs for libapreq2- Apache::Request 
  and Apache::Cookie.  The corresponding XS modules are generated in
  perl/glue/xs by ExtUtils::XSBuilder, which is based on the new build 
  system created specifically for modperl-2.


  The Latest Version
  ------------------

  Details of the latest version can be found on the libapreq
  project page at 

                http://httpd.apache.org/apreq


  Documentation
  -------------

  The documentation is in the docs/ directory.  It is
  based on Doxygen, and can be regenerated by typing

        % make docs

  in the main directory.


  Installation
  ------------

  For full details please consult the INSTALL file.  Briefly,
  to install just the C API (libapreq2 + environment modules)
  on a Unix-like system:

            % ./configure --with-apache2-apxs=/path/to/apache2/bin/apxs
            % make
            % make test
            % make install

   To build and install the perl API as well, either add
   the "--enable-perl-glue" configure option, or let Makefile.PL
   enable it for you:

            % perl Makefile.PL --with-apache2-apxs=/path/to/apache2/bin/apxs
            % make
            % make test 
            % make install

  Licensing
  ---------

  Please see the file called LICENSE.


  Contacts
  --------

     o Project homepage:

        http://httpd.apache.org/apreq/

     o Mailing Lists:

        user lists:
               C/C++ API - modules@apache.org
                Perl API - modperl@perl.apache.org
                 Tcl API - XXX
                Java API - XXX
              Python API - XXX

        developer list (bugs, patches, code contributions, etc.):
                apreq-dev@httpd.apache.org


  Acknowledgments
  ----------------

  We wish to acknowledge the following copyrighted works that
  make up portions of the Apache software:

  libapreq2 relies heavily on the use of the GNU auto-tools 
  to provide a build environment.  The tests are based on 
  the Apache::Test, Test::Harness and Test::Inline.

  Doxygen generates the documentation for libapreq2. The perl glue
  and pods are generated by ExtUtils::XSBuilder.
