APACHE 2.5 STATUS:                                              -*-text-*-
Last modified at [$Date$]

The current version of this file can be found at:

  * http://svn.apache.org/repos/asf/httpd/httpd/trunk/STATUS

Documentation status is maintained separately and can be found at:

  * docs/STATUS in this source tree, or
  * http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/STATUS

Consult the following STATUS files for information on related projects:

  * http://svn.apache.org/repos/asf/apr/apr/trunk/STATUS

Patches considered for backport are noted in their branches' STATUS:

  * http://svn.apache.org/repos/asf/httpd/httpd/branches/2.0.x/STATUS
  * http://svn.apache.org/repos/asf/httpd/httpd/branches/2.2.x/STATUS
  * http://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x/STATUS


Release history:
    [NOTE that x.{odd}.z versions are strictly Alpha/Beta releases,
          while x.{even}.z versions are Stable/GA releases.]

    2.5.1   : In development
    2.5.0   : Tagged on November 8, 2017. Not released.

Contributors looking for a mission:

  * Just do an egrep on "TODO" or "XXX" in the source.

  * Review the bug database at: http://issues.apache.org/bugzilla/

  * Review the "PatchAvailable" bugs in the bug database:

    https://issues.apache.org/bugzilla/buglist.cgi?bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&product=Apache+httpd-2&keywords=PatchAvailable

    After testing, you can append a comment saying "Reviewed and tested".

  * Open bugs in the bug database.

  * See also the STATUS file in the docs/ directory, which lists documentation-specific TODO items.


CURRENT RELEASE NOTES:


RELEASE SHOWSTOPPERS:


CURRENT VOTES:


