~ubuntu-branches/ubuntu/lucid/curl/lucid-201101212007

« back to all changes in this revision

Viewing changes to docs/TODO

  • Committer: Bazaar Package Importer
  • Author(s): Matthias Klose
  • Date: 2008-02-08 11:20:41 UTC
  • mto: (3.1.1 lenny) (1.2.1 upstream)
  • mto: This revision was merged to the branch mainline in revision 26.
  • Revision ID: james.westby@ubuntu.com-20080208112041-hed7sb5r6ghmjf8v
Tags: upstream-7.18.0
ImportĀ upstreamĀ versionĀ 7.18.0

Show diffs side-by-side

added added

removed removed

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