blob: 32910443572a2b5fc1b743a50b110fe6fdecd8ee [file] [log] [blame]
xf.li6c8fc1e2023-08-12 00:11:09 -07001 _ _ ____ _
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 TFO support on Windows
21 1.2 Consult %APPDATA% also for .netrc
22 1.3 struct lifreq
23 1.4 alt-svc sharing
24 1.5 get rid of PATH_MAX
25 1.6 native IDN support on macOS
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 c-ares and CURLOPT_OPENSOCKETFUNCTION
33 1.15 Monitor connections in the connection pool
34 1.16 Try to URL encode given URL
35 1.17 Add support for IRIs
36 1.18 try next proxy if one does not work
37 1.19 provide timing info for each redirect
38 1.20 SRV and URI DNS records
39 1.21 netrc caching and sharing
40 1.22 CURLINFO_PAUSE_STATE
41 1.23 Offer API to flush the connection pool
42 1.25 Expose tried IP addresses that failed
43 1.28 FD_CLOEXEC
44 1.29 Upgrade to websockets
45 1.30 config file parsing
46 1.31 erase secrets from heap/stack after use
47 1.32 add asynch getaddrinfo support
48
49 2. libcurl - multi interface
50 2.1 More non-blocking
51 2.2 Better support for same name resolves
52 2.3 Non-blocking curl_multi_remove_handle()
53 2.4 Split connect and authentication process
54 2.5 Edge-triggered sockets should work
55 2.6 multi upkeep
56 2.7 Virtual external sockets
57 2.8 dynamically decide to use socketpair
58
59 3. Documentation
60 3.1 Improve documentation about fork safety
61 3.2 Provide cmake config-file
62
63 4. FTP
64 4.1 HOST
65 4.2 Alter passive/active on failure and retry
66 4.3 Earlier bad letter detection
67 4.4 Support CURLOPT_PREQUOTE for dir listings too
68 4.5 ASCII support
69 4.6 GSSAPI via Windows SSPI
70 4.7 STAT for LIST without data connection
71
72 5. HTTP
73 5.1 Provide the error body from a CONNNECT response
74 5.2 Set custom client ip when using haproxy protocol
75 5.3 Rearrange request header order
76 5.4 Allow SAN names in HTTP/2 server push
77 5.5 auth= in URLs
78 5.6 alt-svc should fallback if alt-svc does not work
79 5.7 Require HTTP version X or higher
80
81 6. TELNET
82 6.1 ditch stdin
83 6.2 ditch telnet-specific select
84 6.3 feature negotiation debug data
85 6.4 exit immediately upon connection if stdin is /dev/null
86
87 7. SMTP
88 7.1 Passing NOTIFY option to CURLOPT_MAIL_RCPT
89 7.2 Enhanced capability support
90 7.3 Add CURLOPT_MAIL_CLIENT option
91
92 8. POP3
93 8.2 Enhanced capability support
94
95 9. IMAP
96 9.1 Enhanced capability support
97
98 10. LDAP
99 10.1 SASL based authentication mechanisms
100 10.2 CURLOPT_SSL_CTX_FUNCTION for LDAPS
101 10.3 Paged searches on LDAP server
102
103 11. SMB
104 11.1 File listing support
105 11.2 Honor file timestamps
106 11.3 Use NTLMv2
107 11.4 Create remote directories
108
109 12. FILE
110 12.1 Directory listing for FILE:
111
112 13. TLS
113 13.1 TLS-PSK with OpenSSL
114 13.2 Provide mutex locking API
115 13.3 Defeat TLS fingerprinting
116 13.4 Cache/share OpenSSL contexts
117 13.5 Export session ids
118 13.6 Provide callback for cert verification
119 13.7 Less memory massaging with Schannel
120 13.8 Support DANE
121 13.9 TLS record padding
122 13.10 Support Authority Information Access certificate extension (AIA)
123 13.11 Support intermediate & root pinning for PINNEDPUBLICKEY
124 13.12 Reduce CA certificate bundle reparsing
125 13.13 Make sure we forbid TLS 1.3 post-handshake authentication
126 13.14 Support the clienthello extension
127
128 14. GnuTLS
129 14.2 check connection
130
131 15. Schannel
132 15.1 Extend support for client certificate authentication
133 15.2 Extend support for the --ciphers option
134 15.4 Add option to allow abrupt server closure
135
136 16. SASL
137 16.1 Other authentication mechanisms
138 16.2 Add QOP support to GSSAPI authentication
139
140 17. SSH protocols
141 17.1 Multiplexing
142 17.2 Handle growing SFTP files
143 17.3 Read keys from ~/.ssh/id_ecdsa, id_ed25519
144 17.4 Support CURLOPT_PREQUOTE
145 17.5 SSH over HTTPS proxy with more backends
146 17.6 SFTP with SCP://
147
148 18. Command line tool
149 18.1 sync
150 18.2 glob posts
151 18.4 --proxycommand
152 18.5 UTF-8 filenames in Content-Disposition
153 18.6 Option to make -Z merge lined based outputs on stdout
154 18.8 Consider convenience options for JSON and XML?
155 18.9 Choose the name of file in braces for complex URLs
156 18.10 improve how curl works in a windows console window
157 18.11 Windows: set attribute 'archive' for completed downloads
158 18.12 keep running, read instructions from pipe/socket
159 18.13 Ratelimit or wait between serial requests
160 18.14 --dry-run
161 18.15 --retry should resume
162 18.16 send only part of --data
163 18.17 consider file name from the redirected URL with -O ?
164 18.18 retry on network is unreachable
165 18.19 expand ~/ in config files
166 18.20 host name sections in config files
167 18.21 retry on the redirected-to URL
168 18.23 Set the modification date on an uploaded file
169 18.24 Use multiple parallel transfers for a single download
170 18.25 Prevent terminal injection when writing to terminal
171 18.26 Custom progress meter update interval
172
173 19. Build
174 19.1 roffit
175 19.2 Enable PIE and RELRO by default
176 19.3 Do not use GNU libtool on OpenBSD
177 19.4 Package curl for Windows in a signed installer
178 19.5 make configure use --cache-file more and better
179
180 20. Test suite
181 20.1 SSL tunnel
182 20.2 nicer lacking perl message
183 20.3 more protocols supported
184 20.4 more platforms supported
185 20.5 Add support for concurrent connections
186 20.6 Use the RFC6265 test suite
187 20.7 Support LD_PRELOAD on macOS
188 20.8 Run web-platform-tests URL tests
189
190 21. MQTT
191 21.1 Support rate-limiting
192
193==============================================================================
194
1951. libcurl
196
1971.1 TFO support on Windows
198
199 libcurl supports the CURLOPT_TCP_FASTOPEN option since 7.49.0 for Linux and
200 Mac OS. Windows supports TCP Fast Open starting with Windows 10, version 1607
201 and we should add support for it.
202
203 TCP Fast Open is supported on several platforms but not on Windows. Work on
204 this was once started but never finished.
205
206 See https://github.com/curl/curl/pull/3378
207
2081.2 Consult %APPDATA% also for .netrc
209
210 %APPDATA%\.netrc is not considered when running on Windows. should not it?
211
212 See https://github.com/curl/curl/issues/4016
213
2141.3 struct lifreq
215
216 Use 'struct lifreq' and SIOCGLIFADDR instead of 'struct ifreq' and
217 SIOCGIFADDR on newer Solaris versions as they claim the latter is obsolete.
218 To support IPv6 interface addresses for network interfaces properly.
219
2201.4 alt-svc sharing
221
222 The share interface could benefit from allowing the alt-svc cache to be
223 possible to share between easy handles.
224
225 See https://github.com/curl/curl/issues/4476
226
2271.5 get rid of PATH_MAX
228
229 Having code use and rely on PATH_MAX is not nice:
230 https://insanecoding.blogspot.com/2007/11/pathmax-simply-isnt.html
231
232 Currently the libssh2 SSH based code uses it, but to remove PATH_MAX from
233 there we need libssh2 to properly tell us when we pass in a too small buffer
234 and its current API (as of libssh2 1.2.7) does not.
235
2361.6 native IDN support on macOS
237
238 On recent macOS versions, the getaddrinfo() function itself has built-in IDN
239 support. By setting the AI_CANONNAME flag, the function will return the
240 encoded name in the ai_canonname struct field in the returned information.
241 This could be used by curl on macOS when built without a separate IDN library
242 and an IDN host name is used in a URL.
243
244 See initial work in https://github.com/curl/curl/pull/5371
245
2461.7 Support HTTP/2 for HTTP(S) proxies
247
248 Support for doing HTTP/2 to HTTP and HTTPS proxies is still missing.
249
250 See https://github.com/curl/curl/issues/3570
251
2521.8 CURLOPT_RESOLVE for any port number
253
254 This option allows applications to set a replacement IP address for a given
255 host + port pair. Consider making support for providing a replacement address
256 for the host name on all port numbers.
257
258 See https://github.com/curl/curl/issues/1264
259
2601.9 Cache negative name resolves
261
262 A name resolve that has failed is likely to fail when made again within a
263 short period of time. Currently we only cache positive responses.
264
2651.10 auto-detect proxy
266
267 libcurl could be made to detect the system proxy setup automatically and use
268 that. On Windows, macOS and Linux desktops for example.
269
270 The pull-request to use libproxy for this was deferred due to doubts on the
271 reliability of the dependency and how to use it:
272 https://github.com/curl/curl/pull/977
273
274 libdetectproxy is a (C++) library for detecting the proxy on Windows
275 https://github.com/paulharris/libdetectproxy
276
2771.11 minimize dependencies with dynamically loaded modules
278
279 We can create a system with loadable modules/plug-ins, where these modules
280 would be the ones that link to 3rd party libs. That would allow us to avoid
281 having to load ALL dependencies since only the necessary ones for this
282 app/invoke/used protocols would be necessary to load. See
283 https://github.com/curl/curl/issues/349
284
2851.12 updated DNS server while running
286
287 If /etc/resolv.conf gets updated while a program using libcurl is running, it
288 is may cause name resolves to fail unless res_init() is called. We should
289 consider calling res_init() + retry once unconditionally on all name resolve
290 failures to mitigate against this. Firefox works like that. Note that Windows
291 does not have res_init() or an alternative.
292
293 https://github.com/curl/curl/issues/2251
294
2951.13 c-ares and CURLOPT_OPENSOCKETFUNCTION
296
297 curl will create most sockets via the CURLOPT_OPENSOCKETFUNCTION callback and
298 close them with the CURLOPT_CLOSESOCKETFUNCTION callback. However, c-ares
299 does not use those functions and instead opens and closes the sockets
300 itself. This means that when curl passes the c-ares socket to the
301 CURLMOPT_SOCKETFUNCTION it is not owned by the application like other sockets.
302
303 See https://github.com/curl/curl/issues/2734
304
3051.15 Monitor connections in the connection pool
306
307 libcurl's connection cache or pool holds a number of open connections for the
308 purpose of possible subsequent connection reuse. It may contain a few up to a
309 significant amount of connections. Currently, libcurl leaves all connections
310 as they are and first when a connection is iterated over for matching or
311 reuse purpose it is verified that it is still alive.
312
313 Those connections may get closed by the server side for idleness or they may
314 get an HTTP/2 ping from the peer to verify that they are still alive. By
315 adding monitoring of the connections while in the pool, libcurl can detect
316 dead connections (and close them) better and earlier, and it can handle
317 HTTP/2 pings to keep such ones alive even when not actively doing transfers
318 on them.
319
3201.16 Try to URL encode given URL
321
322 Given a URL that for example contains spaces, libcurl could have an option
323 that would try somewhat harder than it does now and convert spaces to %20 and
324 perhaps URL encoded byte values over 128 etc (basically do what the redirect
325 following code already does).
326
327 https://github.com/curl/curl/issues/514
328
3291.17 Add support for IRIs
330
331 IRIs (RFC 3987) allow localized, non-ascii, names in the URL. To properly
332 support this, curl/libcurl would need to translate/encode the given input
333 from the input string encoding into percent encoded output "over the wire".
334
335 To make that work smoothly for curl users even on Windows, curl would
336 probably need to be able to convert from several input encodings.
337
3381.18 try next proxy if one does not work
339
340 Allow an application to specify a list of proxies to try, and failing to
341 connect to the first go on and try the next instead until the list is
342 exhausted. Browsers support this feature at least when they specify proxies
343 using PACs.
344
345 https://github.com/curl/curl/issues/896
346
3471.19 provide timing info for each redirect
348
349 curl and libcurl provide timing information via a set of different
350 time-stamps (CURLINFO_*_TIME). When curl is following redirects, those
351 returned time value are the accumulated sums. An improvement could be to
352 offer separate timings for each redirect.
353
354 https://github.com/curl/curl/issues/6743
355
3561.20 SRV and URI DNS records
357
358 Offer support for resolving SRV and URI DNS records for libcurl to know which
359 server to connect to for various protocols (including HTTP).
360
3611.21 netrc caching and sharing
362
363 The netrc file is read and parsed each time a connection is setup, which
364 means that if a transfer needs multiple connections for authentication or
365 redirects, the file might be reread (and parsed) multiple times. This makes
366 it impossible to provide the file as a pipe.
367
3681.22 CURLINFO_PAUSE_STATE
369
370 Return information about the transfer's current pause state, in both
371 directions. https://github.com/curl/curl/issues/2588
372
3731.23 Offer API to flush the connection pool
374
375 Sometimes applications want to flush all the existing connections kept alive.
376 An API could allow a forced flush or just a forced loop that would properly
377 close all connections that have been closed by the server already.
378
3791.25 Expose tried IP addresses that failed
380
381 When libcurl fails to connect to a host, it could offer the application the
382 addresses that were used in the attempt. Source + dest IP, source + dest port
383 and protocol (UDP or TCP) for each failure. Possibly as a callback. Perhaps
384 also provide "reason".
385
386 https://github.com/curl/curl/issues/2126
387
3881.28 FD_CLOEXEC
389
390 It sets the close-on-exec flag for the file descriptor, which causes the file
391 descriptor to be automatically (and atomically) closed when any of the
392 exec-family functions succeed. Should probably be set by default?
393
394 https://github.com/curl/curl/issues/2252
395
3961.29 Upgrade to websockets
397
398 libcurl could offer a smoother path to get to a websocket connection.
399 See https://github.com/curl/curl/issues/3523
400
401 Michael Kaufmann suggestion here:
402 https://curl.se/video/curlup-2017/2017-03-19_05_Michael_Kaufmann_Websocket_support_for_curl.mp4
403
4041.30 config file parsing
405
406 Consider providing an API, possibly in a separate companion library, for
407 parsing a config file like curl's -K/--config option to allow applications to
408 get the same ability to read curl options from files.
409
410 See https://github.com/curl/curl/issues/3698
411
4121.31 erase secrets from heap/stack after use
413
414 Introducing a concept and system to erase secrets from memory after use, it
415 could help mitigate and lessen the impact of (future) security problems etc.
416 However: most secrets are passed to libcurl as clear text from the
417 application and then clearing them within the library adds nothing...
418
419 https://github.com/curl/curl/issues/7268
420
4211.32 add asynch getaddrinfo support
422
423 Use getaddrinfo_a() to provide an asynch name resolver backend to libcurl
424 that does not use threads and does not depend on c-ares. The getaddrinfo_a
425 function is (probably?) glibc specific but that is a widely used libc among
426 our users.
427
428 https://github.com/curl/curl/pull/6746
429
4302. libcurl - multi interface
431
4322.1 More non-blocking
433
434 Make sure we do not ever loop because of non-blocking sockets returning
435 EWOULDBLOCK or similar. Blocking cases include:
436
437 - Name resolves on non-windows unless c-ares or the threaded resolver is used.
438
439 - The threaded resolver may block on cleanup:
440 https://github.com/curl/curl/issues/4852
441
442 - file:// transfers
443
444 - TELNET transfers
445
446 - GSSAPI authentication for FTP transfers
447
448 - The "DONE" operation (post transfer protocol-specific actions) for the
449 protocols SFTP, SMTP, FTP. Fixing multi_done() for this is a worthy task.
450
451 - curl_multi_remove_handle for any of the above. See section 2.3.
452
4532.2 Better support for same name resolves
454
455 If a name resolve has been initiated for name NN and a second easy handle
456 wants to resolve that name as well, make it wait for the first resolve to end
457 up in the cache instead of doing a second separate resolve. This is
458 especially needed when adding many simultaneous handles using the same host
459 name when the DNS resolver can get flooded.
460
4612.3 Non-blocking curl_multi_remove_handle()
462
463 The multi interface has a few API calls that assume a blocking behavior, like
464 add_handle() and remove_handle() which limits what we can do internally. The
465 multi API need to be moved even more into a single function that "drives"
466 everything in a non-blocking manner and signals when something is done. A
467 remove or add would then only ask for the action to get started and then
468 multi_perform() etc still be called until the add/remove is completed.
469
4702.4 Split connect and authentication process
471
472 The multi interface treats the authentication process as part of the connect
473 phase. As such any failures during authentication will not trigger the relevant
474 QUIT or LOGOFF for protocols such as IMAP, POP3 and SMTP.
475
4762.5 Edge-triggered sockets should work
477
478 The multi_socket API should work with edge-triggered socket events. One of
479 the internal actions that need to be improved for this to work perfectly is
480 the 'maxloops' handling in transfer.c:readwrite_data().
481
4822.6 multi upkeep
483
484 In libcurl 7.62.0 we introduced curl_easy_upkeep. It unfortunately only works
485 on easy handles. We should introduces a version of that for the multi handle,
486 and also consider doing "upkeep" automatically on connections in the
487 connection pool when the multi handle is in used.
488
489 See https://github.com/curl/curl/issues/3199
490
4912.7 Virtual external sockets
492
493 libcurl performs operations on the given file descriptor that presumes it is
494 a socket and an application cannot replace them at the moment. Allowing an
495 application to fully replace those would allow a larger degree of freedom and
496 flexibility.
497
498 See https://github.com/curl/curl/issues/5835
499
5002.8 dynamically decide to use socketpair
501
502 For users who do not use curl_multi_wait() or do not care for
503 curl_multi_wakeup(), we could introduce a way to make libcurl NOT
504 create a socketpair in the multi handle.
505
506 See https://github.com/curl/curl/issues/4829
507
5083. Documentation
509
5103.1 Improve documentation about fork safety
511
512 See https://github.com/curl/curl/issues/6968
513
5143.2 Provide cmake config-file
515
516 A config-file package is a set of files provided by us to allow applications
517 to write cmake scripts to find and use libcurl easier. See
518 https://github.com/curl/curl/issues/885
519
5204. FTP
521
5224.1 HOST
523
524 HOST is a command for a client to tell which host name to use, to offer FTP
525 servers named-based virtual hosting:
526
527 https://datatracker.ietf.org/doc/html/rfc7151
528
5294.2 Alter passive/active on failure and retry
530
531 When trying to connect passively to a server which only supports active
532 connections, libcurl returns CURLE_FTP_WEIRD_PASV_REPLY and closes the
533 connection. There could be a way to fallback to an active connection (and
534 vice versa). https://curl.se/bug/feature.cgi?id=1754793
535
5364.3 Earlier bad letter detection
537
538 Make the detection of (bad) %0d and %0a codes in FTP URL parts earlier in the
539 process to avoid doing a resolve and connect in vain.
540
5414.4 Support CURLOPT_PREQUOTE for dir listings too
542
543 The lack of support is mostly an oversight and requires the FTP state machine
544 to get updated to get fixed.
545
546 https://github.com/curl/curl/issues/8602
547
5484.5 ASCII support
549
550 FTP ASCII transfers do not follow RFC959. They do not convert the data
551 accordingly.
552
5534.6 GSSAPI via Windows SSPI
554
555 In addition to currently supporting the SASL GSSAPI mechanism (Kerberos V5)
556 via third-party GSS-API libraries, such as Heimdal or MIT Kerberos, also add
557 support for GSSAPI authentication via Windows SSPI.
558
5594.7 STAT for LIST without data connection
560
561 Some FTP servers allow STAT for listing directories instead of using LIST,
562 and the response is then sent over the control connection instead of as the
563 otherwise usedw data connection: https://www.nsftools.com/tips/RawFTP.htm#STAT
564
565 This is not detailed in any FTP specification.
566
5675. HTTP
568
5695.1 Provide the error body from a CONNNECT response
570
571 When curl receives a body response from a CONNECT request to a proxy, it will
572 always just read and ignore it. It would make some users happy if curl
573 instead optionally would be able to make that responsible available. Via a new
574 callback? Through some other means?
575
576 See https://github.com/curl/curl/issues/9513
577
5785.2 Set custom client ip when using haproxy protocol
579
580 This would allow testing servers with different client ip addresses (without
581 using x-forward-for header).
582
583 https://github.com/curl/curl/issues/5125
584
5855.3 Rearrange request header order
586
587 Server implementors often make an effort to detect browser and to reject
588 clients it can detect to not match. One of the last details we cannot yet
589 control in libcurl's HTTP requests, which also can be exploited to detect
590 that libcurl is in fact used even when it tries to impersonate a browser, is
591 the order of the request headers. I propose that we introduce a new option in
592 which you give headers a value, and then when the HTTP request is built it
593 sorts the headers based on that number. We could then have internally created
594 headers use a default value so only headers that need to be moved have to be
595 specified.
596
5975.4 Allow SAN names in HTTP/2 server push
598
599 curl only allows HTTP/2 push promise if the provided :authority header value
600 exactly matches the host name given in the URL. It could be extended to allow
601 any name that would match the Subject Alternative Names in the server's TLS
602 certificate.
603
604 See https://github.com/curl/curl/pull/3581
605
6065.5 auth= in URLs
607
608 Add the ability to specify the preferred authentication mechanism to use by
609 using ;auth=<mech> in the login part of the URL.
610
611 For example:
612
613 http://test:pass;auth=NTLM@example.com would be equivalent to specifying
614 --user test:pass;auth=NTLM or --user test:pass --ntlm from the command line.
615
616 Additionally this should be implemented for proxy base URLs as well.
617
6185.6 alt-svc should fallback if alt-svc does not work
619
620 The alt-svc: header provides a set of alternative services for curl to use
621 instead of the original. If the first attempted one fails, it should try the
622 next etc and if all alternatives fail go back to the original.
623
624 See https://github.com/curl/curl/issues/4908
625
6265.7 Require HTTP version X or higher
627
628 curl and libcurl provide options for trying higher HTTP versions (for example
629 HTTP/2) but then still allows the server to pick version 1.1. We could
630 consider adding a way to require a minimum version.
631
632 See https://github.com/curl/curl/issues/7980
633
6346. TELNET
635
6366.1 ditch stdin
637
638 Reading input (to send to the remote server) on stdin is a crappy solution
639 for library purposes. We need to invent a good way for the application to be
640 able to provide the data to send.
641
6426.2 ditch telnet-specific select
643
644 Move the telnet support's network select() loop go away and merge the code
645 into the main transfer loop. Until this is done, the multi interface will not
646 work for telnet.
647
6486.3 feature negotiation debug data
649
650 Add telnet feature negotiation data to the debug callback as header data.
651
6526.4 exit immediately upon connection if stdin is /dev/null
653
654 If it did, curl could be used to probe if there's an server there listening
655 on a specific port. That is, the following command would exit immediately
656 after the connection is established with exit code 0:
657
658 curl -s --connect-timeout 2 telnet://example.com:80 </dev/null
659
6607. SMTP
661
6627.1 Passing NOTIFY option to CURLOPT_MAIL_RCPT
663
664 Is there a way to pass the NOTIFY option to the CURLOPT_MAIL_RCPT option ? I
665 set a string that already contains a bracket. For instance something like
666 that: curl_slist_append( recipients, "<foo@bar> NOTIFY=SUCCESS,FAILURE" );
667
668 https://github.com/curl/curl/issues/8232
669
6707.2 Enhanced capability support
671
672 Add the ability, for an application that uses libcurl, to obtain the list of
673 capabilities returned from the EHLO command.
674
6757.3 Add CURLOPT_MAIL_CLIENT option
676
677 Rather than use the URL to specify the mail client string to present in the
678 HELO and EHLO commands, libcurl should support a new CURLOPT specifically for
679 specifying this data as the URL is non-standard and to be honest a bit of a
680 hack ;-)
681
682 Please see the following thread for more information:
683 https://curl.se/mail/lib-2012-05/0178.html
684
685
6868. POP3
687
6888.2 Enhanced capability support
689
690 Add the ability, for an application that uses libcurl, to obtain the list of
691 capabilities returned from the CAPA command.
692
6939. IMAP
694
6959.1 Enhanced capability support
696
697 Add the ability, for an application that uses libcurl, to obtain the list of
698 capabilities returned from the CAPABILITY command.
699
70010. LDAP
701
70210.1 SASL based authentication mechanisms
703
704 Currently the LDAP module only supports ldap_simple_bind_s() in order to bind
705 to an LDAP server. However, this function sends username and password details
706 using the simple authentication mechanism (as clear text). However, it should
707 be possible to use ldap_bind_s() instead specifying the security context
708 information ourselves.
709
71010.2 CURLOPT_SSL_CTX_FUNCTION for LDAPS
711
712 CURLOPT_SSL_CTX_FUNCTION works perfectly for HTTPS and email protocols, but
713 it has no effect for LDAPS connections.
714
715 https://github.com/curl/curl/issues/4108
716
71710.3 Paged searches on LDAP server
718
719 https://github.com/curl/curl/issues/4452
720
72111. SMB
722
72311.1 File listing support
724
725 Add support for listing the contents of a SMB share. The output should
726 probably be the same as/similar to FTP.
727
72811.2 Honor file timestamps
729
730 The timestamp of the transferred file should reflect that of the original
731 file.
732
73311.3 Use NTLMv2
734
735 Currently the SMB authentication uses NTLMv1.
736
73711.4 Create remote directories
738
739 Support for creating remote directories when uploading a file to a directory
740 that does not exist on the server, just like --ftp-create-dirs.
741
742
74312. FILE
744
74512.1 Directory listing for FILE:
746
747 Add support for listing the contents of a directory accessed with FILE. The
748 output should probably be the same as/similar to FTP.
749
750
75113. TLS
752
75313.1 TLS-PSK with OpenSSL
754
755 Transport Layer Security pre-shared key ciphersuites (TLS-PSK) is a set of
756 cryptographic protocols that provide secure communication based on pre-shared
757 keys (PSKs). These pre-shared keys are symmetric keys shared in advance among
758 the communicating parties.
759
760 https://github.com/curl/curl/issues/5081
761
76213.2 Provide mutex locking API
763
764 Provide a libcurl API for setting mutex callbacks in the underlying SSL
765 library, so that the same application code can use mutex-locking
766 independently of OpenSSL or GnutTLS being used.
767
76813.3 Defeat TLS fingerprinting
769
770 By changing the order of TLS extensions provided in the TLS handshake, it is
771 sometimes possible to circumvent TLS fingerprinting by servers. The TLS
772 extension order is of course not the only way to fingerprint a client.
773
774 See https://github.com/curl/curl/issues/8119
775
77613.4 Cache/share OpenSSL contexts
777
778 "Look at SSL cafile - quick traces look to me like these are done on every
779 request as well, when they should only be necessary once per SSL context (or
780 once per handle)". The major improvement we can rather easily do is to make
781 sure we do not create and kill a new SSL "context" for every request, but
782 instead make one for every connection and re-use that SSL context in the same
783 style connections are re-used. It will make us use slightly more memory but
784 it will libcurl do less creations and deletions of SSL contexts.
785
786 Technically, the "caching" is probably best implemented by getting added to
787 the share interface so that easy handles who want to and can reuse the
788 context specify that by sharing with the right properties set.
789
790 https://github.com/curl/curl/issues/1110
791
79213.5 Export session ids
793
794 Add an interface to libcurl that enables "session IDs" to get
795 exported/imported. Cris Bailiff said: "OpenSSL has functions which can
796 serialise the current SSL state to a buffer of your choice, and recover/reset
797 the state from such a buffer at a later date - this is used by mod_ssl for
798 apache to implement and SSL session ID cache".
799
80013.6 Provide callback for cert verification
801
802 OpenSSL supports a callback for customised verification of the peer
803 certificate, but this does not seem to be exposed in the libcurl APIs. Could
804 it be? There's so much that could be done if it were.
805
80613.7 Less memory massaging with Schannel
807
808 The Schannel backend does a lot of custom memory management we would rather
809 avoid: the repeated alloc + free in sends and the custom memory + realloc
810 system for encrypted and decrypted data. That should be avoided and reduced
811 for 1) efficiency and 2) safety.
812
81313.8 Support DANE
814
815 DNS-Based Authentication of Named Entities (DANE) is a way to provide SSL
816 keys and certs over DNS using DNSSEC as an alternative to the CA model.
817 https://www.rfc-editor.org/rfc/rfc6698.txt
818
819 An initial patch was posted by Suresh Krishnaswamy on March 7th 2013
820 (https://curl.se/mail/lib-2013-03/0075.html) but it was a too simple
821 approach. See Daniel's comments:
822 https://curl.se/mail/lib-2013-03/0103.html . libunbound may be the
823 correct library to base this development on.
824
825 Björn Stenberg wrote a separate initial take on DANE that was never
826 completed.
827
82813.9 TLS record padding
829
830 TLS (1.3) offers optional record padding and OpenSSL provides an API for it.
831 I could make sense for libcurl to offer this ability to applications to make
832 traffic patterns harder to figure out by network traffic observers.
833
834 See https://github.com/curl/curl/issues/5398
835
83613.10 Support Authority Information Access certificate extension (AIA)
837
838 AIA can provide various things like CRLs but more importantly information
839 about intermediate CA certificates that can allow validation path to be
840 fulfilled when the HTTPS server does not itself provide them.
841
842 Since AIA is about downloading certs on demand to complete a TLS handshake,
843 it is probably a bit tricky to get done right.
844
845 See https://github.com/curl/curl/issues/2793
846
84713.11 Support intermediate & root pinning for PINNEDPUBLICKEY
848
849 CURLOPT_PINNEDPUBLICKEY does not consider the hashes of intermediate & root
850 certificates when comparing the pinned keys. Therefore it is not compatible
851 with "HTTP Public Key Pinning" as there also intermediate and root
852 certificates can be pinned. This is useful as it prevents webadmins from
853 "locking themselves out of their servers".
854
855 Adding this feature would make curls pinning 100% compatible to HPKP and
856 allow more flexible pinning.
857
85813.12 Reduce CA certificate bundle reparsing
859
860 When using the OpenSSL backend, curl will load and reparse the CA bundle at
861 the creation of the "SSL context" when it sets up a connection to do a TLS
862 handshake. A more effective way would be to somehow cache the CA bundle to
863 avoid it having to be repeatedly reloaded and reparsed.
864
865 See https://github.com/curl/curl/issues/9379
866
86713.13 Make sure we forbid TLS 1.3 post-handshake authentication
868
869 RFC 8740 explains how using HTTP/2 must forbid the use of TLS 1.3
870 post-handshake authentication. We should make sure to live up to that.
871
872 See https://github.com/curl/curl/issues/5396
873
87413.14 Support the clienthello extension
875
876 Certain stupid networks and middle boxes have a problem with SSL handshake
877 packets that are within a certain size range because how that sets some bits
878 that previously (in older TLS version) were not set. The clienthello
879 extension adds padding to avoid that size range.
880
881 https://datatracker.ietf.org/doc/html/rfc7685
882 https://github.com/curl/curl/issues/2299
883
88414. GnuTLS
885
88614.2 check connection
887
888 Add a way to check if the connection seems to be alive, to correspond to the
889 SSL_peak() way we use with OpenSSL.
890
89115. Schannel
892
89315.1 Extend support for client certificate authentication
894
895 The existing support for the -E/--cert and --key options could be
896 extended by supplying a custom certificate and key in PEM format, see:
897 - Getting a Certificate for Schannel
898 https://msdn.microsoft.com/en-us/library/windows/desktop/aa375447.aspx
899
90015.2 Extend support for the --ciphers option
901
902 The existing support for the --ciphers option could be extended
903 by mapping the OpenSSL/GnuTLS cipher suites to the Schannel APIs, see
904 - Specifying Schannel Ciphers and Cipher Strengths
905 https://msdn.microsoft.com/en-us/library/windows/desktop/aa380161.aspx
906
90715.4 Add option to allow abrupt server closure
908
909 libcurl w/schannel will error without a known termination point from the
910 server (such as length of transfer, or SSL "close notify" alert) to prevent
911 against a truncation attack. Really old servers may neglect to send any
912 termination point. An option could be added to ignore such abrupt closures.
913
914 https://github.com/curl/curl/issues/4427
915
91616. SASL
917
91816.1 Other authentication mechanisms
919
920 Add support for other authentication mechanisms such as OLP,
921 GSS-SPNEGO and others.
922
92316.2 Add QOP support to GSSAPI authentication
924
925 Currently the GSSAPI authentication only supports the default QOP of auth
926 (Authentication), whilst Kerberos V5 supports both auth-int (Authentication
927 with integrity protection) and auth-conf (Authentication with integrity and
928 privacy protection).
929
930
93117. SSH protocols
932
93317.1 Multiplexing
934
935 SSH is a perfectly fine multiplexed protocols which would allow libcurl to do
936 multiple parallel transfers from the same host using the same connection,
937 much in the same spirit as HTTP/2 does. libcurl however does not take
938 advantage of that ability but will instead always create a new connection for
939 new transfers even if an existing connection already exists to the host.
940
941 To fix this, libcurl would have to detect an existing connection and "attach"
942 the new transfer to the existing one.
943
94417.2 Handle growing SFTP files
945
946 The SFTP code in libcurl checks the file size *before* a transfer starts and
947 then proceeds to transfer exactly that amount of data. If the remote file
948 grows while the transfer is in progress libcurl will not notice and will not
949 adapt. The OpenSSH SFTP command line tool does and libcurl could also just
950 attempt to download more to see if there is more to get...
951
952 https://github.com/curl/curl/issues/4344
953
95417.3 Read keys from ~/.ssh/id_ecdsa, id_ed25519
955
956 The libssh2 backend in curl is limited to only reading keys from id_rsa and
957 id_dsa, which makes it fail connecting to servers that use more modern key
958 types.
959
960 https://github.com/curl/curl/issues/8586
961
96217.4 Support CURLOPT_PREQUOTE
963
964 The two other QUOTE options are supported for SFTP, but this was left out for
965 unknown reasons.
966
96717.5 SSH over HTTPS proxy with more backends
968
969 The SSH based protocols SFTP and SCP did not work over HTTPS proxy at
970 all until PR https://github.com/curl/curl/pull/6021 brought the
971 functionality with the libssh2 backend. Presumably, this support
972 can/could be added for the other backends as well.
973
97417.6 SFTP with SCP://
975
976 OpenSSH 9 switched their 'scp' tool to speak SFTP under the hood. Going
977 forward it might be worth having curl or libcurl attempt SFTP if SCP fails to
978 follow suite.
979
98018. Command line tool
981
98218.1 sync
983
984 "curl --sync http://example.com/feed[1-100].rss" or
985 "curl --sync http://example.net/{index,calendar,history}.html"
986
987 Downloads a range or set of URLs using the remote name, but only if the
988 remote file is newer than the local file. A Last-Modified HTTP date header
989 should also be used to set the mod date on the downloaded file.
990
99118.2 glob posts
992
993 Globbing support for -d and -F, as in 'curl -d "name=foo[0-9]" URL'.
994 This is easily scripted though.
995
99618.4 --proxycommand
997
998 Allow the user to make curl run a command and use its stdio to make requests
999 and not do any network connection by itself. Example:
1000
1001 curl --proxycommand 'ssh pi@raspberrypi.local -W 10.1.1.75 80' \
1002 http://some/otherwise/unavailable/service.php
1003
1004 See https://github.com/curl/curl/issues/4941
1005
100618.5 UTF-8 filenames in Content-Disposition
1007
1008 RFC 6266 documents how UTF-8 names can be passed to a client in the
1009 Content-Disposition header, and curl does not support this.
1010
1011 https://github.com/curl/curl/issues/1888
1012
101318.6 Option to make -Z merge lined based outputs on stdout
1014
1015 When a user requests multiple lined based files using -Z and sends them to
1016 stdout, curl will not "merge" and send complete lines fine but may send
1017 partial lines from several sources.
1018
1019 https://github.com/curl/curl/issues/5175
1020
102118.8 Consider convenience options for JSON and XML?
1022
1023 Could we add `--xml` or `--json` to add headers needed to call rest API:
1024
1025 `--xml` adds -H 'Content-Type: application/xml' -H "Accept: application/xml" and
1026 `--json` adds -H 'Content-Type: application/json' -H "Accept: application/json"
1027
1028 Setting Content-Type when doing a GET or any other method without a body
1029 would be a bit strange I think - so maybe only add CT for requests with body?
1030 Maybe plain `--xml` and ` --json` are a bit too brief and generic. Maybe
1031 `--http-json` etc?
1032
1033 See https://github.com/curl/curl/issues/5203
1034
103518.9 Choose the name of file in braces for complex URLs
1036
1037 When using braces to download a list of URLs and you use complicated names
1038 in the list of alternatives, it could be handy to allow curl to use other
1039 names when saving.
1040
1041 Consider a way to offer that. Possibly like
1042 {partURL1:name1,partURL2:name2,partURL3:name3} where the name following the
1043 colon is the output name.
1044
1045 See https://github.com/curl/curl/issues/221
1046
104718.10 improve how curl works in a windows console window
1048
1049 If you pull the scrollbar when transferring with curl in a Windows console
1050 window, the transfer is interrupted and can get disconnected. This can
1051 probably be improved. See https://github.com/curl/curl/issues/322
1052
105318.11 Windows: set attribute 'archive' for completed downloads
1054
1055 The archive bit (FILE_ATTRIBUTE_ARCHIVE, 0x20) separates files that shall be
1056 backed up from those that are either not ready or have not changed.
1057
1058 Downloads in progress are neither ready to be backed up, nor should they be
1059 opened by a different process. Only after a download has been completed it's
1060 sensible to include it in any integer snapshot or backup of the system.
1061
1062 See https://github.com/curl/curl/issues/3354
1063
106418.12 keep running, read instructions from pipe/socket
1065
1066 Provide an option that makes curl not exit after the last URL (or even work
1067 without a given URL), and then make it read instructions passed on a pipe or
1068 over a socket to make further instructions so that a second subsequent curl
1069 invoke can talk to the still running instance and ask for transfers to get
1070 done, and thus maintain its connection pool, DNS cache and more.
1071
107218.13 Ratelimit or wait between serial requests
1073
1074 Consider a command line option that can make curl do multiple serial requests
1075 slow, potentially with a (random) wait between transfers. There's also a
1076 proposed set of standard HTTP headers to let servers let the client adapt to
1077 its rate limits:
1078 https://www.ietf.org/id/draft-polli-ratelimit-headers-02.html
1079
1080 See https://github.com/curl/curl/issues/5406
1081
108218.14 --dry-run
1083
1084 A command line option that makes curl show exactly what it would do and send
1085 if it would run for real.
1086
1087 See https://github.com/curl/curl/issues/5426
1088
108918.15 --retry should resume
1090
1091 When --retry is used and curl actually retries transfer, it should use the
1092 already transferred data and do a resumed transfer for the rest (when
1093 possible) so that it does not have to transfer the same data again that was
1094 already transferred before the retry.
1095
1096 See https://github.com/curl/curl/issues/1084
1097
109818.16 send only part of --data
1099
1100 When the user only wants to send a small piece of the data provided with
1101 --data or --data-binary, like when that data is a huge file, consider a way
1102 to specify that curl should only send a piece of that. One suggested syntax
1103 would be: "--data-binary @largefile.zip!1073741823-2147483647".
1104
1105 See https://github.com/curl/curl/issues/1200
1106
110718.17 consider file name from the redirected URL with -O ?
1108
1109 When a user gives a URL and uses -O, and curl follows a redirect to a new
1110 URL, the file name is not extracted and used from the newly redirected-to URL
1111 even if the new URL may have a much more sensible file name.
1112
1113 This is clearly documented and helps for security since there's no surprise
1114 to users which file name that might get overwritten. But maybe a new option
1115 could allow for this or maybe -J should imply such a treatment as well as -J
1116 already allows for the server to decide what file name to use so it already
1117 provides the "may overwrite any file" risk.
1118
1119 This is extra tricky if the original URL has no file name part at all since
1120 then the current code path will error out with an error message, and we cannot
1121 *know* already at that point if curl will be redirected to a URL that has a
1122 file name...
1123
1124 See https://github.com/curl/curl/issues/1241
1125
112618.18 retry on network is unreachable
1127
1128 The --retry option retries transfers on "transient failures". We later added
1129 --retry-connrefused to also retry for "connection refused" errors.
1130
1131 Suggestions have been brought to also allow retry on "network is unreachable"
1132 errors and while totally reasonable, maybe we should consider a way to make
1133 this more configurable than to add a new option for every new error people
1134 want to retry for?
1135
1136 https://github.com/curl/curl/issues/1603
1137
113818.19 expand ~/ in config files
1139
1140 For example .curlrc could benefit from being able to do this.
1141
1142 See https://github.com/curl/curl/issues/2317
1143
114418.20 host name sections in config files
1145
1146 config files would be more powerful if they could set different
1147 configurations depending on used URLs, host name or possibly origin. Then a
1148 default .curlrc could a specific user-agent only when doing requests against
1149 a certain site.
1150
115118.21 retry on the redirected-to URL
1152
1153 When curl is told to --retry a failed transfer and follows redirects, it
1154 might get an HTTP 429 response from the redirected-to URL and not the
1155 original one, which then could make curl decide to rather retry the transfer
1156 on that URL only instead of the original operation to the original URL.
1157
1158 Perhaps extra emphasized if the original transfer is a large POST that
1159 redirects to a separate GET, and that GET is what gets the 529
1160
1161 See https://github.com/curl/curl/issues/5462
1162
116318.23 Set the modification date on an uploaded file
1164
1165 For SFTP and possibly FTP, curl could offer an option to set the
1166 modification time for the uploaded file.
1167
1168 See https://github.com/curl/curl/issues/5768
1169
117018.24 Use multiple parallel transfers for a single download
1171
1172 To enhance transfer speed, downloading a single URL can be split up into
1173 multiple separate range downloads that get combined into a single final
1174 result.
1175
1176 An ideal implementation would not use a specified number of parallel
1177 transfers, but curl could:
1178 - First start getting the full file as transfer A
1179 - If after N seconds have passed and the transfer is expected to continue for
1180 M seconds or more, add a new transfer (B) that asks for the second half of
1181 A's content (and stop A at the middle).
1182 - If splitting up the work improves the transfer rate, it could then be done
1183 again. Then again, etc up to a limit.
1184
1185 This way, if transfer B fails (because Range: is not supported) it will let
1186 transfer A remain the single one. N and M could be set to some sensible
1187 defaults.
1188
1189 See https://github.com/curl/curl/issues/5774
1190
119118.25 Prevent terminal injection when writing to terminal
1192
1193 curl could offer an option to make escape sequence either non-functional or
1194 avoid cursor moves or similar to reduce the risk of a user getting tricked by
1195 clever tricks.
1196
1197 See https://github.com/curl/curl/issues/6150
1198
119918.26 Custom progress meter update interval
1200
1201 Users who are for example doing large downloads in CI or remote setups might
1202 want the occasional progress meter update to see that the transfer is
1203 progressing and has not stuck, but they may not appreciate the
1204 many-times-a-second frequency curl can end up doing it with now.
1205
120619. Build
1207
120819.1 roffit
1209
1210 Consider extending 'roffit' to produce decent ASCII output, and use that
1211 instead of (g)nroff when building src/tool_hugehelp.c
1212
121319.2 Enable PIE and RELRO by default
1214
1215 Especially when having programs that execute curl via the command line, PIE
1216 renders the exploitation of memory corruption vulnerabilities a lot more
1217 difficult. This can be attributed to the additional information leaks being
1218 required to conduct a successful attack. RELRO, on the other hand, masks
1219 different binary sections like the GOT as read-only and thus kills a handful
1220 of techniques that come in handy when attackers are able to arbitrarily
1221 overwrite memory. A few tests showed that enabling these features had close
1222 to no impact, neither on the performance nor on the general functionality of
1223 curl.
1224
122519.3 Do not use GNU libtool on OpenBSD
1226 When compiling curl on OpenBSD with "--enable-debug" it will give linking
1227 errors when you use GNU libtool. This can be fixed by using the libtool
1228 provided by OpenBSD itself. However for this the user always needs to invoke
1229 make with "LIBTOOL=/usr/bin/libtool". It would be nice if the script could
1230 have some magic to detect if this system is an OpenBSD host and then use the
1231 OpenBSD libtool instead.
1232
1233 See https://github.com/curl/curl/issues/5862
1234
123519.4 Package curl for Windows in a signed installer
1236
1237 See https://github.com/curl/curl/issues/5424
1238
123919.5 make configure use --cache-file more and better
1240
1241 The configure script can be improved to cache more values so that repeated
1242 invokes run much faster.
1243
1244 See https://github.com/curl/curl/issues/7753
1245
124620. Test suite
1247
124820.1 SSL tunnel
1249
1250 Make our own version of stunnel for simple port forwarding to enable HTTPS
1251 and FTP-SSL tests without the stunnel dependency, and it could allow us to
1252 provide test tools built with either OpenSSL or GnuTLS
1253
125420.2 nicer lacking perl message
1255
1256 If perl was not found by the configure script, do not attempt to run the tests
1257 but explain something nice why it does not.
1258
125920.3 more protocols supported
1260
1261 Extend the test suite to include more protocols. The telnet could just do FTP
1262 or http operations (for which we have test servers).
1263
126420.4 more platforms supported
1265
1266 Make the test suite work on more platforms. OpenBSD and Mac OS. Remove
1267 fork()s and it should become even more portable.
1268
126920.5 Add support for concurrent connections
1270
1271 Tests 836, 882 and 938 were designed to verify that separate connections
1272 are not used when using different login credentials in protocols that
1273 should not re-use a connection under such circumstances.
1274
1275 Unfortunately, ftpserver.pl does not appear to support multiple concurrent
1276 connections. The read while() loop seems to loop until it receives a
1277 disconnect from the client, where it then enters the waiting for connections
1278 loop. When the client opens a second connection to the server, the first
1279 connection has not been dropped (unless it has been forced - which we
1280 should not do in these tests) and thus the wait for connections loop is never
1281 entered to receive the second connection.
1282
128320.6 Use the RFC6265 test suite
1284
1285 A test suite made for HTTP cookies (RFC 6265) by Adam Barth is available at
1286 https://github.com/abarth/http-state/tree/master/tests
1287
1288 It'd be really awesome if someone would write a script/setup that would run
1289 curl with that test suite and detect deviances. Ideally, that would even be
1290 incorporated into our regular test suite.
1291
129220.7 Support LD_PRELOAD on macOS
1293
1294 LD_RELOAD does not work on macOS, but there are tests which require it to run
1295 properly. Look into making the preload support in runtests.pl portable such
1296 that it uses DYLD_INSERT_LIBRARIES on macOS.
1297
129820.8 Run web-platform-tests URL tests
1299
1300 Run web-platform-tests URL tests and compare results with browsers on wpt.fyi
1301
1302 It would help us find issues to fix and help us document where our parser
1303 differs from the WHATWG URL spec parsers.
1304
1305 See https://github.com/curl/curl/issues/4477
1306
130721. MQTT
1308
130921.1 Support rate-limiting
1310
1311 The rate-limiting logic is done in the PERFORMING state in multi.c but MQTT
1312 is not (yet) implemented to use that.