• 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 Better and more sharing
24 1.5 get rid of PATH_MAX
25 1.8 CURLOPT_RESOLVE for any port number
26 1.9 Cache negative name resolves
27 1.10 auto-detect proxy
28 1.11 minimize dependencies with dynamically loaded modules
29 1.12 updated DNS server while running
30 1.13 c-ares and CURLOPT_OPENSOCKETFUNCTION
31 1.15 Monitor connections in the connection pool
32 1.16 Try to URL encode given URL
33 1.17 Add support for IRIs
34 1.18 try next proxy if one does not work
35 1.19 provide timing info for each redirect
36 1.20 SRV and URI DNS records
37 1.21 netrc caching and sharing
38 1.22 CURLINFO_PAUSE_STATE
39 1.23 Offer API to flush the connection pool
40 1.25 Expose tried IP addresses that failed
41 1.28 FD_CLOEXEC
42 1.29 WebSocket read callback
43 1.30 config file parsing
44 1.31 erase secrets from heap/stack after use
45 1.32 add asynch getaddrinfo support
46 1.33 make DoH inherit more transfer properties
47
48 2. libcurl - multi interface
49 2.1 More non-blocking
50 2.2 Better support for same name resolves
51 2.3 Non-blocking curl_multi_remove_handle()
52 2.4 Split connect and authentication process
53 2.5 Edge-triggered sockets should work
54 2.6 multi upkeep
55 2.7 Virtual external sockets
56 2.8 dynamically decide to use socketpair
57
58 3. Documentation
59 3.1 Improve documentation about fork safety
60 3.2 Provide cmake config-file
61
62 4. FTP
63 4.1 HOST
64 4.2 Alter passive/active on failure and retry
65 4.3 Earlier bad letter detection
66 4.4 Support CURLOPT_PREQUOTE for dir listings too
67 4.5 ASCII support
68 4.6 GSSAPI via Windows SSPI
69 4.7 STAT for LIST without data connection
70 4.8 Passive transfer could try other IP addresses
71
72 5. HTTP
73 5.1 Provide the error body from a CONNECT response
74 5.2 Obey Retry-After in redirects
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 10.4 Certificate-Based Authentication
103
104 11. SMB
105 11.1 File listing support
106 11.2 Honor file timestamps
107 11.3 Use NTLMv2
108 11.4 Create remote directories
109
110 12. FILE
111 12.1 Directory listing for FILE:
112
113 13. TLS
114 13.1 TLS-PSK with OpenSSL
115 13.2 Provide mutex locking API
116 13.3 Defeat TLS fingerprinting
117 13.4 Cache/share OpenSSL contexts
118 13.5 Export session ids
119 13.6 Provide callback for cert verification
120 13.7 Less memory massaging with Schannel
121 13.8 Support DANE
122 13.9 TLS record padding
123 13.10 Support Authority Information Access certificate extension (AIA)
124 13.11 Some TLS options are not offered for HTTPS proxies
125 13.12 Reduce CA certificate bundle reparsing
126 13.13 Make sure we forbid TLS 1.3 post-handshake authentication
127 13.14 Support the clienthello extension
128 13.15 Select signature algorithms
129
130 14. GnuTLS
131 14.2 check connection
132
133 15. Schannel
134 15.1 Extend support for client certificate authentication
135 15.2 Extend support for the --ciphers option
136 15.4 Add option to allow abrupt server closure
137
138 16. SASL
139 16.1 Other authentication mechanisms
140 16.2 Add QOP support to GSSAPI authentication
141
142 17. SSH protocols
143 17.1 Multiplexing
144 17.2 Handle growing SFTP files
145 17.3 Read keys from ~/.ssh/id_ecdsa, id_ed25519
146 17.4 Support CURLOPT_PREQUOTE
147 17.5 SSH over HTTPS proxy with more backends
148 17.6 SFTP with SCP://
149
150 18. Command line tool
151 18.1 sync
152 18.2 glob posts
153 18.4 --proxycommand
154 18.5 UTF-8 filenames in Content-Disposition
155 18.6 Option to make -Z merge lined based outputs on stdout
156 18.8 Consider convenience options for JSON and XML?
157 18.9 Choose the name of file in braces for complex URLs
158 18.10 improve how curl works in a windows console window
159 18.11 Windows: set attribute 'archive' for completed downloads
160 18.12 keep running, read instructions from pipe/socket
161 18.13 Ratelimit or wait between serial requests
162 18.14 --dry-run
163 18.15 --retry should resume
164 18.16 send only part of --data
165 18.17 consider file name from the redirected URL with -O ?
166 18.18 retry on network is unreachable
167 18.19 expand ~/ in config files
168 18.20 host name sections in config files
169 18.21 retry on the redirected-to URL
170 18.23 Set the modification date on an uploaded file
171 18.24 Use multiple parallel transfers for a single download
172 18.25 Prevent terminal injection when writing to terminal
173 18.26 Custom progress meter update interval
174 18.27 -J and -O with %-encoded file names
175 18.28 -J with -C -
176 18.29 --retry and transfer timeouts
177
178 19. Build
179 19.2 Enable PIE and RELRO by default
180 19.3 Do not use GNU libtool on OpenBSD
181 19.4 Package curl for Windows in a signed installer
182 19.5 make configure use --cache-file more and better
183 19.6 build curl with Windows Unicode support
184
185 20. Test suite
186 20.1 SSL tunnel
187 20.2 nicer lacking perl message
188 20.3 more protocols supported
189 20.4 more platforms supported
190 20.5 Add support for concurrent connections
191 20.6 Use the RFC 6265 test suite
192 20.7 Support LD_PRELOAD on macOS
193 20.8 Run web-platform-tests URL tests
194
195 21. MQTT
196 21.1 Support rate-limiting
197
198 22. TFTP
199 22.1 TFTP doesn't convert LF to CRLF for mode=netascii
200
201==============================================================================
202
2031. libcurl
204
2051.1 TFO support on Windows
206
207 libcurl supports the CURLOPT_TCP_FASTOPEN option since 7.49.0 for Linux and
208 Mac OS. Windows supports TCP Fast Open starting with Windows 10, version 1607
209 and we should add support for it.
210
211 TCP Fast Open is supported on several platforms but not on Windows. Work on
212 this was once started but never finished.
213
214 See https://github.com/curl/curl/pull/3378
215
2161.2 Consult %APPDATA% also for .netrc
217
218 %APPDATA%\.netrc is not considered when running on Windows. should not it?
219
220 See https://github.com/curl/curl/issues/4016
221
2221.3 struct lifreq
223
224 Use 'struct lifreq' and SIOCGLIFADDR instead of 'struct ifreq' and
225 SIOCGIFADDR on newer Solaris versions as they claim the latter is obsolete.
226 To support IPv6 interface addresses for network interfaces properly.
227
2281.4 Better and more sharing
229
230 The share interface could benefit from allowing the alt-svc cache to be
231 possible to share between easy handles.
232
233 See https://github.com/curl/curl/issues/4476
234
235 The share interface offers CURL_LOCK_DATA_CONNECT to have multiple easy
236 handle share a connection cache, but due to how connections are used they are
237 still not thread-safe when used shared.
238
239 See https://github.com/curl/curl/issues/4915 and lib1541.c
240
241 The share interface offers CURL_LOCK_DATA_HSTS to have multiple easy handle
242 share a HSTS cache, but this is not thread-safe.
243
2441.5 get rid of PATH_MAX
245
246 Having code use and rely on PATH_MAX is not nice:
247 https://insanecoding.blogspot.com/2007/11/pathmax-simply-isnt.html
248
249 Currently the libssh2 SSH based code uses it, but to remove PATH_MAX from
250 there we need libssh2 to properly tell us when we pass in a too small buffer
251 and its current API (as of libssh2 1.2.7) does not.
252
2531.8 CURLOPT_RESOLVE for any port number
254
255 This option allows applications to set a replacement IP address for a given
256 host + port pair. Consider making support for providing a replacement address
257 for the host name on all port numbers.
258
259 See https://github.com/curl/curl/issues/1264
260
2611.9 Cache negative name resolves
262
263 A name resolve that has failed is likely to fail when made again within a
264 short period of time. Currently we only cache positive responses.
265
2661.10 auto-detect proxy
267
268 libcurl could be made to detect the system proxy setup automatically and use
269 that. On Windows, macOS and Linux desktops for example.
270
271 The pull-request to use libproxy for this was deferred due to doubts on the
272 reliability of the dependency and how to use it:
273 https://github.com/curl/curl/pull/977
274
275 libdetectproxy is a (C++) library for detecting the proxy on Windows
276 https://github.com/paulharris/libdetectproxy
277
2781.11 minimize dependencies with dynamically loaded modules
279
280 We can create a system with loadable modules/plug-ins, where these modules
281 would be the ones that link to 3rd party libs. That would allow us to avoid
282 having to load ALL dependencies since only the necessary ones for this
283 app/invoke/used protocols would be necessary to load. See
284 https://github.com/curl/curl/issues/349
285
2861.12 updated DNS server while running
287
288 If /etc/resolv.conf gets updated while a program using libcurl is running, it
289 is may cause name resolves to fail unless res_init() is called. We should
290 consider calling res_init() + retry once unconditionally on all name resolve
291 failures to mitigate against this. Firefox works like that. Note that Windows
292 does not have res_init() or an alternative.
293
294 https://github.com/curl/curl/issues/2251
295
2961.13 c-ares and CURLOPT_OPENSOCKETFUNCTION
297
298 curl will create most sockets via the CURLOPT_OPENSOCKETFUNCTION callback and
299 close them with the CURLOPT_CLOSESOCKETFUNCTION callback. However, c-ares
300 does not use those functions and instead opens and closes the sockets
301 itself. This means that when curl passes the c-ares socket to the
302 CURLMOPT_SOCKETFUNCTION it is not owned by the application like other sockets.
303
304 See https://github.com/curl/curl/issues/2734
305
3061.15 Monitor connections in the connection pool
307
308 libcurl's connection cache or pool holds a number of open connections for the
309 purpose of possible subsequent connection reuse. It may contain a few up to a
310 significant amount of connections. Currently, libcurl leaves all connections
311 as they are and first when a connection is iterated over for matching or
312 reuse purpose it is verified that it is still alive.
313
314 Those connections may get closed by the server side for idleness or they may
315 get an HTTP/2 ping from the peer to verify that they are still alive. By
316 adding monitoring of the connections while in the pool, libcurl can detect
317 dead connections (and close them) better and earlier, and it can handle
318 HTTP/2 pings to keep such ones alive even when not actively doing transfers
319 on them.
320
3211.16 Try to URL encode given URL
322
323 Given a URL that for example contains spaces, libcurl could have an option
324 that would try somewhat harder than it does now and convert spaces to %20 and
325 perhaps URL encoded byte values over 128 etc (basically do what the redirect
326 following code already does).
327
328 https://github.com/curl/curl/issues/514
329
3301.17 Add support for IRIs
331
332 IRIs (RFC 3987) allow localized, non-ascii, names in the URL. To properly
333 support this, curl/libcurl would need to translate/encode the given input
334 from the input string encoding into percent encoded output "over the wire".
335
336 To make that work smoothly for curl users even on Windows, curl would
337 probably need to be able to convert from several input encodings.
338
3391.18 try next proxy if one does not work
340
341 Allow an application to specify a list of proxies to try, and failing to
342 connect to the first go on and try the next instead until the list is
343 exhausted. Browsers support this feature at least when they specify proxies
344 using PACs.
345
346 https://github.com/curl/curl/issues/896
347
3481.19 provide timing info for each redirect
349
350 curl and libcurl provide timing information via a set of different
351 time-stamps (CURLINFO_*_TIME). When curl is following redirects, those
352 returned time value are the accumulated sums. An improvement could be to
353 offer separate timings for each redirect.
354
355 https://github.com/curl/curl/issues/6743
356
3571.20 SRV and URI DNS records
358
359 Offer support for resolving SRV and URI DNS records for libcurl to know which
360 server to connect to for various protocols (including HTTP).
361
3621.21 netrc caching and sharing
363
364 The netrc file is read and parsed each time a connection is setup, which
365 means that if a transfer needs multiple connections for authentication or
366 redirects, the file might be reread (and parsed) multiple times. This makes
367 it impossible to provide the file as a pipe.
368
3691.22 CURLINFO_PAUSE_STATE
370
371 Return information about the transfer's current pause state, in both
372 directions. https://github.com/curl/curl/issues/2588
373
3741.23 Offer API to flush the connection pool
375
376 Sometimes applications want to flush all the existing connections kept alive.
377 An API could allow a forced flush or just a forced loop that would properly
378 close all connections that have been closed by the server already.
379
3801.25 Expose tried IP addresses that failed
381
382 When libcurl fails to connect to a host, it could offer the application the
383 addresses that were used in the attempt. Source + dest IP, source + dest port
384 and protocol (UDP or TCP) for each failure. Possibly as a callback. Perhaps
385 also provide "reason".
386
387 https://github.com/curl/curl/issues/2126
388
3891.28 FD_CLOEXEC
390
391 It sets the close-on-exec flag for the file descriptor, which causes the file
392 descriptor to be automatically (and atomically) closed when any of the
393 exec-family functions succeed. Should probably be set by default?
394
395 https://github.com/curl/curl/issues/2252
396
3971.29 WebSocket read callback
398
399 Call the read callback once the connection is established to allow sending
400 the first message in the connection.
401
402 https://github.com/curl/curl/issues/11402
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
4301.33 make DoH inherit more transfer properties
431
432 Some options are not inherited because they are not relevant for the DoH SSL
433 connections, or inheriting the option may result in unexpected behavior. For
434 example the user's debug function callback is not inherited because it would
435 be unexpected for internal handles (ie DoH handles) to be passed to that
436 callback.
437
438 If an option is not inherited then it is not possible to set it separately
439 for DoH without a DoH-specific option. For example:
440 CURLOPT_DOH_SSL_VERIFYHOST, CURLOPT_DOH_SSL_VERIFYPEER and
441 CURLOPT_DOH_SSL_VERIFYSTATUS.
442
443 See https://github.com/curl/curl/issues/6605
444
4452. libcurl - multi interface
446
4472.1 More non-blocking
448
449 Make sure we do not ever loop because of non-blocking sockets returning
450 EWOULDBLOCK or similar. Blocking cases include:
451
452 - Name resolves on non-windows unless c-ares or the threaded resolver is used.
453
454 - The threaded resolver may block on cleanup:
455 https://github.com/curl/curl/issues/4852
456
457 - file:// transfers
458
459 - TELNET transfers
460
461 - GSSAPI authentication for FTP transfers
462
463 - The "DONE" operation (post transfer protocol-specific actions) for the
464 protocols SFTP, SMTP, FTP. Fixing multi_done() for this is a worthy task.
465
466 - curl_multi_remove_handle for any of the above. See section 2.3.
467
4682.2 Better support for same name resolves
469
470 If a name resolve has been initiated for name NN and a second easy handle
471 wants to resolve that name as well, make it wait for the first resolve to end
472 up in the cache instead of doing a second separate resolve. This is
473 especially needed when adding many simultaneous handles using the same host
474 name when the DNS resolver can get flooded.
475
4762.3 Non-blocking curl_multi_remove_handle()
477
478 The multi interface has a few API calls that assume a blocking behavior, like
479 add_handle() and remove_handle() which limits what we can do internally. The
480 multi API need to be moved even more into a single function that "drives"
481 everything in a non-blocking manner and signals when something is done. A
482 remove or add would then only ask for the action to get started and then
483 multi_perform() etc still be called until the add/remove is completed.
484
4852.4 Split connect and authentication process
486
487 The multi interface treats the authentication process as part of the connect
488 phase. As such any failures during authentication will not trigger the relevant
489 QUIT or LOGOFF for protocols such as IMAP, POP3 and SMTP.
490
4912.5 Edge-triggered sockets should work
492
493 The multi_socket API should work with edge-triggered socket events. One of
494 the internal actions that need to be improved for this to work perfectly is
495 the 'maxloops' handling in transfer.c:readwrite_data().
496
4972.6 multi upkeep
498
499 In libcurl 7.62.0 we introduced curl_easy_upkeep. It unfortunately only works
500 on easy handles. We should introduces a version of that for the multi handle,
501 and also consider doing "upkeep" automatically on connections in the
502 connection pool when the multi handle is in used.
503
504 See https://github.com/curl/curl/issues/3199
505
5062.7 Virtual external sockets
507
508 libcurl performs operations on the given file descriptor that presumes it is
509 a socket and an application cannot replace them at the moment. Allowing an
510 application to fully replace those would allow a larger degree of freedom and
511 flexibility.
512
513 See https://github.com/curl/curl/issues/5835
514
5152.8 dynamically decide to use socketpair
516
517 For users who do not use curl_multi_wait() or do not care for
518 curl_multi_wakeup(), we could introduce a way to make libcurl NOT
519 create a socketpair in the multi handle.
520
521 See https://github.com/curl/curl/issues/4829
522
5233. Documentation
524
5253.1 Improve documentation about fork safety
526
527 See https://github.com/curl/curl/issues/6968
528
5293.2 Provide cmake config-file
530
531 A config-file package is a set of files provided by us to allow applications
532 to write cmake scripts to find and use libcurl easier. See
533 https://github.com/curl/curl/issues/885
534
5354. FTP
536
5374.1 HOST
538
539 HOST is a command for a client to tell which host name to use, to offer FTP
540 servers named-based virtual hosting:
541
542 https://datatracker.ietf.org/doc/html/rfc7151
543
5444.2 Alter passive/active on failure and retry
545
546 When trying to connect passively to a server which only supports active
547 connections, libcurl returns CURLE_FTP_WEIRD_PASV_REPLY and closes the
548 connection. There could be a way to fallback to an active connection (and
549 vice versa). https://curl.se/bug/feature.cgi?id=1754793
550
5514.3 Earlier bad letter detection
552
553 Make the detection of (bad) %0d and %0a codes in FTP URL parts earlier in the
554 process to avoid doing a resolve and connect in vain.
555
5564.4 Support CURLOPT_PREQUOTE for dir listings too
557
558 The lack of support is mostly an oversight and requires the FTP state machine
559 to get updated to get fixed.
560
561 https://github.com/curl/curl/issues/8602
562
5634.5 ASCII support
564
565 FTP ASCII transfers do not follow RFC 959. They do not convert the data
566 accordingly.
567
5684.6 GSSAPI via Windows SSPI
569
570 In addition to currently supporting the SASL GSSAPI mechanism (Kerberos V5)
571 via third-party GSS-API libraries, such as Heimdal or MIT Kerberos, also add
572 support for GSSAPI authentication via Windows SSPI.
573
5744.7 STAT for LIST without data connection
575
576 Some FTP servers allow STAT for listing directories instead of using LIST,
577 and the response is then sent over the control connection instead of as the
578 otherwise usedw data connection: https://www.nsftools.com/tips/RawFTP.htm#STAT
579
580 This is not detailed in any FTP specification.
581
5824.8 Passive transfer could try other IP addresses
583
584 When doing FTP operations through a proxy at localhost, the reported spotted
585 that curl only tried to connect once to the proxy, while it had multiple
586 addresses and a failed connect on one address should make it try the next.
587
588 After switching to passive mode (EPSV), curl could try all IP addresses for
589 "localhost". Currently it tries ::1, but it should also try 127.0.0.1.
590
591 See https://github.com/curl/curl/issues/1508
592
5935. HTTP
594
5955.1 Provide the error body from a CONNECT response
596
597 When curl receives a body response from a CONNECT request to a proxy, it will
598 always just read and ignore it. It would make some users happy if curl
599 instead optionally would be able to make that responsible available. Via a new
600 callback? Through some other means?
601
602 See https://github.com/curl/curl/issues/9513
603
6045.2 Obey Retry-After in redirects
605
606 The Retry-After is said to dicate "the minimum time that the user agent is
607 asked to wait before issuing the redirected request" and libcurl does not
608 obey this.
609
610 See https://github.com/curl/curl/issues/11447
611
6125.3 Rearrange request header order
613
614 Server implementers often make an effort to detect browser and to reject
615 clients it can detect to not match. One of the last details we cannot yet
616 control in libcurl's HTTP requests, which also can be exploited to detect
617 that libcurl is in fact used even when it tries to impersonate a browser, is
618 the order of the request headers. I propose that we introduce a new option in
619 which you give headers a value, and then when the HTTP request is built it
620 sorts the headers based on that number. We could then have internally created
621 headers use a default value so only headers that need to be moved have to be
622 specified.
623
6245.4 Allow SAN names in HTTP/2 server push
625
626 curl only allows HTTP/2 push promise if the provided :authority header value
627 exactly matches the host name given in the URL. It could be extended to allow
628 any name that would match the Subject Alternative Names in the server's TLS
629 certificate.
630
631 See https://github.com/curl/curl/pull/3581
632
6335.5 auth= in URLs
634
635 Add the ability to specify the preferred authentication mechanism to use by
636 using ;auth=<mech> in the login part of the URL.
637
638 For example:
639
640 http://test:pass;auth=NTLM@example.com would be equivalent to specifying
641 --user test:pass;auth=NTLM or --user test:pass --ntlm from the command line.
642
643 Additionally this should be implemented for proxy base URLs as well.
644
6455.6 alt-svc should fallback if alt-svc does not work
646
647 The alt-svc: header provides a set of alternative services for curl to use
648 instead of the original. If the first attempted one fails, it should try the
649 next etc and if all alternatives fail go back to the original.
650
651 See https://github.com/curl/curl/issues/4908
652
6535.7 Require HTTP version X or higher
654
655 curl and libcurl provide options for trying higher HTTP versions (for example
656 HTTP/2) but then still allows the server to pick version 1.1. We could
657 consider adding a way to require a minimum version.
658
659 See https://github.com/curl/curl/issues/7980
660
6616. TELNET
662
6636.1 ditch stdin
664
665 Reading input (to send to the remote server) on stdin is a crappy solution
666 for library purposes. We need to invent a good way for the application to be
667 able to provide the data to send.
668
6696.2 ditch telnet-specific select
670
671 Move the telnet support's network select() loop go away and merge the code
672 into the main transfer loop. Until this is done, the multi interface will not
673 work for telnet.
674
6756.3 feature negotiation debug data
676
677 Add telnet feature negotiation data to the debug callback as header data.
678
6796.4 exit immediately upon connection if stdin is /dev/null
680
681 If it did, curl could be used to probe if there is an server there listening
682 on a specific port. That is, the following command would exit immediately
683 after the connection is established with exit code 0:
684
685    curl -s --connect-timeout 2 telnet://example.com:80 </dev/null
686
6877. SMTP
688
6897.1 Passing NOTIFY option to CURLOPT_MAIL_RCPT
690
691 Is there a way to pass the NOTIFY option to the CURLOPT_MAIL_RCPT option ?  I
692 set a string that already contains a bracket. For instance something like
693 that: curl_slist_append( recipients, "<foo@bar> NOTIFY=SUCCESS,FAILURE" );
694
695 https://github.com/curl/curl/issues/8232
696
6977.2 Enhanced capability support
698
699 Add the ability, for an application that uses libcurl, to obtain the list of
700 capabilities returned from the EHLO command.
701
7027.3 Add CURLOPT_MAIL_CLIENT option
703
704 Rather than use the URL to specify the mail client string to present in the
705 HELO and EHLO commands, libcurl should support a new CURLOPT specifically for
706 specifying this data as the URL is non-standard and to be honest a bit of a
707 hack ;-)
708
709 Please see the following thread for more information:
710 https://curl.se/mail/lib-2012-05/0178.html
711
712
7138. POP3
714
7158.2 Enhanced capability support
716
717 Add the ability, for an application that uses libcurl, to obtain the list of
718 capabilities returned from the CAPA command.
719
7209. IMAP
721
7229.1 Enhanced capability support
723
724 Add the ability, for an application that uses libcurl, to obtain the list of
725 capabilities returned from the CAPABILITY command.
726
72710. LDAP
728
72910.1 SASL based authentication mechanisms
730
731 Currently the LDAP module only supports ldap_simple_bind_s() in order to bind
732 to an LDAP server. However, this function sends username and password details
733 using the simple authentication mechanism (as clear text). However, it should
734 be possible to use ldap_bind_s() instead specifying the security context
735 information ourselves.
736
73710.2 CURLOPT_SSL_CTX_FUNCTION for LDAPS
738
739 CURLOPT_SSL_CTX_FUNCTION works perfectly for HTTPS and email protocols, but
740 it has no effect for LDAPS connections.
741
742 https://github.com/curl/curl/issues/4108
743
74410.3 Paged searches on LDAP server
745
746 https://github.com/curl/curl/issues/4452
747
74810.4 Certificate-Based Authentication
749
750 LDAPS not possible with MAC and Windows with Certificate-Based Authentication
751
752 https://github.com/curl/curl/issues/9641
753
75411. SMB
755
75611.1 File listing support
757
758 Add support for listing the contents of a SMB share. The output should
759 probably be the same as/similar to FTP.
760
76111.2 Honor file timestamps
762
763 The timestamp of the transferred file should reflect that of the original
764 file.
765
76611.3 Use NTLMv2
767
768 Currently the SMB authentication uses NTLMv1.
769
77011.4 Create remote directories
771
772 Support for creating remote directories when uploading a file to a directory
773 that does not exist on the server, just like --ftp-create-dirs.
774
775
77612. FILE
777
77812.1 Directory listing for FILE:
779
780 Add support for listing the contents of a directory accessed with FILE. The
781 output should probably be the same as/similar to FTP.
782
783
78413. TLS
785
78613.1 TLS-PSK with OpenSSL
787
788 Transport Layer Security pre-shared key ciphersuites (TLS-PSK) is a set of
789 cryptographic protocols that provide secure communication based on pre-shared
790 keys (PSKs). These pre-shared keys are symmetric keys shared in advance among
791 the communicating parties.
792
793 https://github.com/curl/curl/issues/5081
794
79513.2 Provide mutex locking API
796
797 Provide a libcurl API for setting mutex callbacks in the underlying SSL
798 library, so that the same application code can use mutex-locking
799 independently of OpenSSL or GnutTLS being used.
800
80113.3 Defeat TLS fingerprinting
802
803 By changing the order of TLS extensions provided in the TLS handshake, it is
804 sometimes possible to circumvent TLS fingerprinting by servers. The TLS
805 extension order is of course not the only way to fingerprint a client.
806
807 See https://github.com/curl/curl/issues/8119
808
80913.4 Cache/share OpenSSL contexts
810
811 "Look at SSL cafile - quick traces look to me like these are done on every
812 request as well, when they should only be necessary once per SSL context (or
813 once per handle)". The major improvement we can rather easily do is to make
814 sure we do not create and kill a new SSL "context" for every request, but
815 instead make one for every connection and reuse that SSL context in the same
816 style connections are reused. It will make us use slightly more memory but it
817 will libcurl do less creations and deletions of SSL contexts.
818
819 Technically, the "caching" is probably best implemented by getting added to
820 the share interface so that easy handles who want to and can reuse the
821 context specify that by sharing with the right properties set.
822
823 https://github.com/curl/curl/issues/1110
824
82513.5 Export session ids
826
827 Add an interface to libcurl that enables "session IDs" to get
828 exported/imported. Cris Bailiff said: "OpenSSL has functions which can
829 serialise the current SSL state to a buffer of your choice, and recover/reset
830 the state from such a buffer at a later date - this is used by mod_ssl for
831 apache to implement and SSL session ID cache".
832
83313.6 Provide callback for cert verification
834
835 OpenSSL supports a callback for customised verification of the peer
836 certificate, but this does not seem to be exposed in the libcurl APIs. Could
837 it be? There is so much that could be done if it were.
838
83913.7 Less memory massaging with Schannel
840
841 The Schannel backend does a lot of custom memory management we would rather
842 avoid: the repeated alloc + free in sends and the custom memory + realloc
843 system for encrypted and decrypted data. That should be avoided and reduced
844 for 1) efficiency and 2) safety.
845
84613.8 Support DANE
847
848 DNS-Based Authentication of Named Entities (DANE) is a way to provide SSL
849 keys and certs over DNS using DNSSEC as an alternative to the CA model.
850 https://www.rfc-editor.org/rfc/rfc6698.txt
851
852 An initial patch was posted by Suresh Krishnaswamy on March 7th 2013
853 (https://curl.se/mail/lib-2013-03/0075.html) but it was a too simple
854 approach. See Daniel's comments:
855 https://curl.se/mail/lib-2013-03/0103.html . libunbound may be the
856 correct library to base this development on.
857
858 Björn Stenberg wrote a separate initial take on DANE that was never
859 completed.
860
86113.9 TLS record padding
862
863 TLS (1.3) offers optional record padding and OpenSSL provides an API for it.
864 I could make sense for libcurl to offer this ability to applications to make
865 traffic patterns harder to figure out by network traffic observers.
866
867 See https://github.com/curl/curl/issues/5398
868
86913.10 Support Authority Information Access certificate extension (AIA)
870
871 AIA can provide various things like CRLs but more importantly information
872 about intermediate CA certificates that can allow validation path to be
873 fulfilled when the HTTPS server does not itself provide them.
874
875 Since AIA is about downloading certs on demand to complete a TLS handshake,
876 it is probably a bit tricky to get done right.
877
878 See https://github.com/curl/curl/issues/2793
879
88013.11 Some TLS options are not offered for HTTPS proxies
881
882 Some TLS related options to the command line tool and libcurl are only
883 provided for the server and not for HTTPS proxies. --proxy-tls-max,
884 --proxy-tlsv1.3, --proxy-curves and a few more.
885 For more Documentation on this see:
886 https://curl.se/libcurl/c/tls-options.html
887
888 https://github.com/curl/curl/issues/12286
889
89013.12 Reduce CA certificate bundle reparsing
891
892 When using the OpenSSL backend, curl will load and reparse the CA bundle at
893 the creation of the "SSL context" when it sets up a connection to do a TLS
894 handshake. A more effective way would be to somehow cache the CA bundle to
895 avoid it having to be repeatedly reloaded and reparsed.
896
897 See https://github.com/curl/curl/issues/9379
898
89913.13 Make sure we forbid TLS 1.3 post-handshake authentication
900
901 RFC 8740 explains how using HTTP/2 must forbid the use of TLS 1.3
902 post-handshake authentication. We should make sure to live up to that.
903
904 See https://github.com/curl/curl/issues/5396
905
90613.14 Support the clienthello extension
907
908 Certain stupid networks and middle boxes have a problem with SSL handshake
909 packets that are within a certain size range because how that sets some bits
910 that previously (in older TLS version) were not set. The clienthello
911 extension adds padding to avoid that size range.
912
913 https://datatracker.ietf.org/doc/html/rfc7685
914 https://github.com/curl/curl/issues/2299
915
91613.15 Select signature algorithms
917
918 Consider adding an option or a way for users to select TLS signature
919 algorithm. The signature algorithms set by a client are used directly in the
920 supported signature algorithm in the client hello message.
921
922 https://github.com/curl/curl/issues/12982
923
92414. GnuTLS
925
92614.2 check connection
927
928 Add a way to check if the connection seems to be alive, to correspond to the
929 SSL_peak() way we use with OpenSSL.
930
93115. Schannel
932
93315.1 Extend support for client certificate authentication
934
935 The existing support for the -E/--cert and --key options could be
936 extended by supplying a custom certificate and key in PEM format, see:
937 - Getting a Certificate for Schannel
938   https://msdn.microsoft.com/en-us/library/windows/desktop/aa375447.aspx
939
94015.2 Extend support for the --ciphers option
941
942 The existing support for the --ciphers option could be extended
943 by mapping the OpenSSL/GnuTLS cipher suites to the Schannel APIs, see
944 - Specifying Schannel Ciphers and Cipher Strengths
945   https://msdn.microsoft.com/en-us/library/windows/desktop/aa380161.aspx
946
94715.4 Add option to allow abrupt server closure
948
949 libcurl w/schannel will error without a known termination point from the
950 server (such as length of transfer, or SSL "close notify" alert) to prevent
951 against a truncation attack. Really old servers may neglect to send any
952 termination point. An option could be added to ignore such abrupt closures.
953
954 https://github.com/curl/curl/issues/4427
955
95616. SASL
957
95816.1 Other authentication mechanisms
959
960 Add support for other authentication mechanisms such as OLP,
961 GSS-SPNEGO and others.
962
96316.2 Add QOP support to GSSAPI authentication
964
965 Currently the GSSAPI authentication only supports the default QOP of auth
966 (Authentication), whilst Kerberos V5 supports both auth-int (Authentication
967 with integrity protection) and auth-conf (Authentication with integrity and
968 privacy protection).
969
970
97117. SSH protocols
972
97317.1 Multiplexing
974
975 SSH is a perfectly fine multiplexed protocols which would allow libcurl to do
976 multiple parallel transfers from the same host using the same connection,
977 much in the same spirit as HTTP/2 does. libcurl however does not take
978 advantage of that ability but will instead always create a new connection for
979 new transfers even if an existing connection already exists to the host.
980
981 To fix this, libcurl would have to detect an existing connection and "attach"
982 the new transfer to the existing one.
983
98417.2 Handle growing SFTP files
985
986 The SFTP code in libcurl checks the file size *before* a transfer starts and
987 then proceeds to transfer exactly that amount of data. If the remote file
988 grows while the transfer is in progress libcurl will not notice and will not
989 adapt. The OpenSSH SFTP command line tool does and libcurl could also just
990 attempt to download more to see if there is more to get...
991
992 https://github.com/curl/curl/issues/4344
993
99417.3 Read keys from ~/.ssh/id_ecdsa, id_ed25519
995
996 The libssh2 backend in curl is limited to only reading keys from id_rsa and
997 id_dsa, which makes it fail connecting to servers that use more modern key
998 types.
999
1000 https://github.com/curl/curl/issues/8586
1001
100217.4 Support CURLOPT_PREQUOTE
1003
1004 The two other QUOTE options are supported for SFTP, but this was left out for
1005 unknown reasons.
1006
100717.5 SSH over HTTPS proxy with more backends
1008
1009 The SSH based protocols SFTP and SCP did not work over HTTPS proxy at
1010 all until PR https://github.com/curl/curl/pull/6021 brought the
1011 functionality with the libssh2 backend. Presumably, this support
1012 can/could be added for the other backends as well.
1013
101417.6 SFTP with SCP://
1015
1016 OpenSSH 9 switched their 'scp' tool to speak SFTP under the hood. Going
1017 forward it might be worth having curl or libcurl attempt SFTP if SCP fails to
1018 follow suite.
1019
102018. Command line tool
1021
102218.1 sync
1023
1024 "curl --sync http://example.com/feed[1-100].rss" or
1025 "curl --sync http://example.net/{index,calendar,history}.html"
1026
1027 Downloads a range or set of URLs using the remote name, but only if the
1028 remote file is newer than the local file. A Last-Modified HTTP date header
1029 should also be used to set the mod date on the downloaded file.
1030
103118.2 glob posts
1032
1033 Globbing support for -d and -F, as in 'curl -d "name=foo[0-9]" URL'.
1034 This is easily scripted though.
1035
103618.4 --proxycommand
1037
1038 Allow the user to make curl run a command and use its stdio to make requests
1039 and not do any network connection by itself. Example:
1040
1041   curl --proxycommand 'ssh pi@raspberrypi.local -W 10.1.1.75 80' \
1042        http://some/otherwise/unavailable/service.php
1043
1044 See https://github.com/curl/curl/issues/4941
1045
104618.5 UTF-8 filenames in Content-Disposition
1047
1048 RFC 6266 documents how UTF-8 names can be passed to a client in the
1049 Content-Disposition header, and curl does not support this.
1050
1051 https://github.com/curl/curl/issues/1888
1052
105318.6 Option to make -Z merge lined based outputs on stdout
1054
1055 When a user requests multiple lined based files using -Z and sends them to
1056 stdout, curl will not "merge" and send complete lines fine but may send
1057 partial lines from several sources.
1058
1059 https://github.com/curl/curl/issues/5175
1060
106118.8 Consider convenience options for JSON and XML?
1062
1063 Could we add `--xml` or `--json` to add headers needed to call rest API:
1064
1065 `--xml` adds -H 'Content-Type: application/xml' -H "Accept: application/xml" and
1066 `--json` adds -H 'Content-Type: application/json' -H "Accept: application/json"
1067
1068 Setting Content-Type when doing a GET or any other method without a body
1069 would be a bit strange I think - so maybe only add CT for requests with body?
1070 Maybe plain `--xml` and ` --json` are a bit too brief and generic. Maybe
1071 `--http-json` etc?
1072
1073 See https://github.com/curl/curl/issues/5203
1074
107518.9 Choose the name of file in braces for complex URLs
1076
1077 When using braces to download a list of URLs and you use complicated names
1078 in the list of alternatives, it could be handy to allow curl to use other
1079 names when saving.
1080
1081 Consider a way to offer that. Possibly like
1082 {partURL1:name1,partURL2:name2,partURL3:name3} where the name following the
1083 colon is the output name.
1084
1085 See https://github.com/curl/curl/issues/221
1086
108718.10 improve how curl works in a windows console window
1088
1089 If you pull the scrollbar when transferring with curl in a Windows console
1090 window, the transfer is interrupted and can get disconnected. This can
1091 probably be improved. See https://github.com/curl/curl/issues/322
1092
109318.11 Windows: set attribute 'archive' for completed downloads
1094
1095 The archive bit (FILE_ATTRIBUTE_ARCHIVE, 0x20) separates files that shall be
1096 backed up from those that are either not ready or have not changed.
1097
1098 Downloads in progress are neither ready to be backed up, nor should they be
1099 opened by a different process. Only after a download has been completed it's
1100 sensible to include it in any integer snapshot or backup of the system.
1101
1102 See https://github.com/curl/curl/issues/3354
1103
110418.12 keep running, read instructions from pipe/socket
1105
1106 Provide an option that makes curl not exit after the last URL (or even work
1107 without a given URL), and then make it read instructions passed on a pipe or
1108 over a socket to make further instructions so that a second subsequent curl
1109 invoke can talk to the still running instance and ask for transfers to get
1110 done, and thus maintain its connection pool, DNS cache and more.
1111
111218.13 Ratelimit or wait between serial requests
1113
1114 Consider a command line option that can make curl do multiple serial requests
1115 slow, potentially with a (random) wait between transfers. There is also a
1116 proposed set of standard HTTP headers to let servers let the client adapt to
1117 its rate limits:
1118 https://datatracker.ietf.org/doc/draft-ietf-httpapi-ratelimit-headers/
1119
1120 See https://github.com/curl/curl/issues/5406
1121
112218.14 --dry-run
1123
1124 A command line option that makes curl show exactly what it would do and send
1125 if it would run for real.
1126
1127 See https://github.com/curl/curl/issues/5426
1128
112918.15 --retry should resume
1130
1131 When --retry is used and curl actually retries transfer, it should use the
1132 already transferred data and do a resumed transfer for the rest (when
1133 possible) so that it does not have to transfer the same data again that was
1134 already transferred before the retry.
1135
1136 See https://github.com/curl/curl/issues/1084
1137
113818.16 send only part of --data
1139
1140 When the user only wants to send a small piece of the data provided with
1141 --data or --data-binary, like when that data is a huge file, consider a way
1142 to specify that curl should only send a piece of that. One suggested syntax
1143 would be: "--data-binary @largefile.zip!1073741823-2147483647".
1144
1145 See https://github.com/curl/curl/issues/1200
1146
114718.17 consider file name from the redirected URL with -O ?
1148
1149 When a user gives a URL and uses -O, and curl follows a redirect to a new
1150 URL, the file name is not extracted and used from the newly redirected-to URL
1151 even if the new URL may have a much more sensible file name.
1152
1153 This is clearly documented and helps for security since there is no surprise
1154 to users which file name that might get overwritten. But maybe a new option
1155 could allow for this or maybe -J should imply such a treatment as well as -J
1156 already allows for the server to decide what file name to use so it already
1157 provides the "may overwrite any file" risk.
1158
1159 This is extra tricky if the original URL has no file name part at all since
1160 then the current code path will error out with an error message, and we cannot
1161 *know* already at that point if curl will be redirected to a URL that has a
1162 file name...
1163
1164 See https://github.com/curl/curl/issues/1241
1165
116618.18 retry on network is unreachable
1167
1168 The --retry option retries transfers on "transient failures". We later added
1169 --retry-connrefused to also retry for "connection refused" errors.
1170
1171 Suggestions have been brought to also allow retry on "network is unreachable"
1172 errors and while totally reasonable, maybe we should consider a way to make
1173 this more configurable than to add a new option for every new error people
1174 want to retry for?
1175
1176 https://github.com/curl/curl/issues/1603
1177
117818.19 expand ~/ in config files
1179
1180 For example .curlrc could benefit from being able to do this.
1181
1182 See https://github.com/curl/curl/issues/2317
1183
118418.20 host name sections in config files
1185
1186 config files would be more powerful if they could set different
1187 configurations depending on used URLs, host name or possibly origin. Then a
1188 default .curlrc could a specific user-agent only when doing requests against
1189 a certain site.
1190
119118.21 retry on the redirected-to URL
1192
1193 When curl is told to --retry a failed transfer and follows redirects, it
1194 might get an HTTP 429 response from the redirected-to URL and not the
1195 original one, which then could make curl decide to rather retry the transfer
1196 on that URL only instead of the original operation to the original URL.
1197
1198 Perhaps extra emphasized if the original transfer is a large POST that
1199 redirects to a separate GET, and that GET is what gets the 529
1200
1201 See https://github.com/curl/curl/issues/5462
1202
120318.23 Set the modification date on an uploaded file
1204
1205 For SFTP and possibly FTP, curl could offer an option to set the
1206 modification time for the uploaded file.
1207
1208 See https://github.com/curl/curl/issues/5768
1209
121018.24 Use multiple parallel transfers for a single download
1211
1212 To enhance transfer speed, downloading a single URL can be split up into
1213 multiple separate range downloads that get combined into a single final
1214 result.
1215
1216 An ideal implementation would not use a specified number of parallel
1217 transfers, but curl could:
1218 - First start getting the full file as transfer A
1219 - If after N seconds have passed and the transfer is expected to continue for
1220   M seconds or more, add a new transfer (B) that asks for the second half of
1221   A's content (and stop A at the middle).
1222 - If splitting up the work improves the transfer rate, it could then be done
1223   again. Then again, etc up to a limit.
1224
1225 This way, if transfer B fails (because Range: is not supported) it will let
1226 transfer A remain the single one. N and M could be set to some sensible
1227 defaults.
1228
1229 See https://github.com/curl/curl/issues/5774
1230
123118.25 Prevent terminal injection when writing to terminal
1232
1233 curl could offer an option to make escape sequence either non-functional or
1234 avoid cursor moves or similar to reduce the risk of a user getting tricked by
1235 clever tricks.
1236
1237 See https://github.com/curl/curl/issues/6150
1238
123918.26 Custom progress meter update interval
1240
1241 Users who are for example doing large downloads in CI or remote setups might
1242 want the occasional progress meter update to see that the transfer is
1243 progressing and has not stuck, but they may not appreciate the
1244 many-times-a-second frequency curl can end up doing it with now.
1245
124618.27 -J and -O with %-encoded file names
1247
1248 -J/--remote-header-name does not decode %-encoded file names. RFC 6266 details
1249 how it should be done. The can of worm is basically that we have no charset
1250 handling in curl and ascii >=128 is a challenge for us. Not to mention that
1251 decoding also means that we need to check for nastiness that is attempted,
1252 like "../" sequences and the like. Probably everything to the left of any
1253 embedded slashes should be cut off.
1254 https://curl.se/bug/view.cgi?id=1294
1255
1256 -O also does not decode %-encoded names, and while it has even less
1257 information about the charset involved the process is similar to the -J case.
1258
1259 Note that we will not add decoding to -O without the user asking for it with
1260 some other means as well, since -O has always been documented to use the name
1261 exactly as specified in the URL.
1262
126318.28 -J with -C -
1264
1265 When using -J (with -O), automatically resumed downloading together with "-C
1266 -" fails. Without -J the same command line works. This happens because the
1267 resume logic is worked out before the target file name (and thus its
1268 pre-transfer size) has been figured out. This can be improved.
1269
1270 https://curl.se/bug/view.cgi?id=1169
1271
127218.29 --retry and transfer timeouts
1273
1274 If using --retry and the transfer timeouts (possibly due to using -m or
1275 -y/-Y) the next attempt does not resume the transfer properly from what was
1276 downloaded in the previous attempt but will truncate and restart at the
1277 original position where it was at before the previous failed attempt. See
1278 https://curl.se/mail/lib-2008-01/0080.html and Mandriva bug report
1279 https://qa.mandriva.com/show_bug.cgi?id=22565
1280
1281
128219. Build
1283
128419.2 Enable PIE and RELRO by default
1285
1286 Especially when having programs that execute curl via the command line, PIE
1287 renders the exploitation of memory corruption vulnerabilities a lot more
1288 difficult. This can be attributed to the additional information leaks being
1289 required to conduct a successful attack. RELRO, on the other hand, masks
1290 different binary sections like the GOT as read-only and thus kills a handful
1291 of techniques that come in handy when attackers are able to arbitrarily
1292 overwrite memory. A few tests showed that enabling these features had close
1293 to no impact, neither on the performance nor on the general functionality of
1294 curl.
1295
129619.3 Do not use GNU libtool on OpenBSD
1297 When compiling curl on OpenBSD with "--enable-debug" it will give linking
1298 errors when you use GNU libtool. This can be fixed by using the libtool
1299 provided by OpenBSD itself. However for this the user always needs to invoke
1300 make with "LIBTOOL=/usr/bin/libtool". It would be nice if the script could
1301 have some magic to detect if this system is an OpenBSD host and then use the
1302 OpenBSD libtool instead.
1303
1304 See https://github.com/curl/curl/issues/5862
1305
130619.4 Package curl for Windows in a signed installer
1307
1308 See https://github.com/curl/curl/issues/5424
1309
131019.5 make configure use --cache-file more and better
1311
1312 The configure script can be improved to cache more values so that repeated
1313 invokes run much faster.
1314
1315 See https://github.com/curl/curl/issues/7753
1316
131719.6 build curl with Windows Unicode support
1318
1319 The user wants an easier way to tell autotools to build curl with Windows
1320 Unicode support, like ./configure --enable-windows-unicode
1321
1322 See https://github.com/curl/curl/issues/7229
1323
132420. Test suite
1325
132620.1 SSL tunnel
1327
1328 Make our own version of stunnel for simple port forwarding to enable HTTPS
1329 and FTP-SSL tests without the stunnel dependency, and it could allow us to
1330 provide test tools built with either OpenSSL or GnuTLS
1331
133220.2 nicer lacking perl message
1333
1334 If perl was not found by the configure script, do not attempt to run the tests
1335 but explain something nice why it does not.
1336
133720.3 more protocols supported
1338
1339 Extend the test suite to include more protocols. The telnet could just do FTP
1340 or http operations (for which we have test servers).
1341
134220.4 more platforms supported
1343
1344 Make the test suite work on more platforms. OpenBSD and Mac OS. Remove
1345 fork()s and it should become even more portable.
1346
134720.5 Add support for concurrent connections
1348
1349 Tests 836, 882 and 938 were designed to verify that separate connections are
1350 not used when using different login credentials in protocols that should not
1351 reuse a connection under such circumstances.
1352
1353 Unfortunately, ftpserver.pl does not appear to support multiple concurrent
1354 connections. The read while() loop seems to loop until it receives a
1355 disconnect from the client, where it then enters the waiting for connections
1356 loop. When the client opens a second connection to the server, the first
1357 connection has not been dropped (unless it has been forced - which we
1358 should not do in these tests) and thus the wait for connections loop is never
1359 entered to receive the second connection.
1360
136120.6 Use the RFC 6265 test suite
1362
1363 A test suite made for HTTP cookies (RFC 6265) by Adam Barth is available at
1364 https://github.com/abarth/http-state/tree/master/tests
1365
1366 It'd be really awesome if someone would write a script/setup that would run
1367 curl with that test suite and detect deviances. Ideally, that would even be
1368 incorporated into our regular test suite.
1369
137020.7 Support LD_PRELOAD on macOS
1371
1372 LD_RELOAD does not work on macOS, but there are tests which require it to run
1373 properly. Look into making the preload support in runtests.pl portable such
1374 that it uses DYLD_INSERT_LIBRARIES on macOS.
1375
137620.8 Run web-platform-tests URL tests
1377
1378 Run web-platform-tests URL tests and compare results with browsers on wpt.fyi
1379
1380 It would help us find issues to fix and help us document where our parser
1381 differs from the WHATWG URL spec parsers.
1382
1383 See https://github.com/curl/curl/issues/4477
1384
138521. MQTT
1386
138721.1 Support rate-limiting
1388
1389 The rate-limiting logic is done in the PERFORMING state in multi.c but MQTT
1390 is not (yet) implemented to use that.
1391
139222. TFTP
1393
139422.1 TFTP doesn't convert LF to CRLF for mode=netascii
1395
1396 RFC 3617 defines that an TFTP transfer can be done using "netascii"
1397 mode. curl does not support extracting that mode from the URL nor does it treat
1398 such transfers specifically. It should probably do LF to CRLF translations
1399 for them.
1400
1401 See https://github.com/curl/curl/issues/12655
1402