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:

  * 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

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

  * RFC 2616 violations.
    Closed PRs: 15852, 15857, 15859, 15861, 15864, 15869, 15870, 16120,
                16125, 16135, 16136, 16137, 16138, 16139, 16140, 16518,
                16520, 49825
    Open PRs:   15865, 15866, 15868, 16126, 16133, 16142, 16521, 42978 
    jerenkrantz says: need to decide how many we need to backport and/or
                      if these rise to showstopper status.
    wrowe suggests: it would be nice to see "MUST" v.s. "SHOULD" v.s. "MAY"
                    out of this list, without reviewing them individually.
    wrowe asks: what is lingering after 2.4.25 release? Offhand, only
                URI conformance

  * 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_ depricate 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 intutive 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.


