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 All bugs documented in the KNOWN_BUGS document are subject for fixing! 13 14 1. libcurl 15 1.2 More data sharing 16 1.3 struct lifreq 17 1.4 signal-based resolver timeouts 18 1.5 get rid of PATH_MAX 19 1.6 progress callback without doubles 20 21 2. libcurl - multi interface 22 2.1 More non-blocking 23 2.2 Remove easy interface internally 24 2.4 Fix HTTP Pipelining for PUT 25 26 3. Documentation 27 3.1 More and better 28 29 4. FTP 30 4.1 HOST 31 4.2 Alter passive/active on failure and retry 32 4.3 Earlier bad letter detection 33 4.4 REST for large files 34 4.5 FTP proxy support 35 4.6 ASCII support 36 37 5. HTTP 38 5.1 Better persistency for HTTP 1.0 39 5.2 support FF3 sqlite cookie files 40 5.3 Rearrange request header order 41 42 6. TELNET 43 6.1 ditch stdin 44 6.2 ditch telnet-specific select 45 6.3 feature negotiation debug data 46 6.4 send data in chunks 47 48 7. SSL 49 7.1 Disable specific versions 50 7.2 Provide mutex locking API 51 7.3 Evaluate SSL patches 52 7.4 Cache OpenSSL contexts 53 7.5 Export session ids 54 7.6 Provide callback for cert verification 55 7.7 Support other SSL libraries 56 7.9 improve configure --with-ssl 57 58 8. GnuTLS 59 8.1 SSL engine stuff 60 8.3 check connection 61 8.4 non-gcrypt 62 63 9. Other protocols 64 65 10. New protocols 66 10.1 RSYNC 67 68 11. Client 69 11.1 sync 70 11.2 glob posts 71 11.3 prevent file overwriting 72 11.4 simultaneous parallel transfers 73 11.5 provide formpost headers 74 11.6 url-specific options 75 11.7 metalink support 76 11.8 warning when setting an option 77 11.9 IPv6 addresses with globbing 78 79 12. Build 80 12.1 roffit 81 82 13. Test suite 83 13.1 SSL tunnel 84 13.2 nicer lacking perl message 85 13.3 more protocols supported 86 13.4 more platforms supported 87 88 14. Next SONAME bump 89 14.1 http-style HEAD output for ftp 90 14.2 combine error codes 91 14.3 extend CURLOPT_SOCKOPTFUNCTION prototype 92 93 15. Next major release 94 15.1 cleanup return codes 95 15.2 remove obsolete defines 96 15.3 size_t 97 15.4 remove several functions 98 15.5 remove CURLOPT_FAILONERROR 99 15.6 remove CURLOPT_DNS_USE_GLOBAL_CACHE 100 15.7 remove progress meter from libcurl 101 15.8 remove 'curl_httppost' from public 102 15.9 have form functions use CURL handle argument 103 104============================================================================== 105 1061. libcurl 107 1081.2 More data sharing 109 110 curl_share_* functions already exist and work, and they can be extended to 111 share more. For example, enable sharing of the ares channel and the 112 connection cache. 113 1141.3 struct lifreq 115 116 Use 'struct lifreq' and SIOCGLIFADDR instead of 'struct ifreq' and 117 SIOCGIFADDR on newer Solaris versions as they claim the latter is obsolete. 118 To support ipv6 interface addresses for network interfaces properly. 119 1201.4 signal-based resolver timeouts 121 122 libcurl built without an asynchronous resolver library uses alarm() to time 123 out DNS lookups. When a timeout occurs, this causes libcurl to jump from the 124 signal handler back into the library with a sigsetjmp, which effectively 125 causes libcurl to continue running within the signal handler. This is 126 non-portable and could cause problems on some platforms. A discussion on the 127 problem is available at http://curl.haxx.se/mail/lib-2008-09/0197.html 128 129 Also, alarm() provides timeout resolution only to the nearest second. alarm 130 ought to be replaced by setitimer on systems that support it. 131 1321.5 get rid of PATH_MAX 133 134 Having code use and rely on PATH_MAX is not nice: 135 http://insanecoding.blogspot.com/2007/11/pathmax-simply-isnt.html 136 137 Currently the SSH based code uses it a bit, but to remove PATH_MAX from there 138 we need libssh2 to properly tell us when we pass in a too small buffer and 139 its current API (as of libssh2 1.2.7) doesn't. 140 1411.6 progress callback without doubles 142 143 The progress callback was introduced way back in the days and the choice to 144 use doubles in the arguments was possibly good at the time. Today the doubles 145 only confuse users and make the amounts less precise. We should introduce 146 another progress callback option that take precedence over the old one and 147 have both co-exist for a forseeable time until we can remove the double-using 148 one. 149 1502. libcurl - multi interface 151 1522.1 More non-blocking 153 154 Make sure we don't ever loop because of non-blocking sockets returning 155 EWOULDBLOCK or similar. Blocking cases include: 156 157 - Name resolves on non-windows unless c-ares is used 158 - NSS SSL connections 159 - Active FTP connections 160 - HTTP proxy CONNECT operations 161 - SOCKS proxy handshakes 162 - file:// transfers 163 - TELNET transfers 164 - The "DONE" operation (post transfer protocol-specific actions) for the 165 protocols SFTP, SMTP, FTP. Fixing Curl_done() for this is a worthy task. 166 1672.2 Remove easy interface internally 168 169 Make curl_easy_perform() a wrapper-function that simply creates a multi 170 handle, adds the easy handle to it, runs curl_multi_perform() until the 171 transfer is done, then detach the easy handle, destroy the multi handle and 172 return the easy handle's return code. This will thus make everything 173 internally use and assume the multi interface. The select()-loop should use 174 curl_multi_socket(). 175 1762.4 Fix HTTP Pipelining for PUT 177 178 HTTP Pipelining can be a way to greatly enhance performance for multiple 179 serial requests and currently libcurl only supports that for HEAD and GET 180 requests but it should also be possible for PUT. 181 1823. Documentation 183 1843.1 More and better 185 186 Exactly 187 1884. FTP 189 1904.1 HOST 191 192 HOST is a suggested command in the works for a client to tell which host name 193 to use, to offer FTP servers named-based virtual hosting: 194 195 http://tools.ietf.org/html/draft-hethmon-mcmurray-ftp-hosts-11 196 1974.2 Alter passive/active on failure and retry 198 199 When trying to connect passively to a server which only supports active 200 connections, libcurl returns CURLE_FTP_WEIRD_PASV_REPLY and closes the 201 connection. There could be a way to fallback to an active connection (and 202 vice versa). http://curl.haxx.se/bug/feature.cgi?id=1754793 203 2044.3 Earlier bad letter detection 205 206 Make the detection of (bad) %0d and %0a codes in FTP url parts earlier in the 207 process to avoid doing a resolve and connect in vain. 208 2094.4 REST for large files 210 211 REST fix for servers not behaving well on >2GB requests. This should fail if 212 the server doesn't set the pointer to the requested index. The tricky 213 (impossible?) part is to figure out if the server did the right thing or not. 214 2154.5 FTP proxy support 216 217 Support the most common FTP proxies, Philip Newton provided a list allegedly 218 from ncftp. This is not a subject without debate, and is probably not really 219 suitable for libcurl. http://curl.haxx.se/mail/archive-2003-04/0126.html 220 2214.6 ASCII support 222 223 FTP ASCII transfers do not follow RFC959. They don't convert the data 224 accordingly. 225 2265. HTTP 227 2285.1 Better persistency for HTTP 1.0 229 230 "Better" support for persistent connections over HTTP 1.0 231 http://curl.haxx.se/bug/feature.cgi?id=1089001 232 2335.2 support FF3 sqlite cookie files 234 235 Firefox 3 is changing from its former format to a a sqlite database instead. 236 We should consider how (lib)curl can/should support this. 237 http://curl.haxx.se/bug/feature.cgi?id=1871388 238 2395.3 Rearrange request header order 240 241 Server implementors often make an effort to detect browser and to reject 242 clients it can detect to not match. One of the last details we cannot yet 243 control in libcurl's HTTP requests, which also can be exploited to detect 244 that libcurl is in fact used even when it tries to impersonate a browser, is 245 the order of the request headers. I propose that we introduce a new option in 246 which you give headers a value, and then when the HTTP request is built it 247 sorts the headers based on that number. We could then have internally created 248 headers use a default value so only headers that need to be moved have to be 249 specified. 250 251 2526. TELNET 253 2546.1 ditch stdin 255 256Reading input (to send to the remote server) on stdin is a crappy solution for 257library purposes. We need to invent a good way for the application to be able 258to provide the data to send. 259 2606.2 ditch telnet-specific select 261 262 Move the telnet support's network select() loop go away and merge the code 263 into the main transfer loop. Until this is done, the multi interface won't 264 work for telnet. 265 2666.3 feature negotiation debug data 267 268 Add telnet feature negotiation data to the debug callback as header data. 269 2706.4 send data in chunks 271 272 Currently, telnet sends data one byte at a time. This is fine for interactive 273 use, but inefficient for any other. Sent data should be sent in larger 274 chunks. 275 2767. SSL 277 2787.1 Disable specific versions 279 280 Provide an option that allows for disabling specific SSL versions, such as 281 SSLv2 http://curl.haxx.se/bug/feature.cgi?id=1767276 282 2837.2 Provide mutex locking API 284 285 Provide a libcurl API for setting mutex callbacks in the underlying SSL 286 library, so that the same application code can use mutex-locking 287 independently of OpenSSL or GnutTLS being used. 288 2897.3 Evaluate SSL patches 290 291 Evaluate/apply Gertjan van Wingerde's SSL patches: 292 http://curl.haxx.se/mail/lib-2004-03/0087.html 293 2947.4 Cache OpenSSL contexts 295 296 "Look at SSL cafile - quick traces look to me like these are done on every 297 request as well, when they should only be necessary once per ssl context (or 298 once per handle)". The major improvement we can rather easily do is to make 299 sure we don't create and kill a new SSL "context" for every request, but 300 instead make one for every connection and re-use that SSL context in the same 301 style connections are re-used. It will make us use slightly more memory but 302 it will libcurl do less creations and deletions of SSL contexts. 303 3047.5 Export session ids 305 306 Add an interface to libcurl that enables "session IDs" to get 307 exported/imported. Cris Bailiff said: "OpenSSL has functions which can 308 serialise the current SSL state to a buffer of your choice, and recover/reset 309 the state from such a buffer at a later date - this is used by mod_ssl for 310 apache to implement and SSL session ID cache". 311 3127.6 Provide callback for cert verification 313 314 OpenSSL supports a callback for customised verification of the peer 315 certificate, but this doesn't seem to be exposed in the libcurl APIs. Could 316 it be? There's so much that could be done if it were! 317 3187.7 Support other SSL libraries 319 320 Make curl's SSL layer capable of using other free SSL libraries. Such as 321 MatrixSSL (http://www.matrixssl.org/). 322 3237.9 improve configure --with-ssl 324 325 make the configure --with-ssl option first check for OpenSSL, then GnuTLS, 326 then NSS... 327 3288. GnuTLS 329 3308.1 SSL engine stuff 331 332 Is this even possible? 333 3348.3 check connection 335 336 Add a way to check if the connection seems to be alive, to correspond to the 337 SSL_peak() way we use with OpenSSL. 338 3398.4 non-gcrypt 340 341 libcurl assumes that there are gcrypt functions available when 342 GnuTLS is. 343 344 GnuTLS can be built to use libnettle instead as crypto library, 345 which breaks the previously mentioned assumption 346 347 The correct fix would be to detect which crypto layer that is in use and 348 adapt our code to use that instead of blindly assuming gcrypt. 349 3509. Other protocols 351 35210. New protocols 353 35410.1 RSYNC 355 356 There's no RFC for protocol nor URI/URL format. An implementation should 357 most probably use an existing rsync library, such as librsync. 358 35911. Client 360 36111.1 sync 362 363 "curl --sync http://example.com/feed[1-100].rss" or 364 "curl --sync http://example.net/{index,calendar,history}.html" 365 366 Downloads a range or set of URLs using the remote name, but only if the 367 remote file is newer than the local file. A Last-Modified HTTP date header 368 should also be used to set the mod date on the downloaded file. 369 37011.2 glob posts 371 372 Globbing support for -d and -F, as in 'curl -d "name=foo[0-9]" URL'. 373 This is easily scripted though. 374 37511.3 prevent file overwriting 376 377 Add an option that prevents cURL from overwriting existing local files. When 378 used, and there already is an existing file with the target file name 379 (either -O or -o), a number should be appended (and increased if already 380 existing). So that index.html becomes first index.html.1 and then 381 index.html.2 etc. 382 38311.4 simultaneous parallel transfers 384 385 The client could be told to use maximum N simultaneous parallel transfers and 386 then just make sure that happens. It should of course not make more than one 387 connection to the same remote host. This would require the client to use the 388 multi interface. http://curl.haxx.se/bug/feature.cgi?id=1558595 389 39011.5 provide formpost headers 391 392 Extending the capabilities of the multipart formposting. How about leaving 393 the ';type=foo' syntax as it is and adding an extra tag (headers) which 394 works like this: curl -F "coolfiles=@fil1.txt;headers=@fil1.hdr" where 395 fil1.hdr contains extra headers like 396 397 Content-Type: text/plain; charset=KOI8-R" 398 Content-Transfer-Encoding: base64 399 X-User-Comment: Please don't use browser specific HTML code 400 401 which should overwrite the program reasonable defaults (plain/text, 402 8bit...) 403 40411.6 url-specific options 405 406 Provide a way to make options bound to a specific URL among several on the 407 command line. Possibly by letting ':' separate options between URLs, 408 similar to this: 409 410 curl --data foo --url url.com : \ 411 --url url2.com : \ 412 --url url3.com --data foo3 413 414 (More details: http://curl.haxx.se/mail/archive-2004-07/0133.html) 415 416 The example would do a POST-GET-POST combination on a single command line. 417 41811.7 metalink support 419 420 Add metalink support to curl (http://www.metalinker.org/). This is most useful 421 with simultaneous parallel transfers (11.6) but not necessary. 422 42311.8 warning when setting an option 424 425 Display a warning when libcurl returns an error when setting an option. 426 This can be useful to tell when support for a particular feature hasn't been 427 compiled into the library. 428 42911.9 IPv6 addresses with globbing 430 431 Currently the command line client needs to get url globbing disabled (with 432 -g) for it to support IPv6 numerical addresses. This is a rather silly flaw 433 that should be corrected. It probably involves a smarter detection of the 434 '[' and ']' letters. 435 43612. Build 437 43812.1 roffit 439 440 Consider extending 'roffit' to produce decent ASCII output, and use that 441 instead of (g)nroff when building src/hugehelp.c 442 44313. Test suite 444 44513.1 SSL tunnel 446 447 Make our own version of stunnel for simple port forwarding to enable HTTPS 448 and FTP-SSL tests without the stunnel dependency, and it could allow us to 449 provide test tools built with either OpenSSL or GnuTLS 450 45113.2 nicer lacking perl message 452 453 If perl wasn't found by the configure script, don't attempt to run the tests 454 but explain something nice why it doesn't. 455 45613.3 more protocols supported 457 458 Extend the test suite to include more protocols. The telnet could just do ftp 459 or http operations (for which we have test servers). 460 46113.4 more platforms supported 462 463 Make the test suite work on more platforms. OpenBSD and Mac OS. Remove 464 fork()s and it should become even more portable. 465 46614. Next SONAME bump 467 46814.1 http-style HEAD output for ftp 469 470 #undef CURL_FTP_HTTPSTYLE_HEAD in lib/ftp.c to remove the HTTP-style headers 471 from being output in NOBODY requests over ftp 472 47314.2 combine error codes 474 475 Combine some of the error codes to remove duplicates. The original 476 numbering should not be changed, and the old identifiers would be 477 macroed to the new ones in an CURL_NO_OLDIES section to help with 478 backward compatibility. 479 480 Candidates for removal and their replacements: 481 482 CURLE_FILE_COULDNT_READ_FILE => CURLE_REMOTE_FILE_NOT_FOUND 483 CURLE_FTP_COULDNT_RETR_FILE => CURLE_REMOTE_FILE_NOT_FOUND 484 CURLE_FTP_COULDNT_USE_REST => CURLE_RANGE_ERROR 485 CURLE_FUNCTION_NOT_FOUND => CURLE_FAILED_INIT 486 CURLE_LDAP_INVALID_URL => CURLE_URL_MALFORMAT 487 CURLE_TFTP_NOSUCHUSER => CURLE_TFTP_ILLEGAL 488 CURLE_TFTP_NOTFOUND => CURLE_REMOTE_FILE_NOT_FOUND 489 CURLE_TFTP_PERM => CURLE_REMOTE_ACCESS_DENIED 490 49114.3 extend CURLOPT_SOCKOPTFUNCTION prototype 492 493 The current prototype only provides 'purpose' that tells what the 494 connection/socket is for, but not any protocol or similar. It makes it hard 495 for applications to differentiate on TCP vs UDP and even HTTP vs FTP and 496 similar. 497 49815. Next major release 499 50015.1 cleanup return codes 501 502 curl_easy_cleanup() returns void, but curl_multi_cleanup() returns a 503 CURLMcode. These should be changed to be the same. 504 50515.2 remove obsolete defines 506 507 remove obsolete defines from curl/curl.h 508 50915.3 size_t 510 511 make several functions use size_t instead of int in their APIs 512 51315.4 remove several functions 514 515 remove the following functions from the public API: 516 517 curl_getenv 518 519 curl_mprintf (and variations) 520 521 curl_strequal 522 523 curl_strnequal 524 525 They will instead become curlx_ - alternatives. That makes the curl app 526 still capable of using them, by building with them from source. 527 528 These functions have no purpose anymore: 529 530 curl_multi_socket 531 532 curl_multi_socket_all 533 53415.5 remove CURLOPT_FAILONERROR 535 536 Remove support for CURLOPT_FAILONERROR, it has gotten too kludgy and weird 537 internally. Let the app judge success or not for itself. 538 53915.6 remove CURLOPT_DNS_USE_GLOBAL_CACHE 540 541 Remove support for a global DNS cache. Anything global is silly, and we 542 already offer the share interface for the same functionality but done 543 "right". 544 54515.7 remove progress meter from libcurl 546 547 The internally provided progress meter output doesn't belong in the library. 548 Basically no application wants it (apart from curl) but instead applications 549 can and should do their own progress meters using the progress callback. 550 551 The progress callback should then be bumped as well to get proper 64bit 552 variable types passed to it instead of doubles so that big files work 553 correctly. 554 55515.8 remove 'curl_httppost' from public 556 557 curl_formadd() was made to fill in a public struct, but the fact that the 558 struct is public is never really used by application for their own advantage 559 but instead often restricts how the form functions can or can't be modified. 560 561 Changing them to return a private handle will benefit the implementation and 562 allow us much greater freedoms while still maintining a solid API and ABI. 563 56415.9 have form functions use CURL handle argument 565 566 curl_formadd() and curl_formget() both currently have no CURL handle 567 argument, but both can use a callback that is set in the easy handle, and 568 thus curl_formget() with callback cannot function without first having 569 curl_easy_perform() (or similar) called - which is hard to grasp and a design 570 mistake. 571