comparison mupdf-source/thirdparty/curl/docs/libcurl/libcurl-tutorial.3 @ 2:b50eed0cc0ef upstream

ADD: MuPDF v1.26.7: the MuPDF source as downloaded by a default build of PyMuPDF 1.26.4. The directory name has changed: no version number in the expanded directory now.
author Franz Glasner <fzglas.hg@dom66.de>
date Mon, 15 Sep 2025 11:43:07 +0200
parents
children
comparison
equal deleted inserted replaced
1:1d09e1dec1d9 2:b50eed0cc0ef
1 .\" **************************************************************************
2 .\" * _ _ ____ _
3 .\" * Project ___| | | | _ \| |
4 .\" * / __| | | | |_) | |
5 .\" * | (__| |_| | _ <| |___
6 .\" * \___|\___/|_| \_\_____|
7 .\" *
8 .\" * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
9 .\" *
10 .\" * This software is licensed as described in the file COPYING, which
11 .\" * you should have received as part of this distribution. The terms
12 .\" * are also available at https://curl.haxx.se/docs/copyright.html.
13 .\" *
14 .\" * You may opt to use, copy, modify, merge, publish, distribute and/or sell
15 .\" * copies of the Software, and permit persons to whom the Software is
16 .\" * furnished to do so, under the terms of the COPYING file.
17 .\" *
18 .\" * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19 .\" * KIND, either express or implied.
20 .\" *
21 .\" **************************************************************************
22 .\"
23 .TH libcurl-tutorial 3 "19 Sep 2014" "libcurl" "libcurl programming"
24 .SH NAME
25 libcurl-tutorial \- libcurl programming tutorial
26 .SH "Objective"
27 This document attempts to describe the general principles and some basic
28 approaches to consider when programming with libcurl. The text will focus
29 mainly on the C interface but might apply fairly well on other interfaces as
30 well as they usually follow the C one pretty closely.
31
32 This document will refer to 'the user' as the person writing the source code
33 that uses libcurl. That would probably be you or someone in your position.
34 What will be generally referred to as 'the program' will be the collected
35 source code that you write that is using libcurl for transfers. The program
36 is outside libcurl and libcurl is outside of the program.
37
38 To get more details on all options and functions described herein, please
39 refer to their respective man pages.
40
41 .SH "Building"
42 There are many different ways to build C programs. This chapter will assume a
43 Unix style build process. If you use a different build system, you can still
44 read this to get general information that may apply to your environment as
45 well.
46 .IP "Compiling the Program"
47 Your compiler needs to know where the libcurl headers are located. Therefore
48 you must set your compiler's include path to point to the directory where you
49 installed them. The 'curl-config'[3] tool can be used to get this information:
50
51 $ curl-config --cflags
52
53 .IP "Linking the Program with libcurl"
54 When having compiled the program, you need to link your object files to create
55 a single executable. For that to succeed, you need to link with libcurl and
56 possibly also with other libraries that libcurl itself depends on. Like the
57 OpenSSL libraries, but even some standard OS libraries may be needed on the
58 command line. To figure out which flags to use, once again the 'curl-config'
59 tool comes to the rescue:
60
61 $ curl-config --libs
62
63 .IP "SSL or Not"
64 libcurl can be built and customized in many ways. One of the things that
65 varies from different libraries and builds is the support for SSL-based
66 transfers, like HTTPS and FTPS. If a supported SSL library was detected
67 properly at build-time, libcurl will be built with SSL support. To figure out
68 if an installed libcurl has been built with SSL support enabled, use
69 \&'curl-config' like this:
70
71 $ curl-config --feature
72
73 And if SSL is supported, the keyword 'SSL' will be written to stdout,
74 possibly together with a few other features that could be either on or off on
75 for different libcurls.
76
77 See also the "Features libcurl Provides" further down.
78 .IP "autoconf macro"
79 When you write your configure script to detect libcurl and setup variables
80 accordingly, we offer a prewritten macro that probably does everything you
81 need in this area. See docs/libcurl/libcurl.m4 file - it includes docs on how
82 to use it.
83
84 .SH "Portable Code in a Portable World"
85 The people behind libcurl have put a considerable effort to make libcurl work
86 on a large amount of different operating systems and environments.
87
88 You program libcurl the same way on all platforms that libcurl runs on. There
89 are only very few minor considerations that differ. If you just make sure to
90 write your code portable enough, you may very well create yourself a very
91 portable program. libcurl shouldn't stop you from that.
92
93 .SH "Global Preparation"
94 The program must initialize some of the libcurl functionality globally. That
95 means it should be done exactly once, no matter how many times you intend to
96 use the library. Once for your program's entire life time. This is done using
97
98 curl_global_init()
99
100 and it takes one parameter which is a bit pattern that tells libcurl what to
101 initialize. Using \fICURL_GLOBAL_ALL\fP will make it initialize all known
102 internal sub modules, and might be a good default option. The current two bits
103 that are specified are:
104 .RS
105 .IP "CURL_GLOBAL_WIN32"
106 which only does anything on Windows machines. When used on
107 a Windows machine, it'll make libcurl initialize the win32 socket
108 stuff. Without having that initialized properly, your program cannot use
109 sockets properly. You should only do this once for each application, so if
110 your program already does this or of another library in use does it, you
111 should not tell libcurl to do this as well.
112 .IP CURL_GLOBAL_SSL
113 which only does anything on libcurls compiled and built SSL-enabled. On these
114 systems, this will make libcurl initialize the SSL library properly for this
115 application. This only needs to be done once for each application so if your
116 program or another library already does this, this bit should not be needed.
117 .RE
118
119 libcurl has a default protection mechanism that detects if
120 \fIcurl_global_init(3)\fP hasn't been called by the time
121 \fIcurl_easy_perform(3)\fP is called and if that is the case, libcurl runs the
122 function itself with a guessed bit pattern. Please note that depending solely
123 on this is not considered nice nor very good.
124
125 When the program no longer uses libcurl, it should call
126 \fIcurl_global_cleanup(3)\fP, which is the opposite of the init call. It will
127 then do the reversed operations to cleanup the resources the
128 \fIcurl_global_init(3)\fP call initialized.
129
130 Repeated calls to \fIcurl_global_init(3)\fP and \fIcurl_global_cleanup(3)\fP
131 should be avoided. They should only be called once each.
132
133 .SH "Features libcurl Provides"
134 It is considered best-practice to determine libcurl features at run-time
135 rather than at build-time (if possible of course). By calling
136 \fIcurl_version_info(3)\fP and checking out the details of the returned
137 struct, your program can figure out exactly what the currently running libcurl
138 supports.
139
140 .SH "Two Interfaces"
141 libcurl first introduced the so called easy interface. All operations in the
142 easy interface are prefixed with 'curl_easy'. The easy interface lets you do
143 single transfers with a synchronous and blocking function call.
144
145 libcurl also offers another interface that allows multiple simultaneous
146 transfers in a single thread, the so called multi interface. More about that
147 interface is detailed in a separate chapter further down. You still need to
148 understand the easy interface first, so please continue reading for better
149 understanding.
150 .SH "Handle the Easy libcurl"
151 To use the easy interface, you must first create yourself an easy handle. You
152 need one handle for each easy session you want to perform. Basically, you
153 should use one handle for every thread you plan to use for transferring. You
154 must never share the same handle in multiple threads.
155
156 Get an easy handle with
157
158 easyhandle = curl_easy_init();
159
160 It returns an easy handle. Using that you proceed to the next step: setting
161 up your preferred actions. A handle is just a logic entity for the upcoming
162 transfer or series of transfers.
163
164 You set properties and options for this handle using
165 \fIcurl_easy_setopt(3)\fP. They control how the subsequent transfer or
166 transfers will be made. Options remain set in the handle until set again to
167 something different. They are sticky. Multiple requests using the same handle
168 will use the same options.
169
170 If you at any point would like to blank all previously set options for a
171 single easy handle, you can call \fIcurl_easy_reset(3)\fP and you can also
172 make a clone of an easy handle (with all its set options) using
173 \fIcurl_easy_duphandle(3)\fP.
174
175 Many of the options you set in libcurl are "strings", pointers to data
176 terminated with a zero byte. When you set strings with
177 \fIcurl_easy_setopt(3)\fP, libcurl makes its own copy so that they don't need
178 to be kept around in your application after being set[4].
179
180 One of the most basic properties to set in the handle is the URL. You set your
181 preferred URL to transfer with \fICURLOPT_URL(3)\fP in a manner similar to:
182
183 .nf
184 curl_easy_setopt(handle, CURLOPT_URL, "http://domain.com/");
185 .fi
186
187 Let's assume for a while that you want to receive data as the URL identifies a
188 remote resource you want to get here. Since you write a sort of application
189 that needs this transfer, I assume that you would like to get the data passed
190 to you directly instead of simply getting it passed to stdout. So, you write
191 your own function that matches this prototype:
192
193 size_t write_data(void *buffer, size_t size, size_t nmemb, void *userp);
194
195 You tell libcurl to pass all data to this function by issuing a function
196 similar to this:
197
198 curl_easy_setopt(easyhandle, CURLOPT_WRITEFUNCTION, write_data);
199
200 You can control what data your callback function gets in the fourth argument
201 by setting another property:
202
203 curl_easy_setopt(easyhandle, CURLOPT_WRITEDATA, &internal_struct);
204
205 Using that property, you can easily pass local data between your application
206 and the function that gets invoked by libcurl. libcurl itself won't touch the
207 data you pass with \fICURLOPT_WRITEDATA(3)\fP.
208
209 libcurl offers its own default internal callback that will take care of the
210 data if you don't set the callback with \fICURLOPT_WRITEFUNCTION(3)\fP. It
211 will then simply output the received data to stdout. You can have the default
212 callback write the data to a different file handle by passing a 'FILE *' to a
213 file opened for writing with the \fICURLOPT_WRITEDATA(3)\fP option.
214
215 Now, we need to take a step back and have a deep breath. Here's one of those
216 rare platform-dependent nitpicks. Did you spot it? On some platforms[2],
217 libcurl won't be able to operate on files opened by the program. Thus, if you
218 use the default callback and pass in an open file with
219 \fICURLOPT_WRITEDATA(3)\fP, it will crash. You should therefore avoid this to
220 make your program run fine virtually everywhere.
221
222 (\fICURLOPT_WRITEDATA(3)\fP was formerly known as \fICURLOPT_FILE\fP. Both
223 names still work and do the same thing).
224
225 If you're using libcurl as a win32 DLL, you MUST use the
226 \fICURLOPT_WRITEFUNCTION(3)\fP if you set \fICURLOPT_WRITEDATA(3)\fP - or you
227 will experience crashes.
228
229 There are of course many more options you can set, and we'll get back to a few
230 of them later. Let's instead continue to the actual transfer:
231
232 success = curl_easy_perform(easyhandle);
233
234 \fIcurl_easy_perform(3)\fP will connect to the remote site, do the necessary
235 commands and receive the transfer. Whenever it receives data, it calls the
236 callback function we previously set. The function may get one byte at a time,
237 or it may get many kilobytes at once. libcurl delivers as much as possible as
238 often as possible. Your callback function should return the number of bytes it
239 \&"took care of". If that is not the exact same amount of bytes that was
240 passed to it, libcurl will abort the operation and return with an error code.
241
242 When the transfer is complete, the function returns a return code that informs
243 you if it succeeded in its mission or not. If a return code isn't enough for
244 you, you can use the \fICURLOPT_ERRORBUFFER(3)\fP to point libcurl to a buffer
245 of yours where it'll store a human readable error message as well.
246
247 If you then want to transfer another file, the handle is ready to be used
248 again. Mind you, it is even preferred that you re-use an existing handle if
249 you intend to make another transfer. libcurl will then attempt to re-use the
250 previous connection.
251
252 For some protocols, downloading a file can involve a complicated process of
253 logging in, setting the transfer mode, changing the current directory and
254 finally transferring the file data. libcurl takes care of all that
255 complication for you. Given simply the URL to a file, libcurl will take care
256 of all the details needed to get the file moved from one machine to another.
257
258 .SH "Multi-threading Issues"
259 libcurl is thread safe but there are a few exceptions. Refer to
260 \fIlibcurl-thread(3)\fP for more information.
261
262 .SH "When It Doesn't Work"
263 There will always be times when the transfer fails for some reason. You might
264 have set the wrong libcurl option or misunderstood what the libcurl option
265 actually does, or the remote server might return non-standard replies that
266 confuse the library which then confuses your program.
267
268 There's one golden rule when these things occur: set the
269 \fICURLOPT_VERBOSE(3)\fP option to 1. It'll cause the library to spew out the
270 entire protocol details it sends, some internal info and some received
271 protocol data as well (especially when using FTP). If you're using HTTP,
272 adding the headers in the received output to study is also a clever way to get
273 a better understanding why the server behaves the way it does. Include headers
274 in the normal body output with \fICURLOPT_HEADER(3)\fP set 1.
275
276 Of course, there are bugs left. We need to know about them to be able to fix
277 them, so we're quite dependent on your bug reports! When you do report
278 suspected bugs in libcurl, please include as many details as you possibly can:
279 a protocol dump that \fICURLOPT_VERBOSE(3)\fP produces, library version, as
280 much as possible of your code that uses libcurl, operating system name and
281 version, compiler name and version etc.
282
283 If \fICURLOPT_VERBOSE(3)\fP is not enough, you increase the level of debug
284 data your application receive by using the \fICURLOPT_DEBUGFUNCTION(3)\fP.
285
286 Getting some in-depth knowledge about the protocols involved is never wrong,
287 and if you're trying to do funny things, you might very well understand
288 libcurl and how to use it better if you study the appropriate RFC documents
289 at least briefly.
290
291 .SH "Upload Data to a Remote Site"
292 libcurl tries to keep a protocol independent approach to most transfers, thus
293 uploading to a remote FTP site is very similar to uploading data to an HTTP
294 server with a PUT request.
295
296 Of course, first you either create an easy handle or you re-use one existing
297 one. Then you set the URL to operate on just like before. This is the remote
298 URL, that we now will upload.
299
300 Since we write an application, we most likely want libcurl to get the upload
301 data by asking us for it. To make it do that, we set the read callback and
302 the custom pointer libcurl will pass to our read callback. The read callback
303 should have a prototype similar to:
304
305 size_t function(char *bufptr, size_t size, size_t nitems, void *userp);
306
307 Where bufptr is the pointer to a buffer we fill in with data to upload and
308 size*nitems is the size of the buffer and therefore also the maximum amount
309 of data we can return to libcurl in this call. The 'userp' pointer is the
310 custom pointer we set to point to a struct of ours to pass private data
311 between the application and the callback.
312
313 curl_easy_setopt(easyhandle, CURLOPT_READFUNCTION, read_function);
314
315 curl_easy_setopt(easyhandle, CURLOPT_READDATA, &filedata);
316
317 Tell libcurl that we want to upload:
318
319 curl_easy_setopt(easyhandle, CURLOPT_UPLOAD, 1L);
320
321 A few protocols won't behave properly when uploads are done without any prior
322 knowledge of the expected file size. So, set the upload file size using the
323 \fICURLOPT_INFILESIZE_LARGE(3)\fP for all known file sizes like this[1]:
324
325 .nf
326 /* in this example, file_size must be an curl_off_t variable */
327 curl_easy_setopt(easyhandle, CURLOPT_INFILESIZE_LARGE, file_size);
328 .fi
329
330 When you call \fIcurl_easy_perform(3)\fP this time, it'll perform all the
331 necessary operations and when it has invoked the upload it'll call your
332 supplied callback to get the data to upload. The program should return as much
333 data as possible in every invoke, as that is likely to make the upload perform
334 as fast as possible. The callback should return the number of bytes it wrote
335 in the buffer. Returning 0 will signal the end of the upload.
336
337 .SH "Passwords"
338 Many protocols use or even require that user name and password are provided
339 to be able to download or upload the data of your choice. libcurl offers
340 several ways to specify them.
341
342 Most protocols support that you specify the name and password in the URL
343 itself. libcurl will detect this and use them accordingly. This is written
344 like this:
345
346 protocol://user:password@example.com/path/
347
348 If you need any odd letters in your user name or password, you should enter
349 them URL encoded, as %XX where XX is a two-digit hexadecimal number.
350
351 libcurl also provides options to set various passwords. The user name and
352 password as shown embedded in the URL can instead get set with the
353 \fICURLOPT_USERPWD(3)\fP option. The argument passed to libcurl should be a
354 char * to a string in the format "user:password". In a manner like this:
355
356 curl_easy_setopt(easyhandle, CURLOPT_USERPWD, "myname:thesecret");
357
358 Another case where name and password might be needed at times, is for those
359 users who need to authenticate themselves to a proxy they use. libcurl offers
360 another option for this, the \fICURLOPT_PROXYUSERPWD(3)\fP. It is used quite
361 similar to the \fICURLOPT_USERPWD(3)\fP option like this:
362
363 curl_easy_setopt(easyhandle, CURLOPT_PROXYUSERPWD, "myname:thesecret");
364
365 There's a long time Unix "standard" way of storing FTP user names and
366 passwords, namely in the $HOME/.netrc file. The file should be made private
367 so that only the user may read it (see also the "Security Considerations"
368 chapter), as it might contain the password in plain text. libcurl has the
369 ability to use this file to figure out what set of user name and password to
370 use for a particular host. As an extension to the normal functionality,
371 libcurl also supports this file for non-FTP protocols such as HTTP. To make
372 curl use this file, use the \fICURLOPT_NETRC(3)\fP option:
373
374 curl_easy_setopt(easyhandle, CURLOPT_NETRC, 1L);
375
376 And a very basic example of how such a .netrc file may look like:
377
378 .nf
379 machine myhost.mydomain.com
380 login userlogin
381 password secretword
382 .fi
383
384 All these examples have been cases where the password has been optional, or
385 at least you could leave it out and have libcurl attempt to do its job
386 without it. There are times when the password isn't optional, like when
387 you're using an SSL private key for secure transfers.
388
389 To pass the known private key password to libcurl:
390
391 curl_easy_setopt(easyhandle, CURLOPT_KEYPASSWD, "keypassword");
392
393 .SH "HTTP Authentication"
394 The previous chapter showed how to set user name and password for getting
395 URLs that require authentication. When using the HTTP protocol, there are
396 many different ways a client can provide those credentials to the server and
397 you can control which way libcurl will (attempt to) use them. The default HTTP
398 authentication method is called 'Basic', which is sending the name and
399 password in clear-text in the HTTP request, base64-encoded. This is insecure.
400
401 At the time of this writing, libcurl can be built to use: Basic, Digest, NTLM,
402 Negotiate (SPNEGO). You can tell libcurl which one to use
403 with \fICURLOPT_HTTPAUTH(3)\fP as in:
404
405 curl_easy_setopt(easyhandle, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST);
406
407 And when you send authentication to a proxy, you can also set authentication
408 type the same way but instead with \fICURLOPT_PROXYAUTH(3)\fP:
409
410 curl_easy_setopt(easyhandle, CURLOPT_PROXYAUTH, CURLAUTH_NTLM);
411
412 Both these options allow you to set multiple types (by ORing them together),
413 to make libcurl pick the most secure one out of the types the server/proxy
414 claims to support. This method does however add a round-trip since libcurl
415 must first ask the server what it supports:
416
417 curl_easy_setopt(easyhandle, CURLOPT_HTTPAUTH,
418 CURLAUTH_DIGEST|CURLAUTH_BASIC);
419
420 For convenience, you can use the 'CURLAUTH_ANY' define (instead of a list
421 with specific types) which allows libcurl to use whatever method it wants.
422
423 When asking for multiple types, libcurl will pick the available one it
424 considers "best" in its own internal order of preference.
425
426 .SH "HTTP POSTing"
427 We get many questions regarding how to issue HTTP POSTs with libcurl the
428 proper way. This chapter will thus include examples using both different
429 versions of HTTP POST that libcurl supports.
430
431 The first version is the simple POST, the most common version, that most HTML
432 pages using the <form> tag uses. We provide a pointer to the data and tell
433 libcurl to post it all to the remote site:
434
435 .nf
436 char *data="name=daniel&project=curl";
437 curl_easy_setopt(easyhandle, CURLOPT_POSTFIELDS, data);
438 curl_easy_setopt(easyhandle, CURLOPT_URL, "http://posthere.com/");
439
440 curl_easy_perform(easyhandle); /* post away! */
441 .fi
442
443 Simple enough, huh? Since you set the POST options with the
444 \fICURLOPT_POSTFIELDS(3)\fP, this automatically switches the handle to use
445 POST in the upcoming request.
446
447 Ok, so what if you want to post binary data that also requires you to set the
448 Content-Type: header of the post? Well, binary posts prevent libcurl from
449 being able to do strlen() on the data to figure out the size, so therefore we
450 must tell libcurl the size of the post data. Setting headers in libcurl
451 requests are done in a generic way, by building a list of our own headers and
452 then passing that list to libcurl.
453
454 .nf
455 struct curl_slist *headers=NULL;
456 headers = curl_slist_append(headers, "Content-Type: text/xml");
457
458 /* post binary data */
459 curl_easy_setopt(easyhandle, CURLOPT_POSTFIELDS, binaryptr);
460
461 /* set the size of the postfields data */
462 curl_easy_setopt(easyhandle, CURLOPT_POSTFIELDSIZE, 23L);
463
464 /* pass our list of custom made headers */
465 curl_easy_setopt(easyhandle, CURLOPT_HTTPHEADER, headers);
466
467 curl_easy_perform(easyhandle); /* post away! */
468
469 curl_slist_free_all(headers); /* free the header list */
470 .fi
471
472 While the simple examples above cover the majority of all cases where HTTP
473 POST operations are required, they don't do multi-part formposts. Multi-part
474 formposts were introduced as a better way to post (possibly large) binary data
475 and were first documented in the RFC1867 (updated in RFC2388). They're called
476 multi-part because they're built by a chain of parts, each part being a single
477 unit of data. Each part has its own name and contents. You can in fact create
478 and post a multi-part formpost with the regular libcurl POST support described
479 above, but that would require that you build a formpost yourself and provide
480 to libcurl. To make that easier, libcurl provides a MIME API consisting in
481 several functions: using those, you can create and fill a multi-part form.
482 Function \fIcurl_mime_init(3)\fP creates a multi-part body; you can then
483 append new parts to a multi-part body using \fIcurl_mime_addpart(3)\fP.
484 There are three possible data sources for a part: memory using
485 \fIcurl_mime_data(3)\fP, file using \fIcurl_mime_filedata(3)\fP and
486 user-defined data read callback using \fIcurl_mime_data_cb(3)\fP.
487 \fIcurl_mime_name(3)\fP sets a part's (i.e.: form field) name, while
488 \fIcurl_mime_filename(3)\fP fills in the remote file name. With
489 \fIcurl_mime_type(3)\fP, you can tell the MIME type of a part,
490 \fIcurl_mime_headers(3)\fP allows defining the part's headers. When a
491 multi-part body is no longer needed, you can destroy it using
492 \fIcurl_mime_free(3)\fP.
493
494 The following example sets two simple text parts with plain textual contents,
495 and then a file with binary contents and uploads the whole thing.
496
497 .nf
498 curl_mime *multipart = curl_mime_init(easyhandle);
499 curl_mimepart *part = curl_mime_addpart(multipart);
500 curl_mime_name(part, "name");
501 curl_mime_data(part, "daniel", CURL_ZERO_TERMINATED);
502 part = curl_mime_addpart(multipart);
503 curl_mime_name(part, "project");
504 curl_mime_data(part, "curl", CURL_ZERO_TERMINATED);
505 part = curl_mime_addpart(multipart);
506 curl_mime_name(part, "logotype-image");
507 curl_mime_filedata(part, "curl.png");
508
509 /* Set the form info */
510 curl_easy_setopt(easyhandle, CURLOPT_MIMEPOST, multipart);
511
512 curl_easy_perform(easyhandle); /* post away! */
513
514 /* free the post data again */
515 curl_mime_free(multipart);
516 .fi
517
518 To post multiple files for a single form field, you must supply each file in
519 a separate part, all with the same field name. Although function
520 \fIcurl_mime_subparts(3)\fP implements nested multi-parts, this way of
521 multiple files posting is deprecated by RFC 7578, chapter 4.3.
522
523 To set the data source from an already opened FILE pointer, use:
524
525 .nf
526 curl_mime_data_cb(part, filesize, (curl_read_callback) fread,
527 (curl_seek_callback) fseek, NULL, filepointer);
528 .fi
529
530 A deprecated \fIcurl_formadd(3)\fP function is still supported in libcurl.
531 It should however not be used anymore for new designs and programs using it
532 ought to be converted to the MIME API. It is however described here as an
533 aid to conversion.
534
535 Using \fIcurl_formadd\fP, you add parts to the form. When you're done adding
536 parts, you post the whole form.
537
538 The MIME API example above is expressed as follows using this function:
539
540 .nf
541 struct curl_httppost *post=NULL;
542 struct curl_httppost *last=NULL;
543 curl_formadd(&post, &last,
544 CURLFORM_COPYNAME, "name",
545 CURLFORM_COPYCONTENTS, "daniel", CURLFORM_END);
546 curl_formadd(&post, &last,
547 CURLFORM_COPYNAME, "project",
548 CURLFORM_COPYCONTENTS, "curl", CURLFORM_END);
549 curl_formadd(&post, &last,
550 CURLFORM_COPYNAME, "logotype-image",
551 CURLFORM_FILECONTENT, "curl.png", CURLFORM_END);
552
553 /* Set the form info */
554 curl_easy_setopt(easyhandle, CURLOPT_HTTPPOST, post);
555
556 curl_easy_perform(easyhandle); /* post away! */
557
558 /* free the post data again */
559 curl_formfree(post);
560 .fi
561
562 Multipart formposts are chains of parts using MIME-style separators and
563 headers. It means that each one of these separate parts get a few headers set
564 that describe the individual content-type, size etc. To enable your
565 application to handicraft this formpost even more, libcurl allows you to
566 supply your own set of custom headers to such an individual form part. You can
567 of course supply headers to as many parts as you like, but this little example
568 will show how you set headers to one specific part when you add that to the
569 post handle:
570
571 .nf
572 struct curl_slist *headers=NULL;
573 headers = curl_slist_append(headers, "Content-Type: text/xml");
574
575 curl_formadd(&post, &last,
576 CURLFORM_COPYNAME, "logotype-image",
577 CURLFORM_FILECONTENT, "curl.xml",
578 CURLFORM_CONTENTHEADER, headers,
579 CURLFORM_END);
580
581 curl_easy_perform(easyhandle); /* post away! */
582
583 curl_formfree(post); /* free post */
584 curl_slist_free_all(headers); /* free custom header list */
585 .fi
586
587 Since all options on an easyhandle are "sticky", they remain the same until
588 changed even if you do call \fIcurl_easy_perform(3)\fP, you may need to tell
589 curl to go back to a plain GET request if you intend to do one as your next
590 request. You force an easyhandle to go back to GET by using the
591 \fICURLOPT_HTTPGET(3)\fP option:
592
593 curl_easy_setopt(easyhandle, CURLOPT_HTTPGET, 1L);
594
595 Just setting \fICURLOPT_POSTFIELDS(3)\fP to "" or NULL will *not* stop libcurl
596 from doing a POST. It will just make it POST without any data to send!
597
598 .SH "Converting from deprecated form API to MIME API"
599 Four rules have to be respected in building the multi-part:
600 .br
601 - The easy handle must be created before building the multi-part.
602 .br
603 - The multi-part is always created by a call to curl_mime_init(easyhandle).
604 .br
605 - Each part is created by a call to curl_mime_addpart(multipart).
606 .br
607 - When complete, the multi-part must be bound to the easy handle using
608 \fICURLOPT_MIMEPOST(3)\fP instead of \fICURLOPT_HTTPPOST(3)\fP.
609
610 Here are some example of \fIcurl_formadd\fP calls to MIME API sequences:
611
612 .nf
613 curl_formadd(&post, &last,
614 CURLFORM_COPYNAME, "id",
615 CURLFORM_COPYCONTENTS, "daniel", CURLFORM_END);
616 CURLFORM_CONTENTHEADER, headers,
617 CURLFORM_END);
618 .fi
619 becomes:
620 .nf
621 part = curl_mime_addpart(multipart);
622 curl_mime_name(part, "id");
623 curl_mime_data(part, "daniel", CURL_ZERO_TERMINATED);
624 curl_mime_headers(part, headers, FALSE);
625 .fi
626
627 Setting the last \fIcurl_mime_headers\fP argument to TRUE would have caused
628 the headers to be automatically released upon destroyed the multi-part, thus
629 saving a clean-up call to \fIcurl_slist_free_all(3)\fP.
630
631 .nf
632 curl_formadd(&post, &last,
633 CURLFORM_PTRNAME, "logotype-image",
634 CURLFORM_FILECONTENT, "-",
635 CURLFORM_END);
636 .fi
637 becomes:
638 .nf
639 part = curl_mime_addpart(multipart);
640 curl_mime_name(part, "logotype-image");
641 curl_mime_data_cb(part, (curl_off_t) -1, fread, fseek, NULL, stdin);
642 .fi
643
644 \fIcurl_mime_name\fP always copies the field name. The special file name "-"
645 is not supported by \fIcurl_mime_file\fP: to read an open file, use
646 a callback source using fread(). The transfer will be chunked since the data
647 size is unknown.
648
649 .nf
650 curl_formadd(&post, &last,
651 CURLFORM_COPYNAME, "datafile[]",
652 CURLFORM_FILE, "file1",
653 CURLFORM_FILE, "file2",
654 CURLFORM_END);
655 .fi
656 becomes:
657 .nf
658 part = curl_mime_addpart(multipart);
659 curl_mime_name(part, "datafile[]");
660 curl_mime_filedata(part, "file1");
661 part = curl_mime_addpart(multipart);
662 curl_mime_name(part, "datafile[]");
663 curl_mime_filedata(part, "file2");
664 .fi
665
666 The deprecated multipart/mixed implementation of multiple files field is
667 translated to two distinct parts with the same name.
668
669 .nf
670 curl_easy_setopt(easyhandle, CURLOPT_READFUNCTION, myreadfunc);
671 curl_formadd(&post, &last,
672 CURLFORM_COPYNAME, "stream",
673 CURLFORM_STREAM, arg,
674 CURLFORM_CONTENTLEN, (curl_off_t) datasize,
675 CURLFORM_FILENAME, "archive.zip",
676 CURLFORM_CONTENTTYPE, "application/zip",
677 CURLFORM_END);
678 .fi
679 becomes:
680 .nf
681 part = curl_mime_addpart(multipart);
682 curl_mime_name(part, "stream");
683 curl_mime_data_cb(part, (curl_off_t) datasize,
684 myreadfunc, NULL, NULL, arg);
685 curl_mime_filename(part, "archive.zip");
686 curl_mime_type(part, "application/zip");
687 .fi
688
689 \fICURLOPT_READFUNCTION\fP callback is not used: it is replace by directly
690 setting the part source data from the callback read function.
691
692 .nf
693 curl_formadd(&post, &last,
694 CURLFORM_COPYNAME, "memfile",
695 CURLFORM_BUFFER, "memfile.bin",
696 CURLFORM_BUFFERPTR, databuffer,
697 CURLFORM_BUFFERLENGTH, (long) sizeof databuffer,
698 CURLFORM_END);
699 .fi
700 becomes:
701 .nf
702 part = curl_mime_addpart(multipart);
703 curl_mime_name(part, "memfile");
704 curl_mime_data(part, databuffer, (curl_off_t) sizeof databuffer);
705 curl_mime_filename(part, "memfile.bin");
706 .fi
707
708 \fIcurl_mime_data\fP always copies the initial data: data buffer is thus
709 free for immediate reuse.
710
711 .nf
712 curl_formadd(&post, &last,
713 CURLFORM_COPYNAME, "message",
714 CURLFORM_FILECONTENT, "msg.txt",
715 CURLFORM_END);
716 .fi
717 becomes:
718 .nf
719 part = curl_mime_addpart(multipart);
720 curl_mime_name(part, "message");
721 curl_mime_filedata(part, "msg.txt");
722 curl_mime_filename(part, NULL);
723 .fi
724
725 Use of \fIcurl_mime_filedata\fP sets the remote file name as a side effect: it
726 is therefore necessary to clear it for \fICURLFORM_FILECONTENT\fP emulation.
727
728 .SH "Showing Progress"
729
730 For historical and traditional reasons, libcurl has a built-in progress meter
731 that can be switched on and then makes it present a progress meter in your
732 terminal.
733
734 Switch on the progress meter by, oddly enough, setting
735 \fICURLOPT_NOPROGRESS(3)\fP to zero. This option is set to 1 by default.
736
737 For most applications however, the built-in progress meter is useless and
738 what instead is interesting is the ability to specify a progress
739 callback. The function pointer you pass to libcurl will then be called on
740 irregular intervals with information about the current transfer.
741
742 Set the progress callback by using \fICURLOPT_PROGRESSFUNCTION(3)\fP. And pass
743 a pointer to a function that matches this prototype:
744
745 .nf
746 int progress_callback(void *clientp,
747 double dltotal,
748 double dlnow,
749 double ultotal,
750 double ulnow);
751 .fi
752
753 If any of the input arguments is unknown, a 0 will be passed. The first
754 argument, the 'clientp' is the pointer you pass to libcurl with
755 \fICURLOPT_PROGRESSDATA(3)\fP. libcurl won't touch it.
756
757 .SH "libcurl with C++"
758
759 There's basically only one thing to keep in mind when using C++ instead of C
760 when interfacing libcurl:
761
762 The callbacks CANNOT be non-static class member functions
763
764 Example C++ code:
765
766 .nf
767 class AClass {
768 static size_t write_data(void *ptr, size_t size, size_t nmemb,
769 void *ourpointer)
770 {
771 /* do what you want with the data */
772 }
773 }
774 .fi
775
776 .SH "Proxies"
777
778 What "proxy" means according to Merriam-Webster: "a person authorized to act
779 for another" but also "the agency, function, or office of a deputy who acts as
780 a substitute for another".
781
782 Proxies are exceedingly common these days. Companies often only offer Internet
783 access to employees through their proxies. Network clients or user-agents ask
784 the proxy for documents, the proxy does the actual request and then it returns
785 them.
786
787 libcurl supports SOCKS and HTTP proxies. When a given URL is wanted, libcurl
788 will ask the proxy for it instead of trying to connect to the actual host
789 identified in the URL.
790
791 If you're using a SOCKS proxy, you may find that libcurl doesn't quite support
792 all operations through it.
793
794 For HTTP proxies: the fact that the proxy is an HTTP proxy puts certain
795 restrictions on what can actually happen. A requested URL that might not be a
796 HTTP URL will be still be passed to the HTTP proxy to deliver back to
797 libcurl. This happens transparently, and an application may not need to
798 know. I say "may", because at times it is very important to understand that
799 all operations over an HTTP proxy use the HTTP protocol. For example, you
800 can't invoke your own custom FTP commands or even proper FTP directory
801 listings.
802
803 .IP "Proxy Options"
804
805 To tell libcurl to use a proxy at a given port number:
806
807 curl_easy_setopt(easyhandle, CURLOPT_PROXY, "proxy-host.com:8080");
808
809 Some proxies require user authentication before allowing a request, and you
810 pass that information similar to this:
811
812 curl_easy_setopt(easyhandle, CURLOPT_PROXYUSERPWD, "user:password");
813
814 If you want to, you can specify the host name only in the
815 \fICURLOPT_PROXY(3)\fP option, and set the port number separately with
816 \fICURLOPT_PROXYPORT(3)\fP.
817
818 Tell libcurl what kind of proxy it is with \fICURLOPT_PROXYTYPE(3)\fP (if not,
819 it will default to assume an HTTP proxy):
820
821 curl_easy_setopt(easyhandle, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS4);
822
823 .IP "Environment Variables"
824
825 libcurl automatically checks and uses a set of environment variables to know
826 what proxies to use for certain protocols. The names of the variables are
827 following an ancient de facto standard and are built up as "[protocol]_proxy"
828 (note the lower casing). Which makes the variable \&'http_proxy' checked for a
829 name of a proxy to use when the input URL is HTTP. Following the same rule,
830 the variable named 'ftp_proxy' is checked for FTP URLs. Again, the proxies are
831 always HTTP proxies, the different names of the variables simply allows
832 different HTTP proxies to be used.
833
834 The proxy environment variable contents should be in the format
835 \&"[protocol://][user:password@]machine[:port]". Where the protocol:// part is
836 simply ignored if present (so http://proxy and bluerk://proxy will do the
837 same) and the optional port number specifies on which port the proxy operates
838 on the host. If not specified, the internal default port number will be used
839 and that is most likely *not* the one you would like it to be.
840
841 There are two special environment variables. 'all_proxy' is what sets proxy
842 for any URL in case the protocol specific variable wasn't set, and
843 \&'no_proxy' defines a list of hosts that should not use a proxy even though a
844 variable may say so. If 'no_proxy' is a plain asterisk ("*") it matches all
845 hosts.
846
847 To explicitly disable libcurl's checking for and using the proxy environment
848 variables, set the proxy name to "" - an empty string - with
849 \fICURLOPT_PROXY(3)\fP.
850 .IP "SSL and Proxies"
851
852 SSL is for secure point-to-point connections. This involves strong encryption
853 and similar things, which effectively makes it impossible for a proxy to
854 operate as a "man in between" which the proxy's task is, as previously
855 discussed. Instead, the only way to have SSL work over an HTTP proxy is to ask
856 the proxy to tunnel trough everything without being able to check or fiddle
857 with the traffic.
858
859 Opening an SSL connection over an HTTP proxy is therefore a matter of asking the
860 proxy for a straight connection to the target host on a specified port. This
861 is made with the HTTP request CONNECT. ("please mr proxy, connect me to that
862 remote host").
863
864 Because of the nature of this operation, where the proxy has no idea what kind
865 of data that is passed in and out through this tunnel, this breaks some of the
866 very few advantages that come from using a proxy, such as caching. Many
867 organizations prevent this kind of tunneling to other destination port numbers
868 than 443 (which is the default HTTPS port number).
869
870 .IP "Tunneling Through Proxy"
871 As explained above, tunneling is required for SSL to work and often even
872 restricted to the operation intended for SSL; HTTPS.
873
874 This is however not the only time proxy-tunneling might offer benefits to
875 you or your application.
876
877 As tunneling opens a direct connection from your application to the remote
878 machine, it suddenly also re-introduces the ability to do non-HTTP
879 operations over an HTTP proxy. You can in fact use things such as FTP
880 upload or FTP custom commands this way.
881
882 Again, this is often prevented by the administrators of proxies and is
883 rarely allowed.
884
885 Tell libcurl to use proxy tunneling like this:
886
887 curl_easy_setopt(easyhandle, CURLOPT_HTTPPROXYTUNNEL, 1L);
888
889 In fact, there might even be times when you want to do plain HTTP
890 operations using a tunnel like this, as it then enables you to operate on
891 the remote server instead of asking the proxy to do so. libcurl will not
892 stand in the way for such innovative actions either!
893
894 .IP "Proxy Auto-Config"
895
896 Netscape first came up with this. It is basically a web page (usually using a
897 \&.pac extension) with a Javascript that when executed by the browser with the
898 requested URL as input, returns information to the browser on how to connect
899 to the URL. The returned information might be "DIRECT" (which means no proxy
900 should be used), "PROXY host:port" (to tell the browser where the proxy for
901 this particular URL is) or "SOCKS host:port" (to direct the browser to a SOCKS
902 proxy).
903
904 libcurl has no means to interpret or evaluate Javascript and thus it doesn't
905 support this. If you get yourself in a position where you face this nasty
906 invention, the following advice have been mentioned and used in the past:
907
908 - Depending on the Javascript complexity, write up a script that translates it
909 to another language and execute that.
910
911 - Read the Javascript code and rewrite the same logic in another language.
912
913 - Implement a Javascript interpreter; people have successfully used the
914 Mozilla Javascript engine in the past.
915
916 - Ask your admins to stop this, for a static proxy setup or similar.
917
918 .SH "Persistence Is The Way to Happiness"
919
920 Re-cycling the same easy handle several times when doing multiple requests is
921 the way to go.
922
923 After each single \fIcurl_easy_perform(3)\fP operation, libcurl will keep the
924 connection alive and open. A subsequent request using the same easy handle to
925 the same host might just be able to use the already open connection! This
926 reduces network impact a lot.
927
928 Even if the connection is dropped, all connections involving SSL to the same
929 host again, will benefit from libcurl's session ID cache that drastically
930 reduces re-connection time.
931
932 FTP connections that are kept alive save a lot of time, as the command-
933 response round-trips are skipped, and also you don't risk getting blocked
934 without permission to login again like on many FTP servers only allowing N
935 persons to be logged in at the same time.
936
937 libcurl caches DNS name resolving results, to make lookups of a previously
938 looked up name a lot faster.
939
940 Other interesting details that improve performance for subsequent requests
941 may also be added in the future.
942
943 Each easy handle will attempt to keep the last few connections alive for a
944 while in case they are to be used again. You can set the size of this "cache"
945 with the \fICURLOPT_MAXCONNECTS(3)\fP option. Default is 5. There is very
946 seldom any point in changing this value, and if you think of changing this it
947 is often just a matter of thinking again.
948
949 To force your upcoming request to not use an already existing connection (it
950 will even close one first if there happens to be one alive to the same host
951 you're about to operate on), you can do that by setting
952 \fICURLOPT_FRESH_CONNECT(3)\fP to 1. In a similar spirit, you can also forbid
953 the upcoming request to be "lying" around and possibly get re-used after the
954 request by setting \fICURLOPT_FORBID_REUSE(3)\fP to 1.
955
956 .SH "HTTP Headers Used by libcurl"
957 When you use libcurl to do HTTP requests, it'll pass along a series of headers
958 automatically. It might be good for you to know and understand these. You
959 can replace or remove them by using the \fICURLOPT_HTTPHEADER(3)\fP option.
960
961 .IP "Host"
962 This header is required by HTTP 1.1 and even many 1.0 servers and should be
963 the name of the server we want to talk to. This includes the port number if
964 anything but default.
965
966 .IP "Accept"
967 \&"*/*".
968
969 .IP "Expect"
970 When doing POST requests, libcurl sets this header to \&"100-continue" to ask
971 the server for an "OK" message before it proceeds with sending the data part
972 of the post. If the POSTed data amount is deemed "small", libcurl will not use
973 this header.
974
975 .SH "Customizing Operations"
976 There is an ongoing development today where more and more protocols are built
977 upon HTTP for transport. This has obvious benefits as HTTP is a tested and
978 reliable protocol that is widely deployed and has excellent proxy-support.
979
980 When you use one of these protocols, and even when doing other kinds of
981 programming you may need to change the traditional HTTP (or FTP or...)
982 manners. You may need to change words, headers or various data.
983
984 libcurl is your friend here too.
985
986 .IP CUSTOMREQUEST
987 If just changing the actual HTTP request keyword is what you want, like when
988 GET, HEAD or POST is not good enough for you, \fICURLOPT_CUSTOMREQUEST(3)\fP
989 is there for you. It is very simple to use:
990
991 curl_easy_setopt(easyhandle, CURLOPT_CUSTOMREQUEST, "MYOWNREQUEST");
992
993 When using the custom request, you change the request keyword of the actual
994 request you are performing. Thus, by default you make a GET request but you can
995 also make a POST operation (as described before) and then replace the POST
996 keyword if you want to. You're the boss.
997
998 .IP "Modify Headers"
999 HTTP-like protocols pass a series of headers to the server when doing the
1000 request, and you're free to pass any amount of extra headers that you
1001 think fit. Adding headers is this easy:
1002
1003 .nf
1004 struct curl_slist *headers=NULL; /* init to NULL is important */
1005
1006 headers = curl_slist_append(headers, "Hey-server-hey: how are you?");
1007 headers = curl_slist_append(headers, "X-silly-content: yes");
1008
1009 /* pass our list of custom made headers */
1010 curl_easy_setopt(easyhandle, CURLOPT_HTTPHEADER, headers);
1011
1012 curl_easy_perform(easyhandle); /* transfer http */
1013
1014 curl_slist_free_all(headers); /* free the header list */
1015 .fi
1016
1017 \&... and if you think some of the internally generated headers, such as
1018 Accept: or Host: don't contain the data you want them to contain, you can
1019 replace them by simply setting them too:
1020
1021 .nf
1022 headers = curl_slist_append(headers, "Accept: Agent-007");
1023 headers = curl_slist_append(headers, "Host: munged.host.line");
1024 .fi
1025
1026 .IP "Delete Headers"
1027 If you replace an existing header with one with no contents, you will prevent
1028 the header from being sent. For instance, if you want to completely prevent the
1029 \&"Accept:" header from being sent, you can disable it with code similar to this:
1030
1031 headers = curl_slist_append(headers, "Accept:");
1032
1033 Both replacing and canceling internal headers should be done with careful
1034 consideration and you should be aware that you may violate the HTTP protocol
1035 when doing so.
1036
1037 .IP "Enforcing chunked transfer-encoding"
1038
1039 By making sure a request uses the custom header "Transfer-Encoding: chunked"
1040 when doing a non-GET HTTP operation, libcurl will switch over to "chunked"
1041 upload, even though the size of the data to upload might be known. By default,
1042 libcurl usually switches over to chunked upload automatically if the upload
1043 data size is unknown.
1044
1045 .IP "HTTP Version"
1046
1047 All HTTP requests includes the version number to tell the server which version
1048 we support. libcurl speaks HTTP 1.1 by default. Some very old servers don't
1049 like getting 1.1-requests and when dealing with stubborn old things like that,
1050 you can tell libcurl to use 1.0 instead by doing something like this:
1051
1052 curl_easy_setopt(easyhandle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
1053
1054 .IP "FTP Custom Commands"
1055
1056 Not all protocols are HTTP-like, and thus the above may not help you when
1057 you want to make, for example, your FTP transfers to behave differently.
1058
1059 Sending custom commands to an FTP server means that you need to send the
1060 commands exactly as the FTP server expects them (RFC959 is a good guide
1061 here), and you can only use commands that work on the control-connection
1062 alone. All kinds of commands that require data interchange and thus need
1063 a data-connection must be left to libcurl's own judgement. Also be aware
1064 that libcurl will do its very best to change directory to the target
1065 directory before doing any transfer, so if you change directory (with CWD
1066 or similar) you might confuse libcurl and then it might not attempt to
1067 transfer the file in the correct remote directory.
1068
1069 A little example that deletes a given file before an operation:
1070
1071 .nf
1072 headers = curl_slist_append(headers, "DELE file-to-remove");
1073
1074 /* pass the list of custom commands to the handle */
1075 curl_easy_setopt(easyhandle, CURLOPT_QUOTE, headers);
1076
1077 curl_easy_perform(easyhandle); /* transfer ftp data! */
1078
1079 curl_slist_free_all(headers); /* free the header list */
1080 .fi
1081
1082 If you would instead want this operation (or chain of operations) to happen
1083 _after_ the data transfer took place the option to \fIcurl_easy_setopt(3)\fP
1084 would instead be called \fICURLOPT_POSTQUOTE(3)\fP and used the exact same
1085 way.
1086
1087 The custom FTP command will be issued to the server in the same order they are
1088 added to the list, and if a command gets an error code returned back from the
1089 server, no more commands will be issued and libcurl will bail out with an
1090 error code (CURLE_QUOTE_ERROR). Note that if you use \fICURLOPT_QUOTE(3)\fP to
1091 send commands before a transfer, no transfer will actually take place when a
1092 quote command has failed.
1093
1094 If you set the \fICURLOPT_HEADER(3)\fP to 1, you will tell libcurl to get
1095 information about the target file and output "headers" about it. The headers
1096 will be in "HTTP-style", looking like they do in HTTP.
1097
1098 The option to enable headers or to run custom FTP commands may be useful to
1099 combine with \fICURLOPT_NOBODY(3)\fP. If this option is set, no actual file
1100 content transfer will be performed.
1101
1102 .IP "FTP Custom CUSTOMREQUEST"
1103 If you do want to list the contents of an FTP directory using your own defined
1104 FTP command, \fICURLOPT_CUSTOMREQUEST(3)\fP will do just that. "NLST" is the
1105 default one for listing directories but you're free to pass in your idea of a
1106 good alternative.
1107
1108 .SH "Cookies Without Chocolate Chips"
1109 In the HTTP sense, a cookie is a name with an associated value. A server sends
1110 the name and value to the client, and expects it to get sent back on every
1111 subsequent request to the server that matches the particular conditions
1112 set. The conditions include that the domain name and path match and that the
1113 cookie hasn't become too old.
1114
1115 In real-world cases, servers send new cookies to replace existing ones to
1116 update them. Server use cookies to "track" users and to keep "sessions".
1117
1118 Cookies are sent from server to clients with the header Set-Cookie: and
1119 they're sent from clients to servers with the Cookie: header.
1120
1121 To just send whatever cookie you want to a server, you can use
1122 \fICURLOPT_COOKIE(3)\fP to set a cookie string like this:
1123
1124 curl_easy_setopt(easyhandle, CURLOPT_COOKIE, "name1=var1; name2=var2;");
1125
1126 In many cases, that is not enough. You might want to dynamically save
1127 whatever cookies the remote server passes to you, and make sure those cookies
1128 are then used accordingly on later requests.
1129
1130 One way to do this, is to save all headers you receive in a plain file and
1131 when you make a request, you tell libcurl to read the previous headers to
1132 figure out which cookies to use. Set the header file to read cookies from with
1133 \fICURLOPT_COOKIEFILE(3)\fP.
1134
1135 The \fICURLOPT_COOKIEFILE(3)\fP option also automatically enables the cookie
1136 parser in libcurl. Until the cookie parser is enabled, libcurl will not parse
1137 or understand incoming cookies and they will just be ignored. However, when
1138 the parser is enabled the cookies will be understood and the cookies will be
1139 kept in memory and used properly in subsequent requests when the same handle
1140 is used. Many times this is enough, and you may not have to save the cookies
1141 to disk at all. Note that the file you specify to \fICURLOPT_COOKIEFILE(3)\fP
1142 doesn't have to exist to enable the parser, so a common way to just enable the
1143 parser and not read any cookies is to use the name of a file you know doesn't
1144 exist.
1145
1146 If you would rather use existing cookies that you've previously received with
1147 your Netscape or Mozilla browsers, you can make libcurl use that cookie file
1148 as input. The \fICURLOPT_COOKIEFILE(3)\fP is used for that too, as libcurl
1149 will automatically find out what kind of file it is and act accordingly.
1150
1151 Perhaps the most advanced cookie operation libcurl offers, is saving the
1152 entire internal cookie state back into a Netscape/Mozilla formatted cookie
1153 file. We call that the cookie-jar. When you set a file name with
1154 \fICURLOPT_COOKIEJAR(3)\fP, that file name will be created and all received
1155 cookies will be stored in it when \fIcurl_easy_cleanup(3)\fP is called. This
1156 enables cookies to get passed on properly between multiple handles without any
1157 information getting lost.
1158
1159 .SH "FTP Peculiarities We Need"
1160
1161 FTP transfers use a second TCP/IP connection for the data transfer. This is
1162 usually a fact you can forget and ignore but at times this fact will come
1163 back to haunt you. libcurl offers several different ways to customize how the
1164 second connection is being made.
1165
1166 libcurl can either connect to the server a second time or tell the server to
1167 connect back to it. The first option is the default and it is also what works
1168 best for all the people behind firewalls, NATs or IP-masquerading setups.
1169 libcurl then tells the server to open up a new port and wait for a second
1170 connection. This is by default attempted with EPSV first, and if that doesn't
1171 work it tries PASV instead. (EPSV is an extension to the original FTP spec
1172 and does not exist nor work on all FTP servers.)
1173
1174 You can prevent libcurl from first trying the EPSV command by setting
1175 \fICURLOPT_FTP_USE_EPSV(3)\fP to zero.
1176
1177 In some cases, you will prefer to have the server connect back to you for the
1178 second connection. This might be when the server is perhaps behind a firewall
1179 or something and only allows connections on a single port. libcurl then
1180 informs the remote server which IP address and port number to connect to.
1181 This is made with the \fICURLOPT_FTPPORT(3)\fP option. If you set it to "-",
1182 libcurl will use your system's "default IP address". If you want to use a
1183 particular IP, you can set the full IP address, a host name to resolve to an
1184 IP address or even a local network interface name that libcurl will get the IP
1185 address from.
1186
1187 When doing the "PORT" approach, libcurl will attempt to use the EPRT and the
1188 LPRT before trying PORT, as they work with more protocols. You can disable
1189 this behavior by setting \fICURLOPT_FTP_USE_EPRT(3)\fP to zero.
1190
1191 .SH "MIME API revisited for SMTP and IMAP"
1192 In addition to support HTTP multi-part form fields, the MIME API can be used
1193 to build structured e-mail messages and send them via SMTP or append such
1194 messages to IMAP directories.
1195
1196 A structured e-mail message may contain several parts: some are displayed
1197 inline by the MUA, some are attachments. Parts can also be structured as
1198 multi-part, for example to include another e-mail message or to offer several
1199 text formats alternatives. This can be nested to any level.
1200
1201 To build such a message, you prepare the nth-level multi-part and then include
1202 it as a source to the parent multi-part using function
1203 \fIcurl_mime_subparts(3)\fP. Once it has been
1204 bound to its parent multi-part, a nth-level multi-part belongs to it and
1205 should not be freed explicitly.
1206
1207 E-mail messages data is not supposed to be non-ascii and line length is
1208 limited: fortunately, some transfer encodings are defined by the standards
1209 to support the transmission of such incompatible data. Function
1210 \fIcurl_mime_encoder(3)\fP tells a part that its source data must be encoded
1211 before being sent. It also generates the corresponding header for that part.
1212 If the part data you want to send is already encoded in such a scheme,
1213 do not use this function (this would over-encode it), but explicitly set the
1214 corresponding part header.
1215
1216 Upon sending such a message, libcurl prepends it with the header list
1217 set with \fICURLOPT_HTTPHEADER(3)\fP, as 0th-level mime part headers.
1218
1219 Here is an example building an e-mail message with an inline plain/html text
1220 alternative and a file attachment encoded in base64:
1221
1222 .nf
1223 curl_mime *message = curl_mime_init(easyhandle);
1224
1225 /* The inline part is an alternative proposing the html and the text
1226 versions of the e-mail. */
1227 curl_mime *alt = curl_mime_init(easyhandle);
1228
1229 /* HTML message. */
1230 curl_mimepart *part = curl_mime_addpart(alt);
1231 curl_mime_data(part, "<html><body><p>This is HTML</p></body></html>",
1232 CURL_ZERO_TERMINATED);
1233 curl_mime_type(part, "text/html");
1234
1235 /* Text message. */
1236 part = curl_mime_addpart(alt);
1237 curl_mime_data(part, "This is plain text message",
1238 CURL_ZERO_TERMINATED);
1239
1240 /* Create the inline part. */
1241 part = curl_mime_addpart(message);
1242 curl_mime_subparts(part, alt);
1243 curl_mime_type(part, "multipart/alternative");
1244 struct curl_slist *headers = curl_slist_append(NULL,
1245 "Content-Disposition: inline");
1246 curl_mime_headers(part, headers, TRUE);
1247
1248 /* Add the attachment. */
1249 part = curl_mime_addpart(message);
1250 curl_mime_filedata(part, "manual.pdf");
1251 curl_mime_encoder(part, "base64");
1252
1253 /* Build the mail headers. */
1254 headers = curl_slist_append(NULL, "From: me@example.com");
1255 headers = curl_slist_append(headers, "To: you@example.com");
1256
1257 /* Set these into the easy handle. */
1258 curl_easy_setopt(easyhandle, CURLOPT_HTTPHEADER, headers);
1259 curl_easy_setopt(easyhandle, CURLOPT_MIMEPOST, mime);
1260 .fi
1261
1262 It should be noted that appending a message to an IMAP directory requires
1263 the message size to be known prior upload. It is therefore not possible to
1264 include parts with unknown data size in this context.
1265
1266 .SH "Headers Equal Fun"
1267
1268 Some protocols provide "headers", meta-data separated from the normal
1269 data. These headers are by default not included in the normal data stream, but
1270 you can make them appear in the data stream by setting \fICURLOPT_HEADER(3)\fP
1271 to 1.
1272
1273 What might be even more useful, is libcurl's ability to separate the headers
1274 from the data and thus make the callbacks differ. You can for example set a
1275 different pointer to pass to the ordinary write callback by setting
1276 \fICURLOPT_HEADERDATA(3)\fP.
1277
1278 Or, you can set an entirely separate function to receive the headers, by using
1279 \fICURLOPT_HEADERFUNCTION(3)\fP.
1280
1281 The headers are passed to the callback function one by one, and you can
1282 depend on that fact. It makes it easier for you to add custom header parsers
1283 etc.
1284
1285 \&"Headers" for FTP transfers equal all the FTP server responses. They aren't
1286 actually true headers, but in this case we pretend they are! ;-)
1287
1288 .SH "Post Transfer Information"
1289 See \fIcurl_easy_getinfo(3)\fP.
1290 .SH "The multi Interface"
1291 The easy interface as described in detail in this document is a synchronous
1292 interface that transfers one file at a time and doesn't return until it is
1293 done.
1294
1295 The multi interface, on the other hand, allows your program to transfer
1296 multiple files in both directions at the same time, without forcing you to use
1297 multiple threads. The name might make it seem that the multi interface is for
1298 multi-threaded programs, but the truth is almost the reverse. The multi
1299 interface allows a single-threaded application to perform the same kinds of
1300 multiple, simultaneous transfers that multi-threaded programs can perform. It
1301 allows many of the benefits of multi-threaded transfers without the complexity
1302 of managing and synchronizing many threads.
1303
1304 To complicate matters somewhat more, there are even two versions of the multi
1305 interface. The event based one, also called multi_socket and the "normal one"
1306 designed for using with select(). See the libcurl-multi.3 man page for details
1307 on the multi_socket event based API, this description here is for the select()
1308 oriented one.
1309
1310 To use this interface, you are better off if you first understand the basics
1311 of how to use the easy interface. The multi interface is simply a way to make
1312 multiple transfers at the same time by adding up multiple easy handles into
1313 a "multi stack".
1314
1315 You create the easy handles you want, one for each concurrent transfer, and
1316 you set all the options just like you learned above, and then you create a
1317 multi handle with \fIcurl_multi_init(3)\fP and add all those easy handles to
1318 that multi handle with \fIcurl_multi_add_handle(3)\fP.
1319
1320 When you've added the handles you have for the moment (you can still add new
1321 ones at any time), you start the transfers by calling
1322 \fIcurl_multi_perform(3)\fP.
1323
1324 \fIcurl_multi_perform(3)\fP is asynchronous. It will only perform what can be
1325 done now and then return back control to your program. It is designed to never
1326 block. You need to keep calling the function until all transfers are
1327 completed.
1328
1329 The best usage of this interface is when you do a select() on all possible
1330 file descriptors or sockets to know when to call libcurl again. This also
1331 makes it easy for you to wait and respond to actions on your own application's
1332 sockets/handles. You figure out what to select() for by using
1333 \fIcurl_multi_fdset(3)\fP, that fills in a set of fd_set variables for you
1334 with the particular file descriptors libcurl uses for the moment.
1335
1336 When you then call select(), it'll return when one of the file handles signal
1337 action and you then call \fIcurl_multi_perform(3)\fP to allow libcurl to do
1338 what it wants to do. Take note that libcurl does also feature some time-out
1339 code so we advise you to never use very long timeouts on select() before you
1340 call \fIcurl_multi_perform(3)\fP again. \fIcurl_multi_timeout(3)\fP is
1341 provided to help you get a suitable timeout period.
1342
1343 Another precaution you should use: always call \fIcurl_multi_fdset(3)\fP
1344 immediately before the select() call since the current set of file descriptors
1345 may change in any curl function invoke.
1346
1347 If you want to stop the transfer of one of the easy handles in the stack, you
1348 can use \fIcurl_multi_remove_handle(3)\fP to remove individual easy
1349 handles. Remember that easy handles should be \fIcurl_easy_cleanup(3)\fPed.
1350
1351 When a transfer within the multi stack has finished, the counter of running
1352 transfers (as filled in by \fIcurl_multi_perform(3)\fP) will decrease. When
1353 the number reaches zero, all transfers are done.
1354
1355 \fIcurl_multi_info_read(3)\fP can be used to get information about completed
1356 transfers. It then returns the CURLcode for each easy transfer, to allow you
1357 to figure out success on each individual transfer.
1358
1359 .SH "SSL, Certificates and Other Tricks"
1360
1361 [ seeding, passwords, keys, certificates, ENGINE, ca certs ]
1362
1363 .SH "Sharing Data Between Easy Handles"
1364 You can share some data between easy handles when the easy interface is used,
1365 and some data is share automatically when you use the multi interface.
1366
1367 When you add easy handles to a multi handle, these easy handles will
1368 automatically share a lot of the data that otherwise would be kept on a
1369 per-easy handle basis when the easy interface is used.
1370
1371 The DNS cache is shared between handles within a multi handle, making
1372 subsequent name resolving faster, and the connection pool that is kept to
1373 better allow persistent connections and connection re-use is also shared. If
1374 you're using the easy interface, you can still share these between specific
1375 easy handles by using the share interface, see \fIlibcurl-share(3)\fP.
1376
1377 Some things are never shared automatically, not within multi handles, like for
1378 example cookies so the only way to share that is with the share interface.
1379 .SH "Footnotes"
1380
1381 .IP "[1]"
1382 libcurl 7.10.3 and later have the ability to switch over to chunked
1383 Transfer-Encoding in cases where HTTP uploads are done with data of an unknown
1384 size.
1385 .IP "[2]"
1386 This happens on Windows machines when libcurl is built and used as a
1387 DLL. However, you can still do this on Windows if you link with a static
1388 library.
1389 .IP "[3]"
1390 The curl-config tool is generated at build-time (on Unix-like systems) and
1391 should be installed with the 'make install' or similar instruction that
1392 installs the library, header files, man pages etc.
1393 .IP "[4]"
1394 This behavior was different in versions before 7.17.0, where strings had to
1395 remain valid past the end of the \fIcurl_easy_setopt(3)\fP call.
1396 .SH "SEE ALSO"
1397 .BR libcurl-errors "(3), " libcurl-multi "(3), " libcurl-easy "(3) "