* Keep track of how many times we couldn't do keep-alive from the backend.  This
  happens if the backend server is doing chunked encoding or doesn't provide a
  content length.

* Allow option to say O_EXCL for PUTs

* Investigate/fix error with "no mapping for fd" when a socket abruptly closes
  during the connect process.  (Run ab against perlbal, then Ctrl+C it.)

* Investigate when BackendHTTP fails on a call to get_res_headers?

* Fix shutdown graceful to close off persistent clients and bored backends (reproxy too?)
  (This is done already?)

* Document the 'reproxy bored' queue [old...new] self cleaning on the old side, but
  uses the new side when it needs a connection

* Lots of work can be done to reduce system calls:
  - coalesce epoll_ctl calls
  - make socket by hand without IO::Socket::INET
  - don't cork twice on reproxy & send

* Support dictionary (scratch hash) per service
  - can configure keys to send to backends
  - backends can set keys in dictionary (so they propogate to other backends, etc)

* Allow configurable response code that means "backend dead; replay request"

* Plugins to say what HTTP requests are known idempotent and re-playable in case
  of errors.  Also option to say that all GETs or urls matching certain rules
  are idempotent

* rule service selector

* way for management commands to hold state (absorbing all future commands)
  .. for defining rules, etc

* let rules map to pools (selectors), or set things like idempotent

* disabling services that have no listen configured anyway --- can they still be selected to?

* Proxying non-HTTP services
  -- hard bit:  SMTP/etc needs original client IP.  ignore that and document that deficiency?

* configurable backend monitors
  -- "every 15 seconds telnet to this port number and say 'are you okay'?  they must reply "YES" or "NO""
     -- mysql specific inetd plugins to check replication/etc?

* more global & per node/service/pool bytes in/out

* make the response-code-tracking-per-ipport a plugin, not on by default:
    my $ref = ($NodeStats{$self->{ipport}}->{responsecodes} ||= []);
    ....

* pidfile writing

* acl stuff

* CREATE SERVICE foo LIKE webserver

* HTTP::Request (and other LWP/etc stuff) is required for make test
  but not the rest of the app.  fix that one way or another.

* ProxyPassReverse-like system

* "getter" commands to retrieve the running config (GET?) or DUMP/SHOW/LIST?
  dumping just one property, vs whole service, vs whole server?

* add tests for "trusted_upstream_proxies" and "always_trusted"
  (rename to always_trust_upstream?)

* get rid of httpres vs. res distinction in HTTPHeaders

* verify that we support all the HTTP methods that subversion needs:
  (what the content body/length assumptions there are, if any special)

    GET, PROPFIND, REPORT, OPTIONS, MERGE, MKACTIVITY, CHECKOUT

    HTTP/1.1: GET, HEAD, POST, PUT, DELETE, OPTIONS, TRACE, CONNECT
    WebDAV: LOCK, UNLOCK, PROPFIND, PROPPATCH, COPY, MOVE, MKCOL
    DeltaV: CHECKIN, CHECKOUT, UNCHECKOUT, VERSION-CONTROL, REPORT,
            UPDATE, LABEL, MERGE, MKWORKSPACE, BASELINE-CONTROL, MKACTIVITY

  Subversion uses no methods outside these. It doesn't use all of them
  either, but it's better to support the full WebDAV/DeltaV than just
  some arbitrary subset. If the proxy being configured is a recent
  Squid, it probably has everything from HTTP/1.1 and WebDAV - and then
  it only needs the DeltaV extensions added.

* secure downloads, ala: http://www.lighttpd.net/documentation/secdownload.html

* fix up req_keep_alive and res_keep_alive --- too much duplicated code
  and too many calls.  doesn't feel right.

