Annotation of embedaddon/curl/docs/INTERNALS.md, revision 1.1

1.1     ! misho       1: curl internals
        !             2: ==============
        !             3: 
        !             4:  - [Intro](#intro)
        !             5:  - [git](#git)
        !             6:  - [Portability](#Portability)
        !             7:  - [Windows vs Unix](#winvsunix)
        !             8:  - [Library](#Library)
        !             9:    - [`Curl_connect`](#Curl_connect)
        !            10:    - [`multi_do`](#multi_do)
        !            11:    - [`Curl_readwrite`](#Curl_readwrite)
        !            12:    - [`multi_done`](#multi_done)
        !            13:    - [`Curl_disconnect`](#Curl_disconnect)
        !            14:  - [HTTP(S)](#http)
        !            15:  - [FTP](#ftp)
        !            16:  - [Kerberos](#kerberos)
        !            17:  - [TELNET](#telnet)
        !            18:  - [FILE](#file)
        !            19:  - [SMB](#smb)
        !            20:  - [LDAP](#ldap)
        !            21:  - [E-mail](#email)
        !            22:  - [General](#general)
        !            23:  - [Persistent Connections](#persistent)
        !            24:  - [multi interface/non-blocking](#multi)
        !            25:  - [SSL libraries](#ssl)
        !            26:  - [Library Symbols](#symbols)
        !            27:  - [Return Codes and Informationals](#returncodes)
        !            28:  - [AP/ABI](#abi)
        !            29:  - [Client](#client)
        !            30:  - [Memory Debugging](#memorydebug)
        !            31:  - [Test Suite](#test)
        !            32:  - [Asynchronous name resolves](#asyncdns)
        !            33:    - [c-ares](#cares)
        !            34:  - [`curl_off_t`](#curl_off_t)
        !            35:  - [curlx](#curlx)
        !            36:  - [Content Encoding](#contentencoding)
        !            37:  - [`hostip.c` explained](#hostip)
        !            38:  - [Track Down Memory Leaks](#memoryleak)
        !            39:  - [`multi_socket`](#multi_socket)
        !            40:  - [Structs in libcurl](#structs)
        !            41:    - [Curl_easy](#Curl_easy)
        !            42:    - [connectdata](#connectdata)
        !            43:    - [Curl_multi](#Curl_multi)
        !            44:    - [Curl_handler](#Curl_handler)
        !            45:    - [conncache](#conncache)
        !            46:    - [Curl_share](#Curl_share)
        !            47:    - [CookieInfo](#CookieInfo)
        !            48: 
        !            49: <a name="intro"></a>
        !            50: Intro
        !            51: =====
        !            52: 
        !            53:  This project is split in two. The library and the client. The client part
        !            54:  uses the library, but the library is designed to allow other applications to
        !            55:  use it.
        !            56: 
        !            57:  The largest amount of code and complexity is in the library part.
        !            58: 
        !            59: 
        !            60: <a name="git"></a>
        !            61: git
        !            62: ===
        !            63: 
        !            64:  All changes to the sources are committed to the git repository as soon as
        !            65:  they're somewhat verified to work. Changes shall be committed as independently
        !            66:  as possible so that individual changes can be easily spotted and tracked
        !            67:  afterwards.
        !            68: 
        !            69:  Tagging shall be used extensively, and by the time we release new archives we
        !            70:  should tag the sources with a name similar to the released version number.
        !            71: 
        !            72: <a name="Portability"></a>
        !            73: Portability
        !            74: ===========
        !            75: 
        !            76:  We write curl and libcurl to compile with C89 compilers.  On 32-bit and up
        !            77:  machines. Most of libcurl assumes more or less POSIX compliance but that's
        !            78:  not a requirement.
        !            79: 
        !            80:  We write libcurl to build and work with lots of third party tools, and we
        !            81:  want it to remain functional and buildable with these and later versions
        !            82:  (older versions may still work but is not what we work hard to maintain):
        !            83: 
        !            84: Dependencies
        !            85: ------------
        !            86: 
        !            87:  - OpenSSL      0.9.7
        !            88:  - GnuTLS       3.1.10
        !            89:  - zlib         1.1.4
        !            90:  - libssh2      0.16
        !            91:  - c-ares       1.6.0
        !            92:  - libidn2      2.0.0
        !            93:  - wolfSSL      2.0.0
        !            94:  - openldap     2.0
        !            95:  - MIT Kerberos 1.2.4
        !            96:  - GSKit        V5R3M0
        !            97:  - NSS          3.14.x
        !            98:  - Heimdal      ?
        !            99:  - nghttp2      1.12.0
        !           100: 
        !           101: Operating Systems
        !           102: -----------------
        !           103: 
        !           104:  On systems where configure runs, we aim at working on them all - if they have
        !           105:  a suitable C compiler. On systems that don't run configure, we strive to keep
        !           106:  curl running correctly on:
        !           107: 
        !           108:  - Windows      98
        !           109:  - AS/400       V5R3M0
        !           110:  - Symbian      9.1
        !           111:  - Windows CE   ?
        !           112:  - TPF          ?
        !           113: 
        !           114: Build tools
        !           115: -----------
        !           116: 
        !           117:  When writing code (mostly for generating stuff included in release tarballs)
        !           118:  we use a few "build tools" and we make sure that we remain functional with
        !           119:  these versions:
        !           120: 
        !           121:  - GNU Libtool  1.4.2
        !           122:  - GNU Autoconf 2.57
        !           123:  - GNU Automake 1.7
        !           124:  - GNU M4       1.4
        !           125:  - perl         5.004
        !           126:  - roffit       0.5
        !           127:  - groff        ? (any version that supports `groff -Tps -man [in] [out]`)
        !           128:  - ps2pdf (gs)  ?
        !           129: 
        !           130: <a name="winvsunix"></a>
        !           131: Windows vs Unix
        !           132: ===============
        !           133: 
        !           134:  There are a few differences in how to program curl the Unix way compared to
        !           135:  the Windows way. Perhaps the four most notable details are:
        !           136: 
        !           137:  1. Different function names for socket operations.
        !           138: 
        !           139:    In curl, this is solved with defines and macros, so that the source looks
        !           140:    the same in all places except for the header file that defines them. The
        !           141:    macros in use are `sclose()`, `sread()` and `swrite()`.
        !           142: 
        !           143:  2. Windows requires a couple of init calls for the socket stuff.
        !           144: 
        !           145:    That's taken care of by the `curl_global_init()` call, but if other libs
        !           146:    also do it etc there might be reasons for applications to alter that
        !           147:    behaviour.
        !           148: 
        !           149:  3. The file descriptors for network communication and file operations are
        !           150:     not as easily interchangeable as in Unix.
        !           151: 
        !           152:    We avoid this by not trying any funny tricks on file descriptors.
        !           153: 
        !           154:  4. When writing data to stdout, Windows makes end-of-lines the DOS way, thus
        !           155:     destroying binary data, although you do want that conversion if it is
        !           156:     text coming through... (sigh)
        !           157: 
        !           158:    We set stdout to binary under windows
        !           159: 
        !           160:  Inside the source code, We make an effort to avoid `#ifdef [Your OS]`. All
        !           161:  conditionals that deal with features *should* instead be in the format
        !           162:  `#ifdef HAVE_THAT_WEIRD_FUNCTION`. Since Windows can't run configure scripts,
        !           163:  we maintain a `curl_config-win32.h` file in lib directory that is supposed to
        !           164:  look exactly like a `curl_config.h` file would have looked like on a Windows
        !           165:  machine!
        !           166: 
        !           167:  Generally speaking: always remember that this will be compiled on dozens of
        !           168:  operating systems. Don't walk on the edge!
        !           169: 
        !           170: <a name="Library"></a>
        !           171: Library
        !           172: =======
        !           173: 
        !           174:  (See [Structs in libcurl](#structs) for the separate section describing all
        !           175:  major internal structs and their purposes.)
        !           176: 
        !           177:  There are plenty of entry points to the library, namely each publicly defined
        !           178:  function that libcurl offers to applications. All of those functions are
        !           179:  rather small and easy-to-follow. All the ones prefixed with `curl_easy` are
        !           180:  put in the `lib/easy.c` file.
        !           181: 
        !           182:  `curl_global_init()` and `curl_global_cleanup()` should be called by the
        !           183:  application to initialize and clean up global stuff in the library. As of
        !           184:  today, it can handle the global SSL initing if SSL is enabled and it can init
        !           185:  the socket layer on windows machines. libcurl itself has no "global" scope.
        !           186: 
        !           187:  All printf()-style functions use the supplied clones in `lib/mprintf.c`. This
        !           188:  makes sure we stay absolutely platform independent.
        !           189: 
        !           190:  [ `curl_easy_init()`][2] allocates an internal struct and makes some
        !           191:  initializations.  The returned handle does not reveal internals. This is the
        !           192:  `Curl_easy` struct which works as an "anchor" struct for all `curl_easy`
        !           193:  functions. All connections performed will get connect-specific data allocated
        !           194:  that should be used for things related to particular connections/requests.
        !           195: 
        !           196:  [`curl_easy_setopt()`][1] takes three arguments, where the option stuff must
        !           197:  be passed in pairs: the parameter-ID and the parameter-value. The list of
        !           198:  options is documented in the man page. This function mainly sets things in
        !           199:  the `Curl_easy` struct.
        !           200: 
        !           201:  `curl_easy_perform()` is just a wrapper function that makes use of the multi
        !           202:  API.  It basically calls `curl_multi_init()`, `curl_multi_add_handle()`,
        !           203:  `curl_multi_wait()`, and `curl_multi_perform()` until the transfer is done
        !           204:  and then returns.
        !           205: 
        !           206:  Some of the most important key functions in `url.c` are called from
        !           207:  `multi.c` when certain key steps are to be made in the transfer operation.
        !           208: 
        !           209: <a name="Curl_connect"></a>
        !           210: Curl_connect()
        !           211: --------------
        !           212: 
        !           213:    Analyzes the URL, it separates the different components and connects to the
        !           214:    remote host. This may involve using a proxy and/or using SSL. The
        !           215:    `Curl_resolv()` function in `lib/hostip.c` is used for looking up host
        !           216:    names (it does then use the proper underlying method, which may vary
        !           217:    between platforms and builds).
        !           218: 
        !           219:    When `Curl_connect` is done, we are connected to the remote site. Then it
        !           220:    is time to tell the server to get a document/file. `Curl_do()` arranges
        !           221:    this.
        !           222: 
        !           223:    This function makes sure there's an allocated and initiated `connectdata`
        !           224:    struct that is used for this particular connection only (although there may
        !           225:    be several requests performed on the same connect). A bunch of things are
        !           226:    inited/inherited from the `Curl_easy` struct.
        !           227: 
        !           228: <a name="multi_do"></a>
        !           229: multi_do()
        !           230: ---------
        !           231: 
        !           232:    `multi_do()` makes sure the proper protocol-specific function is called.
        !           233:    The functions are named after the protocols they handle.
        !           234: 
        !           235:    The protocol-specific functions of course deal with protocol-specific
        !           236:    negotiations and setup. They have access to the `Curl_sendf()` (from
        !           237:    `lib/sendf.c`) function to send printf-style formatted data to the remote
        !           238:    host and when they're ready to make the actual file transfer they call the
        !           239:    `Curl_setup_transfer()` function (in `lib/transfer.c`) to setup the
        !           240:    transfer and returns.
        !           241: 
        !           242:    If this DO function fails and the connection is being re-used, libcurl will
        !           243:    then close this connection, setup a new connection and re-issue the DO
        !           244:    request on that. This is because there is no way to be perfectly sure that
        !           245:    we have discovered a dead connection before the DO function and thus we
        !           246:    might wrongly be re-using a connection that was closed by the remote peer.
        !           247: 
        !           248: <a name="Curl_readwrite"></a>
        !           249: Curl_readwrite()
        !           250: ----------------
        !           251: 
        !           252:    Called during the transfer of the actual protocol payload.
        !           253: 
        !           254:    During transfer, the progress functions in `lib/progress.c` are called at
        !           255:    frequent intervals (or at the user's choice, a specified callback might get
        !           256:    called). The speedcheck functions in `lib/speedcheck.c` are also used to
        !           257:    verify that the transfer is as fast as required.
        !           258: 
        !           259: <a name="multi_done"></a>
        !           260: multi_done()
        !           261: -----------
        !           262: 
        !           263:    Called after a transfer is done. This function takes care of everything
        !           264:    that has to be done after a transfer. This function attempts to leave
        !           265:    matters in a state so that `multi_do()` should be possible to call again on
        !           266:    the same connection (in a persistent connection case). It might also soon
        !           267:    be closed with `Curl_disconnect()`.
        !           268: 
        !           269: <a name="Curl_disconnect"></a>
        !           270: Curl_disconnect()
        !           271: -----------------
        !           272: 
        !           273:    When doing normal connections and transfers, no one ever tries to close any
        !           274:    connections so this is not normally called when `curl_easy_perform()` is
        !           275:    used. This function is only used when we are certain that no more transfers
        !           276:    are going to be made on the connection. It can be also closed by force, or
        !           277:    it can be called to make sure that libcurl doesn't keep too many
        !           278:    connections alive at the same time.
        !           279: 
        !           280:    This function cleans up all resources that are associated with a single
        !           281:    connection.
        !           282: 
        !           283: <a name="http"></a>
        !           284: HTTP(S)
        !           285: =======
        !           286: 
        !           287:  HTTP offers a lot and is the protocol in curl that uses the most lines of
        !           288:  code. There is a special file `lib/formdata.c` that offers all the
        !           289:  multipart post functions.
        !           290: 
        !           291:  base64-functions for user+password stuff (and more) is in `lib/base64.c`
        !           292:  and all functions for parsing and sending cookies are found in
        !           293:  `lib/cookie.c`.
        !           294: 
        !           295:  HTTPS uses in almost every case the same procedure as HTTP, with only two
        !           296:  exceptions: the connect procedure is different and the function used to read
        !           297:  or write from the socket is different, although the latter fact is hidden in
        !           298:  the source by the use of `Curl_read()` for reading and `Curl_write()` for
        !           299:  writing data to the remote server.
        !           300: 
        !           301:  `http_chunks.c` contains functions that understands HTTP 1.1 chunked transfer
        !           302:  encoding.
        !           303: 
        !           304:  An interesting detail with the HTTP(S) request, is the `Curl_add_buffer()`
        !           305:  series of functions we use. They append data to one single buffer, and when
        !           306:  the building is finished the entire request is sent off in one single write.
        !           307:  This is done this way to overcome problems with flawed firewalls and lame
        !           308:  servers.
        !           309: 
        !           310: <a name="ftp"></a>
        !           311: FTP
        !           312: ===
        !           313: 
        !           314:  The `Curl_if2ip()` function can be used for getting the IP number of a
        !           315:  specified network interface, and it resides in `lib/if2ip.c`.
        !           316: 
        !           317:  `Curl_ftpsendf()` is used for sending FTP commands to the remote server. It
        !           318:  was made a separate function to prevent us programmers from forgetting that
        !           319:  they must be CRLF terminated. They must also be sent in one single `write()`
        !           320:  to make firewalls and similar happy.
        !           321: 
        !           322: <a name="kerberos"></a>
        !           323: Kerberos
        !           324: ========
        !           325: 
        !           326:  Kerberos support is mainly in `lib/krb5.c` and `lib/security.c` but also
        !           327:  `curl_sasl_sspi.c` and `curl_sasl_gssapi.c` for the email protocols and
        !           328:  `socks_gssapi.c` and `socks_sspi.c` for SOCKS5 proxy specifics.
        !           329: 
        !           330: <a name="telnet"></a>
        !           331: TELNET
        !           332: ======
        !           333: 
        !           334:  Telnet is implemented in `lib/telnet.c`.
        !           335: 
        !           336: <a name="file"></a>
        !           337: FILE
        !           338: ====
        !           339: 
        !           340:  The `file://` protocol is dealt with in `lib/file.c`.
        !           341: 
        !           342: <a name="smb"></a>
        !           343: SMB
        !           344: ===
        !           345: 
        !           346:  The `smb://` protocol is dealt with in `lib/smb.c`.
        !           347: 
        !           348: <a name="ldap"></a>
        !           349: LDAP
        !           350: ====
        !           351: 
        !           352:  Everything LDAP is in `lib/ldap.c` and `lib/openldap.c`.
        !           353: 
        !           354: <a name="email"></a>
        !           355: E-mail
        !           356: ======
        !           357: 
        !           358:  The e-mail related source code is in `lib/imap.c`, `lib/pop3.c` and
        !           359:  `lib/smtp.c`.
        !           360: 
        !           361: <a name="general"></a>
        !           362: General
        !           363: =======
        !           364: 
        !           365:  URL encoding and decoding, called escaping and unescaping in the source code,
        !           366:  is found in `lib/escape.c`.
        !           367: 
        !           368:  While transferring data in `Transfer()` a few functions might get used.
        !           369:  `curl_getdate()` in `lib/parsedate.c` is for HTTP date comparisons (and
        !           370:  more).
        !           371: 
        !           372:  `lib/getenv.c` offers `curl_getenv()` which is for reading environment
        !           373:  variables in a neat platform independent way. That's used in the client, but
        !           374:  also in `lib/url.c` when checking the proxy environment variables. Note that
        !           375:  contrary to the normal unix `getenv()`, this returns an allocated buffer that
        !           376:  must be `free()`ed after use.
        !           377: 
        !           378:  `lib/netrc.c` holds the `.netrc` parser.
        !           379: 
        !           380:  `lib/timeval.c` features replacement functions for systems that don't have
        !           381:  `gettimeofday()` and a few support functions for timeval conversions.
        !           382: 
        !           383:  A function named `curl_version()` that returns the full curl version string
        !           384:  is found in `lib/version.c`.
        !           385: 
        !           386: <a name="persistent"></a>
        !           387: Persistent Connections
        !           388: ======================
        !           389: 
        !           390:  The persistent connection support in libcurl requires some considerations on
        !           391:  how to do things inside of the library.
        !           392: 
        !           393:  - The `Curl_easy` struct returned in the [`curl_easy_init()`][2] call
        !           394:    must never hold connection-oriented data. It is meant to hold the root data
        !           395:    as well as all the options etc that the library-user may choose.
        !           396: 
        !           397:  - The `Curl_easy` struct holds the "connection cache" (an array of
        !           398:    pointers to `connectdata` structs).
        !           399: 
        !           400:  - This enables the 'curl handle' to be reused on subsequent transfers.
        !           401: 
        !           402:  - When libcurl is told to perform a transfer, it first checks for an already
        !           403:    existing connection in the cache that we can use. Otherwise it creates a
        !           404:    new one and adds that to the cache. If the cache is full already when a new
        !           405:    connection is added, it will first close the oldest unused one.
        !           406: 
        !           407:  - When the transfer operation is complete, the connection is left
        !           408:    open. Particular options may tell libcurl not to, and protocols may signal
        !           409:    closure on connections and then they won't be kept open, of course.
        !           410: 
        !           411:  - When `curl_easy_cleanup()` is called, we close all still opened connections,
        !           412:    unless of course the multi interface "owns" the connections.
        !           413: 
        !           414:  The curl handle must be re-used in order for the persistent connections to
        !           415:  work.
        !           416: 
        !           417: <a name="multi"></a>
        !           418: multi interface/non-blocking
        !           419: ============================
        !           420: 
        !           421:  The multi interface is a non-blocking interface to the library. To make that
        !           422:  interface work as well as possible, no low-level functions within libcurl
        !           423:  must be written to work in a blocking manner. (There are still a few spots
        !           424:  violating this rule.)
        !           425: 
        !           426:  One of the primary reasons we introduced c-ares support was to allow the name
        !           427:  resolve phase to be perfectly non-blocking as well.
        !           428: 
        !           429:  The FTP and the SFTP/SCP protocols are examples of how we adapt and adjust
        !           430:  the code to allow non-blocking operations even on multi-stage command-
        !           431:  response protocols. They are built around state machines that return when
        !           432:  they would otherwise block waiting for data.  The DICT, LDAP and TELNET
        !           433:  protocols are crappy examples and they are subject for rewrite in the future
        !           434:  to better fit the libcurl protocol family.
        !           435: 
        !           436: <a name="ssl"></a>
        !           437: SSL libraries
        !           438: =============
        !           439: 
        !           440:  Originally libcurl supported SSLeay for SSL/TLS transports, but that was then
        !           441:  extended to its successor OpenSSL but has since also been extended to several
        !           442:  other SSL/TLS libraries and we expect and hope to further extend the support
        !           443:  in future libcurl versions.
        !           444: 
        !           445:  To deal with this internally in the best way possible, we have a generic SSL
        !           446:  function API as provided by the `vtls/vtls.[ch]` system, and they are the only
        !           447:  SSL functions we must use from within libcurl. vtls is then crafted to use
        !           448:  the appropriate lower-level function calls to whatever SSL library that is in
        !           449:  use. For example `vtls/openssl.[ch]` for the OpenSSL library.
        !           450: 
        !           451: <a name="symbols"></a>
        !           452: Library Symbols
        !           453: ===============
        !           454: 
        !           455:  All symbols used internally in libcurl must use a `Curl_` prefix if they're
        !           456:  used in more than a single file. Single-file symbols must be made static.
        !           457:  Public ("exported") symbols must use a `curl_` prefix. (There are exceptions,
        !           458:  but they are to be changed to follow this pattern in future versions.) Public
        !           459:  API functions are marked with `CURL_EXTERN` in the public header files so
        !           460:  that all others can be hidden on platforms where this is possible.
        !           461: 
        !           462: <a name="returncodes"></a>
        !           463: Return Codes and Informationals
        !           464: ===============================
        !           465: 
        !           466:  I've made things simple. Almost every function in libcurl returns a CURLcode,
        !           467:  that must be `CURLE_OK` if everything is OK or otherwise a suitable error
        !           468:  code as the `curl/curl.h` include file defines. The very spot that detects an
        !           469:  error must use the `Curl_failf()` function to set the human-readable error
        !           470:  description.
        !           471: 
        !           472:  In aiding the user to understand what's happening and to debug curl usage, we
        !           473:  must supply a fair number of informational messages by using the
        !           474:  `Curl_infof()` function. Those messages are only displayed when the user
        !           475:  explicitly asks for them. They are best used when revealing information that
        !           476:  isn't otherwise obvious.
        !           477: 
        !           478: <a name="abi"></a>
        !           479: API/ABI
        !           480: =======
        !           481: 
        !           482:  We make an effort to not export or show internals or how internals work, as
        !           483:  that makes it easier to keep a solid API/ABI over time. See docs/libcurl/ABI
        !           484:  for our promise to users.
        !           485: 
        !           486: <a name="client"></a>
        !           487: Client
        !           488: ======
        !           489: 
        !           490:  `main()` resides in `src/tool_main.c`.
        !           491: 
        !           492:  `src/tool_hugehelp.c` is automatically generated by the `mkhelp.pl` perl
        !           493:  script to display the complete "manual" and the `src/tool_urlglob.c` file
        !           494:  holds the functions used for the URL-"globbing" support. Globbing in the
        !           495:  sense that the `{}` and `[]` expansion stuff is there.
        !           496: 
        !           497:  The client mostly sets up its `config` struct properly, then
        !           498:  it calls the `curl_easy_*()` functions of the library and when it gets back
        !           499:  control after the `curl_easy_perform()` it cleans up the library, checks
        !           500:  status and exits.
        !           501: 
        !           502:  When the operation is done, the `ourWriteOut()` function in `src/writeout.c`
        !           503:  may be called to report about the operation. That function is using the
        !           504:  `curl_easy_getinfo()` function to extract useful information from the curl
        !           505:  session.
        !           506: 
        !           507:  It may loop and do all this several times if many URLs were specified on the
        !           508:  command line or config file.
        !           509: 
        !           510: <a name="memorydebug"></a>
        !           511: Memory Debugging
        !           512: ================
        !           513: 
        !           514:  The file `lib/memdebug.c` contains debug-versions of a few functions.
        !           515:  Functions such as `malloc()`, `free()`, `fopen()`, `fclose()`, etc that
        !           516:  somehow deal with resources that might give us problems if we "leak" them.
        !           517:  The functions in the memdebug system do nothing fancy, they do their normal
        !           518:  function and then log information about what they just did. The logged data
        !           519:  can then be analyzed after a complete session,
        !           520: 
        !           521:  `memanalyze.pl` is the perl script present in `tests/` that analyzes a log
        !           522:  file generated by the memory tracking system. It detects if resources are
        !           523:  allocated but never freed and other kinds of errors related to resource
        !           524:  management.
        !           525: 
        !           526:  Internally, definition of preprocessor symbol `DEBUGBUILD` restricts code
        !           527:  which is only compiled for debug enabled builds. And symbol `CURLDEBUG` is
        !           528:  used to differentiate code which is _only_ used for memory
        !           529:  tracking/debugging.
        !           530: 
        !           531:  Use `-DCURLDEBUG` when compiling to enable memory debugging, this is also
        !           532:  switched on by running configure with `--enable-curldebug`. Use
        !           533:  `-DDEBUGBUILD` when compiling to enable a debug build or run configure with
        !           534:  `--enable-debug`.
        !           535: 
        !           536:  `curl --version` will list 'Debug' feature for debug enabled builds, and
        !           537:  will list 'TrackMemory' feature for curl debug memory tracking capable
        !           538:  builds. These features are independent and can be controlled when running
        !           539:  the configure script. When `--enable-debug` is given both features will be
        !           540:  enabled, unless some restriction prevents memory tracking from being used.
        !           541: 
        !           542: <a name="test"></a>
        !           543: Test Suite
        !           544: ==========
        !           545: 
        !           546:  The test suite is placed in its own subdirectory directly off the root in the
        !           547:  curl archive tree, and it contains a bunch of scripts and a lot of test case
        !           548:  data.
        !           549: 
        !           550:  The main test script is `runtests.pl` that will invoke test servers like
        !           551:  `httpserver.pl` and `ftpserver.pl` before all the test cases are performed.
        !           552:  The test suite currently only runs on Unix-like platforms.
        !           553: 
        !           554:  You'll find a description of the test suite in the `tests/README` file, and
        !           555:  the test case data files in the `tests/FILEFORMAT` file.
        !           556: 
        !           557:  The test suite automatically detects if curl was built with the memory
        !           558:  debugging enabled, and if it was, it will detect memory leaks, too.
        !           559: 
        !           560: <a name="asyncdns"></a>
        !           561: Asynchronous name resolves
        !           562: ==========================
        !           563: 
        !           564:  libcurl can be built to do name resolves asynchronously, using either the
        !           565:  normal resolver in a threaded manner or by using c-ares.
        !           566: 
        !           567: <a name="cares"></a>
        !           568: [c-ares][3]
        !           569: ------
        !           570: 
        !           571: ### Build libcurl to use a c-ares
        !           572: 
        !           573: 1. ./configure --enable-ares=/path/to/ares/install
        !           574: 2. make
        !           575: 
        !           576: ### c-ares on win32
        !           577: 
        !           578:  First I compiled c-ares. I changed the default C runtime library to be the
        !           579:  single-threaded rather than the multi-threaded (this seems to be required to
        !           580:  prevent linking errors later on). Then I simply build the areslib project
        !           581:  (the other projects adig/ahost seem to fail under MSVC).
        !           582: 
        !           583:  Next was libcurl. I opened `lib/config-win32.h` and I added a:
        !           584:  `#define USE_ARES 1`
        !           585: 
        !           586:  Next thing I did was I added the path for the ares includes to the include
        !           587:  path, and the libares.lib to the libraries.
        !           588: 
        !           589:  Lastly, I also changed libcurl to be single-threaded rather than
        !           590:  multi-threaded, again this was to prevent some duplicate symbol errors. I'm
        !           591:  not sure why I needed to change everything to single-threaded, but when I
        !           592:  didn't I got redefinition errors for several CRT functions (`malloc()`,
        !           593:  `stricmp()`, etc.)
        !           594: 
        !           595: <a name="curl_off_t"></a>
        !           596: `curl_off_t`
        !           597: ==========
        !           598: 
        !           599:  `curl_off_t` is a data type provided by the external libcurl include
        !           600:  headers. It is the type meant to be used for the [`curl_easy_setopt()`][1]
        !           601:  options that end with LARGE. The type is 64-bit large on most modern
        !           602:  platforms.
        !           603: 
        !           604: <a name="curlx"></a>
        !           605: curlx
        !           606: =====
        !           607: 
        !           608:  The libcurl source code offers a few functions by source only. They are not
        !           609:  part of the official libcurl API, but the source files might be useful for
        !           610:  others so apps can optionally compile/build with these sources to gain
        !           611:  additional functions.
        !           612: 
        !           613:  We provide them through a single header file for easy access for apps:
        !           614:  `curlx.h`
        !           615: 
        !           616: `curlx_strtoofft()`
        !           617: -------------------
        !           618:    A macro that converts a string containing a number to a `curl_off_t` number.
        !           619:    This might use the `curlx_strtoll()` function which is provided as source
        !           620:    code in strtoofft.c. Note that the function is only provided if no
        !           621:    `strtoll()` (or equivalent) function exist on your platform. If `curl_off_t`
        !           622:    is only a 32-bit number on your platform, this macro uses `strtol()`.
        !           623: 
        !           624: Future
        !           625: ------
        !           626: 
        !           627:  Several functions will be removed from the public `curl_` name space in a
        !           628:  future libcurl release. They will then only become available as `curlx_`
        !           629:  functions instead. To make the transition easier, we already today provide
        !           630:  these functions with the `curlx_` prefix to allow sources to be built
        !           631:  properly with the new function names. The concerned functions are:
        !           632: 
        !           633:  - `curlx_getenv`
        !           634:  - `curlx_strequal`
        !           635:  - `curlx_strnequal`
        !           636:  - `curlx_mvsnprintf`
        !           637:  - `curlx_msnprintf`
        !           638:  - `curlx_maprintf`
        !           639:  - `curlx_mvaprintf`
        !           640:  - `curlx_msprintf`
        !           641:  - `curlx_mprintf`
        !           642:  - `curlx_mfprintf`
        !           643:  - `curlx_mvsprintf`
        !           644:  - `curlx_mvprintf`
        !           645:  - `curlx_mvfprintf`
        !           646: 
        !           647: <a name="contentencoding"></a>
        !           648: Content Encoding
        !           649: ================
        !           650: 
        !           651: ## About content encodings
        !           652: 
        !           653:  [HTTP/1.1][4] specifies that a client may request that a server encode its
        !           654:  response. This is usually used to compress a response using one (or more)
        !           655:  encodings from a set of commonly available compression techniques. These
        !           656:  schemes include `deflate` (the zlib algorithm), `gzip`, `br` (brotli) and
        !           657:  `compress`. A client requests that the server perform an encoding by including
        !           658:  an `Accept-Encoding` header in the request document. The value of the header
        !           659:  should be one of the recognized tokens `deflate`, ... (there's a way to
        !           660:  register new schemes/tokens, see sec 3.5 of the spec). A server MAY honor
        !           661:  the client's encoding request. When a response is encoded, the server
        !           662:  includes a `Content-Encoding` header in the response. The value of the
        !           663:  `Content-Encoding` header indicates which encodings were used to encode the
        !           664:  data, in the order in which they were applied.
        !           665: 
        !           666:  It's also possible for a client to attach priorities to different schemes so
        !           667:  that the server knows which it prefers. See sec 14.3 of RFC 2616 for more
        !           668:  information on the `Accept-Encoding` header. See sec
        !           669:  [3.1.2.2 of RFC 7231][15] for more information on the `Content-Encoding`
        !           670:  header.
        !           671: 
        !           672: ## Supported content encodings
        !           673: 
        !           674:  The `deflate`, `gzip` and `br` content encodings are supported by libcurl.
        !           675:  Both regular and chunked transfers work fine.  The zlib library is required
        !           676:  for the `deflate` and `gzip` encodings, while the brotli decoding library is
        !           677:  for the `br` encoding.
        !           678: 
        !           679: ## The libcurl interface
        !           680: 
        !           681:  To cause libcurl to request a content encoding use:
        !           682: 
        !           683:   [`curl_easy_setopt`][1](curl, [`CURLOPT_ACCEPT_ENCODING`][5], string)
        !           684: 
        !           685:  where string is the intended value of the `Accept-Encoding` header.
        !           686: 
        !           687:  Currently, libcurl does support multiple encodings but only
        !           688:  understands how to process responses that use the `deflate`, `gzip` and/or
        !           689:  `br` content encodings, so the only values for [`CURLOPT_ACCEPT_ENCODING`][5]
        !           690:  that will work (besides `identity`, which does nothing) are `deflate`,
        !           691:  `gzip` and `br`. If a response is encoded using the `compress` or methods,
        !           692:  libcurl will return an error indicating that the response could
        !           693:  not be decoded.  If `<string>` is NULL no `Accept-Encoding` header is
        !           694:  generated. If `<string>` is a zero-length string, then an `Accept-Encoding`
        !           695:  header containing all supported encodings will be generated.
        !           696: 
        !           697:  The [`CURLOPT_ACCEPT_ENCODING`][5] must be set to any non-NULL value for
        !           698:  content to be automatically decoded.  If it is not set and the server still
        !           699:  sends encoded content (despite not having been asked), the data is returned
        !           700:  in its raw form and the `Content-Encoding` type is not checked.
        !           701: 
        !           702: ## The curl interface
        !           703: 
        !           704:  Use the [`--compressed`][6] option with curl to cause it to ask servers to
        !           705:  compress responses using any format supported by curl.
        !           706: 
        !           707: <a name="hostip"></a>
        !           708: `hostip.c` explained
        !           709: ====================
        !           710: 
        !           711:  The main compile-time defines to keep in mind when reading the `host*.c`
        !           712:  source file are these:
        !           713: 
        !           714: ## `CURLRES_IPV6`
        !           715: 
        !           716:  this host has `getaddrinfo()` and family, and thus we use that. The host may
        !           717:  not be able to resolve IPv6, but we don't really have to take that into
        !           718:  account. Hosts that aren't IPv6-enabled have `CURLRES_IPV4` defined.
        !           719: 
        !           720: ## `CURLRES_ARES`
        !           721: 
        !           722:  is defined if libcurl is built to use c-ares for asynchronous name
        !           723:  resolves. This can be Windows or \*nix.
        !           724: 
        !           725: ## `CURLRES_THREADED`
        !           726: 
        !           727:  is defined if libcurl is built to use threading for asynchronous name
        !           728:  resolves. The name resolve will be done in a new thread, and the supported
        !           729:  asynch API will be the same as for ares-builds. This is the default under
        !           730:  (native) Windows.
        !           731: 
        !           732:  If any of the two previous are defined, `CURLRES_ASYNCH` is defined too. If
        !           733:  libcurl is not built to use an asynchronous resolver, `CURLRES_SYNCH` is
        !           734:  defined.
        !           735: 
        !           736: ## `host*.c` sources
        !           737: 
        !           738:  The `host*.c` sources files are split up like this:
        !           739: 
        !           740:  - `hostip.c`      - method-independent resolver functions and utility functions
        !           741:  - `hostasyn.c`    - functions for asynchronous name resolves
        !           742:  - `hostsyn.c`     - functions for synchronous name resolves
        !           743:  - `asyn-ares.c`   - functions for asynchronous name resolves using c-ares
        !           744:  - `asyn-thread.c` - functions for asynchronous name resolves using threads
        !           745:  - `hostip4.c`     - IPv4 specific functions
        !           746:  - `hostip6.c`     - IPv6 specific functions
        !           747: 
        !           748:  The `hostip.h` is the single united header file for all this. It defines the
        !           749:  `CURLRES_*` defines based on the `config*.h` and `curl_setup.h` defines.
        !           750: 
        !           751: <a name="memoryleak"></a>
        !           752: Track Down Memory Leaks
        !           753: =======================
        !           754: 
        !           755: ## Single-threaded
        !           756: 
        !           757:   Please note that this memory leak system is not adjusted to work in more
        !           758:   than one thread. If you want/need to use it in a multi-threaded app. Please
        !           759:   adjust accordingly.
        !           760: 
        !           761: ## Build
        !           762: 
        !           763:   Rebuild libcurl with `-DCURLDEBUG` (usually, rerunning configure with
        !           764:   `--enable-debug` fixes this). `make clean` first, then `make` so that all
        !           765:   files are actually rebuilt properly. It will also make sense to build
        !           766:   libcurl with the debug option (usually `-g` to the compiler) so that
        !           767:   debugging it will be easier if you actually do find a leak in the library.
        !           768: 
        !           769:   This will create a library that has memory debugging enabled.
        !           770: 
        !           771: ## Modify Your Application
        !           772: 
        !           773:   Add a line in your application code:
        !           774: 
        !           775:        `curl_dbg_memdebug("dump");`
        !           776: 
        !           777:   This will make the malloc debug system output a full trace of all resource
        !           778:   using functions to the given file name. Make sure you rebuild your program
        !           779:   and that you link with the same libcurl you built for this purpose as
        !           780:   described above.
        !           781: 
        !           782: ## Run Your Application
        !           783: 
        !           784:   Run your program as usual. Watch the specified memory trace file grow.
        !           785: 
        !           786:   Make your program exit and use the proper libcurl cleanup functions etc. So
        !           787:   that all non-leaks are returned/freed properly.
        !           788: 
        !           789: ## Analyze the Flow
        !           790: 
        !           791:   Use the `tests/memanalyze.pl` perl script to analyze the dump file:
        !           792: 
        !           793:     tests/memanalyze.pl dump
        !           794: 
        !           795:   This now outputs a report on what resources that were allocated but never
        !           796:   freed etc. This report is very fine for posting to the list!
        !           797: 
        !           798:   If this doesn't produce any output, no leak was detected in libcurl. Then
        !           799:   the leak is mostly likely to be in your code.
        !           800: 
        !           801: <a name="multi_socket"></a>
        !           802: `multi_socket`
        !           803: ==============
        !           804: 
        !           805:  Implementation of the `curl_multi_socket` API
        !           806: 
        !           807:  The main ideas of this API are simply:
        !           808: 
        !           809:  1. The application can use whatever event system it likes as it gets info
        !           810:     from libcurl about what file descriptors libcurl waits for what action
        !           811:     on. (The previous API returns `fd_sets` which is very
        !           812:     `select()`-centric).
        !           813: 
        !           814:  2. When the application discovers action on a single socket, it calls
        !           815:     libcurl and informs that there was action on this particular socket and
        !           816:     libcurl can then act on that socket/transfer only and not care about
        !           817:     any other transfers. (The previous API always had to scan through all
        !           818:     the existing transfers.)
        !           819: 
        !           820:  The idea is that [`curl_multi_socket_action()`][7] calls a given callback
        !           821:  with information about what socket to wait for what action on, and the
        !           822:  callback only gets called if the status of that socket has changed.
        !           823: 
        !           824:  We also added a timer callback that makes libcurl call the application when
        !           825:  the timeout value changes, and you set that with [`curl_multi_setopt()`][9]
        !           826:  and the [`CURLMOPT_TIMERFUNCTION`][10] option. To get this to work,
        !           827:  Internally, there's an added struct to each easy handle in which we store
        !           828:  an "expire time" (if any). The structs are then "splay sorted" so that we
        !           829:  can add and remove times from the linked list and yet somewhat swiftly
        !           830:  figure out both how long there is until the next nearest timer expires
        !           831:  and which timer (handle) we should take care of now. Of course, the upside
        !           832:  of all this is that we get a [`curl_multi_timeout()`][8] that should also
        !           833:  work with old-style applications that use [`curl_multi_perform()`][11].
        !           834: 
        !           835:  We created an internal "socket to easy handles" hash table that given
        !           836:  a socket (file descriptor) returns the easy handle that waits for action on
        !           837:  that socket.  This hash is made using the already existing hash code
        !           838:  (previously only used for the DNS cache).
        !           839: 
        !           840:  To make libcurl able to report plain sockets in the socket callback, we had
        !           841:  to re-organize the internals of the [`curl_multi_fdset()`][12] etc so that
        !           842:  the conversion from sockets to `fd_sets` for that function is only done in
        !           843:  the last step before the data is returned. I also had to extend c-ares to
        !           844:  get a function that can return plain sockets, as that library too returned
        !           845:  only `fd_sets` and that is no longer good enough. The changes done to c-ares
        !           846:  are available in c-ares 1.3.1 and later.
        !           847: 
        !           848: <a name="structs"></a>
        !           849: Structs in libcurl
        !           850: ==================
        !           851: 
        !           852: This section should cover 7.32.0 pretty accurately, but will make sense even
        !           853: for older and later versions as things don't change drastically that often.
        !           854: 
        !           855: <a name="Curl_easy"></a>
        !           856: ## Curl_easy
        !           857: 
        !           858:   The `Curl_easy` struct is the one returned to the outside in the external API
        !           859:   as a `CURL *`. This is usually known as an easy handle in API documentations
        !           860:   and examples.
        !           861: 
        !           862:   Information and state that is related to the actual connection is in the
        !           863:   `connectdata` struct. When a transfer is about to be made, libcurl will
        !           864:   either create a new connection or re-use an existing one. The particular
        !           865:   connectdata that is used by this handle is pointed out by
        !           866:   `Curl_easy->easy_conn`.
        !           867: 
        !           868:   Data and information that regard this particular single transfer is put in
        !           869:   the `SingleRequest` sub-struct.
        !           870: 
        !           871:   When the `Curl_easy` struct is added to a multi handle, as it must be in
        !           872:   order to do any transfer, the `->multi` member will point to the `Curl_multi`
        !           873:   struct it belongs to. The `->prev` and `->next` members will then be used by
        !           874:   the multi code to keep a linked list of `Curl_easy` structs that are added to
        !           875:   that same multi handle. libcurl always uses multi so `->multi` *will* point
        !           876:   to a `Curl_multi` when a transfer is in progress.
        !           877: 
        !           878:   `->mstate` is the multi state of this particular `Curl_easy`. When
        !           879:   `multi_runsingle()` is called, it will act on this handle according to which
        !           880:   state it is in. The mstate is also what tells which sockets to return for a
        !           881:   specific `Curl_easy` when [`curl_multi_fdset()`][12] is called etc.
        !           882: 
        !           883:   The libcurl source code generally use the name `data` for the variable that
        !           884:   points to the `Curl_easy`.
        !           885: 
        !           886:   When doing multiplexed HTTP/2 transfers, each `Curl_easy` is associated with
        !           887:   an individual stream, sharing the same connectdata struct. Multiplexing
        !           888:   makes it even more important to keep things associated with the right thing!
        !           889: 
        !           890: <a name="connectdata"></a>
        !           891: ## connectdata
        !           892: 
        !           893:   A general idea in libcurl is to keep connections around in a connection
        !           894:   "cache" after they have been used in case they will be used again and then
        !           895:   re-use an existing one instead of creating a new as it creates a significant
        !           896:   performance boost.
        !           897: 
        !           898:   Each `connectdata` identifies a single physical connection to a server. If
        !           899:   the connection can't be kept alive, the connection will be closed after use
        !           900:   and then this struct can be removed from the cache and freed.
        !           901: 
        !           902:   Thus, the same `Curl_easy` can be used multiple times and each time select
        !           903:   another `connectdata` struct to use for the connection. Keep this in mind,
        !           904:   as it is then important to consider if options or choices are based on the
        !           905:   connection or the `Curl_easy`.
        !           906: 
        !           907:   Functions in libcurl will assume that `connectdata->data` points to the
        !           908:   `Curl_easy` that uses this connection (for the moment).
        !           909: 
        !           910:   As a special complexity, some protocols supported by libcurl require a
        !           911:   special disconnect procedure that is more than just shutting down the
        !           912:   socket. It can involve sending one or more commands to the server before
        !           913:   doing so. Since connections are kept in the connection cache after use, the
        !           914:   original `Curl_easy` may no longer be around when the time comes to shut down
        !           915:   a particular connection. For this purpose, libcurl holds a special dummy
        !           916:   `closure_handle` `Curl_easy` in the `Curl_multi` struct to use when needed.
        !           917: 
        !           918:   FTP uses two TCP connections for a typical transfer but it keeps both in
        !           919:   this single struct and thus can be considered a single connection for most
        !           920:   internal concerns.
        !           921: 
        !           922:   The libcurl source code generally use the name `conn` for the variable that
        !           923:   points to the connectdata.
        !           924: 
        !           925: <a name="Curl_multi"></a>
        !           926: ## Curl_multi
        !           927: 
        !           928:   Internally, the easy interface is implemented as a wrapper around multi
        !           929:   interface functions. This makes everything multi interface.
        !           930: 
        !           931:   `Curl_multi` is the multi handle struct exposed as `CURLM *` in external
        !           932:   APIs.
        !           933: 
        !           934:   This struct holds a list of `Curl_easy` structs that have been added to this
        !           935:   handle with [`curl_multi_add_handle()`][13]. The start of the list is
        !           936:   `->easyp` and `->num_easy` is a counter of added `Curl_easy`s.
        !           937: 
        !           938:   `->msglist` is a linked list of messages to send back when
        !           939:   [`curl_multi_info_read()`][14] is called. Basically a node is added to that
        !           940:   list when an individual `Curl_easy`'s transfer has completed.
        !           941: 
        !           942:   `->hostcache` points to the name cache. It is a hash table for looking up
        !           943:   name to IP. The nodes have a limited life time in there and this cache is
        !           944:   meant to reduce the time for when the same name is wanted within a short
        !           945:   period of time.
        !           946: 
        !           947:   `->timetree` points to a tree of `Curl_easy`s, sorted by the remaining time
        !           948:   until it should be checked - normally some sort of timeout. Each `Curl_easy`
        !           949:   has one node in the tree.
        !           950: 
        !           951:   `->sockhash` is a hash table to allow fast lookups of socket descriptor for
        !           952:   which `Curl_easy` uses that descriptor. This is necessary for the
        !           953:   `multi_socket` API.
        !           954: 
        !           955:   `->conn_cache` points to the connection cache. It keeps track of all
        !           956:   connections that are kept after use. The cache has a maximum size.
        !           957: 
        !           958:   `->closure_handle` is described in the `connectdata` section.
        !           959: 
        !           960:   The libcurl source code generally use the name `multi` for the variable that
        !           961:   points to the `Curl_multi` struct.
        !           962: 
        !           963: <a name="Curl_handler"></a>
        !           964: ## Curl_handler
        !           965: 
        !           966:   Each unique protocol that is supported by libcurl needs to provide at least
        !           967:   one `Curl_handler` struct. It defines what the protocol is called and what
        !           968:   functions the main code should call to deal with protocol specific issues.
        !           969:   In general, there's a source file named `[protocol].c` in which there's a
        !           970:   `struct Curl_handler Curl_handler_[protocol]` declared. In `url.c` there's
        !           971:   then the main array with all individual `Curl_handler` structs pointed to
        !           972:   from a single array which is scanned through when a URL is given to libcurl
        !           973:   to work with.
        !           974: 
        !           975:   `->scheme` is the URL scheme name, usually spelled out in uppercase. That's
        !           976:   "HTTP" or "FTP" etc. SSL versions of the protocol need their own
        !           977:   `Curl_handler` setup so HTTPS separate from HTTP.
        !           978: 
        !           979:   `->setup_connection` is called to allow the protocol code to allocate
        !           980:   protocol specific data that then gets associated with that `Curl_easy` for
        !           981:   the rest of this transfer. It gets freed again at the end of the transfer.
        !           982:   It will be called before the `connectdata` for the transfer has been
        !           983:   selected/created. Most protocols will allocate its private
        !           984:   `struct [PROTOCOL]` here and assign `Curl_easy->req.protop` to point to it.
        !           985: 
        !           986:   `->connect_it` allows a protocol to do some specific actions after the TCP
        !           987:   connect is done, that can still be considered part of the connection phase.
        !           988: 
        !           989:   Some protocols will alter the `connectdata->recv[]` and
        !           990:   `connectdata->send[]` function pointers in this function.
        !           991: 
        !           992:   `->connecting` is similarly a function that keeps getting called as long as
        !           993:   the protocol considers itself still in the connecting phase.
        !           994: 
        !           995:   `->do_it` is the function called to issue the transfer request. What we call
        !           996:   the DO action internally. If the DO is not enough and things need to be kept
        !           997:   getting done for the entire DO sequence to complete, `->doing` is then
        !           998:   usually also provided. Each protocol that needs to do multiple commands or
        !           999:   similar for do/doing need to implement their own state machines (see SCP,
        !          1000:   SFTP, FTP). Some protocols (only FTP and only due to historical reasons) has
        !          1001:   a separate piece of the DO state called `DO_MORE`.
        !          1002: 
        !          1003:   `->doing` keeps getting called while issuing the transfer request command(s)
        !          1004: 
        !          1005:   `->done` gets called when the transfer is complete and DONE. That's after the
        !          1006:   main data has been transferred.
        !          1007: 
        !          1008:   `->do_more` gets called during the `DO_MORE` state. The FTP protocol uses
        !          1009:   this state when setting up the second connection.
        !          1010: 
        !          1011:   `->proto_getsock`
        !          1012:   `->doing_getsock`
        !          1013:   `->domore_getsock`
        !          1014:   `->perform_getsock`
        !          1015:   Functions that return socket information. Which socket(s) to wait for which
        !          1016:   action(s) during the particular multi state.
        !          1017: 
        !          1018:   `->disconnect` is called immediately before the TCP connection is shutdown.
        !          1019: 
        !          1020:   `->readwrite` gets called during transfer to allow the protocol to do extra
        !          1021:   reads/writes
        !          1022: 
        !          1023:   `->defport` is the default report TCP or UDP port this protocol uses
        !          1024: 
        !          1025:   `->protocol` is one or more bits in the `CURLPROTO_*` set. The SSL versions
        !          1026:   have their "base" protocol set and then the SSL variation. Like
        !          1027:   "HTTP|HTTPS".
        !          1028: 
        !          1029:   `->flags` is a bitmask with additional information about the protocol that will
        !          1030:   make it get treated differently by the generic engine:
        !          1031: 
        !          1032:   - `PROTOPT_SSL` - will make it connect and negotiate SSL
        !          1033: 
        !          1034:   - `PROTOPT_DUAL` - this protocol uses two connections
        !          1035: 
        !          1036:   - `PROTOPT_CLOSEACTION` - this protocol has actions to do before closing the
        !          1037:     connection. This flag is no longer used by code, yet still set for a bunch
        !          1038:     of protocol handlers.
        !          1039: 
        !          1040:   - `PROTOPT_DIRLOCK` - "direction lock". The SSH protocols set this bit to
        !          1041:     limit which "direction" of socket actions that the main engine will
        !          1042:     concern itself with.
        !          1043: 
        !          1044:   - `PROTOPT_NONETWORK` - a protocol that doesn't use network (read `file:`)
        !          1045: 
        !          1046:   - `PROTOPT_NEEDSPWD` - this protocol needs a password and will use a default
        !          1047:     one unless one is provided
        !          1048: 
        !          1049:   - `PROTOPT_NOURLQUERY` - this protocol can't handle a query part on the URL
        !          1050:     (?foo=bar)
        !          1051: 
        !          1052: <a name="conncache"></a>
        !          1053: ## conncache
        !          1054: 
        !          1055:   Is a hash table with connections for later re-use. Each `Curl_easy` has a
        !          1056:   pointer to its connection cache. Each multi handle sets up a connection
        !          1057:   cache that all added `Curl_easy`s share by default.
        !          1058: 
        !          1059: <a name="Curl_share"></a>
        !          1060: ## Curl_share
        !          1061: 
        !          1062:   The libcurl share API allocates a `Curl_share` struct, exposed to the
        !          1063:   external API as `CURLSH *`.
        !          1064: 
        !          1065:   The idea is that the struct can have a set of its own versions of caches and
        !          1066:   pools and then by providing this struct in the `CURLOPT_SHARE` option, those
        !          1067:   specific `Curl_easy`s will use the caches/pools that this share handle
        !          1068:   holds.
        !          1069: 
        !          1070:   Then individual `Curl_easy` structs can be made to share specific things
        !          1071:   that they otherwise wouldn't, such as cookies.
        !          1072: 
        !          1073:   The `Curl_share` struct can currently hold cookies, DNS cache and the SSL
        !          1074:   session cache.
        !          1075: 
        !          1076: <a name="CookieInfo"></a>
        !          1077: ## CookieInfo
        !          1078: 
        !          1079:   This is the main cookie struct. It holds all known cookies and related
        !          1080:   information. Each `Curl_easy` has its own private `CookieInfo` even when
        !          1081:   they are added to a multi handle. They can be made to share cookies by using
        !          1082:   the share API.
        !          1083: 
        !          1084: 
        !          1085: [1]: https://curl.haxx.se/libcurl/c/curl_easy_setopt.html
        !          1086: [2]: https://curl.haxx.se/libcurl/c/curl_easy_init.html
        !          1087: [3]: https://c-ares.haxx.se/
        !          1088: [4]: https://tools.ietf.org/html/rfc7230 "RFC 7230"
        !          1089: [5]: https://curl.haxx.se/libcurl/c/CURLOPT_ACCEPT_ENCODING.html
        !          1090: [6]: https://curl.haxx.se/docs/manpage.html#--compressed
        !          1091: [7]: https://curl.haxx.se/libcurl/c/curl_multi_socket_action.html
        !          1092: [8]: https://curl.haxx.se/libcurl/c/curl_multi_timeout.html
        !          1093: [9]: https://curl.haxx.se/libcurl/c/curl_multi_setopt.html
        !          1094: [10]: https://curl.haxx.se/libcurl/c/CURLMOPT_TIMERFUNCTION.html
        !          1095: [11]: https://curl.haxx.se/libcurl/c/curl_multi_perform.html
        !          1096: [12]: https://curl.haxx.se/libcurl/c/curl_multi_fdset.html
        !          1097: [13]: https://curl.haxx.se/libcurl/c/curl_multi_add_handle.html
        !          1098: [14]: https://curl.haxx.se/libcurl/c/curl_multi_info_read.html
        !          1099: [15]: https://tools.ietf.org/html/rfc7231#section-3.1.2.2

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>