TODO 17 KB

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