blob: af800c3b87dbd1c9feb139a8e472b06580a5d328 [file] [log] [blame]
9487f7f2011-08-03 07:05:30 -07001 _ _ ____ _
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
Dirk Vogta7d7f962016-12-01 10:50:48 +010012 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
9487f7f2011-08-03 07:05:30 -070017 All bugs documented in the KNOWN_BUGS document are subject for fixing!
18
19 1. libcurl
9487f7f2011-08-03 07:05:30 -070020 1.2 More data sharing
21 1.3 struct lifreq
22 1.4 signal-based resolver timeouts
Dirk Vogta7d7f962016-12-01 10:50:48 +010023 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.11 minimize dependencies with dynamicly loaded modules
29 1.12 have form functions use CURL handle argument
30 1.14 Typesafe curl_easy_setopt()
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 doesn't work
35 1.19 Timeout idle connections from the pool
36 1.20 SRV and URI DNS records
37 1.21 API for URL parsing/splitting
38 1.23 Offer API to flush the connection pool
39 1.24 TCP Fast Open for windows
40 1.25 Remove the generated include file
9487f7f2011-08-03 07:05:30 -070041
42 2. libcurl - multi interface
43 2.1 More non-blocking
Dirk Vogta7d7f962016-12-01 10:50:48 +010044 2.2 Better support for same name resolves
45 2.3 Non-blocking curl_multi_remove_handle()
46 2.4 Split connect and authentication process
47 2.5 Edge-triggered sockets should work
9487f7f2011-08-03 07:05:30 -070048
49 3. Documentation
Dirk Vogta7d7f962016-12-01 10:50:48 +010050 3.1 Update date and version in man pages
51 3.2 Provide cmake config-file
9487f7f2011-08-03 07:05:30 -070052
53 4. FTP
54 4.1 HOST
55 4.2 Alter passive/active on failure and retry
56 4.3 Earlier bad letter detection
57 4.4 REST for large files
Dirk Vogta7d7f962016-12-01 10:50:48 +010058 4.5 ASCII support
59 4.6 GSSAPI via Windows SSPI
60 4.7 STAT for LIST without data connection
9487f7f2011-08-03 07:05:30 -070061
62 5. HTTP
63 5.1 Better persistency for HTTP 1.0
64 5.2 support FF3 sqlite cookie files
65 5.3 Rearrange request header order
Dirk Vogta7d7f962016-12-01 10:50:48 +010066 5.4 Use huge HTTP/2 windows
67 5.5 auth= in URLs
68 5.6 Refuse "downgrade" redirects
69 5.7 Brotli compression
70 5.8 QUIC
71 5.9 Add easy argument to formpost functions
72 5.10 Leave secure cookies alone
9487f7f2011-08-03 07:05:30 -070073
74 6. TELNET
75 6.1 ditch stdin
76 6.2 ditch telnet-specific select
77 6.3 feature negotiation debug data
78 6.4 send data in chunks
79
Dirk Vogta7d7f962016-12-01 10:50:48 +010080 7. SMTP
81 7.1 Pipelining
82 7.2 Enhanced capability support
83 7.3 Add CURLOPT_MAIL_CLIENT option
9487f7f2011-08-03 07:05:30 -070084
Dirk Vogta7d7f962016-12-01 10:50:48 +010085 8. POP3
86 8.1 Pipelining
87 8.2 Enhanced capability support
9487f7f2011-08-03 07:05:30 -070088
Dirk Vogta7d7f962016-12-01 10:50:48 +010089 9. IMAP
90 9.1 Enhanced capability support
9487f7f2011-08-03 07:05:30 -070091
Dirk Vogta7d7f962016-12-01 10:50:48 +010092 10. LDAP
93 10.1 SASL based authentication mechanisms
9487f7f2011-08-03 07:05:30 -070094
Dirk Vogta7d7f962016-12-01 10:50:48 +010095 11. SMB
96 11.1 File listing support
97 11.2 Honor file timestamps
98 11.3 Use NTLMv2
99 11.4 Create remote directories
9487f7f2011-08-03 07:05:30 -0700100
Dirk Vogta7d7f962016-12-01 10:50:48 +0100101 12. New protocols
102 12.1 RSYNC
9487f7f2011-08-03 07:05:30 -0700103
Dirk Vogta7d7f962016-12-01 10:50:48 +0100104 13. SSL
105 13.1 Disable specific versions
106 13.2 Provide mutex locking API
107 13.3 Evaluate SSL patches
108 13.4 Cache OpenSSL contexts
109 13.5 Export session ids
110 13.6 Provide callback for cert verification
111 13.7 improve configure --with-ssl
112 13.8 Support DANE
113 13.9 Support TLS v1.3
114 13.10 Support SSLKEYLOGFILE
115 13.11 Support intermediate & root pinning for PINNEDPUBLICKEY
116 13.12 Support HSTS
117 13.13 Support HPKP
9487f7f2011-08-03 07:05:30 -0700118
Dirk Vogta7d7f962016-12-01 10:50:48 +0100119 14. GnuTLS
120 14.1 SSL engine stuff
121 14.2 check connection
9487f7f2011-08-03 07:05:30 -0700122
Dirk Vogta7d7f962016-12-01 10:50:48 +0100123 15. WinSSL/SChannel
124 15.1 Add support for client certificate authentication
125 15.2 Add support for custom server certificate validation
126 15.3 Add support for the --ciphers option
127
128 16. SASL
129 16.1 Other authentication mechanisms
130 16.2 Add QOP support to GSSAPI authentication
131 16.3 Support binary messages (i.e.: non-base64)
132
133 17. SSH protocols
134 17.1 Multiplexing
135 17.2 SFTP performance
136 17.3 Support better than MD5 hostkey hash
137
138 18. Command line tool
139 18.1 sync
140 18.2 glob posts
141 18.3 prevent file overwriting
142 18.4 simultaneous parallel transfers
143 18.5 provide formpost headers
144 18.6 warning when setting an option
145 18.7 warning when sending binary output to terminal
146 18.8 offer color-coded HTTP header output
147 18.9 Choose the name of file in braces for complex URLs
148 18.10 improve how curl works in a windows console window
149 18.11 -w output to stderr
150 18.12 keep running, read instructions from pipe/socket
151 18.13 support metalink in http headers
152 18.14 --fail without --location should treat 3xx as a failure
153 18.15 Introduce --fail-fast to exit on first transfer fail
154 18.16 --retry should resume
155
156 19. Build
157 19.1 roffit
158 19.2 Enable PIE and RELRO by default
159
160 20. Test suite
161 20.1 SSL tunnel
162 20.2 nicer lacking perl message
163 20.3 more protocols supported
164 20.4 more platforms supported
165 20.5 Add support for concurrent connections
166 20.6 Use the RFC6265 test suite
167
168 21. Next SONAME bump
169 21.1 http-style HEAD output for FTP
170 21.2 combine error codes
171 21.3 extend CURLOPT_SOCKOPTFUNCTION prototype
172
173 22. Next major release
174 22.1 cleanup return codes
175 22.2 remove obsolete defines
176 22.3 size_t
177 22.4 remove several functions
178 22.5 remove CURLOPT_FAILONERROR
179 22.6 remove CURLOPT_DNS_USE_GLOBAL_CACHE
180 22.7 remove progress meter from libcurl
181 22.8 remove 'curl_httppost' from public
9487f7f2011-08-03 07:05:30 -0700182
183==============================================================================
184
1851. libcurl
186
9487f7f2011-08-03 07:05:30 -07001871.2 More data sharing
188
189 curl_share_* functions already exist and work, and they can be extended to
190 share more. For example, enable sharing of the ares channel and the
191 connection cache.
192
1931.3 struct lifreq
194
195 Use 'struct lifreq' and SIOCGLIFADDR instead of 'struct ifreq' and
196 SIOCGIFADDR on newer Solaris versions as they claim the latter is obsolete.
Dirk Vogta7d7f962016-12-01 10:50:48 +0100197 To support IPv6 interface addresses for network interfaces properly.
9487f7f2011-08-03 07:05:30 -0700198
1991.4 signal-based resolver timeouts
200
201 libcurl built without an asynchronous resolver library uses alarm() to time
202 out DNS lookups. When a timeout occurs, this causes libcurl to jump from the
203 signal handler back into the library with a sigsetjmp, which effectively
204 causes libcurl to continue running within the signal handler. This is
205 non-portable and could cause problems on some platforms. A discussion on the
Dirk Vogta7d7f962016-12-01 10:50:48 +0100206 problem is available at https://curl.haxx.se/mail/lib-2008-09/0197.html
9487f7f2011-08-03 07:05:30 -0700207
208 Also, alarm() provides timeout resolution only to the nearest second. alarm
209 ought to be replaced by setitimer on systems that support it.
210
Dirk Vogta7d7f962016-12-01 10:50:48 +01002111.5 get rid of PATH_MAX
212
213 Having code use and rely on PATH_MAX is not nice:
214 http://insanecoding.blogspot.com/2007/11/pathmax-simply-isnt.html
215
216 Currently the SSH based code uses it a bit, but to remove PATH_MAX from there
217 we need libssh2 to properly tell us when we pass in a too small buffer and
218 its current API (as of libssh2 1.2.7) doesn't.
219
2201.6 Modified buffer size approach
221
222 Current libcurl allocates a fixed 16K size buffer for download and an
223 additional 16K for upload. They are always unconditionally part of the easy
224 handle. If CRLF translations are requested, an additional 32K "scratch
225 buffer" is allocated. A total of 64K transfer buffers in the worst case.
226
227 First, while the handles are not actually in use these buffers could be freed
228 so that lingering handles just kept in queues or whatever waste less memory.
229
230 Secondly, SFTP is a protocol that needs to handle many ~30K blocks at once
231 since each need to be individually acked and therefore libssh2 must be
232 allowed to send (or receive) many separate ones in parallel to achieve high
233 transfer speeds. A current libcurl build with a 16K buffer makes that
234 impossible, but one with a 512K buffer will reach MUCH faster transfers. But
235 allocating 512K unconditionally for all buffers just in case they would like
236 to do fast SFTP transfers at some point is not a good solution either.
237
238 Dynamically allocate buffer size depending on protocol in use in combination
239 with freeing it after each individual transfer? Other suggestions?
240
2411.7 Detect when called from within callbacks
242
243 We should set a state variable before calling callbacks, so that we
244 subsequently can add code within libcurl that returns error if called within
245 callbacks for when that's not supported.
246
2471.8 Allow SSL (HTTPS) to proxy
248
249 To prevent local users from snooping on your traffic to the proxy. Supported
250 by Firefox and Chrome already:
251 https://www.chromium.org/developers/design-documents/secure-web-proxy
252
253 See this stale work in progress branch:
254 https://github.com/curl/curl/tree/HTTPS-proxy based on this PR:
255 https://github.com/curl/curl/pull/305
256
2571.9 Cache negative name resolves
258
259 A name resolve that has failed is likely to fail when made again within a
260 short period of time. Currently we only cache positive responses.
261
2621.11 minimize dependencies with dynamicly loaded modules
263
264 We can create a system with loadable modules/plug-ins, where these modules
265 would be the ones that link to 3rd party libs. That would allow us to avoid
266 having to load ALL dependencies since only the necessary ones for this
267 app/invoke/used protocols would be necessary to load. See
268 https://github.com/curl/curl/issues/349
269
2701.12 have form functions use CURL handle argument
271
272 curl_formadd() and curl_formget() both currently have no CURL handle
273 argument, but both can use a callback that is set in the easy handle, and
274 thus curl_formget() with callback cannot function without first having
275 curl_easy_perform() (or similar) called - which is hard to grasp and a design
276 mistake.
277
278 The curl_formadd() design can probably also be reconsidered to make it easier
279 to use and less error-prone. Probably easiest by splitting it into several
280 function calls.
281
2821.14 Typesafe curl_easy_setopt()
283
284 One of the most common problems in libcurl using applications is the lack of
285 type checks for curl_easy_setopt() which happens because it accepts varargs
286 and thus can take any type.
287
288 One possible solution to this is to introduce a few different versions of the
289 setopt version for the different kinds of data you can set.
290
291 curl_easy_set_num() - sets a long value
292
293 curl_easy_set_large() - sets a curl_off_t value
294
295 curl_easy_set_ptr() - sets a pointer
296
297 curl_easy_set_cb() - sets a callback PLUS its callback data
298
2991.15 Monitor connections in the connection pool
300
301 libcurl's connection cache or pool holds a number of open connections for the
302 purpose of possible subsequent connection reuse. It may contain a few up to a
303 significant amount of connections. Currently, libcurl leaves all connections
304 as they are and first when a connection is iterated over for matching or
305 reuse purpose it is verified that it is still alive.
306
307 Those connections may get closed by the server side for idleness or they may
308 get a HTTP/2 ping from the peer to verify that they're still alive. By adding
309 monitoring of the connections while in the pool, libcurl can detect dead
310 connections (and close them) better and earlier, and it can handle HTTP/2
311 pings to keep such ones alive even when not actively doing transfers on them.
312
3131.16 Try to URL encode given URL
314
315 Given a URL that for example contains spaces, libcurl could have an option
316 that would try somewhat harder than it does now and convert spaces to %20 and
317 perhaps URL encoded byte values over 128 etc (basically do what the redirect
318 following code already does).
319
320 https://github.com/curl/curl/issues/514
321
3221.17 Add support for IRIs
323
324 IRIs (RFC 3987) allow localized, non-ascii, names in the URL. To properly
325 support this, curl/libcurl would need to translate/encode the given input
326 from the input string encoding into percent encoded output "over the wire".
327
328 To make that work smoothly for curl users even on Windows, curl would
329 probably need to be able to convert from several input encodings.
330
3311.18 try next proxy if one doesn't work
332
333 Allow an application to specify a list of proxies to try, and failing to
334 connect to the first go on and try the next instead until the list is
335 exhausted. Browsers support this feature at least when they specify proxies
336 using PACs.
337
338 https://github.com/curl/curl/issues/896
339
3401.19 Timeout idle connections from the pool
341
342 libcurl currently keeps connections in its connection pool for an indefinite
343 period of time, until it either gets reused, gets noticed that it has been
344 closed by the server or gets pruned to make room for a new connection.
345
346 To reduce overhead (especially for when we add monitoring of the connections
347 in the pool), we should introduce a timeout so that connections that have
348 been idle for N seconds get closed.
349
3501.20 SRV and URI DNS records
351
352 Offer support for resolving SRV and URI DNS records for libcurl to know which
353 server to connect to for various protocols (including HTTP!).
354
3551.21 API for URL parsing/splitting
356
357 libcurl has always parsed URLs internally and never exposed any API or
358 features to allow applications to do it. Still most or many applications
359 using libcurl need that ability. In polls to users, we've learned that many
360 libcurl users would like to see and use such an API.
361
3621.23 Offer API to flush the connection pool
363
364 Sometimes applications want to flush all the existing connections kept alive.
365 An API could allow a forced flush or just a forced loop that would properly
366 close all connections that have been closed by the server already.
367
3681.24 TCP Fast Open for windows
369
370 libcurl supports the CURLOPT_TCP_FASTOPEN option since 7.49.0 for Linux and
371 Mac OS. Windows supports TCP Fast Open starting with Windows 10, version 1607
372 and we should add support for it.
373
3741.25 Remove the generated include file
375
376 When curl and libcurl are built, one of the public include files are
377 generated and is populated with a set of defines that are derevid from sizes
378 and constants for the particular target architecture that build is made. For
379 platforms that can select between 32 bit and 64 bit at build time, this
380 approach makes the libcurl build only create a set of public headers suitable
381 for one of the architectures and not both. If you build libcurl for such a
382 platform and you want to allow applications to get built using either 32/64
383 version, you must generate the libcurl headers once for each setup and you
384 must then add a replacement curl header that would itself select the correct
385 32 or 64 bit specific header as necessary.
386
387 Your curl/curl.h alternative could then look like (replace with suitable CPP
388 variable to check):
389
390 #ifdef ARCH_32bit
391 #include <curl32/curl.h>
392 #else /* ARCH_64bit */
393 #include <curl64/curl.h>
394 #endif
395
396 A fix would either (A) fix the 32/64 setup automatically or even better (B)
397 work away the architecture specific defines from the headers so that they can
398 be used for all architectures independently of what libcurl was built for.
399
400
9487f7f2011-08-03 07:05:30 -07004012. libcurl - multi interface
402
4032.1 More non-blocking
404
405 Make sure we don't ever loop because of non-blocking sockets returning
406 EWOULDBLOCK or similar. Blocking cases include:
407
408 - Name resolves on non-windows unless c-ares is used
409 - NSS SSL connections
9487f7f2011-08-03 07:05:30 -0700410 - HTTP proxy CONNECT operations
411 - SOCKS proxy handshakes
412 - file:// transfers
413 - TELNET transfers
414 - The "DONE" operation (post transfer protocol-specific actions) for the
415 protocols SFTP, SMTP, FTP. Fixing Curl_done() for this is a worthy task.
416
Dirk Vogta7d7f962016-12-01 10:50:48 +01004172.2 Better support for same name resolves
9487f7f2011-08-03 07:05:30 -0700418
Dirk Vogta7d7f962016-12-01 10:50:48 +0100419 If a name resolve has been initiated for name NN and a second easy handle
420 wants to resolve that name as well, make it wait for the first resolve to end
421 up in the cache instead of doing a second separate resolve. This is
422 especially needed when adding many simultaneous handles using the same host
423 name when the DNS resolver can get flooded.
9487f7f2011-08-03 07:05:30 -0700424
Dirk Vogta7d7f962016-12-01 10:50:48 +01004252.3 Non-blocking curl_multi_remove_handle()
9487f7f2011-08-03 07:05:30 -0700426
Dirk Vogta7d7f962016-12-01 10:50:48 +0100427 The multi interface has a few API calls that assume a blocking behavior, like
428 add_handle() and remove_handle() which limits what we can do internally. The
429 multi API need to be moved even more into a single function that "drives"
430 everything in a non-blocking manner and signals when something is done. A
431 remove or add would then only ask for the action to get started and then
432 multi_perform() etc still be called until the add/remove is completed.
9487f7f2011-08-03 07:05:30 -0700433
Dirk Vogta7d7f962016-12-01 10:50:48 +01004342.4 Split connect and authentication process
9487f7f2011-08-03 07:05:30 -0700435
Dirk Vogta7d7f962016-12-01 10:50:48 +0100436 The multi interface treats the authentication process as part of the connect
437 phase. As such any failures during authentication won't trigger the relevant
438 QUIT or LOGOFF for protocols such as IMAP, POP3 and SMTP.
9487f7f2011-08-03 07:05:30 -0700439
Dirk Vogta7d7f962016-12-01 10:50:48 +01004402.5 Edge-triggered sockets should work
9487f7f2011-08-03 07:05:30 -0700441
Dirk Vogta7d7f962016-12-01 10:50:48 +0100442 The multi_socket API should work with edge-triggered socket events. One of
443 the internal actions that need to be improved for this to work perfectly is
444 the 'maxloops' handling in transfer.c:readwrite_data().
9487f7f2011-08-03 07:05:30 -0700445
4463. Documentation
447
Dirk Vogta7d7f962016-12-01 10:50:48 +01004483.1 Update date and version in man pages
9487f7f2011-08-03 07:05:30 -0700449
Dirk Vogta7d7f962016-12-01 10:50:48 +0100450 'maketgz' or another suitable script could update the .TH sections of the man
451 pages at release time to use the current date and curl/libcurl version
452 number.
453
4543.2 Provide cmake config-file
455
456 A config-file package is a set of files provided by us to allow applications
457 to write cmake scripts to find and use libcurl easier. See
458 https://github.com/curl/curl/issues/885
9487f7f2011-08-03 07:05:30 -0700459
4604. FTP
461
4624.1 HOST
463
Dirk Vogta7d7f962016-12-01 10:50:48 +0100464 HOST is a command for a client to tell which host name to use, to offer FTP
465 servers named-based virtual hosting:
9487f7f2011-08-03 07:05:30 -0700466
Dirk Vogta7d7f962016-12-01 10:50:48 +0100467 https://tools.ietf.org/html/rfc7151
9487f7f2011-08-03 07:05:30 -0700468
4694.2 Alter passive/active on failure and retry
470
471 When trying to connect passively to a server which only supports active
472 connections, libcurl returns CURLE_FTP_WEIRD_PASV_REPLY and closes the
473 connection. There could be a way to fallback to an active connection (and
Dirk Vogta7d7f962016-12-01 10:50:48 +0100474 vice versa). https://curl.haxx.se/bug/feature.cgi?id=1754793
9487f7f2011-08-03 07:05:30 -0700475
4764.3 Earlier bad letter detection
477
Dirk Vogta7d7f962016-12-01 10:50:48 +0100478 Make the detection of (bad) %0d and %0a codes in FTP URL parts earlier in the
9487f7f2011-08-03 07:05:30 -0700479 process to avoid doing a resolve and connect in vain.
480
4814.4 REST for large files
482
483 REST fix for servers not behaving well on >2GB requests. This should fail if
484 the server doesn't set the pointer to the requested index. The tricky
485 (impossible?) part is to figure out if the server did the right thing or not.
486
Dirk Vogta7d7f962016-12-01 10:50:48 +01004874.5 ASCII support
9487f7f2011-08-03 07:05:30 -0700488
489 FTP ASCII transfers do not follow RFC959. They don't convert the data
490 accordingly.
491
Dirk Vogta7d7f962016-12-01 10:50:48 +01004924.6 GSSAPI via Windows SSPI
493
494In addition to currently supporting the SASL GSSAPI mechanism (Kerberos V5)
495via third-party GSS-API libraries, such as Heimdal or MIT Kerberos, also add
496support for GSSAPI authentication via Windows SSPI.
497
4984.7 STAT for LIST without data connection
499
500Some FTP servers allow STAT for listing directories instead of using LIST, and
501the response is then sent over the control connection instead of as the
502otherwise usedw data connection: http://www.nsftools.com/tips/RawFTP.htm#STAT
503
504This is not detailed in any FTP specification.
505
9487f7f2011-08-03 07:05:30 -07005065. HTTP
507
5085.1 Better persistency for HTTP 1.0
509
510 "Better" support for persistent connections over HTTP 1.0
Dirk Vogta7d7f962016-12-01 10:50:48 +0100511 https://curl.haxx.se/bug/feature.cgi?id=1089001
9487f7f2011-08-03 07:05:30 -0700512
5135.2 support FF3 sqlite cookie files
514
515 Firefox 3 is changing from its former format to a a sqlite database instead.
516 We should consider how (lib)curl can/should support this.
Dirk Vogta7d7f962016-12-01 10:50:48 +0100517 https://curl.haxx.se/bug/feature.cgi?id=1871388
9487f7f2011-08-03 07:05:30 -0700518
5195.3 Rearrange request header order
520
521 Server implementors often make an effort to detect browser and to reject
522 clients it can detect to not match. One of the last details we cannot yet
523 control in libcurl's HTTP requests, which also can be exploited to detect
524 that libcurl is in fact used even when it tries to impersonate a browser, is
525 the order of the request headers. I propose that we introduce a new option in
526 which you give headers a value, and then when the HTTP request is built it
527 sorts the headers based on that number. We could then have internally created
528 headers use a default value so only headers that need to be moved have to be
529 specified.
530
Dirk Vogta7d7f962016-12-01 10:50:48 +01005315.4 Use huge HTTP/2 windows
532
533 We're currently using nghttp2's default window size which is terribly small
534 (64K). This becomes a bottle neck over high bandwidth networks. We should
535 instead make the window size to be very big (512MB?) as we really don't do
536 much flow control anyway.
537
5385.5 auth= in URLs
539
540 Add the ability to specify the preferred authentication mechanism to use by
541 using ;auth=<mech> in the login part of the URL.
542
543 For example:
544
545 http://test:pass;auth=NTLM@example.com would be equivalent to specifying --user
546 test:pass;auth=NTLM or --user test:pass --ntlm from the command line.
547
548 Additionally this should be implemented for proxy base URLs as well.
549
5505.6 Refuse "downgrade" redirects
551
552 See https://github.com/curl/curl/issues/226
553
554 Consider a way to tell curl to refuse to "downgrade" protocol with a redirect
555 and/or possibly a bit that refuses redirect to change protocol completely.
556
5575.7 Brotli compression
558
559 Compression algorithms that perform better than gzip are being considered for
560 use and inclusion in existing browsers. For example 'brotli'. If servers
561 follow along it is a good reason for us to also allow users to take advantage
562 of this. The algorithm: https://github.com/google/brotli The Firefox bug:
563 https://bugzilla.mozilla.org/show_bug.cgi?id=366559
564
5655.8 QUIC
566
567 The standardization process of QUIC has been taken to the IETF and can be
568 followed on the [IETF QUIC Mailing
569 list](https://www.ietf.org/mailman/listinfo/quic). I'd like us to get on the
570 bandwagon. Ideally, this would be done with a separate library/project to
571 handle the binary/framing layer in a similar fashion to how HTTP/2 is
572 implemented. This, to allow other projects to benefit from the work and to
573 thus broaden the interest and chance of others to participate.
574
5755.9 Add easy argument to formpost functions
576
577 Make sure there's an easy handle passed in to `curl_formadd()`,
578 `curl_formget()` and `curl_formfree()` by adding replacement functions and
579 deprecating the old ones. Allows better error messages and is generally good
580 API hygiene.
581
5825.10 Leave secure cookies alone
583
584 Non-secure origins (HTTP sites) should not be allowed to set or modify
585 cookies with the 'secure' property:
586
587 https://tools.ietf.org/html/draft-ietf-httpbis-cookie-alone-01
588
9487f7f2011-08-03 07:05:30 -0700589
5906. TELNET
591
5926.1 ditch stdin
593
594Reading input (to send to the remote server) on stdin is a crappy solution for
595library purposes. We need to invent a good way for the application to be able
596to provide the data to send.
597
5986.2 ditch telnet-specific select
599
600 Move the telnet support's network select() loop go away and merge the code
601 into the main transfer loop. Until this is done, the multi interface won't
602 work for telnet.
603
6046.3 feature negotiation debug data
605
606 Add telnet feature negotiation data to the debug callback as header data.
607
6086.4 send data in chunks
609
610 Currently, telnet sends data one byte at a time. This is fine for interactive
611 use, but inefficient for any other. Sent data should be sent in larger
612 chunks.
613
Dirk Vogta7d7f962016-12-01 10:50:48 +01006147. SMTP
9487f7f2011-08-03 07:05:30 -0700615
Dirk Vogta7d7f962016-12-01 10:50:48 +01006167.1 Pipelining
617
618 Add support for pipelining emails.
619
6207.2 Enhanced capability support
621
622 Add the ability, for an application that uses libcurl, to obtain the list of
623 capabilities returned from the EHLO command.
624
6257.3 Add CURLOPT_MAIL_CLIENT option
626
627 Rather than use the URL to specify the mail client string to present in the
628 HELO and EHLO commands, libcurl should support a new CURLOPT specifically for
629 specifying this data as the URL is non-standard and to be honest a bit of a
630 hack ;-)
631
632 Please see the following thread for more information:
633 https://curl.haxx.se/mail/lib-2012-05/0178.html
634
635
6368. POP3
637
6388.1 Pipelining
639
640 Add support for pipelining commands.
641
6428.2 Enhanced capability support
643
644 Add the ability, for an application that uses libcurl, to obtain the list of
645 capabilities returned from the CAPA command.
646
6479. IMAP
648
6499.1 Enhanced capability support
650
651 Add the ability, for an application that uses libcurl, to obtain the list of
652 capabilities returned from the CAPABILITY command.
653
65410. LDAP
655
65610.1 SASL based authentication mechanisms
657
658 Currently the LDAP module only supports ldap_simple_bind_s() in order to bind
659 to an LDAP server. However, this function sends username and password details
660 using the simple authentication mechanism (as clear text). However, it should
661 be possible to use ldap_bind_s() instead specifying the security context
662 information ourselves.
663
66411. SMB
665
66611.1 File listing support
667
668Add support for listing the contents of a SMB share. The output should probably
669be the same as/similar to FTP.
670
67111.2 Honor file timestamps
672
673The timestamp of the transferred file should reflect that of the original file.
674
67511.3 Use NTLMv2
676
677Currently the SMB authentication uses NTLMv1.
678
67911.4 Create remote directories
680
681Support for creating remote directories when uploading a file to a directory
682that doesn't exist on the server, just like --ftp-create-dirs.
683
68412. New protocols
685
68612.1 RSYNC
687
688 There's no RFC for the protocol or an URI/URL format. An implementation
689 should most probably use an existing rsync library, such as librsync.
690
69113. SSL
692
69313.1 Disable specific versions
9487f7f2011-08-03 07:05:30 -0700694
695 Provide an option that allows for disabling specific SSL versions, such as
Dirk Vogta7d7f962016-12-01 10:50:48 +0100696 SSLv2 https://curl.haxx.se/bug/feature.cgi?id=1767276
9487f7f2011-08-03 07:05:30 -0700697
Dirk Vogta7d7f962016-12-01 10:50:48 +010069813.2 Provide mutex locking API
9487f7f2011-08-03 07:05:30 -0700699
700 Provide a libcurl API for setting mutex callbacks in the underlying SSL
701 library, so that the same application code can use mutex-locking
702 independently of OpenSSL or GnutTLS being used.
703
Dirk Vogta7d7f962016-12-01 10:50:48 +010070413.3 Evaluate SSL patches
9487f7f2011-08-03 07:05:30 -0700705
706 Evaluate/apply Gertjan van Wingerde's SSL patches:
Dirk Vogta7d7f962016-12-01 10:50:48 +0100707 https://curl.haxx.se/mail/lib-2004-03/0087.html
9487f7f2011-08-03 07:05:30 -0700708
Dirk Vogta7d7f962016-12-01 10:50:48 +010070913.4 Cache OpenSSL contexts
9487f7f2011-08-03 07:05:30 -0700710
711 "Look at SSL cafile - quick traces look to me like these are done on every
Dirk Vogta7d7f962016-12-01 10:50:48 +0100712 request as well, when they should only be necessary once per SSL context (or
9487f7f2011-08-03 07:05:30 -0700713 once per handle)". The major improvement we can rather easily do is to make
714 sure we don't create and kill a new SSL "context" for every request, but
715 instead make one for every connection and re-use that SSL context in the same
716 style connections are re-used. It will make us use slightly more memory but
717 it will libcurl do less creations and deletions of SSL contexts.
718
Dirk Vogta7d7f962016-12-01 10:50:48 +010071913.5 Export session ids
9487f7f2011-08-03 07:05:30 -0700720
721 Add an interface to libcurl that enables "session IDs" to get
722 exported/imported. Cris Bailiff said: "OpenSSL has functions which can
723 serialise the current SSL state to a buffer of your choice, and recover/reset
724 the state from such a buffer at a later date - this is used by mod_ssl for
725 apache to implement and SSL session ID cache".
726
Dirk Vogta7d7f962016-12-01 10:50:48 +010072713.6 Provide callback for cert verification
9487f7f2011-08-03 07:05:30 -0700728
729 OpenSSL supports a callback for customised verification of the peer
730 certificate, but this doesn't seem to be exposed in the libcurl APIs. Could
731 it be? There's so much that could be done if it were!
732
Dirk Vogta7d7f962016-12-01 10:50:48 +010073313.7 improve configure --with-ssl
9487f7f2011-08-03 07:05:30 -0700734
735 make the configure --with-ssl option first check for OpenSSL, then GnuTLS,
736 then NSS...
737
Dirk Vogta7d7f962016-12-01 10:50:48 +010073813.8 Support DANE
9487f7f2011-08-03 07:05:30 -0700739
Dirk Vogta7d7f962016-12-01 10:50:48 +0100740 DNS-Based Authentication of Named Entities (DANE) is a way to provide SSL
741 keys and certs over DNS using DNSSEC as an alternative to the CA model.
742 https://www.rfc-editor.org/rfc/rfc6698.txt
743
744 An initial patch was posted by Suresh Krishnaswamy on March 7th 2013
745 (https://curl.haxx.se/mail/lib-2013-03/0075.html) but it was a too simple
746 approach. See Daniel's comments:
747 https://curl.haxx.se/mail/lib-2013-03/0103.html . libunbound may be the
748 correct library to base this development on.
749
750 Björn Stenberg wrote a separate initial take on DANE that was never
751 completed.
752
75313.9 Support TLS v1.3
754
755 TLS version 1.3 is about to ship and is getting implemented by TLS libraries
756 as we speak. We should start to support the symbol and make sure all backends
757 handle it accordingly, then gradually add support as the TLS libraries add
758 the corresponding support. There may be a need to add some additional options
759 to allow libcurl to take advantage of the new features in 1.3.
760
76113.10 Support SSLKEYLOGFILE
762
763 When used, Firefox and Chrome dumps their master TLS keys to the file name
764 this environment variable specifies. This allows tools like for example
765 Wireshark to capture and decipher TLS traffic to/from those clients. libcurl
766 could be made to support this more widely (presumably this already works when
767 built with NSS). Peter Wu made a OpenSSL preload to make possible that can be
768 used as inspiration and guidance
769 https://git.lekensteyn.nl/peter/wireshark-notes/tree/src/sslkeylog.c
770
77113.11 Support intermediate & root pinning for PINNEDPUBLICKEY
772
773 CURLOPT_PINNEDPUBLICKEY does not consider the hashes of intermediate & root
774 certificates when comparing the pinned keys. Therefore it is not compatible
775 with "HTTP Public Key Pinning" as there also intermediate and root certificates
776 can be pinned. This is very useful as it prevents webadmins from "locking
777 themself out of their servers".
778
779 Adding this feature would make curls pinning 100% compatible to HPKP and allow
780 more flexible pinning.
781
78213.12 Support HSTS
783
784 "HTTP Strict Transport Security" is TOFU (trust on first use), time-based
785 features indicated by a HTTP header send by the webserver. It is widely used
786 in browsers and it's purpose is to prevent insecure HTTP connections after
787 a previous HTTPS connection. It protects against SSLStripping attacks.
788
789 Doc: https://developer.mozilla.org/en-US/docs/Web/Security/HTTP_strict_transport_security
790 RFC 6797: https://tools.ietf.org/html/rfc6797
791
79213.13 Support HPKP
793
794 "HTTP Public Key Pinning" is TOFU (trust on first use), time-based
795 features indicated by a HTTP header send by the webserver. It's purpose is
796 to prevent Man-in-the-middle attacks by trusted CAs by allowing webadmins
797 to specify which CAs/certificates/public keys to trust when connection to
798 their websites.
799
800 It can be build based on PINNEDPUBLICKEY.
801
802 Wikipedia: https://en.wikipedia.org/wiki/HTTP_Public_Key_Pinning
803 OWASP: https://www.owasp.org/index.php/Certificate_and_Public_Key_Pinning
804 Doc: https://developer.mozilla.org/de/docs/Web/Security/Public_Key_Pinning
805 RFC: https://tools.ietf.org/html/draft-ietf-websec-key-pinning-21
806
80714. GnuTLS
808
80914.1 SSL engine stuff
9487f7f2011-08-03 07:05:30 -0700810
811 Is this even possible?
812
Dirk Vogta7d7f962016-12-01 10:50:48 +010081314.2 check connection
9487f7f2011-08-03 07:05:30 -0700814
815 Add a way to check if the connection seems to be alive, to correspond to the
816 SSL_peak() way we use with OpenSSL.
817
Dirk Vogta7d7f962016-12-01 10:50:48 +010081815. WinSSL/SChannel
9487f7f2011-08-03 07:05:30 -0700819
Dirk Vogta7d7f962016-12-01 10:50:48 +010082015.1 Add support for client certificate authentication
9487f7f2011-08-03 07:05:30 -0700821
Dirk Vogta7d7f962016-12-01 10:50:48 +0100822 WinSSL/SChannel currently makes use of the OS-level system and user
823 certificate and private key stores. This does not allow the application
824 or the user to supply a custom client certificate using curl or libcurl.
9487f7f2011-08-03 07:05:30 -0700825
Dirk Vogta7d7f962016-12-01 10:50:48 +0100826 Therefore support for the existing -E/--cert and --key options should be
827 implemented by supplying a custom certificate to the SChannel APIs, see:
828 - Getting a Certificate for Schannel
829 https://msdn.microsoft.com/en-us/library/windows/desktop/aa375447.aspx
9487f7f2011-08-03 07:05:30 -0700830
Dirk Vogta7d7f962016-12-01 10:50:48 +010083115.2 Add support for custom server certificate validation
9487f7f2011-08-03 07:05:30 -0700832
Dirk Vogta7d7f962016-12-01 10:50:48 +0100833 WinSSL/SChannel currently makes use of the OS-level system and user
834 certificate trust store. This does not allow the application or user to
835 customize the server certificate validation process using curl or libcurl.
9487f7f2011-08-03 07:05:30 -0700836
Dirk Vogta7d7f962016-12-01 10:50:48 +0100837 Therefore support for the existing --cacert or --capath options should be
838 implemented by supplying a custom certificate to the SChannel APIs, see:
839 - Getting a Certificate for Schannel
840 https://msdn.microsoft.com/en-us/library/windows/desktop/aa375447.aspx
9487f7f2011-08-03 07:05:30 -0700841
Dirk Vogta7d7f962016-12-01 10:50:48 +010084215.3 Add support for the --ciphers option
9487f7f2011-08-03 07:05:30 -0700843
Dirk Vogta7d7f962016-12-01 10:50:48 +0100844 The cipher suites used by WinSSL/SChannel are configured on an OS-level
845 instead of an application-level. This does not allow the application or
846 the user to customize the configured cipher suites using curl or libcurl.
9487f7f2011-08-03 07:05:30 -0700847
Dirk Vogta7d7f962016-12-01 10:50:48 +0100848 Therefore support for the existing --ciphers option should be implemented
849 by mapping the OpenSSL/GnuTLS cipher suites to the SChannel APIs, see
850 - Specifying Schannel Ciphers and Cipher Strengths
851 https://msdn.microsoft.com/en-us/library/windows/desktop/aa380161.aspx
852
85316. SASL
854
85516.1 Other authentication mechanisms
856
857 Add support for other authentication mechanisms such as OLP,
858 GSS-SPNEGO and others.
859
86016.2 Add QOP support to GSSAPI authentication
861
862 Currently the GSSAPI authentication only supports the default QOP of auth
863 (Authentication), whilst Kerberos V5 supports both auth-int (Authentication
864 with integrity protection) and auth-conf (Authentication with integrity and
865 privacy protection).
866
86716.3 Support binary messages (i.e.: non-base64)
868
869 Mandatory to support LDAP SASL authentication.
870
871
87217. SSH protocols
873
87417.1 Multiplexing
875
876 SSH is a perfectly fine multiplexed protocols which would allow libcurl to do
877 multiple parallel transfers from the same host using the same connection,
878 much in the same spirit as HTTP/2 does. libcurl however does not take
879 advantage of that ability but will instead always create a new connection for
880 new transfers even if an existing connection already exists to the host.
881
882 To fix this, libcurl would have to detect an existing connection and "attach"
883 the new transfer to the existing one.
884
88517.2 SFTP performance
886
887 libcurl's SFTP transfer performance is sub par and can be improved, mostly by
888 the approach mentioned in "1.6 Modified buffer size approach".
889
89017.3 Support better than MD5 hostkey hash
891
892 libcurl offers the CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 option for verifying the
893 server's key. MD5 is generally being deprecated so we should implement
894 support for stronger hashing algorithms. libssh2 itself is what provides this
895 underlying functionality and it supports at least SHA-1 as an alternative.
896 SHA-1 is also being deprecated these days so we should consider workign with
897 libssh2 to instead offer support for SHA-256 or similar.
898
899
90018. Command line tool
901
90218.1 sync
9487f7f2011-08-03 07:05:30 -0700903
904 "curl --sync http://example.com/feed[1-100].rss" or
905 "curl --sync http://example.net/{index,calendar,history}.html"
906
907 Downloads a range or set of URLs using the remote name, but only if the
908 remote file is newer than the local file. A Last-Modified HTTP date header
909 should also be used to set the mod date on the downloaded file.
910
Dirk Vogta7d7f962016-12-01 10:50:48 +010091118.2 glob posts
9487f7f2011-08-03 07:05:30 -0700912
913 Globbing support for -d and -F, as in 'curl -d "name=foo[0-9]" URL'.
914 This is easily scripted though.
915
Dirk Vogta7d7f962016-12-01 10:50:48 +010091618.3 prevent file overwriting
9487f7f2011-08-03 07:05:30 -0700917
Dirk Vogta7d7f962016-12-01 10:50:48 +0100918 Add an option that prevents curl from overwriting existing local files. When
9487f7f2011-08-03 07:05:30 -0700919 used, and there already is an existing file with the target file name
920 (either -O or -o), a number should be appended (and increased if already
921 existing). So that index.html becomes first index.html.1 and then
922 index.html.2 etc.
923
Dirk Vogta7d7f962016-12-01 10:50:48 +010092418.4 simultaneous parallel transfers
9487f7f2011-08-03 07:05:30 -0700925
926 The client could be told to use maximum N simultaneous parallel transfers and
927 then just make sure that happens. It should of course not make more than one
928 connection to the same remote host. This would require the client to use the
Dirk Vogta7d7f962016-12-01 10:50:48 +0100929 multi interface. https://curl.haxx.se/bug/feature.cgi?id=1558595
9487f7f2011-08-03 07:05:30 -0700930
Dirk Vogta7d7f962016-12-01 10:50:48 +0100931 Using the multi interface would also allow properly using parallel transfers
932 with HTTP/2 and supporting HTTP/2 server push from the command line.
933
93418.5 provide formpost headers
9487f7f2011-08-03 07:05:30 -0700935
936 Extending the capabilities of the multipart formposting. How about leaving
937 the ';type=foo' syntax as it is and adding an extra tag (headers) which
938 works like this: curl -F "coolfiles=@fil1.txt;headers=@fil1.hdr" where
939 fil1.hdr contains extra headers like
940
941 Content-Type: text/plain; charset=KOI8-R"
942 Content-Transfer-Encoding: base64
943 X-User-Comment: Please don't use browser specific HTML code
944
945 which should overwrite the program reasonable defaults (plain/text,
946 8bit...)
947
Dirk Vogta7d7f962016-12-01 10:50:48 +010094818.6 warning when setting an option
9487f7f2011-08-03 07:05:30 -0700949
Dirk Vogta7d7f962016-12-01 10:50:48 +0100950 Display a warning when libcurl returns an error when setting an option.
951 This can be useful to tell when support for a particular feature hasn't been
952 compiled into the library.
9487f7f2011-08-03 07:05:30 -0700953
Dirk Vogta7d7f962016-12-01 10:50:48 +010095418.7 warning when sending binary output to terminal
9487f7f2011-08-03 07:05:30 -0700955
Dirk Vogta7d7f962016-12-01 10:50:48 +0100956 Provide a way that prompts the user for confirmation before binary data is
957 sent to the terminal, much in the style 'less' does it.
9487f7f2011-08-03 07:05:30 -0700958
Dirk Vogta7d7f962016-12-01 10:50:48 +010095918.8 offer color-coded HTTP header output
9487f7f2011-08-03 07:05:30 -0700960
Dirk Vogta7d7f962016-12-01 10:50:48 +0100961 By offering different color output on the header name and the header
962 contents, they could be made more readable and thus help users working on
963 HTTP services.
9487f7f2011-08-03 07:05:30 -0700964
Dirk Vogta7d7f962016-12-01 10:50:48 +010096518.9 Choose the name of file in braces for complex URLs
9487f7f2011-08-03 07:05:30 -0700966
Dirk Vogta7d7f962016-12-01 10:50:48 +0100967 When using braces to download a list of URLs and you use complicated names
968 in the list of alternatives, it could be handy to allow curl to use other
969 names when saving.
9487f7f2011-08-03 07:05:30 -0700970
Dirk Vogta7d7f962016-12-01 10:50:48 +0100971 Consider a way to offer that. Possibly like
972 {partURL1:name1,partURL2:name2,partURL3:name3} where the name following the
973 colon is the output name.
9487f7f2011-08-03 07:05:30 -0700974
Dirk Vogta7d7f962016-12-01 10:50:48 +0100975 See https://github.com/curl/curl/issues/221
9487f7f2011-08-03 07:05:30 -0700976
Dirk Vogta7d7f962016-12-01 10:50:48 +010097718.10 improve how curl works in a windows console window
978
979 If you pull the scrollbar when transferring with curl in a Windows console
980 window, the transfer is interrupted and can get disconnected. This can
981 probably be improved. See https://github.com/curl/curl/issues/322
982
98318.11 -w output to stderr
984
985 -w is quite useful, but not to those of us who use curl without -o or -O
986 (such as for scripting through a higher level language). It would be nice to
987 have an option that is exactly like -w but sends it to stderr
988 instead. Proposed name: --write-stderr. See
989 https://github.com/curl/curl/issues/613
990
99118.12 keep running, read instructions from pipe/socket
992
993 Provide an option that makes curl not exit after the last URL (or even work
994 without a given URL), and then make it read instructions passed on a pipe or
995 over a socket to make further instructions so that a second subsequent curl
996 invoke can talk to the still running instance and ask for transfers to get
997 done, and thus maintain its connection pool, DNS cache and more.
998
99918.13 support metalink in http headers
1000
1001 Curl has support for downloading a metalink xml file, processing it, and then
1002 downloading the target of the metalink. This is done via the --metalink option.
1003 It would be nice if metalink also supported downloading via metalink
1004 information that is stored in HTTP headers (RFC 6249). Theoretically this could
1005 also be supported with the --metalink option.
1006
1007 See https://tools.ietf.org/html/rfc6249
1008
1009 See also https://lists.gnu.org/archive/html/bug-wget/2015-06/msg00034.html for
1010 an implematation of this in wget.
1011
101218.14 --fail without --location should treat 3xx as a failure
1013
1014 To allow a command line like this to detect a redirect and consider it a
1015 failure:
1016
1017 curl -v --fail -O https://example.com/curl-7.48.0.tar.gz
1018
1019 ... --fail must treat 3xx responses as failures too. The least problematic
1020 way to implement this is probably to add that new logic in the command line
1021 tool only and not in the underlying CURLOPT_FAILONERROR logic.
1022
102318.15 Introduce --fail-fast to exit on first transfer fail
1024
1025 curl will transfer all URLs given on the command line one by one but only
1026 returns the error code for the last transfer. Transfer failures on the first
1027 ones will not be returned as error code etc to the shell. A --fail-fast
1028 option would make curl exit and return an error for the first transfer that
1029 fails.
1030
103118.16 --retry should resume
1032
1033 When --retry is used and curl actually retries transfer, it should use the
1034 already transfered data and do a resumed transfer for the rest (when
1035 possible) so that it doesn't have to transfer the same data again that was
1036 already tranfered before the retry.
1037
1038 See https://github.com/curl/curl/issues/1084
1039
1040
104119. Build
1042
104319.1 roffit
9487f7f2011-08-03 07:05:30 -07001044
1045 Consider extending 'roffit' to produce decent ASCII output, and use that
Dirk Vogta7d7f962016-12-01 10:50:48 +01001046 instead of (g)nroff when building src/tool_hugehelp.c
9487f7f2011-08-03 07:05:30 -07001047
Dirk Vogta7d7f962016-12-01 10:50:48 +0100104819.2 Enable PIE and RELRO by default
9487f7f2011-08-03 07:05:30 -07001049
Dirk Vogta7d7f962016-12-01 10:50:48 +01001050 Especially when having programs that execute curl via the command line, PIE
1051 renders the exploitation of memory corruption vulnerabilities a lot more
1052 difficult. This can be attributed to the additional information leaks being
1053 required to conduct a successful attack. RELRO, on the other hand, masks
1054 different binary sections like the GOT as read-only and thus kills a handful
1055 of techniques that come in handy when attackers are able to arbitrarily
1056 overwrite memory. A few tests showed that enabling these features had close
1057 to no impact, neither on the performance nor on the general functionality of
1058 curl.
1059
1060
106120. Test suite
1062
106320.1 SSL tunnel
9487f7f2011-08-03 07:05:30 -07001064
1065 Make our own version of stunnel for simple port forwarding to enable HTTPS
1066 and FTP-SSL tests without the stunnel dependency, and it could allow us to
1067 provide test tools built with either OpenSSL or GnuTLS
1068
Dirk Vogta7d7f962016-12-01 10:50:48 +0100106920.2 nicer lacking perl message
9487f7f2011-08-03 07:05:30 -07001070
1071 If perl wasn't found by the configure script, don't attempt to run the tests
1072 but explain something nice why it doesn't.
1073
Dirk Vogta7d7f962016-12-01 10:50:48 +0100107420.3 more protocols supported
9487f7f2011-08-03 07:05:30 -07001075
Dirk Vogta7d7f962016-12-01 10:50:48 +01001076 Extend the test suite to include more protocols. The telnet could just do FTP
9487f7f2011-08-03 07:05:30 -07001077 or http operations (for which we have test servers).
1078
Dirk Vogta7d7f962016-12-01 10:50:48 +0100107920.4 more platforms supported
9487f7f2011-08-03 07:05:30 -07001080
1081 Make the test suite work on more platforms. OpenBSD and Mac OS. Remove
1082 fork()s and it should become even more portable.
1083
Dirk Vogta7d7f962016-12-01 10:50:48 +0100108420.5 Add support for concurrent connections
9487f7f2011-08-03 07:05:30 -07001085
Dirk Vogta7d7f962016-12-01 10:50:48 +01001086 Tests 836, 882 and 938 were designed to verify that separate connections aren't
1087 used when using different login credentials in protocols that shouldn't re-use
1088 a connection under such circumstances.
1089
1090 Unfortunately, ftpserver.pl doesn't appear to support multiple concurrent
1091 connections. The read while() loop seems to loop until it receives a disconnect
1092 from the client, where it then enters the waiting for connections loop. When
1093 the client opens a second connection to the server, the first connection hasn't
1094 been dropped (unless it has been forced - which we shouldn't do in these tests)
1095 and thus the wait for connections loop is never entered to receive the second
1096 connection.
1097
109820.6 Use the RFC6265 test suite
1099
1100 A test suite made for HTTP cookies (RFC 6265) by Adam Barth is available at
1101 https://github.com/abarth/http-state/tree/master/tests
1102
1103 It'd be really awesome if someone would write a script/setup that would run
1104 curl with that test suite and detect deviances. Ideally, that would even be
1105 incorporated into our regular test suite.
1106
1107
110821. Next SONAME bump
1109
111021.1 http-style HEAD output for FTP
9487f7f2011-08-03 07:05:30 -07001111
1112 #undef CURL_FTP_HTTPSTYLE_HEAD in lib/ftp.c to remove the HTTP-style headers
Dirk Vogta7d7f962016-12-01 10:50:48 +01001113 from being output in NOBODY requests over FTP
9487f7f2011-08-03 07:05:30 -07001114
Dirk Vogta7d7f962016-12-01 10:50:48 +0100111521.2 combine error codes
9487f7f2011-08-03 07:05:30 -07001116
1117 Combine some of the error codes to remove duplicates. The original
1118 numbering should not be changed, and the old identifiers would be
1119 macroed to the new ones in an CURL_NO_OLDIES section to help with
1120 backward compatibility.
1121
1122 Candidates for removal and their replacements:
1123
1124 CURLE_FILE_COULDNT_READ_FILE => CURLE_REMOTE_FILE_NOT_FOUND
Dirk Vogta7d7f962016-12-01 10:50:48 +01001125
9487f7f2011-08-03 07:05:30 -07001126 CURLE_FTP_COULDNT_RETR_FILE => CURLE_REMOTE_FILE_NOT_FOUND
Dirk Vogta7d7f962016-12-01 10:50:48 +01001127
9487f7f2011-08-03 07:05:30 -07001128 CURLE_FTP_COULDNT_USE_REST => CURLE_RANGE_ERROR
Dirk Vogta7d7f962016-12-01 10:50:48 +01001129
9487f7f2011-08-03 07:05:30 -07001130 CURLE_FUNCTION_NOT_FOUND => CURLE_FAILED_INIT
Dirk Vogta7d7f962016-12-01 10:50:48 +01001131
9487f7f2011-08-03 07:05:30 -07001132 CURLE_LDAP_INVALID_URL => CURLE_URL_MALFORMAT
Dirk Vogta7d7f962016-12-01 10:50:48 +01001133
9487f7f2011-08-03 07:05:30 -07001134 CURLE_TFTP_NOSUCHUSER => CURLE_TFTP_ILLEGAL
Dirk Vogta7d7f962016-12-01 10:50:48 +01001135
9487f7f2011-08-03 07:05:30 -07001136 CURLE_TFTP_NOTFOUND => CURLE_REMOTE_FILE_NOT_FOUND
Dirk Vogta7d7f962016-12-01 10:50:48 +01001137
9487f7f2011-08-03 07:05:30 -07001138 CURLE_TFTP_PERM => CURLE_REMOTE_ACCESS_DENIED
1139
Dirk Vogta7d7f962016-12-01 10:50:48 +0100114021.3 extend CURLOPT_SOCKOPTFUNCTION prototype
9487f7f2011-08-03 07:05:30 -07001141
1142 The current prototype only provides 'purpose' that tells what the
1143 connection/socket is for, but not any protocol or similar. It makes it hard
1144 for applications to differentiate on TCP vs UDP and even HTTP vs FTP and
1145 similar.
1146
Dirk Vogta7d7f962016-12-01 10:50:48 +0100114722. Next major release
9487f7f2011-08-03 07:05:30 -07001148
Dirk Vogta7d7f962016-12-01 10:50:48 +0100114922.1 cleanup return codes
9487f7f2011-08-03 07:05:30 -07001150
1151 curl_easy_cleanup() returns void, but curl_multi_cleanup() returns a
1152 CURLMcode. These should be changed to be the same.
1153
Dirk Vogta7d7f962016-12-01 10:50:48 +0100115422.2 remove obsolete defines
9487f7f2011-08-03 07:05:30 -07001155
1156 remove obsolete defines from curl/curl.h
1157
Dirk Vogta7d7f962016-12-01 10:50:48 +0100115822.3 size_t
9487f7f2011-08-03 07:05:30 -07001159
1160 make several functions use size_t instead of int in their APIs
1161
Dirk Vogta7d7f962016-12-01 10:50:48 +0100116222.4 remove several functions
9487f7f2011-08-03 07:05:30 -07001163
1164 remove the following functions from the public API:
1165
1166 curl_getenv
1167
1168 curl_mprintf (and variations)
1169
1170 curl_strequal
1171
1172 curl_strnequal
1173
1174 They will instead become curlx_ - alternatives. That makes the curl app
1175 still capable of using them, by building with them from source.
1176
1177 These functions have no purpose anymore:
1178
1179 curl_multi_socket
1180
1181 curl_multi_socket_all
1182
Dirk Vogta7d7f962016-12-01 10:50:48 +0100118322.5 remove CURLOPT_FAILONERROR
9487f7f2011-08-03 07:05:30 -07001184
1185 Remove support for CURLOPT_FAILONERROR, it has gotten too kludgy and weird
1186 internally. Let the app judge success or not for itself.
1187
Dirk Vogta7d7f962016-12-01 10:50:48 +0100118822.6 remove CURLOPT_DNS_USE_GLOBAL_CACHE
9487f7f2011-08-03 07:05:30 -07001189
1190 Remove support for a global DNS cache. Anything global is silly, and we
1191 already offer the share interface for the same functionality but done
1192 "right".
1193
Dirk Vogta7d7f962016-12-01 10:50:48 +0100119422.7 remove progress meter from libcurl
9487f7f2011-08-03 07:05:30 -07001195
1196 The internally provided progress meter output doesn't belong in the library.
1197 Basically no application wants it (apart from curl) but instead applications
1198 can and should do their own progress meters using the progress callback.
1199
1200 The progress callback should then be bumped as well to get proper 64bit
1201 variable types passed to it instead of doubles so that big files work
1202 correctly.
Dirk Vogta7d7f962016-12-01 10:50:48 +01001203
120422.8 remove 'curl_httppost' from public
1205
1206 curl_formadd() was made to fill in a public struct, but the fact that the
1207 struct is public is never really used by application for their own advantage
1208 but instead often restricts how the form functions can or can't be modified.
1209
1210 Changing them to return a private handle will benefit the implementation and
1211 allow us much greater freedoms while still maintaining a solid API and ABI.