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