• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 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.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 provide timing info for each redirect
39 1.20 SRV and URI DNS records
40 1.21 netrc caching and sharing
41 1.22 CURLINFO_PAUSE_STATE
42 1.23 Offer API to flush the connection pool
43 1.24 TCP Fast Open for windows
44 1.25 Expose tried IP addresses that failed
45 1.27 hardcode the "localhost" addresses
46 1.28 FD_CLOEXEC
47 1.29 Upgrade to websockets
48 1.30 config file parsing
49
50 2. libcurl - multi interface
51 2.1 More non-blocking
52 2.2 Better support for same name resolves
53 2.3 Non-blocking curl_multi_remove_handle()
54 2.4 Split connect and authentication process
55 2.5 Edge-triggered sockets should work
56 2.6 multi upkeep
57 2.7 Virtual external sockets
58 2.8 dynamically decide to use socketpair
59
60 3. Documentation
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.5 ASCII support
68 4.6 GSSAPI via Windows SSPI
69 4.7 STAT for LIST without data connection
70 4.8 Option to ignore private IP addresses in PASV response
71
72 5. HTTP
73 5.1 Better persistency for HTTP 1.0
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 doesn't work
79
80 6. TELNET
81 6.1 ditch stdin
82 6.2 ditch telnet-specific select
83 6.3 feature negotiation debug data
84
85 7. SMTP
86 7.2 Enhanced capability support
87 7.3 Add CURLOPT_MAIL_CLIENT option
88
89 8. POP3
90 8.2 Enhanced capability support
91
92 9. IMAP
93 9.1 Enhanced capability support
94
95 10. LDAP
96 10.1 SASL based authentication mechanisms
97 10.2 CURLOPT_SSL_CTX_FUNCTION for LDAPS
98 10.3 Paged searches on LDAP server
99
100 11. SMB
101 11.1 File listing support
102 11.2 Honor file timestamps
103 11.3 Use NTLMv2
104 11.4 Create remote directories
105
106 12. FILE
107 12.1 Directory listing for FILE:
108
109 13. SSL
110 13.1 TLS-PSK with OpenSSL
111 13.2 Provide mutex locking API
112 13.4 Cache/share OpenSSL contexts
113 13.5 Export session ids
114 13.6 Provide callback for cert verification
115 13.8 Support DANE
116 13.9 TLS record padding
117 13.10 Support Authority Information Access certificate extension (AIA)
118 13.11 Support intermediate & root pinning for PINNEDPUBLICKEY
119 13.13 Make sure we forbid TLS 1.3 post-handshake authentication
120 13.14 Support the clienthello extension
121 13.15 Support mbedTLS 3.0
122
123 14. GnuTLS
124 14.2 check connection
125
126 15. Schannel
127 15.1 Extend support for client certificate authentication
128 15.2 Extend support for the --ciphers option
129 15.4 Add option to allow abrupt server closure
130
131 16. SASL
132 16.1 Other authentication mechanisms
133 16.2 Add QOP support to GSSAPI authentication
134 16.3 Support binary messages (i.e.: non-base64)
135
136 17. SSH protocols
137 17.1 Multiplexing
138 17.2 Handle growing SFTP files
139 17.3 Support better than MD5 hostkey hash
140 17.4 Support CURLOPT_PREQUOTE
141 17.5 SSH over HTTPS proxy with more backends
142
143 18. Command line tool
144 18.1 sync
145 18.2 glob posts
146 18.3 prevent file overwriting
147 18.4 --proxycommand
148 18.5 UTF-8 filenames in Content-Disposition
149 18.6 Option to make -Z merge lined based outputs on stdout
150 18.7 at least N milliseconds between requests
151 18.8 Consider convenience options for JSON and XML?
152 18.9 Choose the name of file in braces for complex URLs
153 18.10 improve how curl works in a windows console window
154 18.11 Windows: set attribute 'archive' for completed downloads
155 18.12 keep running, read instructions from pipe/socket
156 18.13 Ratelimit or wait between serial requests
157 18.14 --dry-run
158 18.15 --retry should resume
159 18.16 send only part of --data
160 18.17 consider file name from the redirected URL with -O ?
161 18.18 retry on network is unreachable
162 18.19 expand ~/ in config files
163 18.20 host name sections in config files
164 18.21 retry on the redirected-to URL
165 18.23 Set the modification date on an uploaded file
166 18.24 Use multiple parallel transfers for a single download
167 18.25 Prevent terminal injection when writing to terminal
168 18.26 Custom progress meter update interval
169
170 19. Build
171 19.1 roffit
172 19.2 Enable PIE and RELRO by default
173 19.3 Don't use GNU libtool on OpenBSD
174 19.4 Package curl for Windows in a signed installer
175
176 20. Test suite
177 20.1 SSL tunnel
178 20.2 nicer lacking perl message
179 20.3 more protocols supported
180 20.4 more platforms supported
181 20.5 Add support for concurrent connections
182 20.6 Use the RFC6265 test suite
183 20.7 Support LD_PRELOAD on macOS
184 20.8 Run web-platform-tests url tests
185 20.9 Bring back libssh tests on Travis
186
187 21. MQTT
188 21.1 Support rate-limiting
189
190==============================================================================
191
1921. libcurl
193
1941.1 TFO support on Windows
195
196 TCP Fast Open is supported on several platforms but not on Windows. Work on
197 this was once started but never finished.
198
199 See https://github.com/curl/curl/pull/3378
200
2011.2 Consult %APPDATA% also for .netrc
202
203 %APPDATA%\.netrc is not considered when running on Windows. Shouldn't it?
204
205 See https://github.com/curl/curl/issues/4016
206
2071.3 struct lifreq
208
209 Use 'struct lifreq' and SIOCGLIFADDR instead of 'struct ifreq' and
210 SIOCGIFADDR on newer Solaris versions as they claim the latter is obsolete.
211 To support IPv6 interface addresses for network interfaces properly.
212
2131.4 alt-svc sharing
214
215 The share interface could benefit from allowing the alt-svc cache to be
216 possible to share between easy handles.
217
218 See https://github.com/curl/curl/issues/4476
219
2201.5 get rid of PATH_MAX
221
222 Having code use and rely on PATH_MAX is not nice:
223 https://insanecoding.blogspot.com/2007/11/pathmax-simply-isnt.html
224
225 Currently the libssh2 SSH based code uses it, but to remove PATH_MAX from
226 there we need libssh2 to properly tell us when we pass in a too small buffer
227 and its current API (as of libssh2 1.2.7) doesn't.
228
2291.6 native IDN support on macOS
230
231 On recent macOS versions, the getaddrinfo() function itself has built-in IDN
232 support. By setting the AI_CANONNAME flag, the function will return the
233 encoded name in the ai_canonname struct field in the returned information.
234 This could be used by curl on macOS when built without a separate IDN library
235 and an IDN host name is used in a URL.
236
237 See initial work in https://github.com/curl/curl/pull/5371
238
2391.7 Support HTTP/2 for HTTP(S) proxies
240
241 Support for doing HTTP/2 to HTTP and HTTPS proxies is still missing.
242
243 See https://github.com/curl/curl/issues/3570
244
2451.8 CURLOPT_RESOLVE for any port number
246
247 This option allows applications to set a replacement IP address for a given
248 host + port pair. Consider making support for providing a replacement address
249 for the host name on all port numbers.
250
251 See https://github.com/curl/curl/issues/1264
252
2531.9 Cache negative name resolves
254
255 A name resolve that has failed is likely to fail when made again within a
256 short period of time. Currently we only cache positive responses.
257
2581.10 auto-detect proxy
259
260 libcurl could be made to detect the system proxy setup automatically and use
261 that. On Windows, macOS and Linux desktops for example.
262
263 The pull-request to use libproxy for this was deferred due to doubts on the
264 reliability of the dependency and how to use it:
265 https://github.com/curl/curl/pull/977
266
267 libdetectproxy is a (C++) library for detecting the proxy on Windows
268 https://github.com/paulharris/libdetectproxy
269
2701.11 minimize dependencies with dynamically loaded modules
271
272 We can create a system with loadable modules/plug-ins, where these modules
273 would be the ones that link to 3rd party libs. That would allow us to avoid
274 having to load ALL dependencies since only the necessary ones for this
275 app/invoke/used protocols would be necessary to load.  See
276 https://github.com/curl/curl/issues/349
277
2781.12 updated DNS server while running
279
280 If /etc/resolv.conf gets updated while a program using libcurl is running, it
281 is may cause name resolves to fail unless res_init() is called. We should
282 consider calling res_init() + retry once unconditionally on all name resolve
283 failures to mitigate against this. Firefox works like that. Note that Windows
284 doesn't have res_init() or an alternative.
285
286 https://github.com/curl/curl/issues/2251
287
2881.13 c-ares and CURLOPT_OPENSOCKETFUNCTION
289
290 curl will create most sockets via the CURLOPT_OPENSOCKETFUNCTION callback and
291 close them with the CURLOPT_CLOSESOCKETFUNCTION callback. However, c-ares
292 does not use those functions and instead opens and closes the sockets
293 itself. This means that when curl passes the c-ares socket to the
294 CURLMOPT_SOCKETFUNCTION it isn't owned by the application like other sockets.
295
296 See https://github.com/curl/curl/issues/2734
297
2981.14 Typesafe curl_easy_setopt()
299
300 One of the most common problems in libcurl using applications is the lack of
301 type checks for curl_easy_setopt() which happens because it accepts varargs
302 and thus can take any type.
303
304 One possible solution to this is to introduce a few different versions of the
305 setopt version for the different kinds of data you can set.
306
307  curl_easy_set_num() - sets a long value
308
309  curl_easy_set_large() - sets a curl_off_t value
310
311  curl_easy_set_ptr() - sets a pointer
312
313  curl_easy_set_cb() - sets a callback PLUS its callback data
314
3151.15 Monitor connections in the connection pool
316
317 libcurl's connection cache or pool holds a number of open connections for the
318 purpose of possible subsequent connection reuse. It may contain a few up to a
319 significant amount of connections. Currently, libcurl leaves all connections
320 as they are and first when a connection is iterated over for matching or
321 reuse purpose it is verified that it is still alive.
322
323 Those connections may get closed by the server side for idleness or they may
324 get a HTTP/2 ping from the peer to verify that they're still alive. By adding
325 monitoring of the connections while in the pool, libcurl can detect dead
326 connections (and close them) better and earlier, and it can handle HTTP/2
327 pings to keep such ones alive even when not actively doing transfers on them.
328
3291.16 Try to URL encode given URL
330
331 Given a URL that for example contains spaces, libcurl could have an option
332 that would try somewhat harder than it does now and convert spaces to %20 and
333 perhaps URL encoded byte values over 128 etc (basically do what the redirect
334 following code already does).
335
336 https://github.com/curl/curl/issues/514
337
3381.17 Add support for IRIs
339
340 IRIs (RFC 3987) allow localized, non-ascii, names in the URL. To properly
341 support this, curl/libcurl would need to translate/encode the given input
342 from the input string encoding into percent encoded output "over the wire".
343
344 To make that work smoothly for curl users even on Windows, curl would
345 probably need to be able to convert from several input encodings.
346
3471.18 try next proxy if one doesn't work
348
349 Allow an application to specify a list of proxies to try, and failing to
350 connect to the first go on and try the next instead until the list is
351 exhausted. Browsers support this feature at least when they specify proxies
352 using PACs.
353
354 https://github.com/curl/curl/issues/896
355
3561.19 provide timing info for each redirect
357
358 curl and libcurl provide timing information via a set of different
359 time-stamps (CURLINFO_*_TIME). When curl is following redirects, those
360 returned time value are the accumulated sums. An improvement could be to
361 offer separate timings for each redirect.
362
363 https://github.com/curl/curl/issues/6743
364
3651.20 SRV and URI DNS records
366
367 Offer support for resolving SRV and URI DNS records for libcurl to know which
368 server to connect to for various protocols (including HTTP!).
369
3701.21 netrc caching and sharing
371
372 The netrc file is read and parsed each time a connection is setup, which
373 means that if a transfer needs multiple connections for authentication or
374 redirects, the file might be reread (and parsed) multiple times. This makes
375 it impossible to provide the file as a pipe.
376
3771.22 CURLINFO_PAUSE_STATE
378
379 Return information about the transfer's current pause state, in both
380 directions. https://github.com/curl/curl/issues/2588
381
3821.23 Offer API to flush the connection pool
383
384 Sometimes applications want to flush all the existing connections kept alive.
385 An API could allow a forced flush or just a forced loop that would properly
386 close all connections that have been closed by the server already.
387
3881.24 TCP Fast Open for windows
389
390 libcurl supports the CURLOPT_TCP_FASTOPEN option since 7.49.0 for Linux and
391 Mac OS. Windows supports TCP Fast Open starting with Windows 10, version 1607
392 and we should add support for it.
393
3941.25 Expose tried IP addresses that failed
395
396 When libcurl fails to connect to a host, it should be able to offer the
397 application the list of IP addresses that were used in the attempt.
398
399 https://github.com/curl/curl/issues/2126
400
4011.27 hardcode the "localhost" addresses
402
403 There's this new spec getting adopted that says "localhost" should always and
404 unconditionally be a local address and not get resolved by a DNS server. A
405 fine way for curl to fix this would be to simply hard-code the response to
406 127.0.0.1 and/or ::1 (depending on what IP versions that are requested). This
407 is what the browsers probably will do with this hostname.
408
409 https://bugzilla.mozilla.org/show_bug.cgi?id=1220810
410
411 https://tools.ietf.org/html/draft-ietf-dnsop-let-localhost-be-localhost-02
412
4131.28 FD_CLOEXEC
414
415 It sets the close-on-exec flag for the file descriptor, which causes the file
416 descriptor to be automatically (and atomically) closed when any of the
417 exec-family functions succeed. Should probably be set by default?
418
419 https://github.com/curl/curl/issues/2252
420
4211.29 Upgrade to websockets
422
423 libcurl could offer a smoother path to get to a websocket connection.
424 See https://github.com/curl/curl/issues/3523
425
426 Michael Kaufmann suggestion here:
427 https://curl.se/video/curlup-2017/2017-03-19_05_Michael_Kaufmann_Websocket_support_for_curl.mp4
428
4291.30 config file parsing
430
431 Consider providing an API, possibly in a separate companion library, for
432 parsing a config file like curl's -K/--config option to allow applications to
433 get the same ability to read curl options from files.
434
435 See https://github.com/curl/curl/issues/3698
436
4372. libcurl - multi interface
438
4392.1 More non-blocking
440
441 Make sure we don't ever loop because of non-blocking sockets returning
442 EWOULDBLOCK or similar. Blocking cases include:
443
444 - Name resolves on non-windows unless c-ares or the threaded resolver is used.
445
446 - The threaded resolver may block on cleanup:
447 https://github.com/curl/curl/issues/4852
448
449 - file:// transfers
450
451 - TELNET transfers
452
453 - GSSAPI authentication for FTP transfers
454
455 - The "DONE" operation (post transfer protocol-specific actions) for the
456 protocols SFTP, SMTP, FTP. Fixing multi_done() for this is a worthy task.
457
458 - curl_multi_remove_handle for any of the above. See section 2.3.
459
4602.2 Better support for same name resolves
461
462 If a name resolve has been initiated for name NN and a second easy handle
463 wants to resolve that name as well, make it wait for the first resolve to end
464 up in the cache instead of doing a second separate resolve. This is
465 especially needed when adding many simultaneous handles using the same host
466 name when the DNS resolver can get flooded.
467
4682.3 Non-blocking curl_multi_remove_handle()
469
470 The multi interface has a few API calls that assume a blocking behavior, like
471 add_handle() and remove_handle() which limits what we can do internally. The
472 multi API need to be moved even more into a single function that "drives"
473 everything in a non-blocking manner and signals when something is done. A
474 remove or add would then only ask for the action to get started and then
475 multi_perform() etc still be called until the add/remove is completed.
476
4772.4 Split connect and authentication process
478
479 The multi interface treats the authentication process as part of the connect
480 phase. As such any failures during authentication won't trigger the relevant
481 QUIT or LOGOFF for protocols such as IMAP, POP3 and SMTP.
482
4832.5 Edge-triggered sockets should work
484
485 The multi_socket API should work with edge-triggered socket events. One of
486 the internal actions that need to be improved for this to work perfectly is
487 the 'maxloops' handling in transfer.c:readwrite_data().
488
4892.6 multi upkeep
490
491 In libcurl 7.62.0 we introduced curl_easy_upkeep. It unfortunately only works
492 on easy handles. We should introduces a version of that for the multi handle,
493 and also consider doing "upkeep" automatically on connections in the
494 connection pool when the multi handle is in used.
495
496 See https://github.com/curl/curl/issues/3199
497
4982.7 Virtual external sockets
499
500 libcurl performs operations on the given file descriptor that presumes it is
501 a socket and an application cannot replace them at the moment. Allowing an
502 application to fully replace those would allow a larger degree of freedom and
503 flexibility.
504
505 See https://github.com/curl/curl/issues/5835
506
5072.8 dynamically decide to use socketpair
508
509 For users who don't use curl_multi_wait() or don't care for
510 curl_multi_wakeup(), we could introduce a way to make libcurl NOT
511 create a socketpair in the multi handle.
512
513 See https://github.com/curl/curl/issues/4829
514
5153. Documentation
516
5173.2 Provide cmake config-file
518
519 A config-file package is a set of files provided by us to allow applications
520 to write cmake scripts to find and use libcurl easier. See
521 https://github.com/curl/curl/issues/885
522
5234. FTP
524
5254.1 HOST
526
527 HOST is a command for a client to tell which host name to use, to offer FTP
528 servers named-based virtual hosting:
529
530 https://tools.ietf.org/html/rfc7151
531
5324.2 Alter passive/active on failure and retry
533
534 When trying to connect passively to a server which only supports active
535 connections, libcurl returns CURLE_FTP_WEIRD_PASV_REPLY and closes the
536 connection. There could be a way to fallback to an active connection (and
537 vice versa). https://curl.se/bug/feature.cgi?id=1754793
538
5394.3 Earlier bad letter detection
540
541 Make the detection of (bad) %0d and %0a codes in FTP URL parts earlier in the
542 process to avoid doing a resolve and connect in vain.
543
5444.5 ASCII support
545
546 FTP ASCII transfers do not follow RFC959. They don't convert the data
547 accordingly.
548
5494.6 GSSAPI via Windows SSPI
550
551 In addition to currently supporting the SASL GSSAPI mechanism (Kerberos V5)
552 via third-party GSS-API libraries, such as Heimdal or MIT Kerberos, also add
553 support for GSSAPI authentication via Windows SSPI.
554
5554.7 STAT for LIST without data connection
556
557 Some FTP servers allow STAT for listing directories instead of using LIST,
558 and the response is then sent over the control connection instead of as the
559 otherwise usedw data connection: https://www.nsftools.com/tips/RawFTP.htm#STAT
560
561 This is not detailed in any FTP specification.
562
5634.8 Option to ignore private IP addresses in PASV response
564
565 Some servers respond with and some other FTP client implementations can
566 ignore private (RFC 1918 style) IP addresses when received in PASV responses.
567 To consider for libcurl as well. See https://github.com/curl/curl/issues/1455
568
5695. HTTP
570
5715.1 Better persistency for HTTP 1.0
572
573 "Better" support for persistent connections over HTTP 1.0
574 https://curl.se/bug/feature.cgi?id=1089001
575
5765.2 Set custom client ip when using haproxy protocol
577
578 This would allow testing servers with different client ip addresses (without
579 using x-forward-for header).
580
581 https://github.com/curl/curl/issues/5125
582
5835.3 Rearrange request header order
584
585 Server implementors often make an effort to detect browser and to reject
586 clients it can detect to not match. One of the last details we cannot yet
587 control in libcurl's HTTP requests, which also can be exploited to detect
588 that libcurl is in fact used even when it tries to impersonate a browser, is
589 the order of the request headers. I propose that we introduce a new option in
590 which you give headers a value, and then when the HTTP request is built it
591 sorts the headers based on that number. We could then have internally created
592 headers use a default value so only headers that need to be moved have to be
593 specified.
594
5955.4 Allow SAN names in HTTP/2 server push
596
597 curl only allows HTTP/2 push promise if the provided :authority header value
598 exactly matches the host name given in the URL. It could be extended to allow
599 any name that would match the Subject Alternative Names in the server's TLS
600 certificate.
601
602 See https://github.com/curl/curl/pull/3581
603
6045.5 auth= in URLs
605
606 Add the ability to specify the preferred authentication mechanism to use by
607 using ;auth=<mech> in the login part of the URL.
608
609 For example:
610
611 http://test:pass;auth=NTLM@example.com would be equivalent to specifying
612 --user test:pass;auth=NTLM or --user test:pass --ntlm from the command line.
613
614 Additionally this should be implemented for proxy base URLs as well.
615
6165.6 alt-svc should fallback if alt-svc doesn't work
617
618 The alt-svc: header provides a set of alternative services for curl to use
619 instead of the original. If the first attempted one fails, it should try the
620 next etc and if all alternatives fail go back to the original.
621
622 See https://github.com/curl/curl/issues/4908
623
6246. TELNET
625
6266.1 ditch stdin
627
628 Reading input (to send to the remote server) on stdin is a crappy solution
629 for library purposes. We need to invent a good way for the application to be
630 able to provide the data to send.
631
6326.2 ditch telnet-specific select
633
634 Move the telnet support's network select() loop go away and merge the code
635 into the main transfer loop. Until this is done, the multi interface won't
636 work for telnet.
637
6386.3 feature negotiation debug data
639
640 Add telnet feature negotiation data to the debug callback as header data.
641
642
6437. SMTP
644
6457.2 Enhanced capability support
646
647 Add the ability, for an application that uses libcurl, to obtain the list of
648 capabilities returned from the EHLO command.
649
6507.3 Add CURLOPT_MAIL_CLIENT option
651
652 Rather than use the URL to specify the mail client string to present in the
653 HELO and EHLO commands, libcurl should support a new CURLOPT specifically for
654 specifying this data as the URL is non-standard and to be honest a bit of a
655 hack ;-)
656
657 Please see the following thread for more information:
658 https://curl.se/mail/lib-2012-05/0178.html
659
660
6618. POP3
662
6638.2 Enhanced capability support
664
665 Add the ability, for an application that uses libcurl, to obtain the list of
666 capabilities returned from the CAPA command.
667
6689. IMAP
669
6709.1 Enhanced capability support
671
672 Add the ability, for an application that uses libcurl, to obtain the list of
673 capabilities returned from the CAPABILITY command.
674
67510. LDAP
676
67710.1 SASL based authentication mechanisms
678
679 Currently the LDAP module only supports ldap_simple_bind_s() in order to bind
680 to an LDAP server. However, this function sends username and password details
681 using the simple authentication mechanism (as clear text). However, it should
682 be possible to use ldap_bind_s() instead specifying the security context
683 information ourselves.
684
68510.2 CURLOPT_SSL_CTX_FUNCTION for LDAPS
686
687 CURLOPT_SSL_CTX_FUNCTION works perfectly for HTTPS and email protocols, but
688 it has no effect for LDAPS connections.
689
690 https://github.com/curl/curl/issues/4108
691
69210.3 Paged searches on LDAP server
693
694 https://github.com/curl/curl/issues/4452
695
69611. SMB
697
69811.1 File listing support
699
700 Add support for listing the contents of a SMB share. The output should
701 probably be the same as/similar to FTP.
702
70311.2 Honor file timestamps
704
705 The timestamp of the transferred file should reflect that of the original
706 file.
707
70811.3 Use NTLMv2
709
710 Currently the SMB authentication uses NTLMv1.
711
71211.4 Create remote directories
713
714 Support for creating remote directories when uploading a file to a directory
715 that doesn't exist on the server, just like --ftp-create-dirs.
716
717
71812. FILE
719
72012.1 Directory listing for FILE:
721
722 Add support for listing the contents of a directory accessed with FILE. The
723 output should probably be the same as/similar to FTP.
724
725
72613. SSL
727
72813.1 TLS-PSK with OpenSSL
729
730 Transport Layer Security pre-shared key ciphersuites (TLS-PSK) is a set of
731 cryptographic protocols that provide secure communication based on pre-shared
732 keys (PSKs). These pre-shared keys are symmetric keys shared in advance among
733 the communicating parties.
734
735 https://github.com/curl/curl/issues/5081
736
73713.2 Provide mutex locking API
738
739 Provide a libcurl API for setting mutex callbacks in the underlying SSL
740 library, so that the same application code can use mutex-locking
741 independently of OpenSSL or GnutTLS being used.
742
74313.4 Cache/share OpenSSL contexts
744
745 "Look at SSL cafile - quick traces look to me like these are done on every
746 request as well, when they should only be necessary once per SSL context (or
747 once per handle)". The major improvement we can rather easily do is to make
748 sure we don't create and kill a new SSL "context" for every request, but
749 instead make one for every connection and re-use that SSL context in the same
750 style connections are re-used. It will make us use slightly more memory but
751 it will libcurl do less creations and deletions of SSL contexts.
752
753 Technically, the "caching" is probably best implemented by getting added to
754 the share interface so that easy handles who want to and can reuse the
755 context specify that by sharing with the right properties set.
756
757 https://github.com/curl/curl/issues/1110
758
75913.5 Export session ids
760
761 Add an interface to libcurl that enables "session IDs" to get
762 exported/imported. Cris Bailiff said: "OpenSSL has functions which can
763 serialise the current SSL state to a buffer of your choice, and recover/reset
764 the state from such a buffer at a later date - this is used by mod_ssl for
765 apache to implement and SSL session ID cache".
766
76713.6 Provide callback for cert verification
768
769 OpenSSL supports a callback for customised verification of the peer
770 certificate, but this doesn't seem to be exposed in the libcurl APIs. Could
771 it be? There's so much that could be done if it were!
772
77313.8 Support DANE
774
775 DNS-Based Authentication of Named Entities (DANE) is a way to provide SSL
776 keys and certs over DNS using DNSSEC as an alternative to the CA model.
777 https://www.rfc-editor.org/rfc/rfc6698.txt
778
779 An initial patch was posted by Suresh Krishnaswamy on March 7th 2013
780 (https://curl.se/mail/lib-2013-03/0075.html) but it was a too simple
781 approach. See Daniel's comments:
782 https://curl.se/mail/lib-2013-03/0103.html . libunbound may be the
783 correct library to base this development on.
784
785 Björn Stenberg wrote a separate initial take on DANE that was never
786 completed.
787
78813.9 TLS record padding
789
790 TLS (1.3) offers optional record padding and OpenSSL provides an API for it.
791 I could make sense for libcurl to offer this ability to applications to make
792 traffic patterns harder to figure out by network traffic observers.
793
794 See https://github.com/curl/curl/issues/5398
795
79613.10 Support Authority Information Access certificate extension (AIA)
797
798 AIA can provide various things like CRLs but more importantly information
799 about intermediate CA certificates that can allow validation path to be
800 fulfilled when the HTTPS server doesn't itself provide them.
801
802 Since AIA is about downloading certs on demand to complete a TLS handshake,
803 it is probably a bit tricky to get done right.
804
805 See https://github.com/curl/curl/issues/2793
806
80713.11 Support intermediate & root pinning for PINNEDPUBLICKEY
808
809 CURLOPT_PINNEDPUBLICKEY does not consider the hashes of intermediate & root
810 certificates when comparing the pinned keys. Therefore it is not compatible
811 with "HTTP Public Key Pinning" as there also intermediate and root
812 certificates can be pinned. This is very useful as it prevents webadmins from
813 "locking themselves out of their servers".
814
815 Adding this feature would make curls pinning 100% compatible to HPKP and
816 allow more flexible pinning.
817
81813.13 Make sure we forbid TLS 1.3 post-handshake authentication
819
820 RFC 8740 explains how using HTTP/2 must forbid the use of TLS 1.3
821 post-handshake authentication. We should make sure to live up to that.
822
823 See https://github.com/curl/curl/issues/5396
824
82513.14 Support the clienthello extension
826
827 Certain stupid networks and middle boxes have a problem with SSL handshake
828 packets that are within a certain size range because how that sets some bits
829 that previously (in older TLS version) were not set. The clienthello
830 extension adds padding to avoid that size range.
831
832 https://tools.ietf.org/html/rfc7685
833 https://github.com/curl/curl/issues/2299
834
83513.15 Support mbedTLS 3.0
836
837 Version 3.0 is not backwards compatible with pre-3.0 versions, and curl no
838 longer builds due to breaking changes in the API.
839
840 See https://github.com/curl/curl/issues/7385
841
84214. GnuTLS
843
84414.2 check connection
845
846 Add a way to check if the connection seems to be alive, to correspond to the
847 SSL_peak() way we use with OpenSSL.
848
84915. Schannel
850
85115.1 Extend support for client certificate authentication
852
853 The existing support for the -E/--cert and --key options could be
854 extended by supplying a custom certificate and key in PEM format, see:
855 - Getting a Certificate for Schannel
856   https://msdn.microsoft.com/en-us/library/windows/desktop/aa375447.aspx
857
85815.2 Extend support for the --ciphers option
859
860 The existing support for the --ciphers option could be extended
861 by mapping the OpenSSL/GnuTLS cipher suites to the Schannel APIs, see
862 - Specifying Schannel Ciphers and Cipher Strengths
863   https://msdn.microsoft.com/en-us/library/windows/desktop/aa380161.aspx
864
86515.4 Add option to allow abrupt server closure
866
867 libcurl w/schannel will error without a known termination point from the
868 server (such as length of transfer, or SSL "close notify" alert) to prevent
869 against a truncation attack. Really old servers may neglect to send any
870 termination point. An option could be added to ignore such abrupt closures.
871
872 https://github.com/curl/curl/issues/4427
873
87416. SASL
875
87616.1 Other authentication mechanisms
877
878 Add support for other authentication mechanisms such as OLP,
879 GSS-SPNEGO and others.
880
88116.2 Add QOP support to GSSAPI authentication
882
883 Currently the GSSAPI authentication only supports the default QOP of auth
884 (Authentication), whilst Kerberos V5 supports both auth-int (Authentication
885 with integrity protection) and auth-conf (Authentication with integrity and
886 privacy protection).
887
88816.3 Support binary messages (i.e.: non-base64)
889
890  Mandatory to support LDAP SASL authentication.
891
892
89317. SSH protocols
894
89517.1 Multiplexing
896
897 SSH is a perfectly fine multiplexed protocols which would allow libcurl to do
898 multiple parallel transfers from the same host using the same connection,
899 much in the same spirit as HTTP/2 does. libcurl however does not take
900 advantage of that ability but will instead always create a new connection for
901 new transfers even if an existing connection already exists to the host.
902
903 To fix this, libcurl would have to detect an existing connection and "attach"
904 the new transfer to the existing one.
905
90617.2 Handle growing SFTP files
907
908 The SFTP code in libcurl checks the file size *before* a transfer starts and
909 then proceeds to transfer exactly that amount of data. If the remote file
910 grows while the transfer is in progress libcurl won't notice and will not
911 adapt. The OpenSSH SFTP command line tool does and libcurl could also just
912 attempt to download more to see if there is more to get...
913
914 https://github.com/curl/curl/issues/4344
915
91617.3 Support better than MD5 hostkey hash
917
918 libcurl offers the CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 option for verifying the
919 server's key. MD5 is generally being deprecated so we should implement
920 support for stronger hashing algorithms. libssh2 itself is what provides this
921 underlying functionality and it supports at least SHA-1 as an alternative.
922 SHA-1 is also being deprecated these days so we should consider working with
923 libssh2 to instead offer support for SHA-256 or similar.
924
92517.4 Support CURLOPT_PREQUOTE
926
927 The two other QUOTE options are supported for SFTP, but this was left out for
928 unknown reasons!
929
93017.5 SSH over HTTPS proxy with more backends
931
932 The SSH based protocols SFTP and SCP didn't work over HTTPS proxy at
933 all until PR https://github.com/curl/curl/pull/6021 brought the
934 functionality with the libssh2 backend. Presumably, this support
935 can/could be added for the other backends as well.
936
93718. Command line tool
938
93918.1 sync
940
941 "curl --sync http://example.com/feed[1-100].rss" or
942 "curl --sync http://example.net/{index,calendar,history}.html"
943
944 Downloads a range or set of URLs using the remote name, but only if the
945 remote file is newer than the local file. A Last-Modified HTTP date header
946 should also be used to set the mod date on the downloaded file.
947
94818.2 glob posts
949
950 Globbing support for -d and -F, as in 'curl -d "name=foo[0-9]" URL'.
951 This is easily scripted though.
952
95318.3 prevent file overwriting
954
955 Add an option that prevents curl from overwriting existing local files. When
956 used, and there already is an existing file with the target file name
957 (either -O or -o), a number should be appended (and increased if already
958 existing). So that index.html becomes first index.html.1 and then
959 index.html.2 etc.
960
96118.4 --proxycommand
962
963 Allow the user to make curl run a command and use its stdio to make requests
964 and not do any network connection by itself. Example:
965
966   curl --proxycommand 'ssh pi@raspberrypi.local -W 10.1.1.75 80' \
967        http://some/otherwise/unavailable/service.php
968
969 See https://github.com/curl/curl/issues/4941
970
97118.5 UTF-8 filenames in Content-Disposition
972
973 RFC 6266 documents how UTF-8 names can be passed to a client in the
974 Content-Disposition header, and curl does not support this.
975
976 https://github.com/curl/curl/issues/1888
977
97818.6 Option to make -Z merge lined based outputs on stdout
979
980 When a user requests multiple lined based files using -Z and sends them to
981 stdout, curl will not "merge" and send complete lines fine but may very well
982 send partial lines from several sources.
983
984 https://github.com/curl/curl/issues/5175
985
98618.7 at least N milliseconds between requests
987
988 Allow curl command lines issue a lot of request against services that limit
989 users to no more than N requests/second or similar. Could be implemented with
990 an option asking that at least a certain time has elapsed since the previous
991 request before the next one will be performed. Example:
992
993    $ curl "https://example.com/api?input=[1-1000]" -d yadayada --after 500
994
995 See https://github.com/curl/curl/issues/3920
996
99718.8 Consider convenience options for JSON and XML?
998
999 Could we add `--xml` or `--json` to add headers needed to call rest API:
1000
1001 `--xml` adds -H 'Content-Type: application/xml' -H "Accept: application/xml" and
1002 `--json` adds -H 'Content-Type: application/json' -H "Accept: application/json"
1003
1004 Setting Content-Type when doing a GET or any other method without a body
1005 would be a bit strange I think - so maybe only add CT for requests with body?
1006 Maybe plain `--xml` and ` --json` are a bit too brief and generic. Maybe
1007 `--http-json` etc?
1008
1009 See https://github.com/curl/curl/issues/5203
1010
101118.9 Choose the name of file in braces for complex URLs
1012
1013 When using braces to download a list of URLs and you use complicated names
1014 in the list of alternatives, it could be handy to allow curl to use other
1015 names when saving.
1016
1017 Consider a way to offer that. Possibly like
1018 {partURL1:name1,partURL2:name2,partURL3:name3} where the name following the
1019 colon is the output name.
1020
1021 See https://github.com/curl/curl/issues/221
1022
102318.10 improve how curl works in a windows console window
1024
1025 If you pull the scrollbar when transferring with curl in a Windows console
1026 window, the transfer is interrupted and can get disconnected. This can
1027 probably be improved. See https://github.com/curl/curl/issues/322
1028
102918.11 Windows: set attribute 'archive' for completed downloads
1030
1031 The archive bit (FILE_ATTRIBUTE_ARCHIVE, 0x20) separates files that shall be
1032 backed up from those that are either not ready or have not changed.
1033
1034 Downloads in progress are neither ready to be backed up, nor should they be
1035 opened by a different process. Only after a download has been completed it's
1036 sensible to include it in any integer snapshot or backup of the system.
1037
1038 See https://github.com/curl/curl/issues/3354
1039
104018.12 keep running, read instructions from pipe/socket
1041
1042 Provide an option that makes curl not exit after the last URL (or even work
1043 without a given URL), and then make it read instructions passed on a pipe or
1044 over a socket to make further instructions so that a second subsequent curl
1045 invoke can talk to the still running instance and ask for transfers to get
1046 done, and thus maintain its connection pool, DNS cache and more.
1047
104818.13 Ratelimit or wait between serial requests
1049
1050 Consider a command line option that can make curl do multiple serial requests
1051 slow, potentially with a (random) wait between transfers. There's also a
1052 proposed set of standard HTTP headers to let servers let the client adapt to
1053 its rate limits:
1054 https://www.ietf.org/id/draft-polli-ratelimit-headers-02.html
1055
1056 See https://github.com/curl/curl/issues/5406
1057
105818.14 --dry-run
1059
1060 A command line option that makes curl show exactly what it would do and send
1061 if it would run for real.
1062
1063 See https://github.com/curl/curl/issues/5426
1064
106518.15 --retry should resume
1066
1067 When --retry is used and curl actually retries transfer, it should use the
1068 already transferred data and do a resumed transfer for the rest (when
1069 possible) so that it doesn't have to transfer the same data again that was
1070 already transferred before the retry.
1071
1072 See https://github.com/curl/curl/issues/1084
1073
107418.16 send only part of --data
1075
1076 When the user only wants to send a small piece of the data provided with
1077 --data or --data-binary, like when that data is a huge file, consider a way
1078 to specify that curl should only send a piece of that. One suggested syntax
1079 would be: "--data-binary @largefile.zip!1073741823-2147483647".
1080
1081 See https://github.com/curl/curl/issues/1200
1082
108318.17 consider file name from the redirected URL with -O ?
1084
1085 When a user gives a URL and uses -O, and curl follows a redirect to a new
1086 URL, the file name is not extracted and used from the newly redirected-to URL
1087 even if the new URL may have a much more sensible file name.
1088
1089 This is clearly documented and helps for security since there's no surprise
1090 to users which file name that might get overwritten. But maybe a new option
1091 could allow for this or maybe -J should imply such a treatment as well as -J
1092 already allows for the server to decide what file name to use so it already
1093 provides the "may overwrite any file" risk.
1094
1095 This is extra tricky if the original URL has no file name part at all since
1096 then the current code path will error out with an error message, and we can't
1097 *know* already at that point if curl will be redirected to a URL that has a
1098 file name...
1099
1100 See https://github.com/curl/curl/issues/1241
1101
110218.18 retry on network is unreachable
1103
1104 The --retry option retries transfers on "transient failures". We later added
1105 --retry-connrefused to also retry for "connection refused" errors.
1106
1107 Suggestions have been brought to also allow retry on "network is unreachable"
1108 errors and while totally reasonable, maybe we should consider a way to make
1109 this more configurable than to add a new option for every new error people
1110 want to retry for?
1111
1112 https://github.com/curl/curl/issues/1603
1113
111418.19 expand ~/ in config files
1115
1116 For example .curlrc could benefit from being able to do this.
1117
1118 See https://github.com/curl/curl/issues/2317
1119
112018.20 host name sections in config files
1121
1122 config files would be more powerful if they could set different
1123 configurations depending on used URLs, host name or possibly origin. Then a
1124 default .curlrc could a specific user-agent only when doing requests against
1125 a certain site.
1126
112718.21 retry on the redirected-to URL
1128
1129 When curl is told to --retry a failed transfer and follows redirects, it
1130 might get a HTTP 429 response from the redirected-to URL and not the original
1131 one, which then could make curl decide to rather retry the transfer on that
1132 URL only instead of the original operation to the original URL.
1133
1134 Perhaps extra emphasized if the original transfer is a large POST that
1135 redirects to a separate GET, and that GET is what gets the 529
1136
1137 See https://github.com/curl/curl/issues/5462
1138
113918.23 Set the modification date on an uploaded file
1140
1141 For SFTP and possibly FTP, curl could offer an option to set the
1142 modification time for the uploaded file.
1143
1144 See https://github.com/curl/curl/issues/5768
1145
114618.24 Use multiple parallel transfers for a single download
1147
1148 To enhance transfer speed, downloading a single URL can be split up into
1149 multiple separate range downloads that get combined into a single final
1150 result.
1151
1152 An ideal implementation would not use a specified number of parallel
1153 transfers, but curl could:
1154 - First start getting the full file as transfer A
1155 - If after N seconds have passed and the transfer is expected to continue for
1156   M seconds or more, add a new transfer (B) that asks for the second half of
1157   A's content (and stop A at the middle).
1158 - If splitting up the work improves the transfer rate, it could then be done
1159   again. Then again, etc up to a limit.
1160
1161 This way, if transfer B fails (because Range: isn't supported) it will let
1162 transfer A remain the single one. N and M could be set to some sensible
1163 defaults.
1164
1165 See https://github.com/curl/curl/issues/5774
1166
116718.25 Prevent terminal injection when writing to terminal
1168
1169 curl could offer an option to make escape sequence either non-functional or
1170 avoid cursor moves or similar to reduce the risk of a user getting tricked by
1171 clever tricks.
1172
1173 See https://github.com/curl/curl/issues/6150
1174
117518.26 Custom progress meter update interval
1176
1177 Users who are for example doing large downloads in CI or remote setups might
1178 want the occasional progress meter update to see that the transfer is
1179 progressing and hasn't stuck, but they may not appreciate the
1180 many-times-a-second frequency curl can end up doing it with now.
1181
118219. Build
1183
118419.1 roffit
1185
1186 Consider extending 'roffit' to produce decent ASCII output, and use that
1187 instead of (g)nroff when building src/tool_hugehelp.c
1188
118919.2 Enable PIE and RELRO by default
1190
1191 Especially when having programs that execute curl via the command line, PIE
1192 renders the exploitation of memory corruption vulnerabilities a lot more
1193 difficult. This can be attributed to the additional information leaks being
1194 required to conduct a successful attack. RELRO, on the other hand, masks
1195 different binary sections like the GOT as read-only and thus kills a handful
1196 of techniques that come in handy when attackers are able to arbitrarily
1197 overwrite memory. A few tests showed that enabling these features had close
1198 to no impact, neither on the performance nor on the general functionality of
1199 curl.
1200
120119.3 Don't use GNU libtool on OpenBSD
1202 When compiling curl on OpenBSD with "--enable-debug" it will give linking
1203 errors when you use GNU libtool. This can be fixed by using the libtool
1204 provided by OpenBSD itself. However for this the user always needs to invoke
1205 make with "LIBTOOL=/usr/bin/libtool". It would be nice if the script could
1206 have some magic to detect if this system is an OpenBSD host and then use the
1207 OpenBSD libtool instead.
1208
1209 See https://github.com/curl/curl/issues/5862
1210
121119.4 Package curl for Windows in a signed installer
1212
1213 See https://github.com/curl/curl/issues/5424
1214
121520. Test suite
1216
121720.1 SSL tunnel
1218
1219 Make our own version of stunnel for simple port forwarding to enable HTTPS
1220 and FTP-SSL tests without the stunnel dependency, and it could allow us to
1221 provide test tools built with either OpenSSL or GnuTLS
1222
122320.2 nicer lacking perl message
1224
1225 If perl wasn't found by the configure script, don't attempt to run the tests
1226 but explain something nice why it doesn't.
1227
122820.3 more protocols supported
1229
1230 Extend the test suite to include more protocols. The telnet could just do FTP
1231 or http operations (for which we have test servers).
1232
123320.4 more platforms supported
1234
1235 Make the test suite work on more platforms. OpenBSD and Mac OS. Remove
1236 fork()s and it should become even more portable.
1237
123820.5 Add support for concurrent connections
1239
1240 Tests 836, 882 and 938 were designed to verify that separate connections
1241 aren't used when using different login credentials in protocols that
1242 shouldn't re-use a connection under such circumstances.
1243
1244 Unfortunately, ftpserver.pl doesn't appear to support multiple concurrent
1245 connections. The read while() loop seems to loop until it receives a
1246 disconnect from the client, where it then enters the waiting for connections
1247 loop. When the client opens a second connection to the server, the first
1248 connection hasn't been dropped (unless it has been forced - which we
1249 shouldn't do in these tests) and thus the wait for connections loop is never
1250 entered to receive the second connection.
1251
125220.6 Use the RFC6265 test suite
1253
1254 A test suite made for HTTP cookies (RFC 6265) by Adam Barth is available at
1255 https://github.com/abarth/http-state/tree/master/tests
1256
1257 It'd be really awesome if someone would write a script/setup that would run
1258 curl with that test suite and detect deviances. Ideally, that would even be
1259 incorporated into our regular test suite.
1260
126120.7 Support LD_PRELOAD on macOS
1262
1263 LD_RELOAD doesn't work on macOS, but there are tests which require it to run
1264 properly. Look into making the preload support in runtests.pl portable such
1265 that it uses DYLD_INSERT_LIBRARIES on macOS.
1266
126720.8 Run web-platform-tests url tests
1268
1269 Run web-platform-tests url tests and compare results with browsers on wpt.fyi
1270
1271 It would help us find issues to fix and help us document where our parser
1272 differs from the WHATWG URL spec parsers.
1273
1274 See https://github.com/curl/curl/issues/4477
1275
127620.9 Bring back libssh tests on Travis
1277
1278 In https://github.com/curl/curl/pull/7012 we remove the libssh builds and
1279 tests from Travis CI due to them not working. This should be remedied and
1280 libssh builds be brought back.
1281
1282
128321. MQTT
1284
128521.1 Support rate-limiting
1286
1287 The rate-limiting logic is done in the PERFORMING state in multi.c but MQTT
1288 is not (yet) implemented to use that!
1289