Home | History | Annotate | Download | only in docs
      1                                   _   _ ____  _
      2                               ___| | | |  _ \| |
      3                              / __| | | | |_) | |
      4                             | (__| |_| |  _ <| |___
      5                              \___|\___/|_| \_\_____|
      6 
      7                 Things that could be nice to do in the future
      8 
      9  Things to do in project curl. Please tell us what you think, contribute and
     10  send us patches that improve things!
     11 
     12  Be aware that these are things that we could do, or have once been considered
     13  things we could do. If you want to work on any of these areas, please
     14  consider bringing it up for discussions first on the mailing list so that we
     15  all agree it is still a good idea for the project!
     16 
     17  All bugs documented in the KNOWN_BUGS document are subject for fixing!
     18 
     19  1. libcurl
     20  1.2 More data sharing
     21  1.3 struct lifreq
     22  1.4 signal-based resolver timeouts
     23  1.5 get rid of PATH_MAX
     24  1.6 Modified buffer size approach
     25  1.7 Detect when called from within callbacks
     26  1.8 Allow SSL (HTTPS) to proxy
     27  1.9 Cache negative name resolves
     28  1.11 minimize dependencies with dynamicly loaded modules
     29  1.12 have form functions use CURL handle argument
     30  1.14 Typesafe curl_easy_setopt()
     31  1.15 Monitor connections in the connection pool
     32  1.16 Try to URL encode given URL
     33  1.17 Add support for IRIs
     34  1.18 try next proxy if one doesn't work
     35  1.19 Timeout idle connections from the pool
     36  1.20 SRV and URI DNS records
     37  1.21 API for URL parsing/splitting
     38  1.23 Offer API to flush the connection pool
     39  1.24 TCP Fast Open for windows
     40  1.25 Remove the generated include file
     41 
     42  2. libcurl - multi interface
     43  2.1 More non-blocking
     44  2.2 Better support for same name resolves
     45  2.3 Non-blocking curl_multi_remove_handle()
     46  2.4 Split connect and authentication process
     47  2.5 Edge-triggered sockets should work
     48 
     49  3. Documentation
     50  3.1 Update date and version in man pages
     51  3.2 Provide cmake config-file
     52 
     53  4. FTP
     54  4.1 HOST
     55  4.2 Alter passive/active on failure and retry
     56  4.3 Earlier bad letter detection
     57  4.4 REST for large files
     58  4.5 ASCII support
     59  4.6 GSSAPI via Windows SSPI
     60  4.7 STAT for LIST without data connection
     61 
     62  5. HTTP
     63  5.1 Better persistency for HTTP 1.0
     64  5.2 support FF3 sqlite cookie files
     65  5.3 Rearrange request header order
     66  5.5 auth= in URLs
     67  5.6 Refuse "downgrade" redirects
     68  5.7 Brotli compression
     69  5.8 QUIC
     70  5.9 Add easy argument to formpost functions
     71  5.10 Leave secure cookies alone
     72 
     73  6. TELNET
     74  6.1 ditch stdin
     75  6.2 ditch telnet-specific select
     76  6.3 feature negotiation debug data
     77  6.4 send data in chunks
     78 
     79  7. SMTP
     80  7.1 Pipelining
     81  7.2 Enhanced capability support
     82  7.3 Add CURLOPT_MAIL_CLIENT option
     83 
     84  8. POP3
     85  8.1 Pipelining
     86  8.2 Enhanced capability support
     87 
     88  9. IMAP
     89  9.1 Enhanced capability support
     90 
     91  10. LDAP
     92  10.1 SASL based authentication mechanisms
     93 
     94  11. SMB
     95  11.1 File listing support
     96  11.2 Honor file timestamps
     97  11.3 Use NTLMv2
     98  11.4 Create remote directories
     99 
    100  12. New protocols
    101  12.1 RSYNC
    102 
    103  13. SSL
    104  13.1 Disable specific versions
    105  13.2 Provide mutex locking API
    106  13.3 Evaluate SSL patches
    107  13.4 Cache OpenSSL contexts
    108  13.5 Export session ids
    109  13.6 Provide callback for cert verification
    110  13.7 improve configure --with-ssl
    111  13.8 Support DANE
    112  13.9 Support TLS v1.3
    113  13.10 Support SSLKEYLOGFILE
    114  13.11 Support intermediate & root pinning for PINNEDPUBLICKEY
    115  13.12 Support HSTS
    116  13.13 Support HPKP
    117 
    118  14. GnuTLS
    119  14.1 SSL engine stuff
    120  14.2 check connection
    121 
    122  15. WinSSL/SChannel
    123  15.1 Add support for client certificate authentication
    124  15.2 Add support for custom server certificate validation
    125  15.3 Add support for the --ciphers option
    126 
    127  16. SASL
    128  16.1 Other authentication mechanisms
    129  16.2 Add QOP support to GSSAPI authentication
    130  16.3 Support binary messages (i.e.: non-base64)
    131 
    132  17. SSH protocols
    133  17.1 Multiplexing
    134  17.2 SFTP performance
    135  17.3 Support better than MD5 hostkey hash
    136 
    137  18. Command line tool
    138  18.1 sync
    139  18.2 glob posts
    140  18.3 prevent file overwriting
    141  18.4 simultaneous parallel transfers
    142  18.5 provide formpost headers
    143  18.6 warning when setting an option
    144  18.7 warning when sending binary output to terminal
    145  18.8 offer color-coded HTTP header output
    146  18.9 Choose the name of file in braces for complex URLs
    147  18.10 improve how curl works in a windows console window
    148  18.11 -w output to stderr
    149  18.12 keep running, read instructions from pipe/socket
    150  18.13 support metalink in http headers
    151  18.14 --fail without --location should treat 3xx as a failure
    152  18.15 Introduce --fail-fast to exit on first transfer fail
    153  18.16 --retry should resume
    154 
    155  19. Build
    156  19.1 roffit
    157  19.2 Enable PIE and RELRO by default
    158 
    159  20. Test suite
    160  20.1 SSL tunnel
    161  20.2 nicer lacking perl message
    162  20.3 more protocols supported
    163  20.4 more platforms supported
    164  20.5 Add support for concurrent connections
    165  20.6 Use the RFC6265 test suite
    166 
    167  21. Next SONAME bump
    168  21.1 http-style HEAD output for FTP
    169  21.2 combine error codes
    170  21.3 extend CURLOPT_SOCKOPTFUNCTION prototype
    171 
    172  22. Next major release
    173  22.1 cleanup return codes
    174  22.2 remove obsolete defines
    175  22.3 size_t
    176  22.4 remove several functions
    177  22.5 remove CURLOPT_FAILONERROR
    178  22.6 remove CURLOPT_DNS_USE_GLOBAL_CACHE
    179  22.7 remove progress meter from libcurl
    180  22.8 remove 'curl_httppost' from public
    181 
    182 ==============================================================================
    183 
    184 1. libcurl
    185 
    186 1.2 More data sharing
    187 
    188  curl_share_* functions already exist and work, and they can be extended to
    189  share more. For example, enable sharing of the ares channel and the
    190  connection cache.
    191 
    192 1.3 struct lifreq
    193 
    194  Use 'struct lifreq' and SIOCGLIFADDR instead of 'struct ifreq' and
    195  SIOCGIFADDR on newer Solaris versions as they claim the latter is obsolete.
    196  To support IPv6 interface addresses for network interfaces properly.
    197 
    198 1.4 signal-based resolver timeouts
    199 
    200  libcurl built without an asynchronous resolver library uses alarm() to time
    201  out DNS lookups. When a timeout occurs, this causes libcurl to jump from the
    202  signal handler back into the library with a sigsetjmp, which effectively
    203  causes libcurl to continue running within the signal handler. This is
    204  non-portable and could cause problems on some platforms. A discussion on the
    205  problem is available at https://curl.haxx.se/mail/lib-2008-09/0197.html
    206 
    207  Also, alarm() provides timeout resolution only to the nearest second. alarm
    208  ought to be replaced by setitimer on systems that support it.
    209 
    210 1.5 get rid of PATH_MAX
    211 
    212  Having code use and rely on PATH_MAX is not nice:
    213  http://insanecoding.blogspot.com/2007/11/pathmax-simply-isnt.html
    214 
    215  Currently the SSH based code uses it a bit, but to remove PATH_MAX from there
    216  we need libssh2 to properly tell us when we pass in a too small buffer and
    217  its current API (as of libssh2 1.2.7) doesn't.
    218 
    219 1.6 Modified buffer size approach
    220 
    221  Current libcurl allocates a fixed 16K size buffer for download and an
    222  additional 16K for upload. They are always unconditionally part of the easy
    223  handle. If CRLF translations are requested, an additional 32K "scratch
    224  buffer" is allocated. A total of 64K transfer buffers in the worst case.
    225 
    226  First, while the handles are not actually in use these buffers could be freed
    227  so that lingering handles just kept in queues or whatever waste less memory.
    228 
    229  Secondly, SFTP is a protocol that needs to handle many ~30K blocks at once
    230  since each need to be individually acked and therefore libssh2 must be
    231  allowed to send (or receive) many separate ones in parallel to achieve high
    232  transfer speeds. A current libcurl build with a 16K buffer makes that
    233  impossible, but one with a 512K buffer will reach MUCH faster transfers. But
    234  allocating 512K unconditionally for all buffers just in case they would like
    235  to do fast SFTP transfers at some point is not a good solution either.
    236 
    237  Dynamically allocate buffer size depending on protocol in use in combination
    238  with freeing it after each individual transfer? Other suggestions?
    239 
    240 1.7 Detect when called from within callbacks
    241 
    242  We should set a state variable before calling callbacks, so that we
    243  subsequently can add code within libcurl that returns error if called within
    244  callbacks for when that's not supported.
    245 
    246 1.8 Allow SSL (HTTPS) to proxy
    247 
    248  To prevent local users from snooping on your traffic to the proxy. Supported
    249  by Firefox and Chrome already:
    250  https://www.chromium.org/developers/design-documents/secure-web-proxy
    251 
    252  See this stale work in progress branch:
    253  https://github.com/curl/curl/tree/HTTPS-proxy based on this PR:
    254  https://github.com/curl/curl/pull/305
    255 
    256 1.9 Cache negative name resolves
    257 
    258  A name resolve that has failed is likely to fail when made again within a
    259  short period of time. Currently we only cache positive responses.
    260 
    261 1.11 minimize dependencies with dynamicly loaded modules
    262 
    263  We can create a system with loadable modules/plug-ins, where these modules
    264  would be the ones that link to 3rd party libs. That would allow us to avoid
    265  having to load ALL dependencies since only the necessary ones for this
    266  app/invoke/used protocols would be necessary to load.  See
    267  https://github.com/curl/curl/issues/349
    268 
    269 1.12 have form functions use CURL handle argument
    270 
    271  curl_formadd() and curl_formget() both currently have no CURL handle
    272  argument, but both can use a callback that is set in the easy handle, and
    273  thus curl_formget() with callback cannot function without first having
    274  curl_easy_perform() (or similar) called - which is hard to grasp and a design
    275  mistake.
    276 
    277  The curl_formadd() design can probably also be reconsidered to make it easier
    278  to use and less error-prone. Probably easiest by splitting it into several
    279  function calls.
    280 
    281 1.14 Typesafe curl_easy_setopt()
    282 
    283  One of the most common problems in libcurl using applications is the lack of
    284  type checks for curl_easy_setopt() which happens because it accepts varargs
    285  and thus can take any type.
    286 
    287  One possible solution to this is to introduce a few different versions of the
    288  setopt version for the different kinds of data you can set.
    289 
    290   curl_easy_set_num() - sets a long value
    291 
    292   curl_easy_set_large() - sets a curl_off_t value
    293 
    294   curl_easy_set_ptr() - sets a pointer
    295 
    296   curl_easy_set_cb() - sets a callback PLUS its callback data
    297 
    298 1.15 Monitor connections in the connection pool
    299 
    300  libcurl's connection cache or pool holds a number of open connections for the
    301  purpose of possible subsequent connection reuse. It may contain a few up to a
    302  significant amount of connections. Currently, libcurl leaves all connections
    303  as they are and first when a connection is iterated over for matching or
    304  reuse purpose it is verified that it is still alive.
    305 
    306  Those connections may get closed by the server side for idleness or they may
    307  get a HTTP/2 ping from the peer to verify that they're still alive. By adding
    308  monitoring of the connections while in the pool, libcurl can detect dead
    309  connections (and close them) better and earlier, and it can handle HTTP/2
    310  pings to keep such ones alive even when not actively doing transfers on them.
    311 
    312 1.16 Try to URL encode given URL
    313 
    314  Given a URL that for example contains spaces, libcurl could have an option
    315  that would try somewhat harder than it does now and convert spaces to %20 and
    316  perhaps URL encoded byte values over 128 etc (basically do what the redirect
    317  following code already does).
    318 
    319  https://github.com/curl/curl/issues/514
    320 
    321 1.17 Add support for IRIs
    322 
    323  IRIs (RFC 3987) allow localized, non-ascii, names in the URL. To properly
    324  support this, curl/libcurl would need to translate/encode the given input
    325  from the input string encoding into percent encoded output "over the wire".
    326 
    327  To make that work smoothly for curl users even on Windows, curl would
    328  probably need to be able to convert from several input encodings.
    329 
    330 1.18 try next proxy if one doesn't work
    331 
    332  Allow an application to specify a list of proxies to try, and failing to
    333  connect to the first go on and try the next instead until the list is
    334  exhausted. Browsers support this feature at least when they specify proxies
    335  using PACs.
    336 
    337  https://github.com/curl/curl/issues/896
    338 
    339 1.19 Timeout idle connections from the pool
    340 
    341  libcurl currently keeps connections in its connection pool for an indefinite
    342  period of time, until it either gets reused, gets noticed that it has been
    343  closed by the server or gets pruned to make room for a new connection.
    344 
    345  To reduce overhead (especially for when we add monitoring of the connections
    346  in the pool), we should introduce a timeout so that connections that have
    347  been idle for N seconds get closed.
    348 
    349 1.20 SRV and URI DNS records
    350 
    351  Offer support for resolving SRV and URI DNS records for libcurl to know which
    352  server to connect to for various protocols (including HTTP!).
    353 
    354 1.21 API for URL parsing/splitting
    355 
    356  libcurl has always parsed URLs internally and never exposed any API or
    357  features to allow applications to do it. Still most or many applications
    358  using libcurl need that ability. In polls to users, we've learned that many
    359  libcurl users would like to see and use such an API.
    360 
    361 1.23 Offer API to flush the connection pool
    362 
    363  Sometimes applications want to flush all the existing connections kept alive.
    364  An API could allow a forced flush or just a forced loop that would properly
    365  close all connections that have been closed by the server already.
    366 
    367 1.24 TCP Fast Open for windows
    368 
    369  libcurl supports the CURLOPT_TCP_FASTOPEN option since 7.49.0 for Linux and
    370  Mac OS. Windows supports TCP Fast Open starting with Windows 10, version 1607
    371  and we should add support for it.
    372 
    373 1.25 Remove the generated include file
    374 
    375  When curl and libcurl are built, one of the public include files are
    376  generated and is populated with a set of defines that are derevid from sizes
    377  and constants for the particular target architecture that build is made. For
    378  platforms that can select between 32 bit and 64 bit at build time, this
    379  approach makes the libcurl build only create a set of public headers suitable
    380  for one of the architectures and not both. If you build libcurl for such a
    381  platform and you want to allow applications to get built using either 32/64
    382  version, you must generate the libcurl headers once for each setup and you
    383  must then add a replacement curl header that would itself select the correct
    384  32 or 64 bit specific header as necessary.
    385 
    386  Your curl/curl.h alternative could then look like (replace with suitable CPP
    387  variable to check):
    388 
    389      #ifdef ARCH_32bit
    390      #include <curl32/curl.h>
    391      #else /* ARCH_64bit  */
    392      #include <curl64/curl.h>
    393      #endif
    394 
    395  A fix would either (A) fix the 32/64 setup automatically or even better (B)
    396  work away the architecture specific defines from the headers so that they can
    397  be used for all architectures independently of what libcurl was built for.
    398 
    399 
    400 2. libcurl - multi interface
    401 
    402 2.1 More non-blocking
    403 
    404  Make sure we don't ever loop because of non-blocking sockets returning
    405  EWOULDBLOCK or similar. Blocking cases include:
    406 
    407  - Name resolves on non-windows unless c-ares is used
    408  - NSS SSL connections
    409  - HTTP proxy CONNECT operations
    410  - SOCKS proxy handshakes
    411  - file:// transfers
    412  - TELNET transfers
    413  - The "DONE" operation (post transfer protocol-specific actions) for the
    414    protocols SFTP, SMTP, FTP. Fixing Curl_done() for this is a worthy task.
    415 
    416 2.2 Better support for same name resolves
    417 
    418  If a name resolve has been initiated for name NN and a second easy handle
    419  wants to resolve that name as well, make it wait for the first resolve to end
    420  up in the cache instead of doing a second separate resolve. This is
    421  especially needed when adding many simultaneous handles using the same host
    422  name when the DNS resolver can get flooded.
    423 
    424 2.3 Non-blocking curl_multi_remove_handle()
    425 
    426  The multi interface has a few API calls that assume a blocking behavior, like
    427  add_handle() and remove_handle() which limits what we can do internally. The
    428  multi API need to be moved even more into a single function that "drives"
    429  everything in a non-blocking manner and signals when something is done. A
    430  remove or add would then only ask for the action to get started and then
    431  multi_perform() etc still be called until the add/remove is completed.
    432 
    433 2.4 Split connect and authentication process
    434 
    435  The multi interface treats the authentication process as part of the connect
    436  phase. As such any failures during authentication won't trigger the relevant
    437  QUIT or LOGOFF for protocols such as IMAP, POP3 and SMTP.
    438 
    439 2.5 Edge-triggered sockets should work
    440 
    441  The multi_socket API should work with edge-triggered socket events. One of
    442  the internal actions that need to be improved for this to work perfectly is
    443  the 'maxloops' handling in transfer.c:readwrite_data().
    444 
    445 3. Documentation
    446 
    447 3.1 Update date and version in man pages
    448 
    449  'maketgz' or another suitable script could update the .TH sections of the man
    450  pages at release time to use the current date and curl/libcurl version
    451  number.
    452 
    453 3.2 Provide cmake config-file
    454 
    455  A config-file package is a set of files provided by us to allow applications
    456  to write cmake scripts to find and use libcurl easier. See
    457  https://github.com/curl/curl/issues/885
    458 
    459 4. FTP
    460 
    461 4.1 HOST
    462 
    463  HOST is a command for a client to tell which host name to use, to offer FTP
    464  servers named-based virtual hosting:
    465 
    466  https://tools.ietf.org/html/rfc7151
    467 
    468 4.2 Alter passive/active on failure and retry
    469 
    470  When trying to connect passively to a server which only supports active
    471  connections, libcurl returns CURLE_FTP_WEIRD_PASV_REPLY and closes the
    472  connection. There could be a way to fallback to an active connection (and
    473  vice versa). https://curl.haxx.se/bug/feature.cgi?id=1754793
    474 
    475 4.3 Earlier bad letter detection
    476 
    477  Make the detection of (bad) %0d and %0a codes in FTP URL parts earlier in the
    478  process to avoid doing a resolve and connect in vain.
    479 
    480 4.4 REST for large files
    481 
    482  REST fix for servers not behaving well on >2GB requests. This should fail if
    483  the server doesn't set the pointer to the requested index. The tricky
    484  (impossible?) part is to figure out if the server did the right thing or not.
    485 
    486 4.5 ASCII support
    487 
    488  FTP ASCII transfers do not follow RFC959. They don't convert the data
    489  accordingly.
    490 
    491 4.6 GSSAPI via Windows SSPI
    492 
    493 In addition to currently supporting the SASL GSSAPI mechanism (Kerberos V5)
    494 via third-party GSS-API libraries, such as Heimdal or MIT Kerberos, also add
    495 support for GSSAPI authentication via Windows SSPI.
    496 
    497 4.7 STAT for LIST without data connection
    498 
    499 Some FTP servers allow STAT for listing directories instead of using LIST, and
    500 the response is then sent over the control connection instead of as the
    501 otherwise usedw data connection: http://www.nsftools.com/tips/RawFTP.htm#STAT
    502 
    503 This is not detailed in any FTP specification.
    504 
    505 5. HTTP
    506 
    507 5.1 Better persistency for HTTP 1.0
    508 
    509  "Better" support for persistent connections over HTTP 1.0
    510  https://curl.haxx.se/bug/feature.cgi?id=1089001
    511 
    512 5.2 support FF3 sqlite cookie files
    513 
    514  Firefox 3 is changing from its former format to a a sqlite database instead.
    515  We should consider how (lib)curl can/should support this.
    516  https://curl.haxx.se/bug/feature.cgi?id=1871388
    517 
    518 5.3 Rearrange request header order
    519 
    520  Server implementors often make an effort to detect browser and to reject
    521  clients it can detect to not match. One of the last details we cannot yet
    522  control in libcurl's HTTP requests, which also can be exploited to detect
    523  that libcurl is in fact used even when it tries to impersonate a browser, is
    524  the order of the request headers. I propose that we introduce a new option in
    525  which you give headers a value, and then when the HTTP request is built it
    526  sorts the headers based on that number. We could then have internally created
    527  headers use a default value so only headers that need to be moved have to be
    528  specified.
    529 
    530 5.5 auth= in URLs
    531 
    532  Add the ability to specify the preferred authentication mechanism to use by
    533  using ;auth=<mech> in the login part of the URL.
    534 
    535  For example:
    536 
    537  http://test:pass;auth=NTLM@example.com would be equivalent to specifying --user
    538  test:pass;auth=NTLM or --user test:pass --ntlm from the command line.
    539 
    540  Additionally this should be implemented for proxy base URLs as well.
    541 
    542 5.6 Refuse "downgrade" redirects
    543 
    544  See https://github.com/curl/curl/issues/226
    545 
    546  Consider a way to tell curl to refuse to "downgrade" protocol with a redirect
    547  and/or possibly a bit that refuses redirect to change protocol completely.
    548 
    549 5.7 Brotli compression
    550 
    551  Compression algorithms that perform better than gzip are being considered for
    552  use and inclusion in existing browsers. For example 'brotli'. If servers
    553  follow along it is a good reason for us to also allow users to take advantage
    554  of this. The algorithm: https://github.com/google/brotli The Firefox bug:
    555  https://bugzilla.mozilla.org/show_bug.cgi?id=366559
    556 
    557 5.8 QUIC
    558 
    559  The standardization process of QUIC has been taken to the IETF and can be
    560  followed on the [IETF QUIC Mailing
    561  list](https://www.ietf.org/mailman/listinfo/quic). I'd like us to get on the
    562  bandwagon. Ideally, this would be done with a separate library/project to
    563  handle the binary/framing layer in a similar fashion to how HTTP/2 is
    564  implemented. This, to allow other projects to benefit from the work and to
    565  thus broaden the interest and chance of others to participate.
    566 
    567 5.9 Add easy argument to formpost functions
    568 
    569  Make sure there's an easy handle passed in to `curl_formadd()`,
    570  `curl_formget()` and `curl_formfree()` by adding replacement functions and
    571  deprecating the old ones. Allows better error messages and is generally good
    572  API hygiene.
    573 
    574 5.10 Leave secure cookies alone
    575 
    576  Non-secure origins (HTTP sites) should not be allowed to set or modify
    577  cookies with the 'secure' property:
    578 
    579  https://tools.ietf.org/html/draft-ietf-httpbis-cookie-alone-01
    580 
    581 
    582 6. TELNET
    583 
    584 6.1 ditch stdin
    585 
    586 Reading input (to send to the remote server) on stdin is a crappy solution for
    587 library purposes. We need to invent a good way for the application to be able
    588 to provide the data to send.
    589 
    590 6.2 ditch telnet-specific select
    591 
    592  Move the telnet support's network select() loop go away and merge the code
    593  into the main transfer loop. Until this is done, the multi interface won't
    594  work for telnet.
    595 
    596 6.3 feature negotiation debug data
    597 
    598   Add telnet feature negotiation data to the debug callback as header data.
    599 
    600 6.4 send data in chunks
    601 
    602   Currently, telnet sends data one byte at a time.  This is fine for interactive
    603   use, but inefficient for any other.  Sent data should be sent in larger
    604   chunks.
    605 
    606 7. SMTP
    607 
    608 7.1 Pipelining
    609 
    610  Add support for pipelining emails.
    611 
    612 7.2 Enhanced capability support
    613 
    614  Add the ability, for an application that uses libcurl, to obtain the list of
    615  capabilities returned from the EHLO command.
    616 
    617 7.3 Add CURLOPT_MAIL_CLIENT option
    618 
    619  Rather than use the URL to specify the mail client string to present in the
    620  HELO and EHLO commands, libcurl should support a new CURLOPT specifically for
    621  specifying this data as the URL is non-standard and to be honest a bit of a
    622  hack ;-)
    623 
    624  Please see the following thread for more information:
    625  https://curl.haxx.se/mail/lib-2012-05/0178.html
    626 
    627 
    628 8. POP3
    629 
    630 8.1 Pipelining
    631 
    632  Add support for pipelining commands.
    633 
    634 8.2 Enhanced capability support
    635 
    636  Add the ability, for an application that uses libcurl, to obtain the list of
    637  capabilities returned from the CAPA command.
    638 
    639 9. IMAP
    640 
    641 9.1 Enhanced capability support
    642 
    643  Add the ability, for an application that uses libcurl, to obtain the list of
    644  capabilities returned from the CAPABILITY command.
    645 
    646 10. LDAP
    647 
    648 10.1 SASL based authentication mechanisms
    649 
    650  Currently the LDAP module only supports ldap_simple_bind_s() in order to bind
    651  to an LDAP server. However, this function sends username and password details
    652  using the simple authentication mechanism (as clear text). However, it should
    653  be possible to use ldap_bind_s() instead specifying the security context
    654  information ourselves.
    655 
    656 11. SMB
    657 
    658 11.1 File listing support
    659 
    660 Add support for listing the contents of a SMB share. The output should probably
    661 be the same as/similar to FTP.
    662 
    663 11.2 Honor file timestamps
    664 
    665 The timestamp of the transferred file should reflect that of the original file.
    666 
    667 11.3 Use NTLMv2
    668 
    669 Currently the SMB authentication uses NTLMv1.
    670 
    671 11.4 Create remote directories
    672 
    673 Support for creating remote directories when uploading a file to a directory
    674 that doesn't exist on the server, just like --ftp-create-dirs.
    675 
    676 12. New protocols
    677 
    678 12.1 RSYNC
    679 
    680  There's no RFC for the protocol or an URI/URL format.  An implementation
    681  should most probably use an existing rsync library, such as librsync.
    682 
    683 13. SSL
    684 
    685 13.1 Disable specific versions
    686 
    687  Provide an option that allows for disabling specific SSL versions, such as
    688  SSLv2 https://curl.haxx.se/bug/feature.cgi?id=1767276
    689 
    690 13.2 Provide mutex locking API
    691 
    692  Provide a libcurl API for setting mutex callbacks in the underlying SSL
    693  library, so that the same application code can use mutex-locking
    694  independently of OpenSSL or GnutTLS being used.
    695 
    696 13.3 Evaluate SSL patches
    697 
    698  Evaluate/apply Gertjan van Wingerde's SSL patches:
    699  https://curl.haxx.se/mail/lib-2004-03/0087.html
    700 
    701 13.4 Cache OpenSSL contexts
    702 
    703  "Look at SSL cafile - quick traces look to me like these are done on every
    704  request as well, when they should only be necessary once per SSL context (or
    705  once per handle)". The major improvement we can rather easily do is to make
    706  sure we don't create and kill a new SSL "context" for every request, but
    707  instead make one for every connection and re-use that SSL context in the same
    708  style connections are re-used. It will make us use slightly more memory but
    709  it will libcurl do less creations and deletions of SSL contexts.
    710 
    711 13.5 Export session ids
    712 
    713  Add an interface to libcurl that enables "session IDs" to get
    714  exported/imported. Cris Bailiff said: "OpenSSL has functions which can
    715  serialise the current SSL state to a buffer of your choice, and recover/reset
    716  the state from such a buffer at a later date - this is used by mod_ssl for
    717  apache to implement and SSL session ID cache".
    718 
    719 13.6 Provide callback for cert verification
    720 
    721  OpenSSL supports a callback for customised verification of the peer
    722  certificate, but this doesn't seem to be exposed in the libcurl APIs. Could
    723  it be? There's so much that could be done if it were!
    724 
    725 13.7 improve configure --with-ssl
    726 
    727  make the configure --with-ssl option first check for OpenSSL, then GnuTLS,
    728  then NSS...
    729 
    730 13.8 Support DANE
    731 
    732  DNS-Based Authentication of Named Entities (DANE) is a way to provide SSL
    733  keys and certs over DNS using DNSSEC as an alternative to the CA model.
    734  https://www.rfc-editor.org/rfc/rfc6698.txt
    735 
    736  An initial patch was posted by Suresh Krishnaswamy on March 7th 2013
    737  (https://curl.haxx.se/mail/lib-2013-03/0075.html) but it was a too simple
    738  approach. See Daniel's comments:
    739  https://curl.haxx.se/mail/lib-2013-03/0103.html . libunbound may be the
    740  correct library to base this development on.
    741 
    742  Bjrn Stenberg wrote a separate initial take on DANE that was never
    743  completed.
    744 
    745 13.9 Support TLS v1.3
    746 
    747  TLS version 1.3 is about to ship and is getting implemented by TLS libraries
    748  as we speak. We should start to support the symbol and make sure all backends
    749  handle it accordingly, then gradually add support as the TLS libraries add
    750  the corresponding support. There may be a need to add some additional options
    751  to allow libcurl to take advantage of the new features in 1.3.
    752 
    753 13.10 Support SSLKEYLOGFILE
    754 
    755  When used, Firefox and Chrome dumps their master TLS keys to the file name
    756  this environment variable specifies. This allows tools like for example
    757  Wireshark to capture and decipher TLS traffic to/from those clients. libcurl
    758  could be made to support this more widely (presumably this already works when
    759  built with NSS). Peter Wu made a OpenSSL preload to make possible that can be
    760  used as inspiration and guidance
    761  https://git.lekensteyn.nl/peter/wireshark-notes/tree/src/sslkeylog.c
    762 
    763 13.11 Support intermediate & root pinning for PINNEDPUBLICKEY
    764 
    765  CURLOPT_PINNEDPUBLICKEY does not consider the hashes of intermediate & root
    766  certificates when comparing the pinned keys. Therefore it is not compatible
    767  with "HTTP Public Key Pinning" as there also intermediate and root certificates
    768  can be pinned. This is very useful as it prevents webadmins from "locking
    769  themself out of their servers".
    770 
    771  Adding this feature would make curls pinning 100% compatible to HPKP and allow
    772  more flexible pinning.
    773 
    774 13.12 Support HSTS
    775 
    776  "HTTP Strict Transport Security" is TOFU (trust on first use), time-based
    777  features indicated by a HTTP header send by the webserver. It is widely used
    778  in browsers and it's purpose is to prevent insecure HTTP connections after
    779  a previous HTTPS connection. It protects against SSLStripping attacks.
    780 
    781  Doc: https://developer.mozilla.org/en-US/docs/Web/Security/HTTP_strict_transport_security
    782  RFC 6797: https://tools.ietf.org/html/rfc6797
    783 
    784 13.13 Support HPKP
    785 
    786  "HTTP Public Key Pinning" is TOFU (trust on first use), time-based
    787  features indicated by a HTTP header send by the webserver. It's purpose is
    788  to prevent Man-in-the-middle attacks by trusted CAs by allowing webadmins
    789  to specify which CAs/certificates/public keys to trust when connection to
    790  their websites.
    791 
    792  It can be build based on PINNEDPUBLICKEY.
    793 
    794  Wikipedia: https://en.wikipedia.org/wiki/HTTP_Public_Key_Pinning
    795  OWASP: https://www.owasp.org/index.php/Certificate_and_Public_Key_Pinning
    796  Doc: https://developer.mozilla.org/de/docs/Web/Security/Public_Key_Pinning
    797  RFC: https://tools.ietf.org/html/draft-ietf-websec-key-pinning-21
    798 
    799 14. GnuTLS
    800 
    801 14.1 SSL engine stuff
    802 
    803  Is this even possible?
    804 
    805 14.2 check connection
    806 
    807  Add a way to check if the connection seems to be alive, to correspond to the
    808  SSL_peak() way we use with OpenSSL.
    809 
    810 15. WinSSL/SChannel
    811 
    812 15.1 Add support for client certificate authentication
    813 
    814  WinSSL/SChannel currently makes use of the OS-level system and user
    815  certificate and private key stores. This does not allow the application
    816  or the user to supply a custom client certificate using curl or libcurl.
    817 
    818  Therefore support for the existing -E/--cert and --key options should be
    819  implemented by supplying a custom certificate to the SChannel APIs, see:
    820  - Getting a Certificate for Schannel
    821    https://msdn.microsoft.com/en-us/library/windows/desktop/aa375447.aspx
    822 
    823 15.2 Add support for custom server certificate validation
    824 
    825  WinSSL/SChannel currently makes use of the OS-level system and user
    826  certificate trust store. This does not allow the application or user to
    827  customize the server certificate validation process using curl or libcurl.
    828 
    829  Therefore support for the existing --cacert or --capath options should be
    830  implemented by supplying a custom certificate to the SChannel APIs, see:
    831  - Getting a Certificate for Schannel
    832    https://msdn.microsoft.com/en-us/library/windows/desktop/aa375447.aspx
    833 
    834 15.3 Add support for the --ciphers option
    835 
    836  The cipher suites used by WinSSL/SChannel are configured on an OS-level
    837  instead of an application-level. This does not allow the application or
    838  the user to customize the configured cipher suites using curl or libcurl.
    839 
    840  Therefore support for the existing --ciphers option should be implemented
    841  by mapping the OpenSSL/GnuTLS cipher suites to the SChannel APIs, see
    842  - Specifying Schannel Ciphers and Cipher Strengths
    843    https://msdn.microsoft.com/en-us/library/windows/desktop/aa380161.aspx
    844 
    845 16. SASL
    846 
    847 16.1 Other authentication mechanisms
    848 
    849  Add support for other authentication mechanisms such as OLP,
    850  GSS-SPNEGO and others.
    851 
    852 16.2 Add QOP support to GSSAPI authentication
    853 
    854  Currently the GSSAPI authentication only supports the default QOP of auth
    855  (Authentication), whilst Kerberos V5 supports both auth-int (Authentication
    856  with integrity protection) and auth-conf (Authentication with integrity and
    857  privacy protection).
    858 
    859 16.3 Support binary messages (i.e.: non-base64)
    860 
    861   Mandatory to support LDAP SASL authentication.
    862 
    863 
    864 17. SSH protocols
    865 
    866 17.1 Multiplexing
    867 
    868  SSH is a perfectly fine multiplexed protocols which would allow libcurl to do
    869  multiple parallel transfers from the same host using the same connection,
    870  much in the same spirit as HTTP/2 does. libcurl however does not take
    871  advantage of that ability but will instead always create a new connection for
    872  new transfers even if an existing connection already exists to the host.
    873 
    874  To fix this, libcurl would have to detect an existing connection and "attach"
    875  the new transfer to the existing one.
    876 
    877 17.2 SFTP performance
    878 
    879  libcurl's SFTP transfer performance is sub par and can be improved, mostly by
    880  the approach mentioned in "1.6 Modified buffer size approach".
    881 
    882 17.3 Support better than MD5 hostkey hash
    883 
    884  libcurl offers the CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 option for verifying the
    885  server's key. MD5 is generally being deprecated so we should implement
    886  support for stronger hashing algorithms. libssh2 itself is what provides this
    887  underlying functionality and it supports at least SHA-1 as an alternative.
    888  SHA-1 is also being deprecated these days so we should consider workign with
    889  libssh2 to instead offer support for SHA-256 or similar.
    890 
    891 
    892 18. Command line tool
    893 
    894 18.1 sync
    895 
    896  "curl --sync http://example.com/feed[1-100].rss" or
    897  "curl --sync http://example.net/{index,calendar,history}.html"
    898 
    899  Downloads a range or set of URLs using the remote name, but only if the
    900  remote file is newer than the local file. A Last-Modified HTTP date header
    901  should also be used to set the mod date on the downloaded file.
    902 
    903 18.2 glob posts
    904 
    905  Globbing support for -d and -F, as in 'curl -d "name=foo[0-9]" URL'.
    906  This is easily scripted though.
    907 
    908 18.3 prevent file overwriting
    909 
    910  Add an option that prevents curl from overwriting existing local files. When
    911  used, and there already is an existing file with the target file name
    912  (either -O or -o), a number should be appended (and increased if already
    913  existing). So that index.html becomes first index.html.1 and then
    914  index.html.2 etc.
    915 
    916 18.4 simultaneous parallel transfers
    917 
    918  The client could be told to use maximum N simultaneous parallel transfers and
    919  then just make sure that happens. It should of course not make more than one
    920  connection to the same remote host. This would require the client to use the
    921  multi interface. https://curl.haxx.se/bug/feature.cgi?id=1558595
    922 
    923  Using the multi interface would also allow properly using parallel transfers
    924  with HTTP/2 and supporting HTTP/2 server push from the command line.
    925 
    926 18.5 provide formpost headers
    927 
    928  Extending the capabilities of the multipart formposting. How about leaving
    929  the ';type=foo' syntax as it is and adding an extra tag (headers) which
    930  works like this: curl -F "coolfiles=@fil1.txt;headers=@fil1.hdr" where
    931  fil1.hdr contains extra headers like
    932 
    933    Content-Type: text/plain; charset=KOI8-R"
    934    Content-Transfer-Encoding: base64
    935    X-User-Comment: Please don't use browser specific HTML code
    936 
    937  which should overwrite the program reasonable defaults (plain/text,
    938  8bit...)
    939 
    940 18.6 warning when setting an option
    941 
    942  Display a warning when libcurl returns an error when setting an option.
    943  This can be useful to tell when support for a particular feature hasn't been
    944  compiled into the library.
    945 
    946 18.7 warning when sending binary output to terminal
    947 
    948  Provide a way that prompts the user for confirmation before binary data is
    949  sent to the terminal, much in the style 'less' does it.
    950 
    951 18.8 offer color-coded HTTP header output
    952 
    953  By offering different color output on the header name and the header
    954  contents, they could be made more readable and thus help users working on
    955  HTTP services.
    956 
    957 18.9 Choose the name of file in braces for complex URLs
    958 
    959  When using braces to download a list of URLs and you use complicated names
    960  in the list of alternatives, it could be handy to allow curl to use other
    961  names when saving.
    962 
    963  Consider a way to offer that. Possibly like
    964  {partURL1:name1,partURL2:name2,partURL3:name3} where the name following the
    965  colon is the output name.
    966 
    967  See https://github.com/curl/curl/issues/221
    968 
    969 18.10 improve how curl works in a windows console window
    970 
    971  If you pull the scrollbar when transferring with curl in a Windows console
    972  window, the transfer is interrupted and can get disconnected. This can
    973  probably be improved. See https://github.com/curl/curl/issues/322
    974 
    975 18.11 -w output to stderr
    976 
    977  -w is quite useful, but not to those of us who use curl without -o or -O
    978  (such as for scripting through a higher level language). It would be nice to
    979  have an option that is exactly like -w but sends it to stderr
    980  instead. Proposed name: --write-stderr. See
    981  https://github.com/curl/curl/issues/613
    982 
    983 18.12 keep running, read instructions from pipe/socket
    984 
    985  Provide an option that makes curl not exit after the last URL (or even work
    986  without a given URL), and then make it read instructions passed on a pipe or
    987  over a socket to make further instructions so that a second subsequent curl
    988  invoke can talk to the still running instance and ask for transfers to get
    989  done, and thus maintain its connection pool, DNS cache and more.
    990 
    991 18.13 support metalink in http headers
    992 
    993  Curl has support for downloading a metalink xml file, processing it, and then
    994  downloading the target of the metalink. This is done via the --metalink option.
    995  It would be nice if metalink also supported downloading via metalink
    996  information that is stored in HTTP headers (RFC 6249). Theoretically this could
    997  also be supported with the --metalink option.
    998 
    999  See https://tools.ietf.org/html/rfc6249
   1000 
   1001  See also https://lists.gnu.org/archive/html/bug-wget/2015-06/msg00034.html for
   1002  an implematation of this in wget.
   1003 
   1004 18.14 --fail without --location should treat 3xx as a failure
   1005 
   1006  To allow a command line like this to detect a redirect and consider it a
   1007  failure:
   1008 
   1009     curl -v --fail -O https://example.com/curl-7.48.0.tar.gz
   1010 
   1011  ... --fail must treat 3xx responses as failures too. The least problematic
   1012  way to implement this is probably to add that new logic in the command line
   1013  tool only and not in the underlying CURLOPT_FAILONERROR logic.
   1014 
   1015 18.15 Introduce --fail-fast to exit on first transfer fail
   1016 
   1017  curl will transfer all URLs given on the command line one by one but only
   1018  returns the error code for the last transfer. Transfer failures on the first
   1019  ones will not be returned as error code etc to the shell. A --fail-fast
   1020  option would make curl exit and return an error for the first transfer that
   1021  fails.
   1022 
   1023 18.16 --retry should resume
   1024 
   1025  When --retry is used and curl actually retries transfer, it should use the
   1026  already transfered data and do a resumed transfer for the rest (when
   1027  possible) so that it doesn't have to transfer the same data again that was
   1028  already tranfered before the retry.
   1029 
   1030  See https://github.com/curl/curl/issues/1084
   1031 
   1032 
   1033 19. Build
   1034 
   1035 19.1 roffit
   1036 
   1037  Consider extending 'roffit' to produce decent ASCII output, and use that
   1038  instead of (g)nroff when building src/tool_hugehelp.c
   1039 
   1040 19.2 Enable PIE and RELRO by default
   1041 
   1042  Especially when having programs that execute curl via the command line, PIE
   1043  renders the exploitation of memory corruption vulnerabilities a lot more
   1044  difficult. This can be attributed to the additional information leaks being
   1045  required to conduct a successful attack. RELRO, on the other hand, masks
   1046  different binary sections like the GOT as read-only and thus kills a handful
   1047  of techniques that come in handy when attackers are able to arbitrarily
   1048  overwrite memory. A few tests showed that enabling these features had close
   1049  to no impact, neither on the performance nor on the general functionality of
   1050  curl.
   1051 
   1052 
   1053 20. Test suite
   1054 
   1055 20.1 SSL tunnel
   1056 
   1057  Make our own version of stunnel for simple port forwarding to enable HTTPS
   1058  and FTP-SSL tests without the stunnel dependency, and it could allow us to
   1059  provide test tools built with either OpenSSL or GnuTLS
   1060 
   1061 20.2 nicer lacking perl message
   1062 
   1063  If perl wasn't found by the configure script, don't attempt to run the tests
   1064  but explain something nice why it doesn't.
   1065 
   1066 20.3 more protocols supported
   1067 
   1068  Extend the test suite to include more protocols. The telnet could just do FTP
   1069  or http operations (for which we have test servers).
   1070 
   1071 20.4 more platforms supported
   1072 
   1073  Make the test suite work on more platforms. OpenBSD and Mac OS. Remove
   1074  fork()s and it should become even more portable.
   1075 
   1076 20.5 Add support for concurrent connections
   1077 
   1078  Tests 836, 882 and 938 were designed to verify that separate connections aren't
   1079  used when using different login credentials in protocols that shouldn't re-use
   1080  a connection under such circumstances.
   1081 
   1082  Unfortunately, ftpserver.pl doesn't appear to support multiple concurrent
   1083  connections. The read while() loop seems to loop until it receives a disconnect
   1084  from the client, where it then enters the waiting for connections loop. When
   1085  the client opens a second connection to the server, the first connection hasn't
   1086  been dropped (unless it has been forced - which we shouldn't do in these tests)
   1087  and thus the wait for connections loop is never entered to receive the second
   1088  connection.
   1089 
   1090 20.6 Use the RFC6265 test suite
   1091 
   1092  A test suite made for HTTP cookies (RFC 6265) by Adam Barth is available at
   1093  https://github.com/abarth/http-state/tree/master/tests
   1094 
   1095  It'd be really awesome if someone would write a script/setup that would run
   1096  curl with that test suite and detect deviances. Ideally, that would even be
   1097  incorporated into our regular test suite.
   1098 
   1099 
   1100 21. Next SONAME bump
   1101 
   1102 21.1 http-style HEAD output for FTP
   1103 
   1104  #undef CURL_FTP_HTTPSTYLE_HEAD in lib/ftp.c to remove the HTTP-style headers
   1105  from being output in NOBODY requests over FTP
   1106 
   1107 21.2 combine error codes
   1108 
   1109  Combine some of the error codes to remove duplicates.  The original
   1110  numbering should not be changed, and the old identifiers would be
   1111  macroed to the new ones in an CURL_NO_OLDIES section to help with
   1112  backward compatibility.
   1113 
   1114  Candidates for removal and their replacements:
   1115 
   1116     CURLE_FILE_COULDNT_READ_FILE => CURLE_REMOTE_FILE_NOT_FOUND
   1117 
   1118     CURLE_FTP_COULDNT_RETR_FILE => CURLE_REMOTE_FILE_NOT_FOUND
   1119 
   1120     CURLE_FTP_COULDNT_USE_REST => CURLE_RANGE_ERROR
   1121 
   1122     CURLE_FUNCTION_NOT_FOUND => CURLE_FAILED_INIT
   1123 
   1124     CURLE_LDAP_INVALID_URL => CURLE_URL_MALFORMAT
   1125 
   1126     CURLE_TFTP_NOSUCHUSER => CURLE_TFTP_ILLEGAL
   1127 
   1128     CURLE_TFTP_NOTFOUND => CURLE_REMOTE_FILE_NOT_FOUND
   1129 
   1130     CURLE_TFTP_PERM => CURLE_REMOTE_ACCESS_DENIED
   1131 
   1132 21.3 extend CURLOPT_SOCKOPTFUNCTION prototype
   1133 
   1134  The current prototype only provides 'purpose' that tells what the
   1135  connection/socket is for, but not any protocol or similar. It makes it hard
   1136  for applications to differentiate on TCP vs UDP and even HTTP vs FTP and
   1137  similar.
   1138 
   1139 22. Next major release
   1140 
   1141 22.1 cleanup return codes
   1142 
   1143  curl_easy_cleanup() returns void, but curl_multi_cleanup() returns a
   1144  CURLMcode. These should be changed to be the same.
   1145 
   1146 22.2 remove obsolete defines
   1147 
   1148  remove obsolete defines from curl/curl.h
   1149 
   1150 22.3 size_t
   1151 
   1152  make several functions use size_t instead of int in their APIs
   1153 
   1154 22.4 remove several functions
   1155 
   1156  remove the following functions from the public API:
   1157 
   1158  curl_getenv
   1159 
   1160  curl_mprintf (and variations)
   1161 
   1162  curl_strequal
   1163 
   1164  curl_strnequal
   1165 
   1166  They will instead become curlx_ - alternatives. That makes the curl app
   1167  still capable of using them, by building with them from source.
   1168 
   1169  These functions have no purpose anymore:
   1170 
   1171  curl_multi_socket
   1172 
   1173  curl_multi_socket_all
   1174 
   1175 22.5 remove CURLOPT_FAILONERROR
   1176 
   1177  Remove support for CURLOPT_FAILONERROR, it has gotten too kludgy and weird
   1178  internally. Let the app judge success or not for itself.
   1179 
   1180 22.6 remove CURLOPT_DNS_USE_GLOBAL_CACHE
   1181 
   1182  Remove support for a global DNS cache. Anything global is silly, and we
   1183  already offer the share interface for the same functionality but done
   1184  "right".
   1185 
   1186 22.7 remove progress meter from libcurl
   1187 
   1188  The internally provided progress meter output doesn't belong in the library.
   1189  Basically no application wants it (apart from curl) but instead applications
   1190  can and should do their own progress meters using the progress callback.
   1191 
   1192  The progress callback should then be bumped as well to get proper 64bit
   1193  variable types passed to it instead of doubles so that big files work
   1194  correctly.
   1195 
   1196 22.8 remove 'curl_httppost' from public
   1197 
   1198  curl_formadd() was made to fill in a public struct, but the fact that the
   1199  struct is public is never really used by application for their own advantage
   1200  but instead often restricts how the form functions can or can't be modified.
   1201 
   1202  Changing them to return a private handle will benefit the implementation and
   1203  allow us much greater freedoms while still maintaining a solid API and ABI.
   1204