5 \___|\___/|_| \_\_____|
7 Things that could be nice to do in the future
9 Things to do in project cURL. Please tell us what you think, contribute and
10 send us patches that improve things!
12 All bugs documented in the KNOWN_BUGS document are subject for fixing!
15 1.1 Zero-copy interface
18 1.4 signal-based resolver timeouts
20 2. libcurl - multi interface
22 2.2 Remove easy interface internally
23 2.3 Avoid having to remove/readd handles
24 2.4 Fix HTTP Pipelining for PUT
31 4.2 Alter passive/active on failure and retry
32 4.3 Earlier bad letter detection
33 4.4 REST for large files
39 5.1 Better persistency for HTTP 1.0
40 5.2 support FF3 sqlite cookie files
41 5.3 Sort outgoing cookies
42 5.4 Rearrange request header order
46 6.2 ditch telnet-specific select
47 6.3 feature negotiation debug data
48 6.4 send data in chunks
51 7.1 Disable specific versions
52 7.2 Provide mutex locking API
53 7.3 Evaluate SSL patches
54 7.4 Cache OpenSSL contexts
55 7.5 Export session ids
56 7.6 Provide callback for cert verification
57 7.7 Support other SSL libraries
58 7.8 Support SRP on the TLS layer
59 7.9 improve configure --with-ssl
62 8.1 Make NTLM work without OpenSSL functions
69 9.1 ditch ldap-specific select
77 11.1 Content-Disposition
80 11.4 prevent file overwriting
81 11.5 ftp wildcard download
82 11.6 simultaneous parallel transfers
83 11.7 provide formpost headers
84 11.8 url-specific options
86 11.10 warning when setting an option
93 13.2 nicer lacking perl message
94 13.3 more protocols supported
95 13.4 more platforms supported
98 14.1 http-style HEAD output for ftp
99 14.2 combine error codes
100 14.3 extend CURLOPT_SOCKOPTFUNCTION prototype
102 15. Next major release
103 15.1 cleanup return codes
104 15.2 remove obsolete defines
106 15.4 remove several functions
107 15.5 remove CURLOPT_FAILONERROR
108 15.6 remove CURLOPT_DNS_USE_GLOBAL_CACHE
110 ==============================================================================
114 1.1 Zero-copy interface
116 Introduce another callback interface for upload/download that makes one less
117 copy of data and thus a faster operation.
118 [http://curl.haxx.se/dev/no_copy_callbacks.txt]
120 1.2 More data sharing
122 curl_share_* functions already exist and work, and they can be extended to
123 share more. For example, enable sharing of the ares channel and the
128 Use 'struct lifreq' and SIOCGLIFADDR instead of 'struct ifreq' and
129 SIOCGIFADDR on newer Solaris versions as they claim the latter is obsolete.
130 To support ipv6 interface addresses for network interfaces properly.
132 1.4 signal-based resolver timeouts
134 libcurl built without an asynchronous resolver library uses alarm() to time
135 out DNS lookups. When a timeout occurs, this causes libcurl to jump from the
136 signal handler back into the library with a sigsetjmp, which effectively
137 causes libcurl to continue running within the signal handler. This is
138 non-portable and could cause problems on some platforms. A discussion on the
139 problem is available at http://curl.haxx.se/mail/lib-2008-09/0197.html
141 Also, alarm() provides timeout resolution only to the nearest second. alarm
142 ought to be replaced by setitimer on systems that support it.
144 2. libcurl - multi interface
146 2.1 More non-blocking
148 Make sure we don't ever loop because of non-blocking sockets returning
149 EWOULDBLOCK or similar. The GnuTLS connection etc.
151 2.2 Remove easy interface internally
153 Make curl_easy_perform() a wrapper-function that simply creates a multi
154 handle, adds the easy handle to it, runs curl_multi_perform() until the
155 transfer is done, then detach the easy handle, destroy the multi handle and
156 return the easy handle's return code. This will thus make everything
157 internally use and assume the multi interface. The select()-loop should use
160 2.3 Avoid having to remove/readd handles
162 curl_multi_handle_control() - this can control the easy handle (while) added
163 to a multi handle in various ways:
165 o RESTART, unconditionally restart this easy handle's transfer from the
166 start, re-init the state
168 o RESTART_COMPLETED, restart this easy handle's transfer but only if the
169 existing transfer has already completed and it is in a "finished state".
171 o STOP, just stop this transfer and consider it completed
177 2.4 Fix HTTP Pipelining for PUT
179 HTTP Pipelining can be a way to greatly enhance performance for multiple
180 serial requests and currently libcurl only supports that for HEAD and GET
181 requests but it should also be possible for PUT.
194 PRET is a command that primarily "drftpd" supports, which could be useful
195 when using libcurl against such a server. It is a non-standard and a rather
196 oddly designed command, but...
197 http://curl.haxx.se/bug/feature.cgi?id=1729967
199 4.2 Alter passive/active on failure and retry
201 When trying to connect passively to a server which only supports active
202 connections, libcurl returns CURLE_FTP_WEIRD_PASV_REPLY and closes the
203 connection. There could be a way to fallback to an active connection (and
204 vice versa). http://curl.haxx.se/bug/feature.cgi?id=1754793
206 4.3 Earlier bad letter detection
208 Make the detection of (bad) %0d and %0a codes in FTP url parts earlier in the
209 process to avoid doing a resolve and connect in vain.
211 4.4 REST for large files
213 REST fix for servers not behaving well on >2GB requests. This should fail if
214 the server doesn't set the pointer to the requested index. The tricky
215 (impossible?) part is to figure out if the server did the right thing or not.
217 4.5 FTP proxy support
219 Support the most common FTP proxies, Philip Newton provided a list allegedly
220 from ncftp. This is not a subject without debate, and is probably not really
221 suitable for libcurl. http://curl.haxx.se/mail/archive-2003-04/0126.html
225 Make CURLOPT_FTPPORT support an additional port number on the IP/if/name,
226 like "blabla:[port]" or possibly even "blabla:[portfirst]-[portsecond]".
227 http://curl.haxx.se/bug/feature.cgi?id=1505166
231 FTP ASCII transfers do not follow RFC959. They don't convert the data
236 5.1 Better persistency for HTTP 1.0
238 "Better" support for persistent connections over HTTP 1.0
239 http://curl.haxx.se/bug/feature.cgi?id=1089001
241 5.2 support FF3 sqlite cookie files
243 Firefox 3 is changing from its former format to a a sqlite database instead.
244 We should consider how (lib)curl can/should support this.
245 http://curl.haxx.se/bug/feature.cgi?id=1871388
247 5.3 Sort outgoing cookies
249 All the major browsers sort the cookies sent in the Cookie: header based on
250 the length of the path for which the cookie is set with. This could lead to
251 a small fraction of servers to not play well with curl:
252 http://www.ietf.org/mail-archive/web/http-state/current/msg00150.html
254 5.4 Rearrange request header order
256 Server implementors often make an effort to detect browser and to reject
257 clients it can detect to not match. One of the last details we cannot yet
258 control in libcurl's HTTP requests, which also can be exploited to detect
259 that libcurl is in fact used even when it tries to impersonate a browser, is
260 the order of the request headers. I propose that we introduce a new option in
261 which you give headers a value, and then when the HTTP request is built it
262 sorts the headers based on that number. We could then have internally created
263 headers use a default value so only headers that need to be moved have to be
271 Reading input (to send to the remote server) on stdin is a crappy solution for
272 library purposes. We need to invent a good way for the application to be able
273 to provide the data to send.
275 6.2 ditch telnet-specific select
277 Move the telnet support's network select() loop go away and merge the code
278 into the main transfer loop. Until this is done, the multi interface won't
281 6.3 feature negotiation debug data
283 Add telnet feature negotiation data to the debug callback as header data.
285 6.4 send data in chunks
287 Currently, telnet sends data one byte at a time. This is fine for interactive
288 use, but inefficient for any other. Sent data should be sent in larger
293 7.1 Disable specific versions
295 Provide an option that allows for disabling specific SSL versions, such as
296 SSLv2 http://curl.haxx.se/bug/feature.cgi?id=1767276
298 7.2 Provide mutex locking API
300 Provide a libcurl API for setting mutex callbacks in the underlying SSL
301 library, so that the same application code can use mutex-locking
302 independently of OpenSSL or GnutTLS being used.
304 7.3 Evaluate SSL patches
306 Evaluate/apply Gertjan van Wingerde's SSL patches:
307 http://curl.haxx.se/mail/lib-2004-03/0087.html
309 7.4 Cache OpenSSL contexts
311 "Look at SSL cafile - quick traces look to me like these are done on every
312 request as well, when they should only be necessary once per ssl context (or
313 once per handle)". The major improvement we can rather easily do is to make
314 sure we don't create and kill a new SSL "context" for every request, but
315 instead make one for every connection and re-use that SSL context in the same
316 style connections are re-used. It will make us use slightly more memory but
317 it will libcurl do less creations and deletions of SSL contexts.
319 7.5 Export session ids
321 Add an interface to libcurl that enables "session IDs" to get
322 exported/imported. Cris Bailiff said: "OpenSSL has functions which can
323 serialise the current SSL state to a buffer of your choice, and recover/reset
324 the state from such a buffer at a later date - this is used by mod_ssl for
325 apache to implement and SSL session ID cache".
327 7.6 Provide callback for cert verification
329 OpenSSL supports a callback for customised verification of the peer
330 certificate, but this doesn't seem to be exposed in the libcurl APIs. Could
331 it be? There's so much that could be done if it were!
333 7.7 Support other SSL libraries
335 Make curl's SSL layer capable of using other free SSL libraries. Such as
336 MatrixSSL (http://www.matrixssl.org/).
338 7.8 Support SRP on the TLS layer
340 Peter Sylvester's patch for SRP on the TLS layer. Awaits OpenSSL support for
341 this, no need to support this in libcurl before there's an OpenSSL release
344 7.9 improve configure --with-ssl
346 make the configure --with-ssl option first check for OpenSSL, then GnuTLS,
351 8.1 Make NTLM work without OpenSSL functions
353 Get NTLM working using the functions provided by NSS. Not strictly
354 SSL/TLS related, but hey... Another option is to get available DES and
355 MD4 source code from the cryptopp library. They are fine license-wise,
360 Is this even possible?
364 Work out a common method with Peter Sylvester's OpenSSL-patch for SRP on the
365 TLS to provide name and password. GnuTLS already supports it...
369 Fix the connection phase to be non-blocking when multi interface is used
373 Add a way to check if the connection seems to be alive, to correspond to the
374 SSL_peak() way we use with OpenSSL.
378 9.1 ditch ldap-specific select
380 * Look over the implementation. The looping will have to "go away" from the
381 lib/ldap.c source file and get moved to the main network code so that the
382 multi interface and friends will work for LDAP as well.
384 9.2 stop TFTP blocking
386 Stop TFTP from being blocking and doing its own read loop in tftp_do.
392 RFC2326 (protocol - very HTTP-like, also contains URL description)
396 There's no RFC for protocol nor URI/URL format. An implementation should
397 most probably use an existing rsync library, such as librsync.
401 There exists a patch that claims to introduce this protocol:
402 http://osdir.com/ml/gnu.gnash.devel2/2006-11/msg00278.html, further details
403 in the feature-request: http://curl.haxx.se/bug/feature.cgi?id=1843469
407 11.1 Content-Disposition
409 Add option that is similar to -O but that takes the output file name from the
410 Content-Disposition: header, and/or uses the local file name used in
411 redirections for the cases the server bounces the request further to a
412 different file (name): http://curl.haxx.se/bug/feature.cgi?id=1364676
416 "curl --sync http://example.com/feed[1-100].rss" or
417 "curl --sync http://example.net/{index,calendar,history}.html"
419 Downloads a range or set of URLs using the remote name, but only if the
420 remote file is newer than the local file. A Last-Modified HTTP date header
421 should also be used to set the mod date on the downloaded file.
425 Globbing support for -d and -F, as in 'curl -d "name=foo[0-9]" URL'.
426 This is easily scripted though.
428 11.4 prevent file overwriting
430 Add an option that prevents cURL from overwriting existing local files. When
431 used, and there already is an existing file with the target file name
432 (either -O or -o), a number should be appended (and increased if already
433 existing). So that index.html becomes first index.html.1 and then
436 11.5 ftp wildcard download
438 "curl ftp://site.com/*.txt"
440 11.6 simultaneous parallel transfers
442 The client could be told to use maximum N simultaneous parallel transfers and
443 then just make sure that happens. It should of course not make more than one
444 connection to the same remote host. This would require the client to use the
445 multi interface. http://curl.haxx.se/bug/feature.cgi?id=1558595
447 11.7 provide formpost headers
449 Extending the capabilities of the multipart formposting. How about leaving
450 the ';type=foo' syntax as it is and adding an extra tag (headers) which
451 works like this: curl -F "coolfiles=@fil1.txt;headers=@fil1.hdr" where
452 fil1.hdr contains extra headers like
454 Content-Type: text/plain; charset=KOI8-R"
455 Content-Transfer-Encoding: base64
456 X-User-Comment: Please don't use browser specific HTML code
458 which should overwrite the program reasonable defaults (plain/text,
461 11.8 url-specific options
463 Provide a way to make options bound to a specific URL among several on the
464 command line. Possibly by letting ':' separate options between URLs,
467 curl --data foo --url url.com : \
469 --url url3.com --data foo3
471 (More details: http://curl.haxx.se/mail/archive-2004-07/0133.html)
473 The example would do a POST-GET-POST combination on a single command line.
475 11.9 metalink support
477 Add metalink support to curl (http://www.metalinker.org/). This is most useful
478 with simultaneous parallel transfers (11.6) but not necessary.
480 11.10 warning when setting an option
482 Display a warning when libcurl returns an error when setting an option.
483 This can be useful to tell when support for a particular feature hasn't been
484 compiled into the library.
490 Consider extending 'roffit' to produce decent ASCII output, and use that
491 instead of (g)nroff when building src/hugehelp.c
497 Make our own version of stunnel for simple port forwarding to enable HTTPS
498 and FTP-SSL tests without the stunnel dependency, and it could allow us to
499 provide test tools built with either OpenSSL or GnuTLS
501 13.2 nicer lacking perl message
503 If perl wasn't found by the configure script, don't attempt to run the tests
504 but explain something nice why it doesn't.
506 13.3 more protocols supported
508 Extend the test suite to include more protocols. The telnet could just do ftp
509 or http operations (for which we have test servers).
511 13.4 more platforms supported
513 Make the test suite work on more platforms. OpenBSD and Mac OS. Remove
514 fork()s and it should become even more portable.
518 14.1 http-style HEAD output for ftp
520 #undef CURL_FTP_HTTPSTYLE_HEAD in lib/ftp.c to remove the HTTP-style headers
521 from being output in NOBODY requests over ftp
523 14.2 combine error codes
525 Combine some of the error codes to remove duplicates. The original
526 numbering should not be changed, and the old identifiers would be
527 macroed to the new ones in an CURL_NO_OLDIES section to help with
528 backward compatibility.
530 Candidates for removal and their replacements:
532 CURLE_FILE_COULDNT_READ_FILE => CURLE_REMOTE_FILE_NOT_FOUND
533 CURLE_FTP_COULDNT_RETR_FILE => CURLE_REMOTE_FILE_NOT_FOUND
534 CURLE_FTP_COULDNT_USE_REST => CURLE_RANGE_ERROR
535 CURLE_FUNCTION_NOT_FOUND => CURLE_FAILED_INIT
536 CURLE_LDAP_INVALID_URL => CURLE_URL_MALFORMAT
537 CURLE_TFTP_NOSUCHUSER => CURLE_TFTP_ILLEGAL
538 CURLE_TFTP_NOTFOUND => CURLE_REMOTE_FILE_NOT_FOUND
539 CURLE_TFTP_PERM => CURLE_REMOTE_ACCESS_DENIED
541 14.3 extend CURLOPT_SOCKOPTFUNCTION prototype
543 The current prototype only provides 'purpose' that tells what the
544 connection/socket is for, but not any protocol or similar. It makes it hard
545 for applications to differentiate on TCP vs UDP and even HTTP vs FTP and
548 15. Next major release
550 15.1 cleanup return codes
552 curl_easy_cleanup() returns void, but curl_multi_cleanup() returns a
553 CURLMcode. These should be changed to be the same.
555 15.2 remove obsolete defines
557 remove obsolete defines from curl/curl.h
561 make several functions use size_t instead of int in their APIs
563 15.4 remove several functions
565 remove the following functions from the public API:
569 curl_mprintf (and variations)
575 They will instead become curlx_ - alternatives. That makes the curl app
576 still capable of using them, by building with them from source.
578 These functions have no purpose anymore:
582 curl_multi_socket_all
584 15.5 remove CURLOPT_FAILONERROR
586 Remove support for CURLOPT_FAILONERROR, it has gotten too kludgy and weird
587 internally. Let the app judge success or not for itself.
589 15.6 remove CURLOPT_DNS_USE_GLOBAL_CACHE
591 Remove support for a global DNS cache. Anything global is silly, and we
592 already offer the share interface for the same functionality but done