quickjs-tart

quickjs-based runtime for wallet-core logic
Log | Files | Refs | README | LICENSE

FAQ (67885B)


      1                                   _   _ ____  _
      2                               ___| | | |  _ \| |
      3                              / __| | | | |_) | |
      4                             | (__| |_| |  _ <| |___
      5                              \___|\___/|_| \_\_____|
      6 
      7 FAQ
      8 
      9  1. Philosophy
     10   1.1 What is cURL?
     11   1.2 What is libcurl?
     12   1.3 What is curl not?
     13   1.4 When will you make curl do XXXX ?
     14   1.5 Who makes curl?
     15   1.6 What do you get for making curl?
     16   1.7 What about CURL from curl.com?
     17   1.8 I have a problem, who do I mail?
     18   1.9 Where do I buy commercial support for curl?
     19   1.10 How many are using curl?
     20   1.11 Why do you not update ca-bundle.crt
     21   1.12 I have a problem, who can I chat with?
     22   1.13 curl's ECCN number?
     23   1.14 How do I submit my patch?
     24   1.15 How do I port libcurl to my OS?
     25 
     26  2. Install Related Problems
     27   2.1 configure fails when using static libraries
     28   2.2 Does curl work/build with other SSL libraries?
     29   2.3 How do I upgrade curl.exe in Windows?
     30   2.4 Does curl support SOCKS (RFC 1928) ?
     31 
     32  3. Usage Problems
     33   3.1 curl: (1) SSL is disabled, https: not supported
     34   3.2 How do I tell curl to resume a transfer?
     35   3.3 Why does my posting using -F not work?
     36   3.4 How do I tell curl to run custom FTP commands?
     37   3.5 How can I disable the Accept: */* header?
     38   3.6 Does curl support ASP, XML, XHTML or HTML version Y?
     39   3.7 Can I use curl to delete/rename a file through FTP?
     40   3.8 How do I tell curl to follow HTTP redirects?
     41   3.9 How do I use curl in my favorite programming language?
     42   3.10 What about SOAP, WebDAV, XML-RPC or similar protocols over HTTP?
     43   3.11 How do I POST with a different Content-Type?
     44   3.12 Why do FTP-specific features over HTTP proxy fail?
     45   3.13 Why do my single/double quotes fail?
     46   3.14 Does curl support JavaScript or PAC (automated proxy config)?
     47   3.15 Can I do recursive fetches with curl?
     48   3.16 What certificates do I need when I use SSL?
     49   3.17 How do I list the root directory of an FTP server?
     50   3.18 Can I use curl to send a POST/PUT and not wait for a response?
     51   3.19 How do I get HTTP from a host using a specific IP address?
     52   3.20 How to SFTP from my user's home directory?
     53   3.21 Protocol xxx not supported or disabled in libcurl
     54   3.22 curl -X gives me HTTP problems
     55 
     56  4. Running Problems
     57   4.2 Why do I get problems when I use & or % in the URL?
     58   4.3 How can I use {, }, [ or ] to specify multiple URLs?
     59   4.4 Why do I get downloaded data even though the webpage does not exist?
     60   4.5 Why do I get return code XXX from an HTTP server?
     61    4.5.1 "400 Bad Request"
     62    4.5.2 "401 Unauthorized"
     63    4.5.3 "403 Forbidden"
     64    4.5.4 "404 Not Found"
     65    4.5.5 "405 Method Not Allowed"
     66    4.5.6 "301 Moved Permanently"
     67   4.6 Can you tell me what error code 142 means?
     68   4.7 How do I keep usernames and passwords secret in curl command lines?
     69   4.8 I found a bug
     70   4.9 curl cannot authenticate to a server that requires NTLM?
     71   4.10 My HTTP request using HEAD, PUT or DELETE does not work
     72   4.11 Why do my HTTP range requests return the full document?
     73   4.12 Why do I get "certificate verify failed" ?
     74   4.13 Why is curl -R on Windows one hour off?
     75   4.14 Redirects work in browser but not with curl
     76   4.15 FTPS does not work
     77   4.16 My HTTP POST or PUT requests are slow
     78   4.17 Non-functional connect timeouts on Windows
     79   4.18 file:// URLs containing drive letters (Windows, NetWare)
     80   4.19 Why does not curl return an error when the network cable is unplugged?
     81   4.20 curl does not return error for HTTP non-200 responses
     82 
     83  5. libcurl Issues
     84   5.1 Is libcurl thread-safe?
     85   5.2 How can I receive all data into a large memory chunk?
     86   5.3 How do I fetch multiple files with libcurl?
     87   5.4 Does libcurl do Winsock initialization on Win32 systems?
     88   5.5 Does CURLOPT_WRITEDATA and CURLOPT_READDATA work on Win32 ?
     89   5.6 What about Keep-Alive or persistent connections?
     90   5.7 Link errors when building libcurl on Windows
     91   5.8 libcurl.so.X: open failed: No such file or directory
     92   5.9 How does libcurl resolve hostnames?
     93   5.10 How do I prevent libcurl from writing the response to stdout?
     94   5.11 How do I make libcurl not receive the whole HTTP response?
     95   5.12 Can I make libcurl fake or hide my real IP address?
     96   5.13 How do I stop an ongoing transfer?
     97   5.14 Using C++ non-static functions for callbacks?
     98   5.15 How do I get an FTP directory listing?
     99   5.16 I want a different time-out
    100   5.17 Can I write a server with libcurl?
    101   5.18 Does libcurl use threads?
    102 
    103  6. License Issues
    104   6.1 I have a GPL program, can I use the libcurl library?
    105   6.2 I have a closed-source program, can I use the libcurl library?
    106   6.3 I have a BSD licensed program, can I use the libcurl library?
    107   6.4 I have a program that uses LGPL libraries, can I use libcurl?
    108   6.5 Can I modify curl/libcurl for my program and keep the changes secret?
    109   6.6 Can you please change the curl/libcurl license to XXXX?
    110   6.7 What are my obligations when using libcurl in my commercial apps?
    111 
    112  7. PHP/CURL Issues
    113   7.1 What is PHP/CURL?
    114   7.2 Who wrote PHP/CURL?
    115   7.3 Can I perform multiple requests using the same handle?
    116   7.4 Does PHP/CURL have dependencies?
    117 
    118  8. Development
    119   8.1 Why does curl use C89?
    120   8.2 Will curl be rewritten?
    121 
    122 ==============================================================================
    123 
    124 1. Philosophy
    125 
    126   1.1 What is cURL?
    127 
    128   cURL is the name of the project. The name is a play on 'Client for URLs',
    129   originally with URL spelled in uppercase to make it obvious it deals with
    130   URLs. The fact it can also be read as 'see URL' also helped, it works as
    131   an abbreviation for "Client URL Request Library" or why not the recursive
    132   version: "curl URL Request Library".
    133 
    134   The cURL project produces two products:
    135 
    136   libcurl
    137 
    138     A client-side URL transfer library, supporting DICT, FILE, FTP, FTPS,
    139     GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, POP3, POP3S,
    140     RTMP, RTMPS, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP, WS
    141     and WSS.
    142 
    143     libcurl supports HTTPS certificates, HTTP POST, HTTP PUT, FTP uploading,
    144     Kerberos, SPNEGO, HTTP form based upload, proxies, cookies, user+password
    145     authentication, file transfer resume, http proxy tunneling and more.
    146 
    147     libcurl is highly portable, it builds and works identically on numerous
    148     platforms, including Solaris, NetBSD, FreeBSD, OpenBSD, Darwin, HP-UX,
    149     IRIX, AIX, Tru64, Linux, UnixWare, HURD, Windows, Amiga, OS/2, macOS,
    150     Ultrix, QNX, OpenVMS, RISC OS, Novell NetWare, DOS, Symbian, OSF, Android,
    151     Minix, IBM TPF and more...
    152 
    153     libcurl is free, thread-safe, IPv6 compatible, feature rich, well
    154     supported and fast.
    155 
    156   curl
    157 
    158     A command line tool for getting or sending data using URL syntax.
    159 
    160     Since curl uses libcurl, curl supports the same wide range of common
    161     Internet protocols that libcurl does.
    162 
    163   We pronounce curl with an initial k sound. It rhymes with words like girl
    164   and earl. This is a short WAV file to help you:
    165 
    166      https://media.merriam-webster.com/soundc11/c/curl0001.wav
    167 
    168   There are numerous sub-projects and related projects that also use the word
    169   curl in the project names in various combinations, but you should take
    170   notice that this FAQ is directed at the command-line tool named curl (and
    171   libcurl the library), and may therefore not be valid for other curl-related
    172   projects. (There is however a small section for the PHP/CURL in this FAQ.)
    173 
    174   1.2 What is libcurl?
    175 
    176   libcurl is a reliable and portable library for doing Internet data transfers
    177   using one or more of its supported Internet protocols.
    178 
    179   You can use libcurl freely in your application, be it open source,
    180   commercial or closed-source.
    181 
    182   libcurl is most probably the most portable, most powerful and most often
    183   used C-based multi-platform file transfer library on this planet - be it
    184   open source or commercial.
    185 
    186   1.3 What is curl not?
    187 
    188   curl is not a wget clone. That is a common misconception. Never, during
    189   curl's development, have we intended curl to replace wget or compete on its
    190   market. curl is targeted at single-shot file transfers.
    191 
    192   curl is not a website mirroring program. If you want to use curl to mirror
    193   something: fine, go ahead and write a script that wraps around curl or use
    194   libcurl to make it reality.
    195 
    196   curl is not an FTP site mirroring program. Sure, get and send FTP with curl
    197   but if you want systematic and sequential behavior you should write a
    198   script (or write a new program that interfaces libcurl) and do it.
    199 
    200   curl is not a PHP tool, even though it works perfectly well when used from
    201   or with PHP (when using the PHP/CURL module).
    202 
    203   curl is not a program for a single operating system. curl exists, compiles,
    204   builds and runs under a wide range of operating systems, including all
    205   modern Unixes (and a bunch of older ones too), Windows, Amiga, OS/2, macOS,
    206   QNX etc.
    207 
    208   1.4 When will you make curl do XXXX ?
    209 
    210   We love suggestions of what to change in order to make curl and libcurl
    211   better. We do however believe in a few rules when it comes to the future of
    212   curl:
    213 
    214   curl -- the command line tool -- is to remain a non-graphical command line
    215   tool. If you want GUIs or fancy scripting capabilities, you should look for
    216   another tool that uses libcurl.
    217 
    218   We do not add things to curl that other small and available tools already do
    219   well at the side. curl's output can be piped into another program or
    220   redirected to another file for the next program to interpret.
    221 
    222   We focus on protocol related issues and improvements. If you want to do more
    223   magic with the supported protocols than curl currently does, chances are
    224   good we will agree. If you want to add more protocols, we may agree.
    225 
    226   If you want someone else to do all the work while you wait for us to
    227   implement it for you, that is not a friendly attitude. We spend a
    228   considerable time already on maintaining and developing curl. In order to
    229   get more out of us, you should consider trading in some of your time and
    230   effort in return. Simply go to the GitHub repository which resides at
    231   https://github.com/curl/curl, fork the project, and create pull requests
    232   with your proposed changes.
    233 
    234   If you write the code, chances are better that it will get into curl faster.
    235 
    236   1.5 Who makes curl?
    237 
    238   curl and libcurl are not made by any single individual. Daniel Stenberg is
    239   project leader and main developer, but other persons' submissions are
    240   important and crucial. Anyone can contribute and post their changes and
    241   improvements and have them inserted in the main sources (of course on the
    242   condition that developers agree that the fixes are good).
    243 
    244   The full list of all contributors is found in the docs/THANKS file.
    245 
    246   curl is developed by a community, with Daniel at the wheel.
    247 
    248   1.6 What do you get for making curl?
    249 
    250   Project cURL is entirely free and open. We do this voluntarily, mostly in
    251   our spare time. Companies may pay individual developers to work on curl.
    252   This is not controlled by nor supervised in any way by the curl project.
    253 
    254   We get help from companies. Haxx provides website, bandwidth, mailing lists
    255   etc, GitHub hosts the primary git repository and other services like the bug
    256   tracker at https://github.com/curl/curl. Also again, some companies have
    257   sponsored certain parts of the development in the past and I hope some will
    258   continue to do so in the future.
    259 
    260   If you want to support our project, consider a donation or a banner-program
    261   or even better: by helping us with coding, documenting or testing etc.
    262 
    263   See also: https://curl.se/sponsors.html
    264 
    265   1.7 What about CURL from curl.com?
    266 
    267   During the summer of 2001, curl.com was busy advertising their client-side
    268   programming language for the web, named CURL.
    269 
    270   We are in no way associated with curl.com or their CURL programming
    271   language.
    272 
    273   Our project name curl has been in effective use since 1998. We were not the
    274   first computer related project to use the name "curl" and do not claim any
    275   rights to the name.
    276 
    277   We recognize that we will be living in parallel with curl.com and wish them
    278   every success.
    279 
    280   1.8 I have a problem, who do I mail?
    281 
    282   Please do not mail any single individual unless you really need to. Keep
    283   curl-related questions on a suitable mailing list. All available mailing
    284   lists are listed in the MANUAL document and online at
    285   https://curl.se/mail/
    286 
    287   Keeping curl-related questions and discussions on mailing lists allows
    288   others to join in and help, to share their ideas, to contribute their
    289   suggestions and to spread their wisdom. Keeping discussions on public mailing
    290   lists also allows for others to learn from this (both current and future
    291   users thanks to the web based archives of the mailing lists), thus saving us
    292   from having to repeat ourselves even more. Thanks for respecting this.
    293 
    294   If you have found or simply suspect a security problem in curl or libcurl,
    295   submit all the details at https://hackerone.one/curl. On there we keep the
    296   issue private while we investigate, confirm it, work and validate a fix and
    297   agree on a time schedule for publication etc. That way we produce a fix in a
    298   timely manner before the flaw is announced to the world, reducing the impact
    299   the problem risks having on existing users.
    300 
    301   Security issues can also be taking to the curl security team by emailing
    302   security at curl.se (closed list of receivers, mails are not disclosed).
    303 
    304   1.9 Where do I buy commercial support for curl?
    305 
    306   curl is fully open source. It means you can hire any skilled engineer to fix
    307   your curl-related problems.
    308 
    309   We list available alternatives on the curl website:
    310   https://curl.se/support.html
    311 
    312   1.10 How many are using curl?
    313 
    314   It is impossible to tell.
    315 
    316   We do not know how many users that knowingly have installed and use curl.
    317 
    318   We do not know how many users that use curl without knowing that they are in
    319   fact using it.
    320 
    321   We do not know how many users that downloaded or installed curl and then
    322   never use it.
    323 
    324   In 2020, we estimate that curl runs in roughly ten billion installations
    325   world wide.
    326 
    327   1.11 Why do you not update ca-bundle.crt
    328 
    329   In the cURL project we have decided not to attempt to keep this file updated
    330   (or even present) since deciding what to add to a ca cert bundle is an
    331   undertaking we have not been ready to accept, and the one we can get from
    332   Mozilla is perfectly fine so there is no need to duplicate that work.
    333 
    334   Today, with many services performed over HTTPS, every operating system
    335   should come with a default ca cert bundle that can be deemed somewhat
    336   trustworthy and that collection (if reasonably updated) should be deemed to
    337   be a lot better than a private curl version.
    338 
    339   If you want the most recent collection of ca certs that Mozilla Firefox
    340   uses, we recommend that you extract the collection yourself from Mozilla
    341   Firefox (by running 'make ca-bundle), or by using our online service setup
    342   for this purpose: https://curl.se/docs/caextract.html
    343 
    344   1.12 I have a problem who, can I chat with?
    345 
    346   There is a bunch of friendly people hanging out in the #curl channel on the
    347   IRC network libera.chat. If you are polite and nice, chances are good that
    348   you can get -- or provide -- help instantly.
    349 
    350   1.13 curl's ECCN number?
    351 
    352   The US government restricts exports of software that contains or uses
    353   cryptography. When doing so, the Export Control Classification Number (ECCN)
    354   is used to identify the level of export control etc.
    355 
    356   Apache Software Foundation gives a good explanation of ECCNs at
    357   https://www.apache.org/dev/crypto.html
    358 
    359   We believe curl's number might be ECCN 5D002, another possibility is
    360   5D992. It seems necessary to write them (the authority that administers ECCN
    361   numbers), asking to confirm.
    362 
    363   Comprehensible explanations of the meaning of such numbers and how to obtain
    364   them (resp.) are here
    365 
    366   https://www.bis.doc.gov/licensing/exportingbasics.htm
    367   https://www.bis.doc.gov/licensing/do_i_needaneccn.html
    368 
    369   An incomprehensible description of the two numbers above is here
    370   https://www.bis.doc.gov/index.php/documents/new-encryption/1653-ccl5-pt2-3
    371 
    372   1.14 How do I submit my patch?
    373 
    374   We strongly encourage you to submit changes and improvements directly as
    375   "pull requests" on GitHub: https://github.com/curl/curl/pulls
    376 
    377   If you for any reason cannot or will not deal with GitHub, send your patch to
    378   the curl-library mailing list. We are many subscribers there and there are
    379   lots of people who can review patches, comment on them and "receive" them
    380   properly.
    381 
    382   Lots of more details are found in the CONTRIBUTE.md and INTERNALS.md
    383   documents.
    384 
    385   1.15 How do I port libcurl to my OS?
    386 
    387   Here's a rough step-by-step:
    388 
    389   1. copy a suitable lib/config-*.h file as a start to lib/config-[youros].h
    390 
    391   2. edit lib/config-[youros].h to match your OS and setup
    392 
    393   3. edit lib/curl_setup.h to include config-[youros].h when your OS is
    394      detected by the preprocessor, in the style others already exist
    395 
    396   4. compile lib/*.c and make them into a library
    397 
    398 
    399 2. Install Related Problems
    400 
    401   2.1 configure fails when using static libraries
    402 
    403   You may find that configure fails to properly detect the entire dependency
    404   chain of libraries when you provide static versions of the libraries that
    405   configure checks for.
    406 
    407   The reason why static libraries is much harder to deal with is that for them
    408   we do not get any help but the script itself must know or check what more
    409   libraries that are needed (with shared libraries, that dependency "chain" is
    410   handled automatically). This is an error-prone process and one that also
    411   tends to vary over time depending on the release versions of the involved
    412   components and may also differ between operating systems.
    413 
    414   For that reason, configure does few attempts to actually figure this out and
    415   you are instead encouraged to set LIBS and LDFLAGS accordingly when you
    416   invoke configure, and point out the needed libraries and set the necessary
    417   flags yourself.
    418 
    419   2.2 Does curl work with other SSL libraries?
    420 
    421   curl has been written to use a generic SSL function layer internally, and
    422   that SSL functionality can then be provided by one out of many different SSL
    423   backends.
    424 
    425   curl can be built to use one of the following SSL alternatives: OpenSSL,
    426   LibreSSL, BoringSSL, AWS-LC, GnuTLS, wolfSSL, mbedTLS, Schannel (native
    427   Windows) or Rustls. They all have their pros and cons, and we try to
    428   maintain a comparison of them here: https://curl.se/docs/ssl-compared.html
    429 
    430   2.3 How do I upgrade curl.exe in Windows?
    431 
    432   The curl tool that is shipped as an integrated component of Windows 10 and
    433   Windows 11 is managed by Microsoft. If you were to delete the file or
    434   replace it with a newer version downloaded from https://curl.se/windows,
    435   then Windows Update will cease to work on your system.
    436 
    437   There is no way to independently force an upgrade of the curl.exe that is
    438   part of Windows other than through the regular Windows update process. There
    439   is also nothing the curl project itself can do about this, since this is
    440   managed and controlled entirely by Microsoft as owners of the operating
    441   system.
    442 
    443   You can always download and install the latest version of curl for Windows
    444   from https://curl.se/windows into a separate location.
    445 
    446   2.4 Does curl support SOCKS (RFC 1928) ?
    447 
    448   Yes, SOCKS 4 and 5 are supported.
    449 
    450 3. Usage problems
    451 
    452   3.1 curl: (1) SSL is disabled, https: not supported
    453 
    454   If you get this output when trying to get anything from an HTTPS server, it
    455   means that the instance of curl/libcurl that you are using was built without
    456   support for this protocol.
    457 
    458   This could have happened if the configure script that was run at build time
    459   could not find all libs and include files curl requires for SSL to work. If
    460   the configure script fails to find them, curl is simply built without SSL
    461   support.
    462 
    463   To get HTTPS support into a curl that was previously built but that reports
    464   that HTTPS is not supported, you should dig through the document and logs
    465   and check out why the configure script does not find the SSL libs and/or
    466   include files.
    467 
    468   Also, check out the other paragraph in this FAQ labeled "configure does not
    469   find OpenSSL even when it is installed".
    470 
    471   3.2 How do I tell curl to resume a transfer?
    472 
    473   curl supports resumed transfers both ways on both FTP and HTTP.
    474   Try the -C option.
    475 
    476   3.3 Why does my posting using -F not work?
    477 
    478   You cannot arbitrarily use -F or -d, the choice between -F or -d depends on
    479   the HTTP operation you need curl to do and what the web server that will
    480   receive your post expects.
    481 
    482   If the form you are trying to submit uses the type 'multipart/form-data',
    483   then and only then you must use the -F type. In all the most common cases,
    484   you should use -d which then causes a posting with the type
    485   'application/x-www-form-urlencoded'.
    486 
    487   This is described in some detail in the MANUAL and TheArtOfHttpScripting
    488   documents, and if you do not understand it the first time, read it again
    489   before you post questions about this to the mailing list. Also, try reading
    490   through the mailing list archives for old postings and questions regarding
    491   this.
    492 
    493   3.4 How do I tell curl to run custom FTP commands?
    494 
    495   You can tell curl to perform optional commands both before and/or after a
    496   file transfer. Study the -Q/--quote option.
    497 
    498   Since curl is used for file transfers, you do not normally use curl to
    499   perform FTP commands without transferring anything. Therefore you must
    500   always specify a URL to transfer to/from even when doing custom FTP
    501   commands, or use -I which implies the "no body" option sent to libcurl.
    502 
    503   3.5 How can I disable the Accept: */* header?
    504 
    505   You can change all internally generated headers by adding a replacement with
    506   the -H/--header option. By adding a header with empty contents you safely
    507   disable that one. Use -H "Accept:" to disable that specific header.
    508 
    509   3.6 Does curl support ASP, XML, XHTML or HTML version Y?
    510 
    511   To curl, all contents are alike. It does not matter how the page was
    512   generated. It may be ASP, PHP, Perl, shell-script, SSI or plain HTML
    513   files. There is no difference to curl and it does not even know what kind of
    514   language that generated the page.
    515 
    516   See also item 3.14 regarding JavaScript.
    517 
    518   3.7 Can I use curl to delete/rename a file through FTP?
    519 
    520   Yes. You specify custom FTP commands with -Q/--quote.
    521 
    522   One example would be to delete a file after you have downloaded it:
    523 
    524      curl -O ftp://example.com/coolfile -Q '-DELE coolfile'
    525 
    526   or rename a file after upload:
    527 
    528      curl -T infile ftp://example.com/dir/ -Q "-RNFR infile" -Q "-RNTO newname"
    529 
    530   3.8 How do I tell curl to follow HTTP redirects?
    531 
    532   curl does not follow so-called redirects by default. The Location: header
    533   that informs the client about this is only interpreted if you are using the
    534   -L/--location option. As in:
    535 
    536      curl -L http://example.com
    537 
    538   Not all redirects are HTTP ones, see 4.14
    539 
    540   3.9 How do I use curl in my favorite programming language?
    541 
    542   Many programming languages have interfaces/bindings that allow you to use
    543   curl without having to use the command line tool. If you are fluent in such
    544   a language, you may prefer to use one of these interfaces instead.
    545 
    546   Find out more about which languages that support curl directly, and how to
    547   install and use them, in the libcurl section of the curl website:
    548   https://curl.se/libcurl/
    549 
    550   All the various bindings to libcurl are made by other projects and people,
    551   outside of the cURL project. The cURL project itself only produces libcurl
    552   with its plain C API. If you do not find anywhere else to ask you can ask
    553   about bindings on the curl-library list too, but be prepared that people on
    554   that list may not know anything about bindings.
    555 
    556   In December 2021, there were interfaces available for the following
    557   languages: Ada95, Basic, C, C++, Ch, Cocoa, D, Delphi, Dylan, Eiffel,
    558   Euphoria, Falcon, Ferite, Gambas, glib/GTK+, Go, Guile, Harbour, Haskell,
    559   Java, Julia, Lisp, Lua, Mono, .NET, node.js, Object-Pascal, OCaml, Pascal,
    560   Perl, PHP, PostgreSQL, Python, R, Rexx, Ring, RPG, Ruby, Rust, Scheme,
    561   Scilab, S-Lang, Smalltalk, SP-Forth, SPL, Tcl, Visual Basic, Visual FoxPro,
    562   Q, wxwidgets, XBLite and Xoho. By the time you read this, additional ones
    563   may have appeared.
    564 
    565   3.10 What about SOAP, WebDAV, XML-RPC or similar protocols over HTTP?
    566 
    567   curl adheres to the HTTP spec, which basically means you can play with *any*
    568   protocol that is built on top of HTTP. Protocols such as SOAP, WebDAV and
    569   XML-RPC are all such ones. You can use -X to set custom requests and -H to
    570   set custom headers (or replace internally generated ones).
    571 
    572   Using libcurl is of course just as good and you would just use the proper
    573   library options to do the same.
    574 
    575   3.11 How do I POST with a different Content-Type?
    576 
    577   You can always replace the internally generated headers with -H/--header.
    578   To make a simple HTTP POST with text/xml as content-type, do something like:
    579 
    580         curl -d "datatopost" -H "Content-Type: text/xml" [URL]
    581 
    582   3.12 Why do FTP-specific features over HTTP proxy fail?
    583 
    584   Because when you use an HTTP proxy, the protocol spoken on the network will
    585   be HTTP, even if you specify an FTP URL. This effectively means that you
    586   normally cannot use FTP-specific features such as FTP upload and FTP quote
    587   etc.
    588 
    589   There is one exception to this rule, and that is if you can "tunnel through"
    590   the given HTTP proxy. Proxy tunneling is enabled with a special option (-p)
    591   and is generally not available as proxy admins usually disable tunneling to
    592   ports other than 443 (which is used for HTTPS access through proxies).
    593 
    594   3.13 Why do my single/double quotes fail?
    595 
    596   To specify a command line option that includes spaces, you might need to
    597   put the entire option within quotes. Like in:
    598 
    599    curl -d " with spaces " example.com
    600 
    601   or perhaps
    602 
    603    curl -d ' with spaces ' example.com
    604 
    605   Exactly what kind of quotes and how to do this is entirely up to the shell
    606   or command line interpreter that you are using. For most Unix shells, you
    607   can more or less pick either single (') or double (") quotes. For
    608   Windows/DOS command prompts you must use double (") quotes, and if the
    609   option string contains inner double quotes you can escape them with a
    610   backslash.
    611 
    612   For Windows powershell the arguments are not always passed on as expected
    613   because curl is not a powershell script. You may or may not be able to use
    614   single quotes. To escape inner double quotes seems to require a
    615   backslash-backtick escape sequence and the outer quotes as double quotes.
    616 
    617   Please study the documentation for your particular environment. Examples in
    618   the curl docs will use a mix of both of these as shown above. You must
    619   adjust them to work in your environment.
    620 
    621   Remember that curl works and runs on more operating systems than most single
    622   individuals have ever tried.
    623 
    624   3.14 Does curl support JavaScript or PAC (automated proxy config)?
    625 
    626   Many webpages do magic stuff using embedded JavaScript. curl and libcurl
    627   have no built-in support for that, so it will be treated just like any other
    628   contents.
    629 
    630   .pac files are a Netscape invention and are sometimes used by organizations
    631   to allow them to differentiate which proxies to use. The .pac contents is
    632   just a JavaScript program that gets invoked by the browser and that returns
    633   the name of the proxy to connect to. Since curl does not support JavaScript,
    634   it cannot support .pac proxy configuration either.
    635 
    636   Some workarounds usually suggested to overcome this JavaScript dependency:
    637 
    638   Depending on the JavaScript complexity, write up a script that translates it
    639   to another language and execute that.
    640 
    641   Read the JavaScript code and rewrite the same logic in another language.
    642 
    643   Implement a JavaScript interpreter, people have successfully used the
    644   Mozilla JavaScript engine in the past.
    645 
    646   Ask your admins to stop this, for a static proxy setup or similar.
    647 
    648   3.15 Can I do recursive fetches with curl?
    649 
    650   No. curl itself has no code that performs recursive operations, such as
    651   those performed by wget and similar tools.
    652 
    653   There exists wrapper scripts with that functionality (for example the
    654   curlmirror perl script), and you can write programs based on libcurl to do
    655   it, but the command line tool curl itself cannot.
    656 
    657   3.16 What certificates do I need when I use SSL?
    658 
    659   There are three different kinds of "certificates" to keep track of when we
    660   talk about using SSL-based protocols (HTTPS or FTPS) using curl or libcurl.
    661 
    662   CLIENT CERTIFICATE
    663 
    664   The server you communicate with may require that you can provide this in
    665   order to prove that you actually are who you claim to be. If the server
    666   does not require this, you do not need a client certificate.
    667 
    668   A client certificate is always used together with a private key, and the
    669   private key has a pass phrase that protects it.
    670 
    671   SERVER CERTIFICATE
    672 
    673   The server you communicate with has a server certificate. You can and should
    674   verify this certificate to make sure that you are truly talking to the real
    675   server and not a server impersonating it.
    676 
    677   CERTIFICATE AUTHORITY CERTIFICATE ("CA cert")
    678 
    679   You often have several CA certs in a CA cert bundle that can be used to
    680   verify a server certificate that was signed by one of the authorities in the
    681   bundle. curl does not come with a CA cert bundle but most curl installs
    682   provide one. You can also override the default.
    683 
    684   The server certificate verification process is made by using a Certificate
    685   Authority certificate ("CA cert") that was used to sign the server
    686   certificate. Server certificate verification is enabled by default in curl
    687   and libcurl and is often the reason for problems as explained in FAQ entry
    688   4.12 and the SSLCERTS document
    689   (https://curl.se/docs/sslcerts.html). Server certificates that are
    690   "self-signed" or otherwise signed by a CA that you do not have a CA cert
    691   for, cannot be verified. If the verification during a connect fails, you are
    692   refused access. You then need to explicitly disable the verification to
    693   connect to the server.
    694 
    695   3.17 How do I list the root directory of an FTP server?
    696 
    697   There are two ways. The way defined in the RFC is to use an encoded slash
    698   in the first path part. List the "/tmp" directory like this:
    699 
    700      curl ftp://ftp.example.com/%2ftmp/
    701 
    702   or the not-quite-kosher-but-more-readable way, by simply starting the path
    703   section of the URL with a slash:
    704 
    705      curl ftp://ftp.example.com//tmp/
    706 
    707   3.18 Can I use curl to send a POST/PUT and not wait for a response?
    708 
    709   No.
    710 
    711   You can easily write your own program using libcurl to do such stunts.
    712 
    713   3.19 How do I get HTTP from a host using a specific IP address?
    714 
    715   For example, you may be trying out a website installation that is not yet in
    716   the DNS. Or you have a site using multiple IP addresses for a given host
    717   name and you want to address a specific one out of the set.
    718 
    719   Set a custom Host: header that identifies the server name you want to reach
    720   but use the target IP address in the URL:
    721 
    722     curl --header "Host: www.example.com" http://127.0.0.1/
    723 
    724   You can also opt to add faked hostname entries to curl with the --resolve
    725   option. That has the added benefit that things like redirects will also work
    726   properly. The above operation would instead be done as:
    727 
    728     curl --resolve www.example.com:80:127.0.0.1 http://www.example.com/
    729 
    730   3.20 How to SFTP from my user's home directory?
    731 
    732   Contrary to how FTP works, SFTP and SCP URLs specify the exact directory to
    733   work with. It means that if you do not specify that you want the user's home
    734   directory, you get the actual root directory.
    735 
    736   To specify a file in your user's home directory, you need to use the correct
    737   URL syntax which for SFTP might look similar to:
    738 
    739     curl -O -u user:password sftp://example.com/~/file.txt
    740 
    741   and for SCP it is just a different protocol prefix:
    742 
    743     curl -O -u user:password scp://example.com/~/file.txt
    744 
    745   3.21 Protocol xxx not supported or disabled in libcurl
    746 
    747   When passing on a URL to curl to use, it may respond that the particular
    748   protocol is not supported or disabled. The particular way this error message
    749   is phrased is because curl does not make a distinction internally of whether
    750   a particular protocol is not supported (i.e. never got any code added that
    751   knows how to speak that protocol) or if it was explicitly disabled. curl can
    752   be built to only support a given set of protocols, and the rest would then
    753   be disabled or not supported.
    754 
    755   Note that this error will also occur if you pass a wrongly spelled protocol
    756   part as in "htpt://example.com" or as in the less evident case if you prefix
    757   the protocol part with a space as in " http://example.com/".
    758 
    759   3.22 curl -X gives me HTTP problems
    760 
    761   In normal circumstances, -X should hardly ever be used.
    762 
    763   By default you use curl without explicitly saying which request method to
    764   use when the URL identifies an HTTP transfer. If you just pass in a URL like
    765   "curl http://example.com" it will use GET. If you use -d or -F curl will use
    766   POST, -I will cause a HEAD and -T will make it a PUT.
    767 
    768   If for whatever reason you are not happy with these default choices that curl
    769   does for you, you can override those request methods by specifying -X
    770   [WHATEVER]. This way you can for example send a DELETE by doing "curl -X
    771   DELETE [URL]".
    772 
    773   It is thus pointless to do "curl -XGET [URL]" as GET would be used anyway.
    774   In the same vein it is pointless to do "curl -X POST -d data [URL]". You can
    775   make a fun and somewhat rare request that sends a request-body in a GET
    776   request with something like "curl -X GET -d data [URL]"
    777 
    778   Note that -X does not actually change curl's behavior as it only modifies the
    779   actual string sent in the request, but that may of course trigger a
    780   different set of events.
    781 
    782   Accordingly, by using -XPOST on a command line that for example would follow
    783   a 303 redirect, you will effectively prevent curl from behaving
    784   correctly. Be aware.
    785 
    786 
    787 4. Running Problems
    788 
    789   4.2 Why do I get problems when I use & or % in the URL?
    790 
    791   In general Unix shells, the & symbol is treated specially and when used, it
    792   runs the specified command in the background. To safely send the & as a part
    793   of a URL, you should quote the entire URL by using single (') or double (")
    794   quotes around it. Similar problems can also occur on some shells with other
    795   characters, including ?*!$~(){}<>\|;`. When in doubt, quote the URL.
    796 
    797   An example that would invoke a remote CGI that uses &-symbols could be:
    798 
    799      curl 'http://www.example.com/cgi-bin/query?text=yes&q=curl'
    800 
    801   In Windows, the standard DOS shell treats the percent sign specially and you
    802   need to use TWO percent signs for each single one you want to use in the
    803   URL.
    804 
    805   If you want a literal percent sign to be part of the data you pass in a POST
    806   using -d/--data you must encode it as '%25' (which then also needs the
    807   percent sign doubled on Windows machines).
    808 
    809   4.3 How can I use {, }, [ or ] to specify multiple URLs?
    810 
    811   Because those letters have a special meaning to the shell, to be used in
    812   a URL specified to curl you must quote them.
    813 
    814   An example that downloads two URLs (sequentially) would be:
    815 
    816     curl '{curl,www}.haxx.se'
    817 
    818   To be able to use those characters as actual parts of the URL (without using
    819   them for the curl URL "globbing" system), use the -g/--globoff option:
    820 
    821     curl -g 'www.example.com/weirdname[].html'
    822 
    823   4.4 Why do I get downloaded data even though the webpage does not exist?
    824 
    825   curl asks remote servers for the page you specify. If the page does not exist
    826   at the server, the HTTP protocol defines how the server should respond and
    827   that means that headers and a "page" will be returned. That is simply how
    828   HTTP works.
    829 
    830   By using the --fail option you can tell curl explicitly to not get any data
    831   if the HTTP return code does not say success.
    832 
    833   4.5 Why do I get return code XXX from an HTTP server?
    834 
    835   RFC 2616 clearly explains the return codes. This is a short transcript. Go
    836   read the RFC for exact details:
    837 
    838     4.5.1 "400 Bad Request"
    839 
    840     The request could not be understood by the server due to malformed
    841     syntax. The client SHOULD NOT repeat the request without modifications.
    842 
    843     4.5.2 "401 Unauthorized"
    844 
    845     The request requires user authentication.
    846 
    847     4.5.3 "403 Forbidden"
    848 
    849     The server understood the request, but is refusing to fulfill it.
    850     Authorization will not help and the request SHOULD NOT be repeated.
    851 
    852     4.5.4 "404 Not Found"
    853 
    854     The server has not found anything matching the Request-URI. No indication
    855     is given as to whether the condition is temporary or permanent.
    856 
    857     4.5.5 "405 Method Not Allowed"
    858 
    859     The method specified in the Request-Line is not allowed for the resource
    860     identified by the Request-URI. The response MUST include an Allow header
    861     containing a list of valid methods for the requested resource.
    862 
    863     4.5.6 "301 Moved Permanently"
    864 
    865     If you get this return code and an HTML output similar to this:
    866 
    867        <H1>Moved Permanently</H1> The document has moved <A
    868        HREF="http://same_url_now_with_a_trailing_slash/">here</A>.
    869 
    870     it might be because you requested a directory URL but without the trailing
    871     slash. Try the same operation again _with_ the trailing URL, or use the
    872     -L/--location option to follow the redirection.
    873 
    874   4.6 Can you tell me what error code 142 means?
    875 
    876   All curl error codes are described at the end of the man page, in the
    877   section called "EXIT CODES".
    878 
    879   Error codes that are larger than the highest documented error code means
    880   that curl has exited due to a crash. This is a serious error, and we
    881   appreciate a detailed bug report from you that describes how we could go
    882   ahead and repeat this.
    883 
    884   4.7 How do I keep usernames and passwords secret in curl command lines?
    885 
    886   This problem has two sides:
    887 
    888   The first part is to avoid having clear-text passwords in the command line
    889   so that they do not appear in 'ps' outputs and similar. That is easily
    890   avoided by using the "-K" option to tell curl to read parameters from a file
    891   or stdin to which you can pass the secret info. curl itself will also
    892   attempt to "hide" the given password by blanking out the option - this
    893   does not work on all platforms.
    894 
    895   To keep the passwords in your account secret from the rest of the world is
    896   not a task that curl addresses. You could of course encrypt them somehow to
    897   at least hide them from being read by human eyes, but that is not what
    898   anyone would call security.
    899 
    900   Also note that regular HTTP (using Basic authentication) and FTP passwords
    901   are sent as cleartext across the network. All it takes for anyone to fetch
    902   them is to listen on the network. Eavesdropping is easy. Use more secure
    903   authentication methods (like Digest, Negotiate or even NTLM) or consider the
    904   SSL-based alternatives HTTPS and FTPS.
    905 
    906   4.8 I found a bug
    907 
    908   It is not a bug if the behavior is documented. Read the docs first.
    909   Especially check out the KNOWN_BUGS file, it may be a documented bug.
    910 
    911   If it is a problem with a binary you have downloaded or a package for your
    912   particular platform, try contacting the person who built the package/archive
    913   you have.
    914 
    915   If there is a bug, read the BUGS document first. Then report it as described
    916   in there.
    917 
    918   4.9 curl cannot authenticate to a server that requires NTLM?
    919 
    920   NTLM support requires OpenSSL, GnuTLS, mbedTLS or Microsoft Windows
    921   libraries at build-time to provide this functionality.
    922 
    923   4.10 My HTTP request using HEAD, PUT or DELETE does not work
    924 
    925   Many web servers allow or demand that the administrator configures the
    926   server properly for these requests to work on the web server.
    927 
    928   Some servers seem to support HEAD only on certain kinds of URLs.
    929 
    930   To fully grasp this, try the documentation for the particular server
    931   software you are trying to interact with. This is not anything curl can do
    932   anything about.
    933 
    934   4.11 Why do my HTTP range requests return the full document?
    935 
    936   Because the range may not be supported by the server, or the server may
    937   choose to ignore it and return the full document anyway.
    938 
    939   4.12 Why do I get "certificate verify failed" ?
    940 
    941   When you invoke curl and get an error 60 error back it means that curl
    942   could not verify that the server's certificate was good. curl verifies the
    943   certificate using the CA cert bundle and verifying for which names the
    944   certificate has been granted.
    945 
    946   To completely disable the certificate verification, use -k. This does
    947   however enable man-in-the-middle attacks and makes the transfer INSECURE.
    948   We strongly advise against doing this for more than experiments.
    949 
    950   If you get this failure with a CA cert bundle installed and used, the
    951   server's certificate might not be signed by one of the CA's in your CA
    952   store. It might for example be self-signed. You then correct this problem by
    953   obtaining a valid CA cert for the server. Or again, decrease the security by
    954   disabling this check.
    955 
    956   At times, you find that the verification works in your favorite browser but
    957   fails in curl. When this happens, the reason is usually that the server
    958   sends an incomplete cert chain. The server is mandated to send all
    959   "intermediate certificates" but does not. This typically works with browsers
    960   anyway since they A) cache such certs and B) supports AIA which downloads
    961   such missing certificates on demand. This is a server misconfiguration. A
    962   good way to figure out if this is the case it to use the SSL Labs server
    963   test and check the certificate chain: https://www.ssllabs.com/ssltest/
    964 
    965   Details are also in the SSLCERTS.md document, found online here:
    966   https://curl.se/docs/sslcerts.html
    967 
    968   4.13 Why is curl -R on Windows one hour off?
    969 
    970   Since curl 7.53.0 this issue should be fixed as long as curl was built with
    971   any modern compiler that allows for a 64-bit curl_off_t type. For older
    972   compilers or prior curl versions it may set a time that appears one hour off.
    973   This happens due to a flaw in how Windows stores and uses file modification
    974   times and it is not easily worked around. For more details read this:
    975   https://www.codeproject.com/Articles/1144/Beating-the-Daylight-Savings-Time-bug-and-getting
    976 
    977   4.14 Redirects work in browser but not with curl
    978 
    979   curl supports HTTP redirects well (see item 3.8). Browsers generally support
    980   at least two other ways to perform redirects that curl does not:
    981 
    982   Meta tags. You can write an HTML tag that will cause the browser to redirect
    983   to another given URL after a certain time.
    984 
    985   JavaScript. You can write a JavaScript program embedded in an HTML page that
    986   redirects the browser to another given URL.
    987 
    988   There is no way to make curl follow these redirects. You must either
    989   manually figure out what the page is set to do, or write a script that parses
    990   the results and fetches the new URL.
    991 
    992   4.15 FTPS does not work
    993 
    994   curl supports FTPS (sometimes known as FTP-SSL) both implicit and explicit
    995   mode.
    996 
    997   When a URL is used that starts with FTPS://, curl assumes implicit SSL on
    998   the control connection and will therefore immediately connect and try to
    999   speak SSL. FTPS:// connections default to port 990.
   1000 
   1001   To use explicit FTPS, you use an FTP:// URL and the --ssl-reqd option (or one
   1002   of its related flavors). This is the most common method, and the one
   1003   mandated by RFC 4217. This kind of connection will then of course use the
   1004   standard FTP port 21 by default.
   1005 
   1006   4.16 My HTTP POST or PUT requests are slow
   1007 
   1008   libcurl makes all POST and PUT requests (except for requests with a small
   1009   request body) use the "Expect: 100-continue" header. This header allows the
   1010   server to deny the operation early so that libcurl can bail out before having
   1011   to send any data. This is useful in authentication cases and others.
   1012 
   1013   However, many servers do not implement the Expect: stuff properly and if the
   1014   server does not respond (positively) within 1 second libcurl will continue
   1015   and send off the data anyway.
   1016 
   1017   You can disable libcurl's use of the Expect: header the same way you disable
   1018   any header, using -H / CURLOPT_HTTPHEADER, or by forcing it to use HTTP 1.0.
   1019 
   1020   4.17 Non-functional connect timeouts
   1021 
   1022   In most Windows setups having a timeout longer than 21 seconds make no
   1023   difference, as it will only send 3 TCP SYN packets and no more. The second
   1024   packet sent three seconds after the first and the third six seconds after
   1025   the second. No more than three packets are sent, no matter how long the
   1026   timeout is set.
   1027 
   1028   See option TcpMaxConnectRetransmissions on this page:
   1029   https://support.microsoft.com/en-us/kb/175523/en-us
   1030 
   1031   Also, even on non-Windows systems there may run a firewall or anti-virus
   1032   software or similar that accepts the connection but does not actually do
   1033   anything else. This will make (lib)curl to consider the connection connected
   1034   and thus the connect timeout will not trigger.
   1035 
   1036   4.18 file:// URLs containing drive letters (Windows, NetWare)
   1037 
   1038   When using curl to try to download a local file, one might use a URL
   1039   in this format:
   1040 
   1041   file://D:/blah.txt
   1042 
   1043   you will find that even if D:\blah.txt does exist, curl returns a 'file
   1044   not found' error.
   1045 
   1046   According to RFC 1738 (https://www.ietf.org/rfc/rfc1738.txt),
   1047   file:// URLs must contain a host component, but it is ignored by
   1048   most implementations. In the above example, 'D:' is treated as the
   1049   host component, and is taken away. Thus, curl tries to open '/blah.txt'.
   1050   If your system is installed to drive C:, that will resolve to 'C:\blah.txt',
   1051   and if that does not exist you will get the not found error.
   1052 
   1053   To fix this problem, use file:// URLs with *three* leading slashes:
   1054 
   1055   file:///D:/blah.txt
   1056 
   1057   Alternatively, if it makes more sense, specify 'localhost' as the host
   1058   component:
   1059 
   1060   file://localhost/D:/blah.txt
   1061 
   1062   In either case, curl should now be looking for the correct file.
   1063 
   1064   4.19 Why does not curl return an error when the network cable is unplugged?
   1065 
   1066   Unplugging a cable is not an error situation. The TCP/IP protocol stack
   1067   was designed to be fault tolerant, so even though there may be a physical
   1068   break somewhere the connection should not be affected, just possibly
   1069   delayed. Eventually, the physical break will be fixed or the data will be
   1070   re-routed around the physical problem through another path.
   1071 
   1072   In such cases, the TCP/IP stack is responsible for detecting when the
   1073   network connection is irrevocably lost. Since with some protocols it is
   1074   perfectly legal for the client to wait indefinitely for data, the stack may
   1075   never report a problem, and even when it does, it can take up to 20 minutes
   1076   for it to detect an issue. The curl option --keepalive-time enables
   1077   keep-alive support in the TCP/IP stack which makes it periodically probe the
   1078   connection to make sure it is still available to send data. That should
   1079   reliably detect any TCP/IP network failure.
   1080 
   1081   TCP keep alive will not detect the network going down before the TCP/IP
   1082   connection is established (e.g. during a DNS lookup) or using protocols that
   1083   do not use TCP. To handle those situations, curl offers a number of timeouts
   1084   on its own. --speed-limit/--speed-time will abort if the data transfer rate
   1085   falls too low, and --connect-timeout and --max-time can be used to put an
   1086   overall timeout on the connection phase or the entire transfer.
   1087 
   1088   A libcurl-using application running in a known physical environment (e.g.
   1089   an embedded device with only a single network connection) may want to act
   1090   immediately if its lone network connection goes down. That can be achieved
   1091   by having the application monitor the network connection on its own using an
   1092   OS-specific mechanism, then signaling libcurl to abort (see also item 5.13).
   1093 
   1094   4.20 curl does not return error for HTTP non-200 responses
   1095 
   1096   Correct. Unless you use -f (--fail).
   1097 
   1098   When doing HTTP transfers, curl will perform exactly what you are asking it
   1099   to do and if successful it will not return an error. You can use curl to
   1100   test your web server's "file not found" page (that gets 404 back), you can
   1101   use it to check your authentication protected webpages (that gets a 401
   1102   back) and so on.
   1103 
   1104   The specific HTTP response code does not constitute a problem or error for
   1105   curl. It simply sends and delivers HTTP as you asked and if that worked,
   1106   everything is fine and dandy. The response code is generally providing more
   1107   higher level error information that curl does not care about. The error was
   1108   not in the HTTP transfer.
   1109 
   1110   If you want your command line to treat error codes in the 400 and up range
   1111   as errors and thus return a non-zero value and possibly show an error
   1112   message, curl has a dedicated option for that: -f (CURLOPT_FAILONERROR in
   1113   libcurl speak).
   1114 
   1115   You can also use the -w option and the variable %{response_code} to extract
   1116   the exact response code that was returned in the response.
   1117 
   1118 5. libcurl Issues
   1119 
   1120   5.1 Is libcurl thread-safe?
   1121 
   1122   Yes.
   1123 
   1124   We have written the libcurl code specifically adjusted for multi-threaded
   1125   programs. libcurl will use thread-safe functions instead of non-safe ones if
   1126   your system has such. Note that you must never share the same handle in
   1127   multiple threads.
   1128 
   1129   There may be some exceptions to thread safety depending on how libcurl was
   1130   built. Please review the guidelines for thread safety to learn more:
   1131   https://curl.se/libcurl/c/threadsafe.html
   1132 
   1133   5.2 How can I receive all data into a large memory chunk?
   1134 
   1135   [ See also the examples/getinmemory.c source ]
   1136 
   1137   You are in full control of the callback function that gets called every time
   1138   there is data received from the remote server. You can make that callback do
   1139   whatever you want. You do not have to write the received data to a file.
   1140 
   1141   One solution to this problem could be to have a pointer to a struct that you
   1142   pass to the callback function. You set the pointer using the
   1143   CURLOPT_WRITEDATA option. Then that pointer will be passed to the callback
   1144   instead of a FILE * to a file:
   1145 
   1146         /* imaginary struct */
   1147         struct MemoryStruct {
   1148           char *memory;
   1149           size_t size;
   1150         };
   1151 
   1152         /* imaginary callback function */
   1153         size_t
   1154         WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data)
   1155         {
   1156           size_t realsize = size * nmemb;
   1157           struct MemoryStruct *mem = (struct MemoryStruct *)data;
   1158 
   1159           mem->memory = (char *)realloc(mem->memory, mem->size + realsize + 1);
   1160           if (mem->memory) {
   1161             memcpy(&(mem->memory[mem->size]), ptr, realsize);
   1162             mem->size += realsize;
   1163             mem->memory[mem->size] = 0;
   1164           }
   1165           return realsize;
   1166         }
   1167 
   1168   5.3 How do I fetch multiple files with libcurl?
   1169 
   1170   libcurl has excellent support for transferring multiple files. You should
   1171   just repeatedly set new URLs with curl_easy_setopt() and then transfer it
   1172   with curl_easy_perform(). The handle you get from curl_easy_init() is not
   1173   only reusable, but you are even encouraged to reuse it if you can, as that
   1174   will enable libcurl to use persistent connections.
   1175 
   1176   5.4 Does libcurl do Winsock initialization on Win32 systems?
   1177 
   1178   Yes, if told to in the curl_global_init() call.
   1179 
   1180   5.5 Does CURLOPT_WRITEDATA and CURLOPT_READDATA work on Win32 ?
   1181 
   1182   Yes, but you cannot open a FILE * and pass the pointer to a DLL and have
   1183   that DLL use the FILE * (as the DLL and the client application cannot access
   1184   each others' variable memory areas). If you set CURLOPT_WRITEDATA you must
   1185   also use CURLOPT_WRITEFUNCTION as well to set a function that writes the
   1186   file, even if that simply writes the data to the specified FILE *.
   1187   Similarly, if you use CURLOPT_READDATA you must also specify
   1188   CURLOPT_READFUNCTION.
   1189 
   1190   5.6 What about Keep-Alive or persistent connections?
   1191 
   1192   curl and libcurl have excellent support for persistent connections when
   1193   transferring several files from the same server. curl will attempt to reuse
   1194   connections for all URLs specified on the same command line/config file, and
   1195   libcurl will reuse connections for all transfers that are made using the
   1196   same libcurl handle.
   1197 
   1198   When you use the easy interface the connection cache is kept within the easy
   1199   handle. If you instead use the multi interface, the connection cache will be
   1200   kept within the multi handle and will be shared among all the easy handles
   1201   that are used within the same multi handle.
   1202 
   1203   5.7 Link errors when building libcurl on Windows
   1204 
   1205   You need to make sure that your project, and all the libraries (both static
   1206   and dynamic) that it links against, are compiled/linked against the same run
   1207   time library.
   1208 
   1209   This is determined by the /MD, /ML, /MT (and their corresponding /M?d)
   1210   options to the command line compiler. /MD (linking against MSVCRT dll) seems
   1211   to be the most commonly used option.
   1212 
   1213   When building an application that uses the static libcurl library, you must
   1214   add -DCURL_STATICLIB to your CFLAGS. Otherwise the linker will look for
   1215   dynamic import symbols. If you are using Visual Studio, you need to instead
   1216   add CURL_STATICLIB in the "Preprocessor Definitions" section.
   1217 
   1218   If you get a linker error like "unknown symbol __imp__curl_easy_init ..." you
   1219   have linked against the wrong (static) library. If you want to use the
   1220   libcurl.dll and import lib, you do not need any extra CFLAGS, but use one of
   1221   the import libraries below. These are the libraries produced by the various
   1222   lib/Makefile.* files:
   1223 
   1224        Target:          static lib.   import lib for libcurl*.dll.
   1225        -----------------------------------------------------------
   1226        MinGW:           libcurl.a     libcurldll.a
   1227        MSVC (release):  libcurl.lib   libcurl_imp.lib
   1228        MSVC (debug):    libcurld.lib  libcurld_imp.lib
   1229        Borland:         libcurl.lib   libcurl_imp.lib
   1230 
   1231   5.8 libcurl.so.X: open failed: No such file or directory
   1232 
   1233   This is an error message you might get when you try to run a program linked
   1234   with a shared version of libcurl and your runtime linker (ld.so) could not
   1235   find the shared library named libcurl.so.X. (Where X is the number of the
   1236   current libcurl ABI, typically 3 or 4).
   1237 
   1238   You need to make sure that ld.so finds libcurl.so.X. You can do that
   1239   multiple ways, and it differs somewhat between different operating systems.
   1240   They are usually:
   1241 
   1242   * Add an option to the linker command line that specify the hard-coded path
   1243     the runtime linker should check for the lib (usually -R)
   1244 
   1245   * Set an environment variable (LD_LIBRARY_PATH for example) where ld.so
   1246     should check for libs
   1247 
   1248   * Adjust the system's config to check for libs in the directory where you have
   1249     put the library (like Linux's /etc/ld.so.conf)
   1250 
   1251   'man ld.so' and 'man ld' will tell you more details
   1252 
   1253   5.9 How does libcurl resolve hostnames?
   1254 
   1255   libcurl supports a large number of name resolve functions. One of them is
   1256   picked at build-time and will be used unconditionally. Thus, if you want to
   1257   change name resolver function you must rebuild libcurl and tell it to use a
   1258   different function.
   1259 
   1260   - The non-IPv6 resolver that can use one of four different hostname resolve
   1261   calls (depending on what your system supports):
   1262 
   1263       A - gethostbyname()
   1264       B - gethostbyname_r() with 3 arguments
   1265       C - gethostbyname_r() with 5 arguments
   1266       D - gethostbyname_r() with 6 arguments
   1267 
   1268   - The IPv6-resolver that uses getaddrinfo()
   1269 
   1270   - The c-ares based name resolver that uses the c-ares library for resolves.
   1271     Using this offers asynchronous name resolves.
   1272 
   1273   - The threaded resolver (default option on Windows). It uses:
   1274 
   1275       A - gethostbyname() on plain IPv4 hosts
   1276       B - getaddrinfo() on IPv6 enabled hosts
   1277 
   1278   Also note that libcurl never resolves or reverse-lookups addresses given as
   1279   pure numbers, such as 127.0.0.1 or ::1.
   1280 
   1281   5.10 How do I prevent libcurl from writing the response to stdout?
   1282 
   1283   libcurl provides a default built-in write function that writes received data
   1284   to stdout. Set the CURLOPT_WRITEFUNCTION to receive the data, or possibly
   1285   set CURLOPT_WRITEDATA to a different FILE * handle.
   1286 
   1287   5.11 How do I make libcurl not receive the whole HTTP response?
   1288 
   1289   You make the write callback (or progress callback) return an error and
   1290   libcurl will then abort the transfer.
   1291 
   1292   5.12 Can I make libcurl fake or hide my real IP address?
   1293 
   1294   No. libcurl operates on a higher level. Besides, faking IP address would
   1295   imply sending IP packets with a made-up source address, and then you normally
   1296   get a problem with receiving the packet sent back as they would then not be
   1297   routed to you.
   1298 
   1299   If you use a proxy to access remote sites, the sites will not see your local
   1300   IP address but instead the address of the proxy.
   1301 
   1302   Also note that on many networks NATs or other IP-munging techniques are used
   1303   that makes you see and use a different IP address locally than what the
   1304   remote server will see you coming from. You may also consider using
   1305   https://www.torproject.org/ .
   1306 
   1307   5.13 How do I stop an ongoing transfer?
   1308 
   1309   With the easy interface you make sure to return the correct error code from
   1310   one of the callbacks, but none of them are instant. There is no function you
   1311   can call from another thread or similar that will stop it immediately.
   1312   Instead, you need to make sure that one of the callbacks you use returns an
   1313   appropriate value that will stop the transfer. Suitable callbacks that you
   1314   can do this with include the progress callback, the read callback and the
   1315   write callback.
   1316 
   1317   If you are using the multi interface, you can also stop a transfer by
   1318   removing the particular easy handle from the multi stack at any moment you
   1319   think the transfer is done or when you wish to abort the transfer.
   1320 
   1321   5.14 Using C++ non-static functions for callbacks?
   1322 
   1323   libcurl is a C library, it does not know anything about C++ member functions.
   1324 
   1325   You can overcome this "limitation" with relative ease using a static
   1326   member function that is passed a pointer to the class:
   1327 
   1328      // f is the pointer to your object.
   1329      static size_t YourClass::func(void *buffer, size_t sz, size_t n, void *f)
   1330      {
   1331        // Call non-static member function.
   1332        static_cast<YourClass*>(f)->nonStaticFunction();
   1333      }
   1334 
   1335      // This is how you pass pointer to the static function:
   1336      curl_easy_setopt(hcurl, CURLOPT_WRITEFUNCTION, YourClass::func);
   1337      curl_easy_setopt(hcurl, CURLOPT_WRITEDATA, this);
   1338 
   1339   5.15 How do I get an FTP directory listing?
   1340 
   1341   If you end the FTP URL you request with a slash, libcurl will provide you
   1342   with a directory listing of that given directory. You can also set
   1343   CURLOPT_CUSTOMREQUEST to alter what exact listing command libcurl would use
   1344   to list the files.
   1345 
   1346   The follow-up question tends to be how is a program supposed to parse the
   1347   directory listing. How does it know what's a file and what's a directory and
   1348   what's a symlink etc. If the FTP server supports the MLSD command then it
   1349   will return data in a machine-readable format that can be parsed for type.
   1350   The types are specified by RFC 3659 section 7.5.1. If MLSD is not supported
   1351   then you have to work with what you are given. The LIST output format is
   1352   entirely at the server's own liking and the NLST output does not reveal any
   1353   types and in many cases does not even include all the directory entries.
   1354   Also, both LIST and NLST tend to hide Unix-style hidden files (those that
   1355   start with a dot) by default so you need to do "LIST -a" or similar to see
   1356   them.
   1357 
   1358   Example - List only directories.
   1359   ftp.funet.fi supports MLSD and ftp.kernel.org does not:
   1360 
   1361      curl -s ftp.funet.fi/pub/ -X MLSD | \
   1362        perl -lne 'print if s/(?:^|;)type=dir;[^ ]+ (.+)$/$1/'
   1363 
   1364      curl -s ftp.kernel.org/pub/linux/kernel/ | \
   1365        perl -lne 'print if s/^d[-rwx]{9}(?: +[^ ]+){7} (.+)$/$1/'
   1366 
   1367   If you need to parse LIST output in libcurl one such existing
   1368   list parser is available at https://cr.yp.to/ftpparse.html  Versions of
   1369   libcurl since 7.21.0 also provide the ability to specify a wildcard to
   1370   download multiple files from one FTP directory.
   1371 
   1372   5.16 I want a different time-out
   1373 
   1374   Sometimes users realize that CURLOPT_TIMEOUT and CURLOPT_CONNECTIMEOUT are
   1375   not sufficiently advanced or flexible to cover all the various use cases and
   1376   scenarios applications end up with.
   1377 
   1378   libcurl offers many more ways to time-out operations. A common alternative
   1379   is to use the CURLOPT_LOW_SPEED_LIMIT and CURLOPT_LOW_SPEED_TIME options to
   1380   specify the lowest possible speed to accept before to consider the transfer
   1381   timed out.
   1382 
   1383   The most flexible way is by writing your own time-out logic and using
   1384   CURLOPT_XFERINFOFUNCTION (perhaps in combination with other callbacks) and
   1385   use that to figure out exactly when the right condition is met when the
   1386   transfer should get stopped.
   1387 
   1388   5.17 Can I write a server with libcurl?
   1389 
   1390   No. libcurl offers no functions or building blocks to build any kind of
   1391   Internet protocol server. libcurl is only a client-side library. For server
   1392   libraries, you need to continue your search elsewhere but there exist many
   1393   good open source ones out there for most protocols you could want a server
   1394   for. There are also really good stand-alone servers that have been tested
   1395   and proven for many years. There is no need for you to reinvent them.
   1396 
   1397   5.18 Does libcurl use threads?
   1398 
   1399   Put simply: no, libcurl will execute in the same thread you call it in. All
   1400   callbacks will be called in the same thread as the one you call libcurl in.
   1401 
   1402   If you want to avoid your thread to be blocked by the libcurl call, you make
   1403   sure you use the non-blocking multi API which will do transfers
   1404   asynchronously - still in the same single thread.
   1405 
   1406   libcurl will potentially internally use threads for name resolving, if it
   1407   was built to work like that, but in those cases it will create the child
   1408   threads by itself and they will only be used and then killed internally by
   1409   libcurl and never exposed to the outside.
   1410 
   1411 6. License Issues
   1412 
   1413   curl and libcurl are released under an MIT/X derivative license. The license
   1414   is liberal and should not impose a problem for your project. This section is
   1415   just a brief summary for the cases we get the most questions. (Parts of this
   1416   section was much enhanced by Bjorn Reese.)
   1417 
   1418   We are not lawyers and this is not legal advice. You should probably consult
   1419   one if you want true and accurate legal insights without our prejudice. Note
   1420   especially that this section concerns the libcurl license only; compiling in
   1421   features of libcurl that depend on other libraries (e.g. OpenSSL) may affect
   1422   the licensing obligations of your application.
   1423 
   1424   6.1 I have a GPL program, can I use the libcurl library?
   1425 
   1426   Yes
   1427 
   1428   Since libcurl may be distributed under the MIT/X derivative license, it can
   1429   be used together with GPL in any software.
   1430 
   1431   6.2 I have a closed-source program, can I use the libcurl library?
   1432 
   1433   Yes
   1434 
   1435   libcurl does not put any restrictions on the program that uses the library.
   1436 
   1437   6.3 I have a BSD licensed program, can I use the libcurl library?
   1438 
   1439   Yes
   1440 
   1441   libcurl does not put any restrictions on the program that uses the library.
   1442 
   1443   6.4 I have a program that uses LGPL libraries, can I use libcurl?
   1444 
   1445   Yes
   1446 
   1447   The LGPL license does not clash with other licenses.
   1448 
   1449   6.5 Can I modify curl/libcurl for my program and keep the changes secret?
   1450 
   1451   Yes
   1452 
   1453   The MIT/X derivative license practically allows you to do almost anything
   1454   with the sources, on the condition that the copyright texts in the sources
   1455   are left intact.
   1456 
   1457   6.6 Can you please change the curl/libcurl license to XXXX?
   1458 
   1459   No.
   1460 
   1461   We have carefully picked this license after years of development and
   1462   discussions and a large amount of people have contributed with source code
   1463   knowing that this is the license we use. This license puts the restrictions
   1464   we want on curl/libcurl and it does not spread to other programs or
   1465   libraries that use it. It should be possible for everyone to use libcurl or
   1466   curl in their projects, no matter what license they already have in use.
   1467 
   1468   6.7 What are my obligations when using libcurl in my commercial apps?
   1469 
   1470   Next to none. All you need to adhere to is the MIT-style license (stated in
   1471   the COPYING file) which basically says you have to include the copyright
   1472   notice in "all copies" and that you may not use the copyright holder's name
   1473   when promoting your software.
   1474 
   1475   You do not have to release any of your source code.
   1476 
   1477   You do not have to reveal or make public any changes to the libcurl source
   1478   code.
   1479 
   1480   You do not have to broadcast to the world that you are using libcurl within
   1481   your app.
   1482 
   1483   All we ask is that you disclose "the copyright notice and this permission
   1484   notice" somewhere. Most probably like in the documentation or in the section
   1485   where other third party dependencies already are mentioned and acknowledged.
   1486 
   1487   As can be seen here: https://curl.se/docs/companies.html and elsewhere,
   1488   more and more companies are discovering the power of libcurl and take
   1489   advantage of it even in commercial environments.
   1490 
   1491 
   1492 7. PHP/CURL Issues
   1493 
   1494   7.1 What is PHP/CURL?
   1495 
   1496   The module for PHP that makes it possible for PHP programs to access curl-
   1497   functions from within PHP.
   1498 
   1499   In the cURL project we call this module PHP/CURL to differentiate it from
   1500   curl the command line tool and libcurl the library. The PHP team however
   1501   does not refer to it like this (for unknown reasons). They call it plain
   1502   CURL (often using all caps) or sometimes ext/curl, but both cause much
   1503   confusion to users which in turn gives us a higher question load.
   1504 
   1505   7.2 Who wrote PHP/CURL?
   1506 
   1507   PHP/CURL was initially written by Sterling Hughes.
   1508 
   1509   7.3 Can I perform multiple requests using the same handle?
   1510 
   1511   Yes - at least in PHP version 4.3.8 and later (this has been known to not
   1512   work in earlier versions, but the exact version when it started to work is
   1513   unknown to me).
   1514 
   1515   After a transfer, you just set new options in the handle and make another
   1516   transfer. This will make libcurl reuse the same connection if it can.
   1517 
   1518   7.4 Does PHP/CURL have dependencies?
   1519 
   1520   PHP/CURL is a module that comes with the regular PHP package. It depends on
   1521   and uses libcurl, so you need to have libcurl installed properly before
   1522   PHP/CURL can be used.
   1523 
   1524 8. Development
   1525 
   1526  8.1 Why does curl use C89?
   1527 
   1528  As with everything in curl, there is a history and we keep using what we have
   1529  used before until someone brings up the subject and argues for and works on
   1530  changing it.
   1531 
   1532  We started out using C89 in the 1990s because that was the only way to write
   1533  a truly portable C program and have it run as widely as possible. C89 was for
   1534  a long time even necessary to make things work on otherwise considered modern
   1535  platforms such as Windows. Today, we do not really know how many users that
   1536  still require the use of a C89 compiler.
   1537 
   1538  We will continue to use C89 for as long as nobody brings up a strong enough
   1539  reason for us to change our minds. The core developers of the project do not
   1540  feel restricted by this and we are not convinced that going C99 will offer us
   1541  enough of a benefit to warrant the risk of cutting off a share of users.
   1542 
   1543  8.2 Will curl be rewritten?
   1544 
   1545  In one go: no. Little by little over time? Maybe.
   1546 
   1547  Over the years, new languages and clever operating environments come and go.
   1548  Every now and then the urge apparently arises to request that we rewrite curl
   1549  in another language.
   1550 
   1551  Some the most important properties in curl are maintaining the API and ABI
   1552  for libcurl and keeping the behavior for the command line tool. As long as we
   1553  can do that, everything else is up for discussion. To maintain the ABI, we
   1554  probably have to maintain a certain amount of code in C, and to remain rock
   1555  stable, we will never risk anything by rewriting a lot of things in one go.
   1556  That said, we can certainly offer more and more optional backends written in
   1557  other languages, as long as those backends can be plugged in at build-time.
   1558  Backends can be written in any language, but should probably provide APIs
   1559  usable from C to ease integration and transition.