Last modified at [$Date$]   -*-text-*-
/** @page apreq_status STATUS

     2.05-dev in development.

Contributors looking for a mission:

    - just do an egrep on "TODO" or "XXX" and see what's there


CURRENT RELEASE NOTES:

    - This is the multi-env-unstable branch.  It is a work-in-progress
      which attempts to refactor our C interfaces to provide a more 
      robust module API.  This refactoring effort will propagate 
      into the perl glue as well, once the C API changes settle into 
      place.

    - This is a developer release, indicated by the "-dev" suffix on the
      version string. We believe the core interfaces to be stable, but some
      portions of the API may still need significant modification. Thus,
      binary/source compatibility may be broken from one developer release to
      the next. In particular the version numbering rules specified at 

          http://apr.apache.org/versioning.html

      do not apply to developer releases.


RELEASE SHOWSTOPPERS:

    - The api docs and perl glue are currently broken.


CURRENT VOTES:

    - Should we switch to EU::MM for determining the full path to perl?
      The problem is that some folks move their perl binary post-installation,
      but never adjust Config.pm.  EU::MM is smart, by accepting a 
      full path in $^X or by searching the user's $PATH for $^X, before
      resorting to Config.pm.  However, if we change apreq2, we should also
      lobby test-dev to adopt the same solution for Apache::Test.  Otherwise
      our test suite will likely fail, even though the rest of the perl build
      system will presumably still work.

            +1: joes
             0:
            -1:


TODO:

    - Introduce APR::Request::Parser and APR::Request::Hook.  Implement
      Apache2::Request::new's UPLOAD_HOOK using them.

    - Move module/t to module/apache2/t.

    - Figure out how and where the apreq_xs_ headers, and typemap file,
      should be installed.

    - Write tests for the apache 1.3.x module.

    - Fix the broken make dependencies, especially in the module 
      and glue subdirs.  The libtool workaround (for OSX IIRC) 
      that copies module/.libs to module/t is especially bogus.

    - Consider dropping ExtUtils::XSBuilder as the C API is fairly
      stable now.  The header parsing + xs generation stuff may be too 
      difficult for the community to maintain over ordinary .xs files.

    - Round out the unit tests in library/t.  Ideally each
      API function should have its own tests, and each possible
      error status should be both tested & documented.  Also
      upgrade these tests to use the Apache::Test framework.

    - Fix all the "//apreq_log" comments in the cgi tests.

    - Let hooks interrupt parsers via APREQ_ERROR_INTERRUPT.  
      Need a delete_hook method to make interrupts a useful
      way of tuning parser behavior.

      [joes] Interrupts may not be worth the extra effort, so I don't 
             plan to pursue this.  We have more important issues 
             to deal with prior to release, and nobody has ever 
             asked for this feature in apreq2.

    - Add a "memory_limit" setting to apreq_parser_t and apreq_module_t, 
      which will control how much pool allocation the parser may use.

    - Add a "header_limit" setting to control outgoing header size
      (mainly for baking cookies) instead of using a compiled-in limit.

    - in glue/perl/t/apreq/cgi.t on Win32, printing to the error log
      hangs if the strings involved are about 10000 in size.
      This doesn't occur in the env/cgi tests - why?

    - Why must fprintf(stderr, ...), rather than
      apr_file_printf(err, ...), be used on Win32 in
      cgi_log() of src/apreq_env.c?

    - Get env/ (Apache::Test) tests to work for --with-apache2-src option.
      Also add a test to configure that prevents simultaneous use of
      --with-apache2-src and --with-apache2-apxs.

    - symbol exports files:
      -# aix needs .exp files

    - Install the html dox during "make install".  Should we do this 
      for the doxy manpages also?

    - Rework glue/perl build system to use apreq2-config instead of
      relying on paths like "../../src".


OPEN ISSUES:

    - Should we bundle an apr-based "application/xml" parser?  
      If so, how should we parse the xml data into an apr_table?


BUGS:

    - Fix build automake/libtool/autoconf build system so it works
      properly on OSX & AIX.


WISH LIST:

    - I [joes] wish folks would contribute some glue code for
      one of these:

      - php,
      - Rivet,
      - mod_dtcl, 
      - mod_python, 
      - mod_jk, 
      - tomcat,
      - mod_ruby,
      - mod_parrot.

*/