THINGS THAT SHOULD BE CONSIDERED EARLY IN THE 2.6/3.0 DEVELOPMENT CYCLE:

  * Remove directives whose purpose was to preserve existing buggy behaviour
    in v2.4.x.

  * Re-align structures to be memory efficient. Move bit fields to the
    top of structures so that they can be extended without adding a
    memory overhead.

  * Seriously ramp up/replace test framework and cases to have better
    coverage of existing special cases and behaviours users rely on.

  * Add performance testing to the test framework.

  * Competely untangle core filesystem behavior where a filesystem htdocs/
    resource wasn't indicated by the request URI.

  * Refactor r->uri into a %escaped raw form presented by the client, and
    a distinct decoded field used only for local filesystem access.

  * Change default prefix from /usr/local/apache2 to something corresponding
    to the project name. Rename apachectl to httpdctl.

  * Change merge order of <Location> to be most specific match last. This
    is more consistent with <Directory> and allows some optimizations for the
    location merge code.

  * Detect Lua 5.2.0 during configure and add LUA_COMPAT_ALL to CPPFLAGS.
    Maybe it even suffices to add LUA_COMPAT_MODULE and individually
    care about the two remaining incompatible code lines (one with lua_strlen,
    one with lua_objlen).

  * Event's timeout_mutex to enter keepalive state probably needs some
    analysis/attention.

  * Better H2 integration?
    - adding handling of slave connections to mpm, no extra H2 workers,
      triggering "events" read/write/timer from main/slave
    - add slave writes/done/abort to events that wake up master connection
    - disentangle core filters to server one purpose only, so that H2
      versions can reuse them properly.

  * Remove mod_access_compat?

  * Ditch platforms/89/old prereqs or anything else?

  * Leverage libmill? Drop serf?

  * Better abstraction of slave connections and "requests".
    - add abstraction for "response" as something that can be passed
      through filters. To be serialized into the correct HTTP bytes on
      the main connection.
    - solve multi-threaded access to master connection props/module conf
      (e.g. ssl vars)

  * make mod_ssl more "core"?

  * add high-level server configuration directives that can steer/influence
    module defaults/warn/rejects related to security

  * Ditch HTTP/0.9? At least, make HttpProtocolOptions Require1.0 the default.

  * Restructure merge fn table/indexes to ignore modules with no directives,
    and permit modules with dozens upon dozens of merge values to split these
    into multiple functional config groups to avoid excessive merging.
    Retitle from 'per-dir' to 'per-location' to better reflect the always-run
    sections (location, ifexpr etc), while we phase out the file-oriented
    bias from httpd.

  * New versioning or release cadence.

  * Ditch old APIs when we have the chance with 3.x. Consolidate current
    functionality into APIs with stronger guarantees. (Specific examples TBD.)

  * Remove as many undesirable-but-kept-for-backwards-compatibility behaviors
    as possible from current config directives. (Specific examples TBD.)

  * True event-loop/asynchronous support in the server core.

  * Modify configuration syntax to separate meta-directives from runtime
    directives (e.g. If vs. IfVersion). Allow as much static analysis of the
    configuration as possible without needing to start the server to figure out
    what's going on.

  * Support JSON-like configuration files

  * Support YAML based configuration files (JSON does not support comments)

  * Opaque data structures w/ getters/setters

  * Generic interface to enable runtime changes (adjusting log level, modifying
    balancer information, toggling flags on/off). Perhaps modules can register
    callbacks for making these changes?

  * REST-based administration for existing (balancer/etc) and new dynamic
    runtime changes (see above)

  * Improve the look of generated pages (status, load-balancer...) with dynamic
    update of the values. Generate HTML5 pages, instead of 3.2, Get rid of XHTML
    in the generated pages.

  * Add performance monitoring of the server, of each module (?), in order to help
    understanding what worth looking at in order to improve overall performance.
    (https://cdn.wp.nginx.com/wp-content/uploads/2016/12/Amplify-Dashboards-page-base-for-filters.png)

  * Drop CGI-1.1-incompatible behaviors kept for compatibility reasons with
    "broken" server implementations (PR 51517). (Note that many of them are
    "broken" *because* of our behaviors.)

  * Add a "normalized" list of headers for a HTTP response, rather then relying
    on r->headers_out and r->err_headers_out, since mod_headers' behavior is
    not really user friendly in some scenarios (example in PR 62380).


OLD ISSUES THAT WERE THOUGHT TO BE SHOWSTOPPERS FOR 2.4 BUT OBVIOUSLY WEREN'T:

  * Handling of non-trailing / config by non-default handler is broken
    http://marc.theaimsgroup.com/?l=apache-httpd-dev&m=105451701628081&w=2
    jerenkrantz asks: Why should this block a release?
    wsanchez agrees: this may be a change in behavior, but isn't
      clearly wrong, and even if so, it doesn't seem like a
      showstopper.

  * the edge connection filter cannot be removed
    http://marc.theaimsgroup.com/?l=apache-httpd-dev&m=105366252619530&w=2
    http://mail-archives.apache.org/mod_mbox/httpd-dev/200501.mbox/%3C41E30B42.4060202@stason.org%3E
    jerenkrantz asks: Why should this block a release?
    stas replies: because it requires a rewrite of the filters stack
          implementation (you have suggested that) and once 2.2 is
          released you can't do that anymore.
    pgollucci: this affects mod_perl I'm pretty sure.


RELEASE NON-SHOWSTOPPERS BUT WOULD BE REAL NICE TO WRAP THESE UP:

  * Clean up all the kruft and *extremely* outdated stuff below...

  * Maybe remove Limit/LimitExcept or at least make it log warnings when
    mis-used.

  * Patches submitted to the bug database:
    http://issues.apache.org/bugzilla/buglist.cgi?bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&product=Apache+httpd-2&keywords=PatchAvailable

  * Filter stacks and subrequests, redirects and fast redirects.
    There's at least one PR that suffers from the current unclean behaviour
    (which lets the server send garbage): PR 17629
    nd says: Every subrequest should get its own filter stack with the
             subreq_core filter as bottom-most. That filter does two things:
               - swallow EOS buckets
               - redirect the data stream to the upper request's (rr->main)
                 filter chain directly after the subrequest's starting
                 point.
             Once we have a clean solution, we can try to optimize
             it, so that the server won't be slow down too much.

  * pipes deadlock on all platforms with limited pipe buffers (e.g. both
    Linux and Win32, as opposed to only Win32 on 1.3).  The right solution
    is either GStein's proposal for a "CGI Brigade", or OtherBill's proposal
    for "Poll Buckets" for "Polling Filter Chains".  Or maybe both :-)

  * All handlers should always send content down even if r->header_only
    is set.  If not, it means that the HEAD requests don't generate the
    same headers as a GET which is wrong.

  * exec cmd and suexec arg-passing enhancements
    Status: Patches proposed
    Message-ID: <20020526041748.A29148@prodigy.Redbrick.DCU.IE>
    (see the "proc.patch" and "suexec-shell.patch" links in this message)

  * The 2.0.36 worker MPM graceless shutdown changes work but are
    a bit clunky on some platforms; eg, on Linux, the loop to
    join each worker thread seems to hang, and the parent ends up
    killing off the child with SIGKILL.  But at least it shuts down.

    chrisd: Has this been fixed by the changes for PR 38737?

  * We do not properly substitute the prefix-variables in the configuration
    scripts or generated-configs.  (i.e. if sysconfdir is etc,
    httpd-std.conf points to conf.)

  * If any request gets through ap_process_request_internal() and is
    scheduled to be served by the core handler, without a flag that this 
    r->filename was tested by dir/file_walk, we need to 500 at the very 
    end of the ap_process_request_internal() processing so sub_req-esters
    know this request cannot be run.  This provides authors of older 
    modules better compatibility, while still improving the security and 
    robustness of 2.0.

    Status: still need to decide where this goes, OtherBill comments...
    Message-ID: <065701c14526$495203b0$96c0b0d0@roweclan.net>
    [Deleted comments regarding the ap_run_handler phase, as irrelevant
     as BillS points out that "common case will be caught in
     default_handler already (with the r->finfo.filetype == 0 check)"
     and the issue is detecting this -before- we try to run the req.]

     gregames says: can this happen somehow without a broken module
       being involved?  If not, why waste cycles trying to defend against
       potential broken modules?  It seems futile.
     wrowe counters: no, it shouldn't happen unless the module is broken.
       But the right answer is to fail the request up-front in dir/file
       walk if the path was entirely invalid; and we can't do that either
       UNTIL 2.1 or we break modules that haven't hooked map_to_storage.

  * Can a static httpd be built reliably?
      Message-ID: <20020207142751.T31582@clove.org>

  * Usage of APR_BRIGADE_NORMALIZE in core_input_filter should be
    removed if possible.
      Message-ID:
        <Pine.LNX.4.33.0201202232430.318-100000@deepthought.cs.virginia.edu>
    Jeff wonders if we still care about this.  It is no longer an
    API issue but simply an extra trip through the brigade.

  * Try to get libtool inter-library dependency code working on AIX.
      Message-ID: <cm3n10lx555.fsf@rdu163-40-092.nc.rr.com>

    Justin says: If we get it working on AIX, we can enable this
                 on all platforms and clean up our build system somewhat.
    Jeff says:   I thought I tested a patch for you sometime in
                 January that you were going to commit within a few days.

  * Handling of %2f in URIs.  Currently both 1.3 and 2.0
    completely disallow %2f in the request URI path (see
    ap_unescape_url() in util.c).  It's permitted and passed
    through in the query string, however.  Roy says the
    original reason for disallowing it, from five years ago,
    was to protect CGI scripts that applied PATH_INFO to
    a filesystem location and which might be tricked by
    ..%2f..%2f(...).  We *should* allow path-info of the
    form 'http://foo.com/index.cgi/path/to/path%2finfo'.
    Since we've revamped a lot of our processing of path
    segments, it would be nice to allow this, or at least
    allow it conditionally with a directive.

      OtherBill adds that %2f as the SECOND character of a multibyte
      sequence causes the request to fail!  This happens notably in
      the ja-jis encoding.

  * There is increasing demand from module writers for an API
    that will allow them to control the server à la apachectl.
    Reasons include sole-function servers that need to die if
    an external dependency (e.g., a database) fails, et cetera.
    Perhaps something in the (ever more abused) scoreboard?
      
      On the other hand, we already have a pipe that goes between parent
      and child for graceful shutdown events, along with an API that
      can be used to send a message down that pipe.  In threaded MPMs,
      it is easy enough to make that one pipe be used for graceful
      and graceless events, and it is also easy to open that pipe
      to both parent and child for writing.  Then we just need to
      figure out how to do graceless on non-threaded MPMs.

  * Allow the DocumentRoot directive within <Location > scopes?  This
    allows the beloved (crusty) Alias /foo/ /somepath/foo/ followed
    by a <Directory /somepath/foo> to become simply 
    <Location /foo/> DocumentRoot /somefile/foo (IMHO a bit more legible
    and in-your-face.)  DocumentRoot unset would be accepted [and would
    not permit content to be served, only virtual resources such as
    server-info or server-status.
    This proposed change would _not_ deprecate Alias.
      striker: See the thread starting with Message-ID:
        JLEGKKNELMHCJPNMOKHOGEEJFBAA.striker@apache.org.

  * Win32: Rotatelogs sometimes is not terminated when Apache
    goes down hard.  FirstBill was looking at possibly tracking the 
    child's-child processes in the parent process.
      stoddard: Shared scoreboard might offer a good way for the parent 
      to keep track of 'other child' processes and whack them if the child 
      goes down.
      Other thoughts on walking the process chain using the NT kernel
      have also been proposed on APR.

  * Eliminate unnecessary creation of pipes in mod_cgid

  * Combine log_child and piped_log_spawn. Clean up http_log.c.
    Common logging API.

  * Platforms that do not support fork (primarily Win32 and AS/400)
    Architect start-up code that avoids initializing all the modules 
    in the parent process on platforms that do not support fork.

  * There are still a number of places in the code where we are
    losing error status (i.e. throwing away the error returned by a
    system call and replacing it with a generic error code)

  * Mass vhosting version of suEXEC.

  * All DBMs suffer from confusion in support/dbmmanage (perl script) since 
    the dbmmanage employs the first-matched dbm format.  This is not
    necessarily the library that Apache was built with.  Aught to
    rewrite dbmmanage upon installation to bin/ with the proper library 
    for predictable mod_auth_dbm administration.
      Questions; htdbm exists, time to kill dbmmanage, or does it remain
                 useful as a perl dbm management example?  If we keep it,
                 do we address the issue above?

  * Integrate mod_dav.
      Some additional items remaining:
      - case_preserved_filename stuff
          (use the new canonical name stuff?)
      - find a new home for ap_text(_header)
      - is it possible to remove the DAV: namespace stuff from util_xml?

  * ap_core_translate() and its use by mod_mmap_static and mod_file_cache
    are a bit wonky.  The function should probably be exposed as a utility 
    function (such as ap_translate_url2fs() or ap_validate_fs_url() or 
    something).  Another approach would be a new hook phase after
    "translate" which would allow the module to munge what the
    translation has decided to do.
      Status: Greg +1 (volunteers)

  * Explore use of a post-config hook for the code in http_main.c which
    calls ap_fixup_virutal_hosts(), ap_fini_vhost_config(), and
    ap_sort_hooks()  [to reduce the logic in main()]

  * read the config tree just once, and process N times (as necessary)

  * (possibly) use UUIDs in mod_unique_id and/or mod_usertrack

  * (possibly) port the bug fix for PR 6942 (segv when LoadModule is put
    into a VirtualHost container) to 2.0.

  * shift stuff to mod_core.h

  * callers of ap_run_create_request() should check the return value
    for failure (Doug volunteers)

  * Fix the worker MPM to use POD to kill child processes instead
    of ap_os_killpg, regardless of how they should die.

      chrisd: Is this done, by any chance?  See r92598 and r93358.

  * Scoreboard structures could be changed in the future such that
    proper alignment is not maintained, leading to segfaults on 
    some systems.  Cliff posted a patch to deal with this issue but
    later recanted. See this message to dev@apr.apache.org:
      Message-ID:
        <Pine.LNX.4.44.0203011354090.16457-200000@deepthought.cs.virginia.edu>

  * APXS either needs to be fixed completely for use when apr is out of tree,
    or it should drop query mode altogether, and we just grow an 
    httpd-config or similar arrangement. 
    To quote a discussion in STATUS earlier:

        thommay: this doesn't fix all the problems with apxs and out of
                 tree apr/apr-util, but it's a good start. There's still the 
                 query cases; but I'm beginning to think that in these cases 
                 the app should be querying ap{r,u}-config directly
        deprecate -q:  add htpd-config: gstein, pquerna, minfrin, pgollucci
        other: 

TODO ISSUES REMAINING IN MOD_SSL:

  * SSLRequire directive (parsing of) leaks memory

  * ssl_var_lookup could be rewritten to be MUCH faster

WISH LIST
  * mod_proxy: Ability to run SSL over proxy gateway connections,
    encrypting (or reencrypting) at the proxy.

  * mod_cache: Handle ESI tags.

  * mod_cache: Resolve issue of how to cache page fragments (or perhaps
    -if- we want to cache page fragments). Today, mod_cache/mod_mem_cache
    will cache #include 'virtual' requests (but not #include 'file'
    requests). This was accomplished by making CACHE_IN a
    CONTENT_SET-1 filter to force it to run before the SUBREQ_CORE
    filter.  But now responses cannot be cached that include the
    effects of having been run through CONTENT_SET filters
    (mod_deflate, mod_expires, etc).  We could rerun all the
    CONTENT_SET filters on the cached response, but this will not
    work in all cases. For example, mod_expires relies on installing
    the EXPIRATION filter during fixups. Contents served out of
    mod_cache (out of the quick_handler) bypass -all- the request
    line server hooks (Ryan really hated this. It is great for
    performance, but bad because of the complications listed above).

    mod_cache/mod_mem_cache/mod_cache_disk:

  * mod_mem_cache: Consider adding a RevalidateTimeout directive to
    specify time at which local cached content is to be revalidated
    (ie, underlying file stat'ed to see if it has changed).

  * mod_mem_cache/mod_cache_disk: Need to be able to query cache
    status (num of entries, cache object properties, etc.).
    mod_status could be extended to query optional hooks defined
    by modules for the purpose of reporting module status.
    mod_cache (et. al.) could define optional hooks that are called
    to collect status.  Status should be queryable by
    HTTP or SNMP?
    jerenkrantz says: Yawn.  Who cares.

  * Regex containers don't work in an intuitive way
      Status: No one has come up with an efficient way to fix this
      behavior. Dean has suggested getting rid of regex containers
      completely.
      OtherBill suggests: We at least seem to agree on eliminating
                          the <Container ~ foo> forms, and using only
                          <ContainerMatch foo> semantics.

  * orig_ct in the byterange/multipart handling may not be
    needed. Apache 1.3 just never stashed "multipart" into
    r->content_type. We should probably follow suit since the
    byterange stuff doesn't want the rest of the code to see the
    multipart content-type; the other code should still think it is
    dealing with the <orig_ct> stuff.
      Status: Greg volunteers to investigate (esp. since he was most 
              likely the one to break it :-)

EXPERIMENTAL MODULES:

    Experimental modules should eventually be be promoted to fully supported
    status or removed from the repository entirely (ie, the
    'experiment' failed). This section tracks what needs to happen to 
    get the modules promoted to fully supported status.

