TODO: Allow SSL (HTTPS) to proxy
[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.2 More data sharing
16  1.3 struct lifreq
17  1.4 signal-based resolver timeouts
18  1.5 get rid of PATH_MAX
19  1.6 Modified buffer size approach
20  1.7 Detect when called from witin callbacks
21  1.8 Allow SSL (HTTPS) to proxy
22
23  2. libcurl - multi interface
24  2.1 More non-blocking
25  2.2 Fix HTTP Pipelining for PUT
26
27  3. Documentation
28  3.1  More and better
29
30  4. FTP
31  4.1 HOST
32  4.2 Alter passive/active on failure and retry
33  4.3 Earlier bad letter detection
34  4.4 REST for large files
35  4.5 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  5.4 HTTP2/SPDY
42  5.5 auth= in URLs
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. SMTP
51  7.1 Pipelining
52  7.2 Enhanced capability support
53  
54  8. POP3
55  8.1 Pipelining
56  8.2 Enhanced capability support
57  
58  9. IMAP
59  9.1 Enhanced capability support
60  
61  10. LDAP
62  10.1 SASL based authentication mechanisms
63  
64  11. New protocols
65  11.1 RSYNC
66
67  12. SSL
68  12.1 Disable specific versions
69  12.2 Provide mutex locking API
70  12.3 Evaluate SSL patches
71  12.4 Cache OpenSSL contexts
72  12.5 Export session ids
73  12.6 Provide callback for cert verification
74  12.7 improve configure --with-ssl
75  12.8 Support DANE
76
77  13. GnuTLS
78  13.1 SSL engine stuff
79  13.2 check connection
80
81  14. SASL
82  14.1 Other authentication mechanisms
83  
84  15. Client
85  15.1 sync
86  15.2 glob posts
87  15.3 prevent file overwriting
88  15.4 simultaneous parallel transfers
89  15.5 provide formpost headers
90  15.6 url-specific options
91  15.7 warning when setting an option
92  15.8 IPv6 addresses with globbing
93
94  16. Build
95  16.1 roffit
96
97  17. Test suite
98  17.1 SSL tunnel
99  17.2 nicer lacking perl message
100  17.3 more protocols supported
101  17.4 more platforms supported
102
103  18. Next SONAME bump
104  18.1 http-style HEAD output for ftp
105  18.2 combine error codes
106  18.3 extend CURLOPT_SOCKOPTFUNCTION prototype
107
108  19. Next major release
109  19.1 cleanup return codes
110  19.2 remove obsolete defines
111  19.3 size_t
112  19.4 remove several functions
113  19.5 remove CURLOPT_FAILONERROR
114  19.6 remove CURLOPT_DNS_USE_GLOBAL_CACHE
115  19.7 remove progress meter from libcurl
116  19.8 remove 'curl_httppost' from public
117  19.9 have form functions use CURL handle argument
118  19.10 Add CURLOPT_MAIL_CLIENT option
119
120 ==============================================================================
121
122 1. libcurl
123
124 1.2 More data sharing
125
126  curl_share_* functions already exist and work, and they can be extended to
127  share more. For example, enable sharing of the ares channel and the
128  connection cache.
129
130 1.3 struct lifreq
131
132  Use 'struct lifreq' and SIOCGLIFADDR instead of 'struct ifreq' and
133  SIOCGIFADDR on newer Solaris versions as they claim the latter is obsolete.
134  To support ipv6 interface addresses for network interfaces properly.
135
136 1.4 signal-based resolver timeouts
137
138  libcurl built without an asynchronous resolver library uses alarm() to time
139  out DNS lookups. When a timeout occurs, this causes libcurl to jump from the
140  signal handler back into the library with a sigsetjmp, which effectively
141  causes libcurl to continue running within the signal handler. This is
142  non-portable and could cause problems on some platforms. A discussion on the
143  problem is available at http://curl.haxx.se/mail/lib-2008-09/0197.html
144
145  Also, alarm() provides timeout resolution only to the nearest second. alarm
146  ought to be replaced by setitimer on systems that support it.
147
148 1.5 get rid of PATH_MAX
149
150  Having code use and rely on PATH_MAX is not nice:
151  http://insanecoding.blogspot.com/2007/11/pathmax-simply-isnt.html
152
153  Currently the SSH based code uses it a bit, but to remove PATH_MAX from there
154  we need libssh2 to properly tell us when we pass in a too small buffer and
155  its current API (as of libssh2 1.2.7) doesn't.
156
157 1.6 Modified buffer size approach
158
159  Current libcurl allocates a fixed 16K size buffer for download and an
160  additional 16K for upload. They are always unconditionally part of the easy
161  handle. If CRLF translations are requested, an additional 32K "scratch
162  buffer" is allocated. A total of 64K transfer buffers in the worst case.
163
164  First, while the handles are not actually in use these buffers could be freed
165  so that lingering handles just kept in queues or whatever waste less memory.
166
167  Secondly, SFTP is a protocol that needs to handle many ~30K blocks at once
168  since each need to be individually acked and therefore libssh2 must be
169  allowed to send (or receive) many separate ones in parallel to achieve high
170  transfer speeds. A current libcurl build with a 16K buffer makes that
171  impossible, but one with a 512K buffer will reach MUCH faster transfers. But
172  allocating 512K unconditionally for all buffers just in case they would like
173  to do fast SFTP transfers at some point is not a good solution either.
174
175  Dynamically allocate buffer size depending on protocol in use in combination
176  with freeing it after each individual transfer? Other suggestions?
177
178 1.7 Detect when called from witin callbacks
179
180  We should set a state variable before calling callbacks, so that we
181  subsequently can add code within libcurl that returns error if called within
182  callbacks for when that's not supported.
183
184 1.8 Allow SSL (HTTPS) to proxy
185
186  To prevent local users from snooping on your traffic to the proxy. Supported
187  by Chrome already:
188  http://www.chromium.org/developers/design-documents/secure-web-proxy
189
190
191 2. libcurl - multi interface
192
193 2.1 More non-blocking
194
195  Make sure we don't ever loop because of non-blocking sockets returning
196  EWOULDBLOCK or similar. Blocking cases include:
197
198  - Name resolves on non-windows unless c-ares is used
199  - NSS SSL connections
200  - HTTP proxy CONNECT operations
201  - SOCKS proxy handshakes
202  - file:// transfers
203  - TELNET transfers
204  - The "DONE" operation (post transfer protocol-specific actions) for the
205    protocols SFTP, SMTP, FTP. Fixing Curl_done() for this is a worthy task.
206
207 2.2 Fix HTTP Pipelining for PUT
208
209  HTTP Pipelining can be a way to greatly enhance performance for multiple
210  serial requests and currently libcurl only supports that for HEAD and GET
211  requests but it should also be possible for PUT.
212
213 3. Documentation
214
215 3.1  More and better
216
217  Exactly
218
219 4. FTP
220
221 4.1 HOST
222
223  HOST is a suggested command in the works for a client to tell which host name
224  to use, to offer FTP servers named-based virtual hosting:
225
226  http://tools.ietf.org/html/draft-hethmon-mcmurray-ftp-hosts-11
227
228 4.2 Alter passive/active on failure and retry
229
230  When trying to connect passively to a server which only supports active
231  connections, libcurl returns CURLE_FTP_WEIRD_PASV_REPLY and closes the
232  connection. There could be a way to fallback to an active connection (and
233  vice versa). http://curl.haxx.se/bug/feature.cgi?id=1754793
234
235 4.3 Earlier bad letter detection
236
237  Make the detection of (bad) %0d and %0a codes in FTP url parts earlier in the
238  process to avoid doing a resolve and connect in vain.
239
240 4.4 REST for large files
241
242  REST fix for servers not behaving well on >2GB requests. This should fail if
243  the server doesn't set the pointer to the requested index. The tricky
244  (impossible?) part is to figure out if the server did the right thing or not.
245
246 4.5 ASCII support
247
248  FTP ASCII transfers do not follow RFC959. They don't convert the data
249  accordingly.
250
251 5. HTTP
252
253 5.1 Better persistency for HTTP 1.0
254
255  "Better" support for persistent connections over HTTP 1.0
256  http://curl.haxx.se/bug/feature.cgi?id=1089001
257
258 5.2 support FF3 sqlite cookie files
259
260  Firefox 3 is changing from its former format to a a sqlite database instead.
261  We should consider how (lib)curl can/should support this.
262  http://curl.haxx.se/bug/feature.cgi?id=1871388
263
264 5.3 Rearrange request header order
265
266  Server implementors often make an effort to detect browser and to reject
267  clients it can detect to not match. One of the last details we cannot yet
268  control in libcurl's HTTP requests, which also can be exploited to detect
269  that libcurl is in fact used even when it tries to impersonate a browser, is
270  the order of the request headers. I propose that we introduce a new option in
271  which you give headers a value, and then when the HTTP request is built it
272  sorts the headers based on that number. We could then have internally created
273  headers use a default value so only headers that need to be moved have to be
274  specified.
275
276 5.4 HTTP2/SPDY
277
278  The first drafts for HTTP2 have been published
279  (http://tools.ietf.org/html/draft-ietf-httpbis-http2-03) and is so far based
280  on SPDY (http://www.chromium.org/spdy) designs and experiences. Chances are
281  it will end up in that style. Chrome and Firefox already support SPDY and
282  lots of web services do.
283
284  It would make sense to implement SPDY support now and later transition into
285  or add HTTP2 support as well.
286
287  We should base or HTTP2/SPDY work on a 3rd party library for the protocol
288  fiddling. The Spindy library (http://spindly.haxx.se/) was an attempt to make
289  such a library with an API suitable for use by libcurl but that effort has
290  more or less stalled.  spdylay (https://github.com/tatsuhiro-t/spdylay) may
291  be a better option, either used directly or wrapped with a more spindly-like
292  API.
293
294 5.5 auth= in URLs
295
296  Add the ability to specify the preferred authentication mechanism to use by
297  using ;auth=<mech> in the login part of the URL.
298
299  For example:
300
301  http://test:pass;auth=NTLM@example.com would be equivalent to specifing --user
302  test:pass;auth=NTLM or --user test:pass --ntlm from the command line. 
303
304  Additionally this should be implemented for proxy base URLs as well.
305
306 6. TELNET
307
308 6.1 ditch stdin
309
310 Reading input (to send to the remote server) on stdin is a crappy solution for
311 library purposes. We need to invent a good way for the application to be able
312 to provide the data to send.
313
314 6.2 ditch telnet-specific select
315
316  Move the telnet support's network select() loop go away and merge the code
317  into the main transfer loop. Until this is done, the multi interface won't
318  work for telnet.
319
320 6.3 feature negotiation debug data
321
322   Add telnet feature negotiation data to the debug callback as header data.
323
324 6.4 send data in chunks
325
326   Currently, telnet sends data one byte at a time.  This is fine for interactive
327   use, but inefficient for any other.  Sent data should be sent in larger
328   chunks.
329
330 7. SMTP
331
332 7.1 Pipelining
333
334  Add support for pipelining emails.
335
336 7.2 Enhanced capability support
337
338  Add the ability, for an application that uses libcurl, to obtain the list of
339  capabilities returned from the EHLO command.
340
341 8. POP3
342
343 8.1 Pipelining
344
345  Add support for pipelining commands.
346
347 8.2 Enhanced capability support
348
349  Add the ability, for an application that uses libcurl, to obtain the list of
350  capabilities returned from the CAPA command.
351
352 9. IMAP
353
354 9.1 Enhanced capability support
355
356  Add the ability, for an application that uses libcurl, to obtain the list of
357  capabilities returned from the CAPABILITY command.
358
359 10. LDAP
360
361 10.1 SASL based authentication mechanisms
362
363  Currently the LDAP module only supports ldap_simple_bind_s() in order to bind
364  to an LDAP server. However, this function sends username and password details
365  using the simple authentication mechanism (as clear text). However, it should
366  be possible to use ldap_bind_s() instead specifing the security context
367  information ourselves.
368
369 11. New protocols
370
371 11.1 RSYNC
372
373  There's no RFC for the protocol or an URI/URL format.  An implementation
374  should most probably use an existing rsync library, such as librsync.
375
376 12. SSL
377
378 12.1 Disable specific versions
379
380  Provide an option that allows for disabling specific SSL versions, such as
381  SSLv2 http://curl.haxx.se/bug/feature.cgi?id=1767276
382
383 12.2 Provide mutex locking API
384
385  Provide a libcurl API for setting mutex callbacks in the underlying SSL
386  library, so that the same application code can use mutex-locking
387  independently of OpenSSL or GnutTLS being used.
388
389 12.3 Evaluate SSL patches
390
391  Evaluate/apply Gertjan van Wingerde's SSL patches:
392  http://curl.haxx.se/mail/lib-2004-03/0087.html
393
394 12.4 Cache OpenSSL contexts
395
396  "Look at SSL cafile - quick traces look to me like these are done on every
397  request as well, when they should only be necessary once per ssl context (or
398  once per handle)". The major improvement we can rather easily do is to make
399  sure we don't create and kill a new SSL "context" for every request, but
400  instead make one for every connection and re-use that SSL context in the same
401  style connections are re-used. It will make us use slightly more memory but
402  it will libcurl do less creations and deletions of SSL contexts.
403
404 12.5 Export session ids
405
406  Add an interface to libcurl that enables "session IDs" to get
407  exported/imported. Cris Bailiff said: "OpenSSL has functions which can
408  serialise the current SSL state to a buffer of your choice, and recover/reset
409  the state from such a buffer at a later date - this is used by mod_ssl for
410  apache to implement and SSL session ID cache".
411
412 12.6 Provide callback for cert verification
413
414  OpenSSL supports a callback for customised verification of the peer
415  certificate, but this doesn't seem to be exposed in the libcurl APIs. Could
416  it be? There's so much that could be done if it were!
417
418 12.7 improve configure --with-ssl
419
420  make the configure --with-ssl option first check for OpenSSL, then GnuTLS,
421  then NSS...
422
423 12.8 Support DANE
424
425  DNS-Based Authentication of Named Entities (DANE) is a way to provide SSL
426  keys and certs over DNS using DNSSEC as an alternative to the CA model.
427  http://www.rfc-editor.org/rfc/rfc6698.txt
428
429  An initial patch was posted by Suresh Krishnaswamy on March 7th 2013
430  (http://curl.haxx.se/mail/lib-2013-03/0075.html) but it was a too simple
431  approach. See Daniel's comments:
432  http://curl.haxx.se/mail/lib-2013-03/0103.html . libunbound may be the
433  correct library to base this development on.
434
435 13. GnuTLS
436
437 13.1 SSL engine stuff
438
439  Is this even possible?
440
441 13.2 check connection
442
443  Add a way to check if the connection seems to be alive, to correspond to the
444  SSL_peak() way we use with OpenSSL.
445
446 14. SASL
447
448 14.1 Other authentication mechanisms
449
450  Add support for GSSAPI to SMTP, POP3 and IMAP.
451
452 15. Client
453
454 15.1 sync
455
456  "curl --sync http://example.com/feed[1-100].rss" or
457  "curl --sync http://example.net/{index,calendar,history}.html"
458
459  Downloads a range or set of URLs using the remote name, but only if the
460  remote file is newer than the local file. A Last-Modified HTTP date header
461  should also be used to set the mod date on the downloaded file.
462
463 15.2 glob posts
464
465  Globbing support for -d and -F, as in 'curl -d "name=foo[0-9]" URL'.
466  This is easily scripted though.
467
468 15.3 prevent file overwriting
469
470  Add an option that prevents cURL from overwriting existing local files. When
471  used, and there already is an existing file with the target file name
472  (either -O or -o), a number should be appended (and increased if already
473  existing). So that index.html becomes first index.html.1 and then
474  index.html.2 etc.
475
476 15.4 simultaneous parallel transfers
477
478  The client could be told to use maximum N simultaneous parallel transfers and
479  then just make sure that happens. It should of course not make more than one
480  connection to the same remote host. This would require the client to use the
481  multi interface. http://curl.haxx.se/bug/feature.cgi?id=1558595
482
483 15.5 provide formpost headers
484
485  Extending the capabilities of the multipart formposting. How about leaving
486  the ';type=foo' syntax as it is and adding an extra tag (headers) which
487  works like this: curl -F "coolfiles=@fil1.txt;headers=@fil1.hdr" where
488  fil1.hdr contains extra headers like
489
490    Content-Type: text/plain; charset=KOI8-R"
491    Content-Transfer-Encoding: base64
492    X-User-Comment: Please don't use browser specific HTML code
493
494  which should overwrite the program reasonable defaults (plain/text,
495  8bit...)
496
497 15.6 url-specific options
498
499  Provide a way to make options bound to a specific URL among several on the
500  command line. Possibly by letting ':' separate options between URLs,
501  similar to this:
502
503     curl --data foo --url url.com : \
504         --url url2.com : \
505         --url url3.com --data foo3
506
507  (More details: http://curl.haxx.se/mail/archive-2004-07/0133.html)
508
509  The example would do a POST-GET-POST combination on a single command line.
510
511 15.7 warning when setting an option
512
513   Display a warning when libcurl returns an error when setting an option.
514   This can be useful to tell when support for a particular feature hasn't been
515   compiled into the library.
516
517 15.8 IPv6 addresses with globbing
518
519   Currently the command line client needs to get url globbing disabled (with
520   -g) for it to support IPv6 numerical addresses. This is a rather silly flaw
521   that should be corrected. It probably involves a smarter detection of the
522   '[' and ']' letters.
523
524 16. Build
525
526 16.1 roffit
527
528  Consider extending 'roffit' to produce decent ASCII output, and use that
529  instead of (g)nroff when building src/tool_hugehelp.c
530
531 17. Test suite
532
533 17.1 SSL tunnel
534
535  Make our own version of stunnel for simple port forwarding to enable HTTPS
536  and FTP-SSL tests without the stunnel dependency, and it could allow us to
537  provide test tools built with either OpenSSL or GnuTLS
538
539 17.2 nicer lacking perl message
540
541  If perl wasn't found by the configure script, don't attempt to run the tests
542  but explain something nice why it doesn't.
543
544 17.3 more protocols supported
545
546  Extend the test suite to include more protocols. The telnet could just do ftp
547  or http operations (for which we have test servers).
548
549 17.4 more platforms supported
550
551  Make the test suite work on more platforms. OpenBSD and Mac OS. Remove
552  fork()s and it should become even more portable.
553
554 18. Next SONAME bump
555
556 18.1 http-style HEAD output for ftp
557
558  #undef CURL_FTP_HTTPSTYLE_HEAD in lib/ftp.c to remove the HTTP-style headers
559  from being output in NOBODY requests over ftp
560
561 18.2 combine error codes
562
563  Combine some of the error codes to remove duplicates.  The original
564  numbering should not be changed, and the old identifiers would be
565  macroed to the new ones in an CURL_NO_OLDIES section to help with
566  backward compatibility.
567
568  Candidates for removal and their replacements:
569
570     CURLE_FILE_COULDNT_READ_FILE => CURLE_REMOTE_FILE_NOT_FOUND
571
572     CURLE_FTP_COULDNT_RETR_FILE => CURLE_REMOTE_FILE_NOT_FOUND
573
574     CURLE_FTP_COULDNT_USE_REST => CURLE_RANGE_ERROR
575
576     CURLE_FUNCTION_NOT_FOUND => CURLE_FAILED_INIT
577
578     CURLE_LDAP_INVALID_URL => CURLE_URL_MALFORMAT
579
580     CURLE_TFTP_NOSUCHUSER => CURLE_TFTP_ILLEGAL
581
582     CURLE_TFTP_NOTFOUND => CURLE_REMOTE_FILE_NOT_FOUND
583
584     CURLE_TFTP_PERM => CURLE_REMOTE_ACCESS_DENIED
585
586 18.3 extend CURLOPT_SOCKOPTFUNCTION prototype
587
588  The current prototype only provides 'purpose' that tells what the
589  connection/socket is for, but not any protocol or similar. It makes it hard
590  for applications to differentiate on TCP vs UDP and even HTTP vs FTP and
591  similar.
592
593 10. Next major release
594
595 19.1 cleanup return codes
596
597  curl_easy_cleanup() returns void, but curl_multi_cleanup() returns a
598  CURLMcode. These should be changed to be the same.
599
600 19.2 remove obsolete defines
601
602  remove obsolete defines from curl/curl.h
603
604 19.3 size_t
605
606  make several functions use size_t instead of int in their APIs
607
608 19.4 remove several functions
609
610  remove the following functions from the public API:
611
612  curl_getenv
613
614  curl_mprintf (and variations)
615
616  curl_strequal
617
618  curl_strnequal
619
620  They will instead become curlx_ - alternatives. That makes the curl app
621  still capable of using them, by building with them from source.
622
623  These functions have no purpose anymore:
624
625  curl_multi_socket
626
627  curl_multi_socket_all
628
629 19.5 remove CURLOPT_FAILONERROR
630
631  Remove support for CURLOPT_FAILONERROR, it has gotten too kludgy and weird
632  internally. Let the app judge success or not for itself.
633
634 19.6 remove CURLOPT_DNS_USE_GLOBAL_CACHE
635
636  Remove support for a global DNS cache. Anything global is silly, and we
637  already offer the share interface for the same functionality but done
638  "right".
639
640 19.7 remove progress meter from libcurl
641
642  The internally provided progress meter output doesn't belong in the library.
643  Basically no application wants it (apart from curl) but instead applications
644  can and should do their own progress meters using the progress callback.
645
646  The progress callback should then be bumped as well to get proper 64bit
647  variable types passed to it instead of doubles so that big files work
648  correctly.
649
650 19.8 remove 'curl_httppost' from public
651
652  curl_formadd() was made to fill in a public struct, but the fact that the
653  struct is public is never really used by application for their own advantage
654  but instead often restricts how the form functions can or can't be modified.
655
656  Changing them to return a private handle will benefit the implementation and
657  allow us much greater freedoms while still maintining a solid API and ABI.
658
659 19.9 have form functions use CURL handle argument
660
661  curl_formadd() and curl_formget() both currently have no CURL handle
662  argument, but both can use a callback that is set in the easy handle, and
663  thus curl_formget() with callback cannot function without first having
664  curl_easy_perform() (or similar) called - which is hard to grasp and a design
665  mistake.
666
667 19.10 Add CURLOPT_MAIL_CLIENT option
668
669  Rather than use the URL to specify the mail client string to present in the
670  HELO and EHLO commands, libcurl should support a new CURLOPT specifically for
671  specifing this data as the URL is non-standard and to be honest a bit of a
672  hack ;-)
673
674  Please see the following thread for more information:
675  http://curl.haxx.se/mail/lib-2012-05/0178.html
676