1 _ _ ____ _ 2 ___| | | | _ \| | 3 / __| | | | |_) | | 4 | (__| |_| | _ <| |___ 5 \___|\___/|_| \_\_____| 6 7 Things that could be nice to do in the future 8 9 Things to do in project cURL. Please tell us what you think, contribute and 10 send us patches that improve things! 11 12 Be aware that these are things that we could do, or have once been considered 13 things we could do. If you want to work on any of these areas, please 14 consider bringing it up for discussions first on the mailing list so that we 15 all agree it is still a good idea for the project! 16 17 All bugs documented in the KNOWN_BUGS document are subject for fixing! 18 19 1. libcurl 20 1.2 More data sharing 21 1.3 struct lifreq 22 1.4 signal-based resolver timeouts 23 1.5 get rid of PATH_MAX 24 1.6 Modified buffer size approach 25 1.7 Detect when called from within callbacks 26 1.8 Allow SSL (HTTPS) to proxy 27 1.9 Cache negative name resolves 28 1.10 Support IDNA2008 29 1.11 minimize dependencies with dynamicly loaded modules 30 1.12 have form functions use CURL handle argument 31 1.13 Add CURLOPT_MAIL_CLIENT option 32 1.14 Typesafe curl_easy_setopt() 33 1.15 TCP Fast Open 34 1.16 Try to URL encode given URL 35 1.17 Add support for IRIs 36 1.18 try next proxy if one doesn't work 37 1.19 Timeout idle connections from the pool 38 39 2. libcurl - multi interface 40 2.1 More non-blocking 41 2.2 Better support for same name resolves 42 2.3 Non-blocking curl_multi_remove_handle() 43 2.4 Split connect and authentication process 44 2.5 Edge-triggered sockets should work 45 46 3. Documentation 47 3.1 Update date and version in man pages 48 3.2 Provide cmake config-file 49 50 4. FTP 51 4.1 HOST 52 4.2 Alter passive/active on failure and retry 53 4.3 Earlier bad letter detection 54 4.4 REST for large files 55 4.5 ASCII support 56 4.6 GSSAPI via Windows SSPI 57 4.7 STAT for LIST without data connection 58 59 5. HTTP 60 5.1 Better persistency for HTTP 1.0 61 5.2 support FF3 sqlite cookie files 62 5.3 Rearrange request header order 63 5.4 SPDY 64 5.5 auth= in URLs 65 5.6 Refuse "downgrade" redirects 66 5.7 More compressions 67 68 6. TELNET 69 6.1 ditch stdin 70 6.2 ditch telnet-specific select 71 6.3 feature negotiation debug data 72 6.4 send data in chunks 73 74 7. SMTP 75 7.1 Pipelining 76 7.2 Enhanced capability support 77 78 8. POP3 79 8.1 Pipelining 80 8.2 Enhanced capability support 81 82 9. IMAP 83 9.1 Enhanced capability support 84 85 10. LDAP 86 10.1 SASL based authentication mechanisms 87 88 11. SMB 89 11.1 File listing support 90 11.2 Honor file timestamps 91 11.3 Use NTLMv2 92 11.4 Create remote directories 93 94 12. New protocols 95 12.1 RSYNC 96 97 13. SSL 98 13.1 Disable specific versions 99 13.2 Provide mutex locking API 100 13.3 Evaluate SSL patches 101 13.4 Cache OpenSSL contexts 102 13.5 Export session ids 103 13.6 Provide callback for cert verification 104 13.7 improve configure --with-ssl 105 13.8 Support DANE 106 107 14. GnuTLS 108 14.1 SSL engine stuff 109 14.2 check connection 110 111 15. WinSSL/SChannel 112 15.1 Add support for client certificate authentication 113 15.2 Add support for custom server certificate validation 114 15.3 Add support for the --ciphers option 115 116 16. SASL 117 16.1 Other authentication mechanisms 118 16.2 Add QOP support to GSSAPI authentication 119 16.3 Support binary messages (i.e.: non-base64) 120 121 17. Command line tool 122 17.1 sync 123 17.2 glob posts 124 17.3 prevent file overwriting 125 17.4 simultaneous parallel transfers 126 17.5 provide formpost headers 127 17.6 warning when setting an option 128 17.7 warning when sending binary output to terminal 129 17.8 offer color-coded HTTP header output 130 17.9 Choose the name of file in braces for complex URLs 131 17.10 improve how curl works in a windows console window 132 17.11 -w output to stderr 133 17.12 keep running, read instructions from pipe/socket 134 17.13 support metalink in http headers 135 17.14 --fail without --location should treat 3xx as a failure 136 137 18. Build 138 18.1 roffit 139 140 19. Test suite 141 19.1 SSL tunnel 142 19.2 nicer lacking perl message 143 19.3 more protocols supported 144 19.4 more platforms supported 145 19.5 Add support for concurrent connections 146 19.6 Use the RFC6265 test suite 147 148 20. Next SONAME bump 149 20.1 http-style HEAD output for FTP 150 20.2 combine error codes 151 20.3 extend CURLOPT_SOCKOPTFUNCTION prototype 152 153 21. Next major release 154 21.1 cleanup return codes 155 21.2 remove obsolete defines 156 21.3 size_t 157 21.4 remove several functions 158 21.5 remove CURLOPT_FAILONERROR 159 21.6 remove CURLOPT_DNS_USE_GLOBAL_CACHE 160 21.7 remove progress meter from libcurl 161 21.8 remove 'curl_httppost' from public 162 163============================================================================== 164 1651. libcurl 166 1671.2 More data sharing 168 169 curl_share_* functions already exist and work, and they can be extended to 170 share more. For example, enable sharing of the ares channel and the 171 connection cache. 172 1731.3 struct lifreq 174 175 Use 'struct lifreq' and SIOCGLIFADDR instead of 'struct ifreq' and 176 SIOCGIFADDR on newer Solaris versions as they claim the latter is obsolete. 177 To support IPv6 interface addresses for network interfaces properly. 178 1791.4 signal-based resolver timeouts 180 181 libcurl built without an asynchronous resolver library uses alarm() to time 182 out DNS lookups. When a timeout occurs, this causes libcurl to jump from the 183 signal handler back into the library with a sigsetjmp, which effectively 184 causes libcurl to continue running within the signal handler. This is 185 non-portable and could cause problems on some platforms. A discussion on the 186 problem is available at https://curl.haxx.se/mail/lib-2008-09/0197.html 187 188 Also, alarm() provides timeout resolution only to the nearest second. alarm 189 ought to be replaced by setitimer on systems that support it. 190 1911.5 get rid of PATH_MAX 192 193 Having code use and rely on PATH_MAX is not nice: 194 http://insanecoding.blogspot.com/2007/11/pathmax-simply-isnt.html 195 196 Currently the SSH based code uses it a bit, but to remove PATH_MAX from there 197 we need libssh2 to properly tell us when we pass in a too small buffer and 198 its current API (as of libssh2 1.2.7) doesn't. 199 2001.6 Modified buffer size approach 201 202 Current libcurl allocates a fixed 16K size buffer for download and an 203 additional 16K for upload. They are always unconditionally part of the easy 204 handle. If CRLF translations are requested, an additional 32K "scratch 205 buffer" is allocated. A total of 64K transfer buffers in the worst case. 206 207 First, while the handles are not actually in use these buffers could be freed 208 so that lingering handles just kept in queues or whatever waste less memory. 209 210 Secondly, SFTP is a protocol that needs to handle many ~30K blocks at once 211 since each need to be individually acked and therefore libssh2 must be 212 allowed to send (or receive) many separate ones in parallel to achieve high 213 transfer speeds. A current libcurl build with a 16K buffer makes that 214 impossible, but one with a 512K buffer will reach MUCH faster transfers. But 215 allocating 512K unconditionally for all buffers just in case they would like 216 to do fast SFTP transfers at some point is not a good solution either. 217 218 Dynamically allocate buffer size depending on protocol in use in combination 219 with freeing it after each individual transfer? Other suggestions? 220 2211.7 Detect when called from within callbacks 222 223 We should set a state variable before calling callbacks, so that we 224 subsequently can add code within libcurl that returns error if called within 225 callbacks for when that's not supported. 226 2271.8 Allow SSL (HTTPS) to proxy 228 229 To prevent local users from snooping on your traffic to the proxy. Supported 230 by Chrome already: 231 https://www.chromium.org/developers/design-documents/secure-web-proxy 232 233 ...and by Firefox soon: 234 https://bugzilla.mozilla.org/show_bug.cgi?id=378637 235 2361.9 Cache negative name resolves 237 238 A name resolve that has failed is likely to fail when made again within a 239 short period of time. Currently we only cache positive responses. 240 2411.10 Support IDNA2008 242 243 International Domain Names are supported in libcurl since years back, powered 244 by libidn. libidn implements IDNA2003 which has been superseded by IDNA2008. 245 libidn2 is an existing library offering support for IDNA2008. 246 2471.11 minimize dependencies with dynamicly loaded modules 248 249 We can create a system with loadable modules/plug-ins, where these modules 250 would be the ones that link to 3rd party libs. That would allow us to avoid 251 having to load ALL dependencies since only the necessary ones for this 252 app/invoke/used protocols would be necessary to load. See 253 https://github.com/curl/curl/issues/349 254 2551.12 have form functions use CURL handle argument 256 257 curl_formadd() and curl_formget() both currently have no CURL handle 258 argument, but both can use a callback that is set in the easy handle, and 259 thus curl_formget() with callback cannot function without first having 260 curl_easy_perform() (or similar) called - which is hard to grasp and a design 261 mistake. 262 263 The curl_formadd() design can probably also be reconsidered to make it easier 264 to use and less error-prone. Probably easiest by splitting it into several 265 function calls. 266 2671.13 Add CURLOPT_MAIL_CLIENT option 268 269 Rather than use the URL to specify the mail client string to present in the 270 HELO and EHLO commands, libcurl should support a new CURLOPT specifically for 271 specifying this data as the URL is non-standard and to be honest a bit of a 272 hack ;-) 273 274 Please see the following thread for more information: 275 https://curl.haxx.se/mail/lib-2012-05/0178.html 276 2771.14 Typesafe curl_easy_setopt() 278 279 One of the most common problems in libcurl using applications is the lack of 280 type checks for curl_easy_setopt() which happens because it accepts varargs 281 and thus can take any type. 282 283 One possible solution to this is to introduce a few different versions of the 284 setopt version for the different kinds of data you can set. 285 286 curl_easy_set_num() - sets a long value 287 288 curl_easy_set_large() - sets a curl_off_t value 289 290 curl_easy_set_ptr() - sets a pointer 291 292 curl_easy_set_cb() - sets a callback PLUS its callback data 293 2941.15 Monitor connections in the connection pool 295 296 libcurl's connection cache or pool holds a number of open connections for the 297 purpose of possible subsequent connection reuse. It may contain a few up to a 298 significant amount of connections. Currently, libcurl leaves all connections 299 as they are and first when a connection is iterated over for matching or 300 reuse purpose it is verified that it is still alive. 301 302 Those connections may get closed by the server side for idleness or they may 303 get a HTTP/2 ping from the peer to verify that they're still alive. By adding 304 monitoring of the connections while in the pool, libcurl can detect dead 305 connections (and close them) better and earlier, and it can handle HTTP/2 306 pings to keep such ones alive even when not actively doing transfers on them. 307 3081.16 Try to URL encode given URL 309 310 Given a URL that for example contains spaces, libcurl could have an option 311 that would try somewhat harder than it does now and convert spaces to %20 and 312 perhaps URL encoded byte values over 128 etc (basically do what the redirect 313 following code already does). 314 315 https://github.com/curl/curl/issues/514 316 3171.17 Add support for IRIs 318 319 IRIs (RFC 3987) allow localized, non-ascii, names in the URL. To properly 320 support this, curl/libcurl would need to translate/encode the given input 321 from the input string encoding into percent encoded output "over the wire". 322 323 To make that work smoothly for curl users even on Windows, curl would 324 probably need to be able to convert from several input encodings. 325 3261.18 try next proxy if one doesn't work 327 328 Allow an application to specify a list of proxies to try, and failing to 329 connect to the first go on and try the next instead until the list is 330 exhausted. Browsers support this feature at least when they specify proxies 331 using PACs. 332 333 https://github.com/curl/curl/issues/896 334 3351.19 Timeout idle connections from the pool 336 337 libcurl currently keeps connections in its connection pool for an indefinite 338 period of time, until it either gets reused, gets noticed that it has been 339 closed by the server or gets pruned to make room for a new connection. 340 341 To reduce overhead (especially for when we add monitoring of the connections 342 in the pool), we should introduce a timeout so that connections that have 343 been idle for N seconds get closed. 344 345 3462. libcurl - multi interface 347 3482.1 More non-blocking 349 350 Make sure we don't ever loop because of non-blocking sockets returning 351 EWOULDBLOCK or similar. Blocking cases include: 352 353 - Name resolves on non-windows unless c-ares is used 354 - NSS SSL connections 355 - HTTP proxy CONNECT operations 356 - SOCKS proxy handshakes 357 - file:// transfers 358 - TELNET transfers 359 - The "DONE" operation (post transfer protocol-specific actions) for the 360 protocols SFTP, SMTP, FTP. Fixing Curl_done() for this is a worthy task. 361 3622.2 Better support for same name resolves 363 364 If a name resolve has been initiated for name NN and a second easy handle 365 wants to resolve that name as well, make it wait for the first resolve to end 366 up in the cache instead of doing a second separate resolve. This is 367 especially needed when adding many simultaneous handles using the same host 368 name when the DNS resolver can get flooded. 369 3702.3 Non-blocking curl_multi_remove_handle() 371 372 The multi interface has a few API calls that assume a blocking behavior, like 373 add_handle() and remove_handle() which limits what we can do internally. The 374 multi API need to be moved even more into a single function that "drives" 375 everything in a non-blocking manner and signals when something is done. A 376 remove or add would then only ask for the action to get started and then 377 multi_perform() etc still be called until the add/remove is completed. 378 3792.4 Split connect and authentication process 380 381 The multi interface treats the authentication process as part of the connect 382 phase. As such any failures during authentication won't trigger the relevant 383 QUIT or LOGOFF for protocols such as IMAP, POP3 and SMTP. 384 3852.5 Edge-triggered sockets should work 386 387 The multi_socket API should work with edge-triggered socket events. One of 388 the internal actions that need to be improved for this to work perfectly is 389 the 'maxloops' handling in transfer.c:readwrite_data(). 390 3913. Documentation 392 3933.1 Update date and version in man pages 394 395 'maketgz' or another suitable script could update the .TH sections of the man 396 pages at release time to use the current date and curl/libcurl version 397 number. 398 3993.2 Provide cmake config-file 400 401 A config-file package is a set of files provided by us to allow applications 402 to write cmake scripts to find and use libcurl easier. See 403 https://github.com/curl/curl/issues/885 404 4054. FTP 406 4074.1 HOST 408 409 HOST is a command for a client to tell which host name to use, to offer FTP 410 servers named-based virtual hosting: 411 412 https://tools.ietf.org/html/rfc7151 413 4144.2 Alter passive/active on failure and retry 415 416 When trying to connect passively to a server which only supports active 417 connections, libcurl returns CURLE_FTP_WEIRD_PASV_REPLY and closes the 418 connection. There could be a way to fallback to an active connection (and 419 vice versa). https://curl.haxx.se/bug/feature.cgi?id=1754793 420 4214.3 Earlier bad letter detection 422 423 Make the detection of (bad) %0d and %0a codes in FTP URL parts earlier in the 424 process to avoid doing a resolve and connect in vain. 425 4264.4 REST for large files 427 428 REST fix for servers not behaving well on >2GB requests. This should fail if 429 the server doesn't set the pointer to the requested index. The tricky 430 (impossible?) part is to figure out if the server did the right thing or not. 431 4324.5 ASCII support 433 434 FTP ASCII transfers do not follow RFC959. They don't convert the data 435 accordingly. 436 4374.6 GSSAPI via Windows SSPI 438 439In addition to currently supporting the SASL GSSAPI mechanism (Kerberos V5) 440via third-party GSS-API libraries, such as Heimdal or MIT Kerberos, also add 441support for GSSAPI authentication via Windows SSPI. 442 4434.7 STAT for LIST without data connection 444 445Some FTP servers allow STAT for listing directories instead of using LIST, and 446the response is then sent over the control connection instead of as the 447otherwise usedw data connection: http://www.nsftools.com/tips/RawFTP.htm#STAT 448 449This is not detailed in any FTP specification. 450 4515. HTTP 452 4535.1 Better persistency for HTTP 1.0 454 455 "Better" support for persistent connections over HTTP 1.0 456 https://curl.haxx.se/bug/feature.cgi?id=1089001 457 4585.2 support FF3 sqlite cookie files 459 460 Firefox 3 is changing from its former format to a a sqlite database instead. 461 We should consider how (lib)curl can/should support this. 462 https://curl.haxx.se/bug/feature.cgi?id=1871388 463 4645.3 Rearrange request header order 465 466 Server implementors often make an effort to detect browser and to reject 467 clients it can detect to not match. One of the last details we cannot yet 468 control in libcurl's HTTP requests, which also can be exploited to detect 469 that libcurl is in fact used even when it tries to impersonate a browser, is 470 the order of the request headers. I propose that we introduce a new option in 471 which you give headers a value, and then when the HTTP request is built it 472 sorts the headers based on that number. We could then have internally created 473 headers use a default value so only headers that need to be moved have to be 474 specified. 475 4765.4 SPDY 477 478 Chrome and Firefox already support SPDY and lots of web services do. There's 479 a library for us to use for this (spdylay) that has a similar API and the 480 same author as nghttp2. 481 482 spdylay: https://github.com/tatsuhiro-t/spdylay 483 4845.5 auth= in URLs 485 486 Add the ability to specify the preferred authentication mechanism to use by 487 using ;auth=<mech> in the login part of the URL. 488 489 For example: 490 491 http://test:pass;auth=NTLM@example.com would be equivalent to specifying --user 492 test:pass;auth=NTLM or --user test:pass --ntlm from the command line. 493 494 Additionally this should be implemented for proxy base URLs as well. 495 4965.6 Refuse "downgrade" redirects 497 498 See https://github.com/curl/curl/issues/226 499 500 Consider a way to tell curl to refuse to "downgrade" protocol with a redirect 501 and/or possibly a bit that refuses redirect to change protocol completely. 502 5035.7 More compressions 504 505 Compression algorithms that perform better than gzip are being considered for 506 use and inclusion in existing browsers. For example 'brotli'. If servers 507 follow along it is a good reason for us to also allow users to take advantage 508 of this. The algorithm: https://github.com/google/brotli The Firefox bug: 509 https://bugzilla.mozilla.org/show_bug.cgi?id=366559 510 511 5126. TELNET 513 5146.1 ditch stdin 515 516Reading input (to send to the remote server) on stdin is a crappy solution for 517library purposes. We need to invent a good way for the application to be able 518to provide the data to send. 519 5206.2 ditch telnet-specific select 521 522 Move the telnet support's network select() loop go away and merge the code 523 into the main transfer loop. Until this is done, the multi interface won't 524 work for telnet. 525 5266.3 feature negotiation debug data 527 528 Add telnet feature negotiation data to the debug callback as header data. 529 5306.4 send data in chunks 531 532 Currently, telnet sends data one byte at a time. This is fine for interactive 533 use, but inefficient for any other. Sent data should be sent in larger 534 chunks. 535 5367. SMTP 537 5387.1 Pipelining 539 540 Add support for pipelining emails. 541 5427.2 Enhanced capability support 543 544 Add the ability, for an application that uses libcurl, to obtain the list of 545 capabilities returned from the EHLO command. 546 5478. POP3 548 5498.1 Pipelining 550 551 Add support for pipelining commands. 552 5538.2 Enhanced capability support 554 555 Add the ability, for an application that uses libcurl, to obtain the list of 556 capabilities returned from the CAPA command. 557 5589. IMAP 559 5609.1 Enhanced capability support 561 562 Add the ability, for an application that uses libcurl, to obtain the list of 563 capabilities returned from the CAPABILITY command. 564 56510. LDAP 566 56710.1 SASL based authentication mechanisms 568 569 Currently the LDAP module only supports ldap_simple_bind_s() in order to bind 570 to an LDAP server. However, this function sends username and password details 571 using the simple authentication mechanism (as clear text). However, it should 572 be possible to use ldap_bind_s() instead specifying the security context 573 information ourselves. 574 57511. SMB 576 57711.1 File listing support 578 579Add support for listing the contents of a SMB share. The output should probably 580be the same as/similar to FTP. 581 58211.2 Honor file timestamps 583 584The timestamp of the transferred file should reflect that of the original file. 585 58611.3 Use NTLMv2 587 588Currently the SMB authentication uses NTLMv1. 589 59011.4 Create remote directories 591 592Support for creating remote directories when uploading a file to a directory 593that doesn't exist on the server, just like --ftp-create-dirs. 594 59512. New protocols 596 59712.1 RSYNC 598 599 There's no RFC for the protocol or an URI/URL format. An implementation 600 should most probably use an existing rsync library, such as librsync. 601 60213. SSL 603 60413.1 Disable specific versions 605 606 Provide an option that allows for disabling specific SSL versions, such as 607 SSLv2 https://curl.haxx.se/bug/feature.cgi?id=1767276 608 60913.2 Provide mutex locking API 610 611 Provide a libcurl API for setting mutex callbacks in the underlying SSL 612 library, so that the same application code can use mutex-locking 613 independently of OpenSSL or GnutTLS being used. 614 61513.3 Evaluate SSL patches 616 617 Evaluate/apply Gertjan van Wingerde's SSL patches: 618 https://curl.haxx.se/mail/lib-2004-03/0087.html 619 62013.4 Cache OpenSSL contexts 621 622 "Look at SSL cafile - quick traces look to me like these are done on every 623 request as well, when they should only be necessary once per SSL context (or 624 once per handle)". The major improvement we can rather easily do is to make 625 sure we don't create and kill a new SSL "context" for every request, but 626 instead make one for every connection and re-use that SSL context in the same 627 style connections are re-used. It will make us use slightly more memory but 628 it will libcurl do less creations and deletions of SSL contexts. 629 63013.5 Export session ids 631 632 Add an interface to libcurl that enables "session IDs" to get 633 exported/imported. Cris Bailiff said: "OpenSSL has functions which can 634 serialise the current SSL state to a buffer of your choice, and recover/reset 635 the state from such a buffer at a later date - this is used by mod_ssl for 636 apache to implement and SSL session ID cache". 637 63813.6 Provide callback for cert verification 639 640 OpenSSL supports a callback for customised verification of the peer 641 certificate, but this doesn't seem to be exposed in the libcurl APIs. Could 642 it be? There's so much that could be done if it were! 643 64413.7 improve configure --with-ssl 645 646 make the configure --with-ssl option first check for OpenSSL, then GnuTLS, 647 then NSS... 648 64913.8 Support DANE 650 651 DNS-Based Authentication of Named Entities (DANE) is a way to provide SSL 652 keys and certs over DNS using DNSSEC as an alternative to the CA model. 653 https://www.rfc-editor.org/rfc/rfc6698.txt 654 655 An initial patch was posted by Suresh Krishnaswamy on March 7th 2013 656 (https://curl.haxx.se/mail/lib-2013-03/0075.html) but it was a too simple 657 approach. See Daniel's comments: 658 https://curl.haxx.se/mail/lib-2013-03/0103.html . libunbound may be the 659 correct library to base this development on. 660 66114. GnuTLS 662 66314.1 SSL engine stuff 664 665 Is this even possible? 666 66714.2 check connection 668 669 Add a way to check if the connection seems to be alive, to correspond to the 670 SSL_peak() way we use with OpenSSL. 671 67215. WinSSL/SChannel 673 67415.1 Add support for client certificate authentication 675 676 WinSSL/SChannel currently makes use of the OS-level system and user 677 certificate and private key stores. This does not allow the application 678 or the user to supply a custom client certificate using curl or libcurl. 679 680 Therefore support for the existing -E/--cert and --key options should be 681 implemented by supplying a custom certificate to the SChannel APIs, see: 682 - Getting a Certificate for Schannel 683 https://msdn.microsoft.com/en-us/library/windows/desktop/aa375447.aspx 684 68515.2 Add support for custom server certificate validation 686 687 WinSSL/SChannel currently makes use of the OS-level system and user 688 certificate trust store. This does not allow the application or user to 689 customize the server certificate validation process using curl or libcurl. 690 691 Therefore support for the existing --cacert or --capath options should be 692 implemented by supplying a custom certificate to the SChannel APIs, see: 693 - Getting a Certificate for Schannel 694 https://msdn.microsoft.com/en-us/library/windows/desktop/aa375447.aspx 695 69615.3 Add support for the --ciphers option 697 698 The cipher suites used by WinSSL/SChannel are configured on an OS-level 699 instead of an application-level. This does not allow the application or 700 the user to customize the configured cipher suites using curl or libcurl. 701 702 Therefore support for the existing --ciphers option should be implemented 703 by mapping the OpenSSL/GnuTLS cipher suites to the SChannel APIs, see 704 - Specifying Schannel Ciphers and Cipher Strengths 705 https://msdn.microsoft.com/en-us/library/windows/desktop/aa380161.aspx 706 70716. SASL 708 70916.1 Other authentication mechanisms 710 711 Add support for other authentication mechanisms such as OLP, 712 GSS-SPNEGO and others. 713 71416.2 Add QOP support to GSSAPI authentication 715 716 Currently the GSSAPI authentication only supports the default QOP of auth 717 (Authentication), whilst Kerberos V5 supports both auth-int (Authentication 718 with integrity protection) and auth-conf (Authentication with integrity and 719 privacy protection). 720 72116.3 Support binary messages (i.e.: non-base64) 722 723 Mandatory to support LDAP SASL authentication. 724 72517. Command line tool 726 72717.1 sync 728 729 "curl --sync http://example.com/feed[1-100].rss" or 730 "curl --sync http://example.net/{index,calendar,history}.html" 731 732 Downloads a range or set of URLs using the remote name, but only if the 733 remote file is newer than the local file. A Last-Modified HTTP date header 734 should also be used to set the mod date on the downloaded file. 735 73617.2 glob posts 737 738 Globbing support for -d and -F, as in 'curl -d "name=foo[0-9]" URL'. 739 This is easily scripted though. 740 74117.3 prevent file overwriting 742 743 Add an option that prevents cURL from overwriting existing local files. When 744 used, and there already is an existing file with the target file name 745 (either -O or -o), a number should be appended (and increased if already 746 existing). So that index.html becomes first index.html.1 and then 747 index.html.2 etc. 748 74917.4 simultaneous parallel transfers 750 751 The client could be told to use maximum N simultaneous parallel transfers and 752 then just make sure that happens. It should of course not make more than one 753 connection to the same remote host. This would require the client to use the 754 multi interface. https://curl.haxx.se/bug/feature.cgi?id=1558595 755 756 Using the multi interface would also allow properly using parallel transfers 757 with HTTP/2 and supporting HTTP/2 server push from the command line. 758 75917.5 provide formpost headers 760 761 Extending the capabilities of the multipart formposting. How about leaving 762 the ';type=foo' syntax as it is and adding an extra tag (headers) which 763 works like this: curl -F "coolfiles=@fil1.txt;headers=@fil1.hdr" where 764 fil1.hdr contains extra headers like 765 766 Content-Type: text/plain; charset=KOI8-R" 767 Content-Transfer-Encoding: base64 768 X-User-Comment: Please don't use browser specific HTML code 769 770 which should overwrite the program reasonable defaults (plain/text, 771 8bit...) 772 77317.6 warning when setting an option 774 775 Display a warning when libcurl returns an error when setting an option. 776 This can be useful to tell when support for a particular feature hasn't been 777 compiled into the library. 778 77917.7 warning when sending binary output to terminal 780 781 Provide a way that prompts the user for confirmation before binary data is 782 sent to the terminal, much in the style 'less' does it. 783 78417.8 offer color-coded HTTP header output 785 786 By offering different color output on the header name and the header 787 contents, they could be made more readable and thus help users working on 788 HTTP services. 789 79017.9 Choose the name of file in braces for complex URLs 791 792 When using braces to download a list of URLs and you use complicated names 793 in the list of alternatives, it could be handy to allow curl to use other 794 names when saving. 795 796 Consider a way to offer that. Possibly like 797 {partURL1:name1,partURL2:name2,partURL3:name3} where the name following the 798 colon is the output name. 799 800 See https://github.com/curl/curl/issues/221 801 80217.10 improve how curl works in a windows console window 803 804 If you pull the scrollbar when transferring with curl in a Windows console 805 window, the transfer is interrupted and can get disconnected. This can 806 probably be improved. See https://github.com/curl/curl/issues/322 807 80817.11 -w output to stderr 809 810 -w is quite useful, but not to those of us who use curl without -o or -O 811 (such as for scripting through a higher level language). It would be nice to 812 have an option that is exactly like -w but sends it to stderr 813 instead. Proposed name: --write-stderr. See 814 https://github.com/curl/curl/issues/613 815 81617.12 keep running, read instructions from pipe/socket 817 818 Provide an option that makes curl not exit after the last URL (or even work 819 without a given URL), and then make it read instructions passed on a pipe or 820 over a socket to make further instructions so that a second subsequent curl 821 invoke can talk to the still running instance and ask for transfers to get 822 done, and thus maintain its connection pool, DNS cache and more. 823 82417.13 support metalink in http headers 825 826 Curl has support for downloading a metalink xml file, processing it, and then 827 downloading the target of the metalink. This is done via the --metalink option. 828 It would be nice if metalink also supported downloading via metalink 829 information that is stored in HTTP headers (RFC 6249). Theoretically this could 830 also be supported with the --metalink option. 831 832 See https://tools.ietf.org/html/rfc6249 833 834 See also https://lists.gnu.org/archive/html/bug-wget/2015-06/msg00034.html for 835 an implematation of this in wget. 836 83717.14 --fail without --location should treat 3xx as a failure 838 839 To allow a command line like this to detect a redirect and consider it a 840 failure: 841 842 curl -v --fail -O https://example.com/curl-7.48.0.tar.gz 843 844 ... --fail must treat 3xx responses as failures too. The least problematic 845 way to implement this is probably to add that new logic in the command line 846 tool only and not in the underlying CURLOPT_FAILONERROR logic. 847 848 84918. Build 850 85118.1 roffit 852 853 Consider extending 'roffit' to produce decent ASCII output, and use that 854 instead of (g)nroff when building src/tool_hugehelp.c 855 85619. Test suite 857 85819.1 SSL tunnel 859 860 Make our own version of stunnel for simple port forwarding to enable HTTPS 861 and FTP-SSL tests without the stunnel dependency, and it could allow us to 862 provide test tools built with either OpenSSL or GnuTLS 863 86419.2 nicer lacking perl message 865 866 If perl wasn't found by the configure script, don't attempt to run the tests 867 but explain something nice why it doesn't. 868 86919.3 more protocols supported 870 871 Extend the test suite to include more protocols. The telnet could just do FTP 872 or http operations (for which we have test servers). 873 87419.4 more platforms supported 875 876 Make the test suite work on more platforms. OpenBSD and Mac OS. Remove 877 fork()s and it should become even more portable. 878 87919.5 Add support for concurrent connections 880 881 Tests 836, 882 and 938 were designed to verify that separate connections aren't 882 used when using different login credentials in protocols that shouldn't re-use 883 a connection under such circumstances. 884 885 Unfortunately, ftpserver.pl doesn't appear to support multiple concurrent 886 connections. The read while() loop seems to loop until it receives a disconnect 887 from the client, where it then enters the waiting for connections loop. When 888 the client opens a second connection to the server, the first connection hasn't 889 been dropped (unless it has been forced - which we shouldn't do in these tests) 890 and thus the wait for connections loop is never entered to receive the second 891 connection. 892 89319.6 Use the RFC6265 test suite 894 895 A test suite made for HTTP cookies (RFC 6265) by Adam Barth is available at 896 https://github.com/abarth/http-state/tree/master/tests 897 898 It'd be really awesome if someone would write a script/setup that would run 899 curl with that test suite and detect deviances. Ideally, that would even be 900 incorporated into our regular test suite. 901 902 90320. Next SONAME bump 904 90520.1 http-style HEAD output for FTP 906 907 #undef CURL_FTP_HTTPSTYLE_HEAD in lib/ftp.c to remove the HTTP-style headers 908 from being output in NOBODY requests over FTP 909 91020.2 combine error codes 911 912 Combine some of the error codes to remove duplicates. The original 913 numbering should not be changed, and the old identifiers would be 914 macroed to the new ones in an CURL_NO_OLDIES section to help with 915 backward compatibility. 916 917 Candidates for removal and their replacements: 918 919 CURLE_FILE_COULDNT_READ_FILE => CURLE_REMOTE_FILE_NOT_FOUND 920 921 CURLE_FTP_COULDNT_RETR_FILE => CURLE_REMOTE_FILE_NOT_FOUND 922 923 CURLE_FTP_COULDNT_USE_REST => CURLE_RANGE_ERROR 924 925 CURLE_FUNCTION_NOT_FOUND => CURLE_FAILED_INIT 926 927 CURLE_LDAP_INVALID_URL => CURLE_URL_MALFORMAT 928 929 CURLE_TFTP_NOSUCHUSER => CURLE_TFTP_ILLEGAL 930 931 CURLE_TFTP_NOTFOUND => CURLE_REMOTE_FILE_NOT_FOUND 932 933 CURLE_TFTP_PERM => CURLE_REMOTE_ACCESS_DENIED 934 93520.3 extend CURLOPT_SOCKOPTFUNCTION prototype 936 937 The current prototype only provides 'purpose' that tells what the 938 connection/socket is for, but not any protocol or similar. It makes it hard 939 for applications to differentiate on TCP vs UDP and even HTTP vs FTP and 940 similar. 941 94221. Next major release 943 94421.1 cleanup return codes 945 946 curl_easy_cleanup() returns void, but curl_multi_cleanup() returns a 947 CURLMcode. These should be changed to be the same. 948 94921.2 remove obsolete defines 950 951 remove obsolete defines from curl/curl.h 952 95321.3 size_t 954 955 make several functions use size_t instead of int in their APIs 956 95721.4 remove several functions 958 959 remove the following functions from the public API: 960 961 curl_getenv 962 963 curl_mprintf (and variations) 964 965 curl_strequal 966 967 curl_strnequal 968 969 They will instead become curlx_ - alternatives. That makes the curl app 970 still capable of using them, by building with them from source. 971 972 These functions have no purpose anymore: 973 974 curl_multi_socket 975 976 curl_multi_socket_all 977 97821.5 remove CURLOPT_FAILONERROR 979 980 Remove support for CURLOPT_FAILONERROR, it has gotten too kludgy and weird 981 internally. Let the app judge success or not for itself. 982 98321.6 remove CURLOPT_DNS_USE_GLOBAL_CACHE 984 985 Remove support for a global DNS cache. Anything global is silly, and we 986 already offer the share interface for the same functionality but done 987 "right". 988 98921.7 remove progress meter from libcurl 990 991 The internally provided progress meter output doesn't belong in the library. 992 Basically no application wants it (apart from curl) but instead applications 993 can and should do their own progress meters using the progress callback. 994 995 The progress callback should then be bumped as well to get proper 64bit 996 variable types passed to it instead of doubles so that big files work 997 correctly. 998 99921.8 remove 'curl_httppost' from public 1000 1001 curl_formadd() was made to fill in a public struct, but the fact that the 1002 struct is public is never really used by application for their own advantage 1003 but instead often restricts how the form functions can or can't be modified. 1004 1005 Changing them to return a private handle will benefit the implementation and 1006 allow us much greater freedoms while still maintaining a solid API and ABI. 1007