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