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