oracular (3) tclcurl_multi.3.gz

Provided by: tclcurl_7.22.0+hg20160822-3build2_amd64 bug

NAME

       TclCurl:  -  get   a   URL with FTP, FTPS, HTTP, HTTPS, SCP, SFTP, TFTP, TELNET, DICT, FILE, LDAP, LDAPS,
       IMAP, IMAPS, POP, POP3, SMTP, SMTPS and gopher syntax.

SYNOPSIS

       curl::multiinit

       multiHandle addhandle

       multiHandle removehandle

       multiHandle configure

       multiHandle perform

       multiHandle active

       multiHandle getinfo

       multihandle cleanup

       multihandle auto

       curl::multistrerror errorCode

DESCRIPTION

       TclCurl's multi interface introduces several new abilities that the easy interface refuses to offer. They
       are mainly:

       Enable a "pull" interface. The application that uses TclCurl decides where and when to get/send data.

       Enable  multiple  simultaneous  transfers  in  the  same  thread  without  making  it complicated for the
       application.

       Keep Tk GUIs 'alive' while transfers are taking place.

Blocking

       A few areas in the code are still using blocking code, even when used from the multi interface. While  we
       certainly  want  and  intend  for  these to get fixed in the future, you should be aware of the following
       current restrictions:

              Name resolves on non-windows unless c-ares is used.

              GnuTLS SSL connections.

              GnuTLS SSL connections

              Active FTP connections.

              HTTP proxy CONNECT operations.

              SOCKS proxy handshakes

              file:// transfers.

              TELNET transfers

curl::multiinit

       This procedure must be the first one to call, it returns a multiHandle that you need  to  use  to  invoke
       TclCurl procedures. The init MUST have a corresponding call to cleanup when the operation is completed.

       RETURN VALUE

       multiHandle to use.

multiHandle addhandle ?easyHandle?

       Each  single transfer is built up with an 'easy' handle, the kind we have been using so far with TclCurl,
       you must create them and setup the appropriate options for each of them. Then we add them to  the  'multi
       stack' using the addhandle command.

       If  the  easy handle is not set to use a shared or global DNS cache, it will be made to use the DNS cache
       that is shared between all easy handles within the multi handle.

       When an easy handle has been added to a multi stack, you can not and you must not  use  perform  on  that
       handle!

       multiHandle is the return code from the curl::multiinit call.

       RETURN VALUE The possible return values are:

       -1     Handle added to the multi stack, please call perform soon

       0      Handle added ok.

       1      Invalid multi handle.

       2      Invalid  'easy'  handle.  It  could mean that it isn't an easy handle at all, or possibly that the
              handle already is in used by this or another multi handle.

       3      Out of memory, you should never get this.

       4      You found a bug in TclCurl.

multiHandle removehandle ?easyHandle?

       When a transfer is done or if we want to stop  a  transfer  before  it  is  completed,  we  can  use  the
       removehandle command. Once removed from the multi handle, we can again use other easy interface functions
       on it.

       Please note that when a single transfer is completed, the easy handle is still left added  to  the  multi
       stack.  You  need to remove it and then close or, possibly, set new options to it and add it again to the
       multi handle to start another transfer.

       RETURN VALUE The possible return values are:

       0      Handle removed ok.

       1      Invalid multi handle.

       2      Invalid 'easy' handle.

       3      Out of memory, you should never get this.

       4      You found a bug in TclCurl.

multiHandle configure

       So far the only options are:

       -pipelining
              Pass a 1 to enable or 0 to disable. Enabling pipelining on a multi handle will make it attempt  to
              perform HTTP Pipelining as far as possible for transfers using this handle. This means that if you
              add a second request that can use an already existing  connection,  the  second  request  will  be
              "piped" on the same connection rather than being executed in parallel.

       -maxconnects
              Pass  a  number  which  will be used as the maximum amount of simultaneously open connections that
              TclCurl may cache. Default is 10, and TclCurl will enlarge the size for each added easy handle  to
              make it fit 4 times the number of added easy handles.

              By  setting  this option, you can prevent the cache size to grow beyond the limit set by you. When
              the cache is full, curl closes the oldest  one  in  the  cache  to  prevent  the  number  of  open
              connections to increase.

              This  option  is for the multi handle's use only, when using the easy interface you should instead
              use it's own maxconnects option.

multiHandle perform

       Adding the easy handles to the multi stack does not start any transfer.  Remember that one  of  the  main
       ideas  with this interface is to let your application drive. You drive the transfers by invoking perform.
       TclCurl will then transfer data if there is anything available to transfer.  It'll use the callbacks  and
       everything  else  we  have  setup  in  the  individual  easy  handles. It'll transfer data on all current
       transfers in the multi stack that are ready to transfer anything. It may be all, it may be none.

       When you call perform and the amount of running handles is changed from the previous  call  (or  is  less
       than  the  amount  of  easy  handles  you  added to the multi handle), you know that there is one or more
       transfers less "running". You can then call getinfo to get information about  each  individual  completed
       transfer. If an added handle fails very quickly, it may never be counted as a running handle.

       RETURN  VALUE  If everything goes well, it returns the number of running handles, '0' if all are done. In
       case of error, it will return the error code.

       This function only returns errors etc regarding  the  whole  multi  stack.   Problems  still  might  have
       occurred on individual transfers even when this function returns ok.

multiHandle active

       In  order  to  know if any of the easy handles are ready to transfer data before invoking perform you can
       use the active command, it will return the number of transfers currently active.

       RETURN VALUE The number of active transfers or '-1' in case of error.

multiHandle getinfo

       This procedure returns very simple information about the transfers, you can get more  detail  information
       using the getinfo command on each of the easy handles.

       RETURN VALUE A list with the following elements:

       easyHandle about which the info is about.

       state of the transfer, '1' if it is done.

       exit code of the transfer, '0' if there was no error,...

       Number of messages still in the info queue.

       In case there are no messages in the queue it will return {"" 0 0 0}.

multiHandle cleanup

       This  procedure must be the last one to call for a multi stack, it is the opposite of the curl::multiinit
       procedure and must be called with the same multiHandle as input as the curl::multiinit call returned.

multiHandle auto ?-command command?

       Using this command Tcl's event loop will take care of periodically invoking perform for you, before using
       it, you must have already added at least one easy handle to the multi handle.

       The  command  option  allows  you to specify a command to invoke after all the easy handles have finished
       their transfers, even though I say it is an option, the truth is you must use this command to cleanup all
       the handles, otherwise the transfered files may not be complete.

       This  support  is  still  in a very experimental state, it may still change without warning.  Any and all
       comments are welcome.

       You can find a couple of examples at tests/multi.

curl::multistrerror errorCode

       This procedure returns a string describing the error code passed in the argument.

SEE ALSO

       tclcurl, curl.