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

     2.05 in development.

Contributors looking for a mission:

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


CURRENT RELEASE NOTES:



RELEASE SHOWSTOPPERS:



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:

    - Add Apache-Test via svn:externals, include it in our
      releases, and remove the associated prereq in build/version-check.pl.

    - Document the new apr-dependency in our soname's major version:

         libapreq2.so.2.x.y  <--- has apr-0's ABI
         libapreq2.so.3.x.y  <--- has apr-1's ABI

    - We need to add some basic charset support.  Long discussion 
      starts here:
              http://article.gmane.org/gmane.comp.apache.apreq/2371

    - There are too many calls to apreq_env_pool()- lots of these
      can be eliminated by caching the pool in the parser's context.

    - 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?

    - The current tests don't cover these functions, 
      so add CuTest tests for them:
      -  apreq_merge_values()

    - CuTest needs va_arg to print comments for a failed unit test.

    - 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.

    - Bring Perl documentation up to speed: Table.pod, and Error.pod.
      These docs either need to be written, or they require Test::Inline 
      tests to verify their API.

    - Write parser/hook API documentation, and add perl glue for the API.

    - 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".

    - Taint checks need to be extended to APR objects, like
      $upload->bb and $upload->info.  We may need be able to
      do that with additional typemaps.


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.

*/
