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