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