CurlShare Object¶
- class pycurl.CurlShare(detach_on_close=True) → New CurlShare object¶
Creates a new CurlShare Object which corresponds to a
CURLSHhandle in libcurl. CurlShare objects is what you pass as an argument to the SHARE option on Curl objects.The
CurlShareobject can be used as a context manager. Exiting the context callsclose().When a
CurlShareis closed, its behavior depends on the value ofdetach_on_close.Example:
with pycurl.CurlShare(detach_on_close=True) as s: curl.setopt(pycurl.SHARE, s) # perform operations # the CurlShare is closed and the Curl object has been detached
- Parameters:
detach_on_close (bool) –
Controls how associated Curl objects are handled when the
CurlShareis closed.If
True(default), all liveCurlobjects associated with the share are automatically detached whenclose()is called or when exiting the context manager. Detaching clears theSHAREoption on eachCurlobject, but does not close them. The caller remains responsible for managing the lifetime of theCurlobjects.If
False, callingclose()(or exiting the context manager) while there are stillCurlobjects associated with the share raises an exception. In this mode, the caller must explicitly remove or close all associatedCurlobjects before closing theCurlShare.
See
close()for the rulesclose()enforces when associatedCurlhandles are still in use.CurlShare objects have the following methods:
- close() → None¶
Close shared handle.
Corresponds to curl_share_cleanup in libcurl. This method is automatically called by pycurl when a
CurlShareobject no longer has any references to it, but can also be called explicitly.The behavior of
close()depends on thedetach_on_closesetting of theCurlShare:If
detach_on_closeisTrue(default), all associated idle Curl objects are first detached from the share before the share handle is closed. Detaching clears theSHAREoption on eachCurlobject but does not close them.If
detach_on_closeisFalse, callingclose()while there are still associatedCurlobjects raisespycurl.errorand the share handle is not closed.
close()refuses to detach aCurlhandle that is currently insideperform()and raisespycurl.errorin that case, even withdetach_on_close=True. Idle attached handles are still detached automatically.Warning
Detaching
Curlobjects from aCurlShareis not thread-safe with respect to thoseCurlobjects.The caller is responsible for ensuring proper synchronization when using
CurlShareandCurlobjects across multiple threads.
- closed¶
Whether this
CurlShareobject has been closed.
- setopt(option, value) → None¶
Set curl share option.
Corresponds to curl_share_setopt in libcurl, where option is specified with the
CURLSHOPT_*constants in libcurl, except that theCURLSHOPT_prefix has been changed toSH_. Currently, value must be one of:LOCK_DATA_COOKIE,LOCK_DATA_DNS,LOCK_DATA_SSL_SESSIONorLOCK_DATA_CONNECT.Example usage:
import pycurl curl = pycurl.Curl() s = pycurl.CurlShare() s.setopt(pycurl.SH_SHARE, pycurl.LOCK_DATA_COOKIE) s.setopt(pycurl.SH_SHARE, pycurl.LOCK_DATA_DNS) curl.setopt(pycurl.URL, 'https://curl.haxx.se') curl.setopt(pycurl.SHARE, s) curl.perform() curl.close()
Raises pycurl.error exception upon failure. Failures reported by libcurl (
CURLSHcode) are surfaced aspycurl.error.
- share(*data) → None¶
Mark one or more data kinds as shared.
Equivalent to calling
setopt(SH_SHARE, item)for each item. Each item must be one of:LOCK_DATA_COOKIE,LOCK_DATA_DNS,LOCK_DATA_SSL_SESSION,LOCK_DATA_CONNECTorLOCK_DATA_PSL.At least one argument is required. Lists and tuples are not expanded — pass each constant individually. Items are applied sequentially under the CurlShare object lock; on failure, items already applied are not rolled back.
Example usage:
import pycurl s = pycurl.CurlShare() s.share(pycurl.LOCK_DATA_COOKIE, pycurl.LOCK_DATA_DNS)
Raises pycurl.error exception upon failure.
- unshare(*data) → None¶
Mark one or more data kinds as no longer shared.
Equivalent to calling
setopt(SH_UNSHARE, item)for each item. Each item must be one of:LOCK_DATA_COOKIE,LOCK_DATA_DNS,LOCK_DATA_SSL_SESSION,LOCK_DATA_CONNECTorLOCK_DATA_PSL.At least one argument is required. Lists and tuples are not expanded — pass each constant individually. Items are applied sequentially under the CurlShare object lock; on failure, items already applied are not rolled back.
Example usage:
import pycurl s = pycurl.CurlShare() s.share(pycurl.LOCK_DATA_COOKIE, pycurl.LOCK_DATA_DNS) s.unshare(pycurl.LOCK_DATA_COOKIE)
Raises pycurl.error exception upon failure.