TODO 18 KB

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