PHP FAQ
[platform/upstream/curl.git] / docs / FAQ
1 Updated: August 18, 2004 (http://curl.haxx.se/docs/faq.html)
2                                   _   _ ____  _
3                               ___| | | |  _ \| |
4                              / __| | | | |_) | |
5                             | (__| |_| |  _ <| |___
6                              \___|\___/|_| \_\_____|
7
8 FAQ
9
10  1. Philosophy
11   1.1 What is cURL?
12   1.2 What is libcurl?
13   1.3 What is cURL not?
14   1.4 When will you make curl do XXXX ?
15   1.5 Who makes cURL?
16   1.6 What do you get for making cURL?
17   1.7 What about CURL from curl.com?
18   1.8 I have a problem who do I mail?
19
20  2. Install Related Problems
21   2.1 configure doesn't find OpenSSL even when it is installed
22    2.1.1 native linker doesn't find OpenSSL
23    2.1.2 only the libssl lib is missing
24   2.2 Does curl work/build with other SSL libraries?
25   2.3 Where can I find a copy of LIBEAY32.DLL?
26   2.4 Does cURL support Socks (RFC 1928) ?
27
28  3. Usage Problems
29   3.1 curl: (1) SSL is disabled, https: not supported
30   3.2 How do I tell curl to resume a transfer?
31   3.3 Why doesn't my posting using -F work?
32   3.4 How do I tell curl to run custom FTP commands?
33   3.5 How can I disable the Pragma: nocache header?
34   3.6 Does curl support ASP, XML, XHTML or HTML version Y?
35   3.7 Can I use curl to delete/rename a file through FTP?
36   3.8 How do I tell curl to follow HTTP redirects?
37   3.9 How do I use curl in my favorite programming language?
38   3.10 What about SOAP, WebDAV, XML-RPC or similar protocols over HTTP?
39   3.11 How do I POST with a different Content-Type?
40   3.12 Why do FTP specific features over HTTP proxy fail?
41   3.13 Why does my single/double quotes fail?
42   3.14 Does curl support javascript or pac (automated proxy config)?
43   3.15 Can I do recursive fetches with curl?
44   3.16 What certificates do I need when I use SSL?
45
46  4. Running Problems
47   4.1 Problems connecting to SSL servers.
48   4.2 Why do I get problems when I use & or % in the URL?
49   4.3 How can I use {, }, [ or ] to specify multiple URLs?
50   4.4 Why do I get downloaded data even though the web page doesn't exist?
51   4.5 Why do I get return code XXX from a HTTP server?
52    4.5.1 "400 Bad Request"
53    4.5.2 "401 Unauthorized"
54    4.5.3 "403 Forbidden"
55    4.5.4 "404 Not Found"
56    4.5.5 "405 Method Not Allowed"
57    4.5.6 "301 Moved Permanently"
58   4.6 Can you tell me what error code 142 means?
59   4.7 How do I keep user names and passwords secret in Curl command lines?
60   4.8 I found a bug!
61   4.9 Curl can't authenticate to the server that requires NTLM?
62   4.10 My HTTP request using HEAD, PUT or DELETE doesn't work!
63   4.11 Why does my HTTP range requests return the full document?
64   4.12 Why do I get "certificate verify failed" ?
65
66  5. libcurl Issues
67   5.1 Is libcurl thread-safe?
68   5.2 How can I receive all data into a large memory chunk?
69   5.3 How do I fetch multiple files with libcurl?
70   5.4 Does libcurl do Winsock initing on win32 systems?
71   5.5 Does CURLOPT_WRITEDATA and CURLOPT_READDATA work on win32 ?
72   5.6 What about Keep-Alive or persistent connections?
73   5.7 Link errors when building libcurl on Windows!
74   5.8 libcurl.so.3: open failed: No such file or directory
75   5.9 How does libcurl resolve host names?
76
77  6. License Issues
78   6.1 I have a GPL program, can I use the libcurl library?
79   6.2 I have a closed-source program, can I use the libcurl library?
80   6.3 I have a BSD licensed program, can I use the libcurl library?
81   6.4 I have a program that uses LGPL libraries, can I use libcurl?
82   6.5 Can I modify curl/libcurl for my program and keep the changes secret?
83   6.6 Can you please change the curl/libcurl license to XXXX?
84
85  7. PHP/CURL Issues
86   7.1 What is PHP/CURL?
87   7.2 Who write PHP/CURL?
88   7.3 Can I perform multiple requests using the same handle?
89
90 ==============================================================================
91
92 1. Philosophy
93
94   1.1 What is cURL?
95
96   cURL (or simply just 'curl') is a command line tool for getting or sending
97   files using URL syntax. The name is a play on 'Client for URLs', originally
98   with URL spelled in uppercase to make it obvious it deals with URLs. The
99   fact it can also be pronounced 'see URL' also helped, it works as an
100   abbrivation for "Client URL Request Library" or why not the recursive
101   version: "Curl URL Request Library".
102
103   Curl supports a range of common Internet protocols, currently including
104   HTTP, HTTPS, FTP, FTPS, GOPHER, LDAP, DICT, TELNET and FILE.
105
106   We spell it cURL or just curl. We pronounce it with an initial k sound:
107   [kurl].
108
109   NOTE: there are numerous sub-projects and related projects that also use the
110   word curl in the project names in various combinations, but you should take
111   notice that this FAQ is directed at the command-line tool named curl (and
112   libcurl the library), and may therefore not be valid for other curl-related
113   projects.
114
115   1.2 What is libcurl?
116
117   libcurl is a reliable and portable library which provides you with an easy
118   interface to a range of common Internet protocols.
119
120   You can use libcurl for free in your application, be it open source,
121   commercial or closed-source.
122
123   1.3 What is cURL not?
124
125   Curl is *not* a wget clone. That is a common misconception.  Never, during
126   curl's development, have we intended curl to replace wget or compete on its
127   market. Curl is targeted at single-shot file transfers.
128
129   Curl is not a web site mirroring program. If you want to use curl to mirror
130   something: fine, go ahead and write a script that wraps around curl to make
131   it reality (like curlmirror.pl does).
132
133   Curl is not an FTP site mirroring program. Sure, get and send FTP with curl
134   but if you want systematic and sequential behavior you should write a
135   script (or write a new program that interfaces libcurl) and do it.
136
137   Curl is not a PHP tool, even though it works perfectly well when used from
138   or with PHP.
139
140   Curl is not a single-OS program. Curl exists, compiles, builds and runs
141   under a wide range of operating systems, including all modern Unixes (and a
142   bunch of older ones too), Windows, Amiga, BeOS, OS/2, OS X, QNX etc.
143
144   1.4 When will you make curl do XXXX ?
145
146   We love suggestions of what to change in order to make curl and libcurl
147   better. We do however believe in a few rules when it comes to the future of
148   curl:
149
150   * Curl -- the command line tool -- is to remain a non-graphical command line
151     tool. If you want GUIs or fancy scripting capabilities, you should look
152     for another tool that uses libcurl.
153
154   * We do not add things to curl that other small and available tools already
155     do very fine at the side. Curl's output is fine to pipe into another
156     program or redirect to another file for the next program to interpret.
157
158   * We focus on protocol related issues and improvements. If you wanna do more
159     magic with the supported protocols than curl currently does, chances are
160     big we will agree. If you wanna add more protocols, we may very well
161     agree.
162
163   * If you want someone else to make all the work while you wait for us to
164     implement it for you, that is not a very friendly attitude. We spend a
165     considerable time already on maintaining and developing curl. In order to
166     get more out of us, you should consider trading in some of your time and
167     efforts in return.
168
169   * If you write the code, chances are bigger that it will get into curl
170     faster.
171
172   1.5 Who makes cURL?
173
174   cURL and libcurl are not made by any single individual. Sure, Daniel
175   Stenberg writes the major parts, but other persons' submissions are
176   important and crucial. Anyone can contribute and post their changes and
177   improvements and have them inserted in the main sources (of course on the
178   condition that developers agree on that the fixes are good).
179
180   The list of contributors in the docs/THANKS file is only a small part of all
181   the people that every day provide us with bug reports, suggestions, ideas
182   and source code.
183
184   curl is developed by a community, with Daniel at the wheel.
185
186   1.6 What do you get for making cURL?
187
188   Project cURL is entirely free and open. No person gets paid for developing
189   curl. We do this voluntarily on our spare time.
190
191   We get some help from companies. Contactor Data hosts the curl web site,
192   Haxx owns the curl web site's domain and sourceforge.net hosts project
193   services we take advantage from, like the bug tracker.
194
195   If you want to support our project with a donation or similar, one way of
196   doing that would be to buy "gift certificates" at useful online shopping
197   sites, such as amazon.com or thinkgeek.com. Another way would be to sponsor
198   us through a banner-program or even better: by helping us coding,
199   documenting, testing etc. You're welcome to send us a buck using paypal, as
200   described here: http://curl.haxx.se/donation.html
201
202   1.7 What about CURL from curl.com?
203
204   During the summer 2001, curl.com was busy advertising their client-side
205   programming language for the web, named CURL.
206
207   We are in no way associated with curl.com or their CURL programming
208   language.
209
210   Our project name curl has been in effective use since 1998. We were not the
211   first computer related project to use the name "curl" and do not claim any
212   first-hand rights to the name.
213
214   We recognize that we will be living in parallel with curl.com and wish them
215   every success.
216
217   1.8 I have a problem who do I mail?
218
219   Please do not mail any single individual unless you really need to. Keep
220   curl-related questions on a suitable mailing list. All available mailing
221   lists are listed in the MANUAL document and online at
222   http://curl.haxx.se/mail/
223
224   Keeping curl-related questions and discussions on mailing lists allows
225   others to join in and help, to share their ideas, contribute their
226   suggestions and spread their wisdom. Keeping discussions on public mailing
227   lists also allows for others to learn from this (both current and future
228   users thanks to the web based archives of the mailing lists), thus saving us
229   from having to repeat ourselves even more. Thanks for respecting this.
230
231
232 2. Install Related Problems
233
234   2.1 configure doesn't find OpenSSL even when it is installed
235
236   This may be because of several reasons.
237
238     2.1.1 native linker doesn't find openssl
239
240     Affected platforms:
241       Solaris (native cc compiler)
242       HPUX (native cc compiler)
243       SGI IRIX (native cc compiler)
244       SCO UNIX (native cc compiler)
245
246     When configuring curl, I specify --with-ssl. OpenSSL is installed in
247     /usr/local/ssl Configure reports SSL in /usr/local/ssl, but fails to find
248     CRYPTO_lock in -lcrypto
249
250     Cause: The cc for this test places the -L/usr/local/ssl/lib AFTER
251     -lcrypto, so ld can't find the library. This is due to a bug in the GNU
252     autoconf tool.
253
254     Workaround: Specifying "LDFLAGS=-L/usr/local/ssl/lib" in front of
255     ./configure places the -L/usr/local/ssl/lib early enough in the command
256     line to make things work
257
258     Solution submitted by: Bob Allison <allisonb@users.sourceforge.net>
259
260     2.1.2 only the libssl lib is missing
261
262     If all include files and the libcrypto lib is present, with only the
263     libssl being missing according to configure, this is mostly likely because
264     a few functions are left out from the libssl.
265
266     If the function names missing include RSA or RSAREF you can be certain
267     that this is because libssl requires the RSA and RSAREF libs to build.
268
269     See the INSTALL file section that explains how to add those libs to
270     configure. Make sure that you remove the config.cache file before you
271     rerun configure with the new flags.
272
273   2.2 Does curl work/build with other SSL libraries?
274
275   Curl has been written to use OpenSSL, although there should not be much
276   problems using a different library. If anyone does "port" curl to use a
277   different SSL library, we are of course very interested in getting the
278   patch!
279
280   2.3 Where can I find a copy of LIBEAY32.DLL?
281
282   That is an OpenSSL binary built for Windows.
283
284   Curl uses OpenSSL to do the SSL stuff. The LIBEAY32.DLL is what curl needs
285   on a windows machine to do https://. Check out the curl web site to find
286   accurate and up-to-date pointers to recent OpenSSL DLLs and other binary
287   packages.
288
289   2.4 Does cURL support Socks (RFC 1928) ?
290
291   Yes, SOCKS5 is supported.
292
293
294 3. Usage problems
295
296   3.1 curl: (1) SSL is disabled, https: not supported
297
298   If you get this output when trying to get anything from a https:// server,
299   it means that the configure script couldn't find all libs and include files
300   it requires for SSL to work. If the configure script fails to find them,
301   curl is simply built without SSL support.
302
303   To get the https:// support into a curl that was previously built but that
304   reports that https:// is not supported, you should dig through the document
305   and logs and check out why the configure script doesn't find the SSL libs
306   and/or include files.
307
308   Also, check out the other paragraph in this FAQ labeled "configure doesn't
309   find OpenSSL even when it is installed".
310
311   3.2 How do I tell curl to resume a transfer?
312
313   Curl supports resumed transfers both ways on both FTP and HTTP.
314
315   Try the -C option.
316
317   3.3 Why doesn't my posting using -F work?
318
319   You can't simply use -F or -d at your choice. The web server that will
320   receive your post assumes one of the formats. If the form you're trying to
321   "fake" sets the type to 'multipart/form-data', then and only then you must
322   use the -F type. In all the most common cases, you should use -d which then
323   causes a posting with the type 'application/x-www-form-urlencoded'.
324
325   This is described in some detail in the MANUAL and TheArtOfHttpScripting
326   documents, and if you don't understand it the first time, read it again
327   before you post questions about this to the mailing list. Also, try reading
328   through the mailing list archives for old postings and questions regarding
329   this.
330
331   3.4 How do I tell curl to run custom FTP commands?
332
333   You can tell curl to perform optional commands both before and/or after a
334   file transfer. Study the -Q/--quote option.
335
336   Since curl is used for file transfers, you don't use curl to just perform
337   FTP commands without transferring anything. Therefore you must always specify
338   a URL to transfer to/from even when doing custom FTP commands.
339
340   3.5 How can I disable the Pragma: nocache header?
341
342   You can change all internally generated headers by adding a replacement with
343   the -H/--header option. By adding a header with empty contents you safely
344   disable that one. Use -H "Pragma:" to disable that specific header.
345
346   3.6 Does curl support ASP, XML, XHTML or HTML version Y?
347
348   To curl, all contents are alike. It doesn't matter how the page was
349   generated. It may be ASP, PHP, Perl, shell-script, SSI or plain
350   HTML-files. There's no difference to curl and it doesn't even know what kind
351   of language that generated the page.
352
353   See also item 3.14 regarding javascript.
354
355   3.7 Can I use curl to delete/rename a file through FTP?
356
357   Yes. You specify custom FTP commands with -Q/--quote.
358
359   One example would be to delete a file after you have downloaded it:
360
361      curl -O ftp://download.com/coolfile -Q '-DELE coolfile'
362
363   3.8 How do I tell curl to follow HTTP redirects?
364
365   Curl does not follow so-called redirects by default. The Location: header
366   that informs the client about this is only interpreted if you're using the
367   -L/--location option. As in:
368
369      curl -L http://redirector.com
370
371   3.9 How do I use curl in my favorite programming language?
372
373   There exist many language interfaces/bindings for curl that integrates it
374   better with various languages. If you are fluid in a script language, you
375   may very well opt to use such an interface instead of using the command line
376   tool.
377
378   Find out more about which languages that support curl directly, and how to
379   install and use them, in the libcurl section of the curl web site:
380   http://curl.haxx.se/libcurl/
381
382   In February 2003, there are interfaces available for the following
383   languages: Basic, C, C++, Cocoa, Dylan, Euphoria, Java, Lua, Object-Pascal,
384   Pascal, Perl, PHP, PostgreSQL, Python, Rexx, Ruby, Scheme and Tcl. By the
385   time you read this, additional ones may have appeared!
386
387   3.10 What about SOAP, WebDAV, XML-RPC or similar protocols over HTTP?
388
389   Curl adheres to the HTTP spec, which basically means you can play with *any*
390   protocol that is built on top of HTTP. Protocols such as SOAP, WEBDAV and
391   XML-RPC are all such ones. You can use -X to set custom requests and -H to
392   set custom headers (or replace internally generated ones).
393
394   Using libcurl is of course just as fine and you'd just use the proper
395   library options to do the same.
396
397   3.11 How do I POST with a different Content-Type?
398
399   You can always replace the internally generated headers with -H/--header.
400   To make a simple HTTP POST with text/xml as content-type, do something like:
401
402         curl -d "datatopost" -H "Content-Type: text/xml" [URL]
403
404   3.12 Why do FTP specific features over HTTP proxy fail?
405
406   Because when you use a HTTP proxy, the protocol spoken on the network will
407   be HTTP, even if you specify a FTP URL. This effectively means that you
408   normally can't use FTP specific features such as FTP upload and FTP quote
409   etc.
410
411   There is one exception to this rule, and that is if you can "tunnel through"
412   the given HTTP proxy. Proxy tunneling is enabled with a special option (-p)
413   and is generally not available as proxy admins usually disable tunneling to
414   other ports than 443 (which is used for HTTPS access through proxies).
415
416   3.13 Why does my single/double quotes fail?
417
418   To specify a command line option that includes spaces, you might need to
419   put the entire option within quotes. Like in:
420
421    curl -d " with spaces " url.com
422
423   or perhaps
424
425    curl -d ' with spaces ' url.com
426
427   Exactly what kind of quotes and how to do this is entirely up to the shell
428   or command line interpreter that you are using. For most unix shells, you
429   can more or less pick either single (') or double (") quotes. For
430   Windows/DOS prompts I believe you're forced to use double (") quotes.
431
432   Please study the documentation for your particular environment. Examples in
433   the curl docs will use a mix of both these ones as shown above. You must
434   adjust them to work in your environment.
435
436   Remember that curl works and runs on more operating systems than most single
437   individuals have ever tried.
438
439   3.14 Does curl support javascript or pac (automated proxy config)?
440
441   Many web pages do magic stuff using embedded javascript. Curl and libcurl
442   have no built-in support for that, so it will be treated just like any other
443   contents.
444
445   .pac files are a netscape invention and are sometimes used by organizations
446   to allow them to differentiate which proxies to use. The .pac contents is
447   just a javascript program that gets invoked by the browser and that returns
448   the name of the proxy to connect to. Since curl doesn't support javascript,
449   it can't support .pac proxy configuration either.
450
451   Some work-arounds usually suggested to overcome this javascript dependency:
452
453   - Depending on the javascript complexity, write up a script that
454     translates it to another language and execute that.
455
456   - Read the javascript code and rewrite the same logic in another language.
457
458   - Implement a javascript interpreter, people have successfully used the
459     Mozilla javascript engine in the past.
460
461   - Ask your admins to stop this, for a static proxy setup or similar.
462
463   3.15 Can I do recursive fetches with curl?
464
465   No. curl itself has no code that performs recursive operations, such as
466   those performed by wget and similar tools.
467
468   There exist wrapper scripts with that functionality (for example the
469   curlmirror perl script), and you can write programs based on libcurl to do
470   it, but the command line tool curl itself cannot.
471
472   3.16 What certificates do I need when I use SSL?
473
474   There are three different kinds of "certificates" to keep track of when we
475   talk about using SSL-based protocols (HTTPS or FTPS) using curl or libcurl.
476
477   - Client certificate. The server you communicate may require that you can
478     provide this in order to prove that you actually are who you claim to be.
479     If the server doesn't require this, you don't need a client certificate.
480
481   - Server certificate. The server you communicate with has a server
482     certificate. You can and should verify this certficate to make sure that
483     you are truly talking to the real server and not a server impersonating
484     it. The server certificate verifaction process is made by using a
485     Certificate Authority certificate ("CA cert") that was used to sign the
486     server certificate. Server certificate verification is enabled by default
487     in curl and libcurl and is often the reason for problems as explained in
488     FAQ entry 4.12 and the SSLCERTS document
489     (http://curl.haxx.se/docs/sslcerts.html). Server certificates that are
490     "self-signed" or otherwise signed by a CA that you do not have a CA cert
491     for, cannot be verified. If the verification during a connect fails, you
492     are refused access. You then need to explicitly disable the verification
493     to connect to the server.
494
495   - Certificate Authority certificate ("CA cert"). You often have several CA
496     certs in a CA cert bundle that can be used to verify a server certificate
497     that was signed by one of the authorities in the bundle. curl comes with a
498     default CA cert bundle. You can override the default.
499
500
501 4. Running Problems
502
503   4.1 Problems connecting to SSL servers.
504
505   It took a very long time before we could sort out why curl had problems to
506   connect to certain SSL servers when using SSLeay or OpenSSL v0.9+.  The
507   error sometimes showed up similar to:
508
509   16570:error:1407D071:SSL routines:SSL2_READ:bad mac decode:s2_pkt.c:233:
510
511   It turned out to be because many older SSL servers don't deal with SSLv3
512   requests properly. To correct this problem, tell curl to select SSLv2 from
513   the command line (-2/--sslv2).
514
515   There have also been examples where the remote server didn't like the SSLv2
516   request and instead you had to force curl to use SSLv3 with -3/--sslv3.
517
518   4.2 Why do I get problems when I use & or % in the URL?
519
520   In general unix shells, the & letter is treated special and when used, it
521   runs the specified command in the background. To safely send the & as a part
522   of a URL, you should quote the entire URL by using single (') or double (")
523   quotes around it.
524
525   An example that would invoke a remote CGI that uses &-letters could be:
526
527      curl 'http://www.altavista.com/cgi-bin/query?text=yes&q=curl'
528
529   In Windows, the standard DOS shell treats the %-letter specially and you
530   need to use TWO %-letters for each single one you want to use in the URL.
531
532   Also note that if you want the literal %-letter to be part of the data you
533   pass in a POST using -d/--data you must encode it as '%25' (which then also
534   needs the %-letter doubled on Windows machines).
535
536   4.3 How can I use {, }, [ or ] to specify multiple URLs?
537
538   Because those letters have a special meaning to the shell, and to be used in
539   a URL specified to curl you must quote them.
540
541   An example that downloads two URLs (sequentially) would do:
542
543     curl '{curl,www}.haxx.se'
544
545   To be able to use those letters as actual parts of the URL (without using
546   them for the curl URL "globbing" system), use the -g/--globoff option:
547
548     curl -g 'www.site.com/weirdname[].html'
549
550   4.4 Why do I get downloaded data even though the web page doesn't exist?
551
552   Curl asks remote servers for the page you specify. If the page doesn't exist
553   at the server, the HTTP protocol defines how the server should respond and
554   that means that headers and a "page" will be returned. That's simply how
555   HTTP works.
556
557   By using the --fail option you can tell curl explicitly to not get any data
558   if the HTTP return code doesn't say success.
559
560   4.5 Why do I get return code XXX from a HTTP server?
561
562   RFC2616 clearly explains the return codes. This is a short transcript. Go
563   read the RFC for exact details:
564
565     4.5.1 "400 Bad Request"
566
567     The request could not be understood by the server due to malformed
568     syntax. The client SHOULD NOT repeat the request without modifications.
569
570     4.5.2 "401 Unauthorized"
571
572     The request requires user authentication.
573
574     4.5.3 "403 Forbidden"
575
576     The server understood the request, but is refusing to fulfill it.
577     Authorization will not help and the request SHOULD NOT be repeated.
578
579     4.5.4 "404 Not Found"
580
581     The server has not found anything matching the Request-URI. No indication
582     is given of whether the condition is temporary or permanent.
583
584     4.5.5 "405 Method Not Allowed"
585
586     The method specified in the Request-Line is not allowed for the resource
587     identified by the Request-URI. The response MUST include an Allow header
588     containing a list of valid methods for the requested resource.
589
590     4.5.6 "301 Moved Permanently"
591
592     If you get this return code and an HTML output similar to this:
593
594        <H1>Moved Permanently</H1> The document has moved <A
595        HREF="http://same_url_now_with_a_trailing_slash/">here</A>.
596
597     it might be because you request a directory URL but without the trailing
598     slash. Try the same operation again _with_ the trailing URL, or use the
599     -L/--location option to follow the redirection.
600
601   4.6 Can you tell me what error code 142 means?
602
603   All error codes that are larger than the highest documented error code means
604   that curl has exited due to a crash. This is a serious error, and we
605   appreciate a detailed bug report from you that describes how we could go
606   ahead and repeat this!
607
608   4.7 How do I keep user names and passwords secret in Curl command lines?
609
610   This problem has two sides:
611
612   The first part is to avoid having clear-text passwords in the command line
613   so that they don't appear in 'ps' outputs and similar. That is easily
614   avoided by using the "-K" option to tell curl to read parameters from a file
615   or stdin to which you can pass the secret info. curl itself will also
616   attempt to "hide" the given password by blanking out the option - this
617   doesn't work on all platforms.
618
619   To keep the passwords in your account secret from the rest of the world is
620   not a task that curl addresses. You could of course encrypt them somehow to
621   at least hide them from being read by human eyes, but that is not what
622   anyone would call security.
623
624   Also note that regular HTTP (using Basic authentication) and FTP passwords
625   are sent in clear across the network. All it takes for anyone to fetch them
626   is to listen on the network.  Eavesdropping is very easy. Use more secure
627   authentication methods (like Digest, Negotiate or even NTLM) or consider the
628   SSL-based alternatives HTTPS and FTPS.
629
630   4.8 I found a bug!
631
632   It is not a bug if the behavior is documented. Read the docs first.
633   Especially check out the KNOWN_BUGS file, it may be a documented bug!
634
635   If it is a problem with a binary you've downloaded or a package for your
636   particular platform, try contacting the person who built the package/archive
637   you have.
638
639   If there is a bug, read the BUGS document first. Then report it as described
640   in there.
641
642   4.9 Curl can't authenticate to the server that requires NTLM?
643
644   This is supported in curl 7.10.6 or later. No earlier curl version knows
645   of this magic.
646
647   NTLM is a Microsoft proprietary protocol. Proprietary formats are evil. You
648   should not use such ones.
649
650   4.10 My HTTP request using HEAD, PUT or DELETE doesn't work!
651
652   Many web servers allow or demand that the administrator configures the
653   server properly for these requests to work on the web server.
654
655   Some servers seem to support HEAD only on certain kinds of URLs.
656
657   To fully grasp this, try the documentation for the particular server
658   software you're trying to interact with. This is not anything curl can do
659   anything about.
660
661   4.11 Why does my HTTP range requests return the full document?
662
663   Because the range may not be supported by the server, or the server may
664   choose to ignore it and return the full document anyway.
665
666   4.12 Why do I get "certificate verify failed" ?
667
668   You invoke curl 7.10 or later to communicate on a https:// URL and get an
669   error back looking something similar to this:
670
671       curl: (35) SSL: error:14090086:SSL routines:
672       SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
673
674   Then it means that curl couldn't verify that the server's certificate was
675   good. Curl verifies the certificate using the CA cert bundle that comes with
676   the curl installation.
677
678   To disable the verification (which makes it act like curl did before 7.10),
679   use -k. This does however enable man-in-the-middle attacks.
680
681   If you get this failure but are having a CA cert bundle installed and used,
682   the server's certificate is not signed by one of the CA's in the bundle. It
683   might for example be self-signed. You then correct this problem by obtaining
684   a valid CA cert for the server. Or again, decrease the security by disabling
685   this check.
686
687   Details are also in the SSLCERTS file in the release archives, found online
688   here: http://curl.haxx.se/docs/sslcerts.html
689
690
691 5. libcurl Issues
692
693   5.1 Is libcurl thread-safe?
694
695   Yes.
696
697   We have written the libcurl code specificly adjusted for multi-threaded
698   programs. libcurl will use thread-safe functions instead of non-safe ones if
699   your system has such.
700
701   We would appreciate some kind of report or README file from those who have
702   used libcurl in a threaded environment.
703
704   5.2 How can I receive all data into a large memory chunk?
705
706   [ See also the examples/getinmemory.c source ]
707
708   You are in full control of the callback function that gets called every time
709   there is data received from the remote server. You can make that callback do
710   whatever you want. You do not have to write the received data to a file.
711
712   One solution to this problem could be to have a pointer to a struct that you
713   pass to the callback function. You set the pointer using the
714   curl_easy_setopt(CURLOPT_FILE) function. Then that pointer will be passed to
715   the callback instead of a FILE * to a file:
716
717         /* imaginary struct */
718         struct MemoryStruct {
719           char *memory;
720           size_t size;
721         };
722
723         /* imaginary callback function */
724         size_t
725         WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data)
726         {
727           size_t realsize = size * nmemb;
728           struct MemoryStruct *mem = (struct MemoryStruct *)data;
729
730           mem->memory = (char *)realloc(mem->memory, mem->size + realsize + 1);
731           if (mem->memory) {
732             memcpy(&(mem->memory[mem->size]), ptr, realsize);
733             mem->size += realsize;
734             mem->memory[mem->size] = 0;
735           }
736           return realsize;
737         }
738
739   5.3 How do I fetch multiple files with libcurl?
740
741   libcurl has excellent support for transferring multiple files. You should
742   just repeatedly set new URLs with curl_easy_setopt() and then transfer it
743   with curl_easy_perform(). The handle you get from curl_easy_init() is not
744   only reusable, but you're even encouraged to reuse it if you can, as that
745   will enable libcurl to use persistent connections.
746
747   5.4 Does libcurl do Winsock initialization on win32 systems?
748
749   Yes, if told to in the curl_global_init() call.
750
751   5.5 Does CURLOPT_WRITEDATA and CURLOPT_READDATA work on win32 ?
752
753   Yes, but you cannot open a FILE * and pass the pointer to a DLL and have
754   that DLL use the FILE * (as the DLL and the client application cannot access
755   each others' variable memory areas). If you set CURLOPT_WRITEDATA you must
756   also use CURLOPT_WRITEFUNCTION as well to set a function that writes the
757   file, even if that simply writes the data to the specified FILE *.
758   Similarly, if you use CURLOPT_READDATA you must also specify
759   CURLOPT_READFUNCTION.
760
761   (Provided by Joel DeYoung and Bob Schader)
762
763   5.6 What about Keep-Alive or persistent connections?
764
765   curl and libcurl have excellent support for persistent connections when
766   transferring several files from the same server.  Curl will attempt to reuse
767   connections for all URLs specified on the same command line/config file, and
768   libcurl will reuse connections for all transfers that are made using the
769   same libcurl handle.
770
771   5.7 Link errors when building libcurl on Windows!
772
773   You need to make sure that your project, and all the libraries (both static
774   and dynamic) that it links against, are compiled/linked against the same run
775   time library.
776
777   This is determined by the /MD, /ML, /MT (and their corresponding /M?d)
778   options to the command line compiler. /MD (linking against MSVCRT dll) seems
779   to be the most commonly used option.
780
781   (Provided by Andrew Francis)
782
783   5.8 libcurl.so.3: open failed: No such file or directory
784
785   This is an error message you might get when you try to run a program linked
786   with a shared version of libcurl and your run-time linker (ld.so) couldn't
787   find the shared library named libcurl.so.3.
788
789   You need to make sure that ld.so finds libcurl.so.3. You can do that
790   multiple ways, and it differs somewhat between different operating systems,
791   but they are usually:
792
793   * Add an option to the linker command line that specify the hard-coded path
794     the run-time linker should check for the lib (usually -R)
795
796   * Set an environment variable (LD_LIBRARY_PATH for example) where ld.so
797     should check for libs
798
799   * Adjust the system's config to check for libs in the directory where you've
800     put the dir (like Linux's /etc/ld.so.conf)
801
802   'man ld.so' and 'man ld' will tell you more details
803
804   5.9 How does libcurl resolve host names?
805
806   libcurl includes a number of different name resolve functions:
807
808   - The non-ipv6 resolver that can use one out of four host name resolve calls
809     (depending on what your system supports):
810
811     A - gethostbyname()
812     B - gethostbyname_r() with 3 arguments
813     C - gethostbyname_r() with 5 arguments
814     D - gethostbyname_r() with 6 arguments
815
816   - The ipv6-resolver that uses getaddrinfo()
817
818   - The c-ares based name resolver that uses the c-ares library for resolves.
819
820   - The Windows threaded resolver. It use:
821
822     A - gethostbyname() on plain ipv4 windows hosts
823     B - getaddrinfo() on ipv6-enabled windows hosts
824
825 6. License Issues
826
827   Curl and libcurl are released under a MIT/X derivate license. The license is
828   very liberal and should not impose a problem for your project. This section
829   is just a brief summary for the cases we get the most questions. (Parts of
830   this section was much enhanced by Bjorn Reese.)
831
832   6.1 I have a GPL program, can I use the libcurl library?
833
834   Yes!
835
836   Since libcurl may be distributed under the MIT/X derivate license, it can be
837   used together with GPL in any software.
838
839   6.2 I have a closed-source program, can I use the libcurl library?
840
841   Yes!
842
843   libcurl does not put any restrictions on the program that uses the library.
844
845   6.3 I have a BSD licensed program, can I use the libcurl library?
846
847   Yes!
848
849   libcurl does not put any restrictions on the program that uses the library.
850
851   6.4 I have a program that uses LGPL libraries, can I use libcurl?
852
853   Yes!
854
855   The LGPL license doesn't clash with other licenses.
856
857   6.5 Can I modify curl/libcurl for my program and keep the changes secret?
858
859   Yes!
860
861   The MIT/X derivate license practically allows you to do almost anything with
862   the sources, on the condition that the copyright texts in the sources are
863   left intact.
864
865   6.6 Can you please change the curl/libcurl license to XXXX?
866
867   No.
868
869   We have carefully picked this license after years of development and
870   discussions and a large amount of people have contributed with source code
871   knowing that this is the license we use. This license puts the restrictions
872   we want on curl/libcurl and it does not spread to other programs or
873   libraries that use it. It should be possible for everyone to use libcurl or
874   curl in their projects, no matter what license they already have in use.
875
876 7. PHP/CURL Issues
877
878   7.1 What is PHP/CURL?
879
880   The module for PHP that makes it possible for PHP programs to access curl-
881   functions from within PHP. We often call it PHP/CURL to differentiate from
882   curl the command line tool and libcurl the library.
883
884   7.2 Who write PHP/CURL?
885
886   PHP/CURL is a module that comes with the regular PHP package. It depends and
887   uses libcurl, so you need to have libcurl installed properly first before
888   PHP/CURL can be used. PHP/CURL is written by Sterling Hughes.
889
890   7.3 Can I perform multiple requests using the same handle?
891
892   With libcurl you can. With PHP/CURL you cannot. This is a limitation in the
893   PHP/CURL code. Therefore, you need to close each handle after each request
894   and create a new one for the following one.
895
896   I've heard rumours that this situation has been fixed in PHP5, but that is
897   unconfirmed.