                                  _   _ ____  _     
                              ___| | | |  _ \| |    
                             / __| | | | |_) | |    
                            | (__| |_| |  _ <| |___ 
                             \___|\___/|_| \_\_____|

TODO

For version 7. Stuff I palnned to have included in curl for version
seven. Let's do a serious attempt to include most of this.

  Document the easy-interface completely

  Make sure the low-level interface works. highlevel.c should basically be
  possible to write using that interface.

  Document the low-level interface

  Add asynchronous name resolving, as this enables full timeout support for
  fork() systems.

  Make sure you can set the progress callback

  Add libtool stuff

  Move non-URL related functions that are used by both the lib and the curl
  application to a separate "portability lib".

  Add support for other languages than C (not important)

  Improve the -K config file parser.

For the future


 Ok, this is what I wanna do with Curl. Please tell me what you think, and
 please don't hesitate to contribute and send me patches that improve this
 product! (Yes, you may add things not mentioned here, these are just a
 few teasers...)

 * rtsp:// support -- "Real Time Streaming Protocol"

   RFC 2326

 * "Content-Encoding: compress/gzip/zlib"

   HTTP 1.1 clearly defines how to get and decode compressed documents. There
   is the zlib that is pretty good at decompressing stuff. This work was
   started in October 1999 but halted again since it proved more work than we
   thought. It is still a good idea to implement though.

 * HTTP Pipelining/persistant connections

 - We should introduce HTTP "pipelining". Curl could be able to request for
   several HTTP documents in one connect. It would be the beginning for
   supporing more advanced functions in the future, like web site
   mirroring. This will require that the urlget() function supports several
   documents from a single HTTP server, which it doesn't today.

 - When curl supports fetching several documents from the same server using
   pipelining, I'd like to offer that function to the command line. Anyone has
   a good idea how? The current way of specifying one URL with the output sent
   to the stdout or a file gets in the way. Imagine a syntax that supports
   "additional documents from the same server" in a way similar to:

     curl <main URL> --more-doc <path> --more-doc <path>

   where --more-doc specifies another document on the same server. Where are
   the output files gonna be put and how should they be named? Should each
   "--more-doc" parameter require a local file name to store the result in?
   Like "--more-file" as in:

     curl <URL> --more-doc <path> --more-file <file>

 * RFC2617 compliance, "Digest Access Authentication"
   A valid test page seem to exist at:
    http://hopf.math.nwu.edu/testpage/digest/
   And some friendly person's server source code is available at
    http://hopf.math.nwu.edu/digestauth/index.html

   Then there's the Apache mod_digest source code too of course.  It seems as
   if Netscape doesn't support this, and not many servers do. Although this is
   a lot better authentication method than the more common "Basic". Basic
   sends the password in cleartext over the network, this "Digest" method uses
   a challange-response protocol which increases security quite a lot.

 * Different FTP Upload Through Web Proxy
   I don't know any web proxies that allow CONNECT through on port 21, but
   that would be the best way to do ftp upload. All we would need to do would
   be to 'CONNECT <host>:<port> HTTP/1.0\r\n\r\n' and then do business as
   usual. I least I think so. It would be fun if someone tried this...

 * Multiple Proxies?
   Is there anyone that actually uses serial-proxies? I mean, send CONNECT to
   the first proxy to connect to the second proxy to which you send CONNECT to
   connect to the remote host (or even more iterations). Is there anyone
   wanting curl to support it? (Not that it would be hard, just confusing...)

 * Other proxies
   Ftp-kind proxy, Socks5, whatever kind of proxies are there?

 * IPv6 Awareness and support
   Where ever it would fit. I am not that into v6 yet to fully grasp what we
   would need to do, but letting the autoconf search for v6-versions of a few
   functions and then use them instead is of course the first thing to do...
   RFC 2428 "FTP Extensions for IPv6 and NATs" will be interesting. PORT
   should be replaced with EPRT for IPv6, and EPSV instead of PASV.

 * An automatic RPM package maker
   Please, write me a script that makes it. It'd make my day.

 * SSL for more protocols, like SSL-FTP...
   (http://search.ietf.org/internet-drafts/draft-murray-auth-ftp-ssl-05.txt)

 * HTTP POST resume using Range:

 * Make curl capable of verifying the server's certificate when connecting
   with HTTPS://.

