17db96d56Sopenharmony_ci:mod:`http.cookiejar` --- Cookie handling for HTTP clients
27db96d56Sopenharmony_ci==========================================================
37db96d56Sopenharmony_ci
47db96d56Sopenharmony_ci.. module:: http.cookiejar
57db96d56Sopenharmony_ci   :synopsis: Classes for automatic handling of HTTP cookies.
67db96d56Sopenharmony_ci
77db96d56Sopenharmony_ci.. moduleauthor:: John J. Lee <jjl@pobox.com>
87db96d56Sopenharmony_ci.. sectionauthor:: John J. Lee <jjl@pobox.com>
97db96d56Sopenharmony_ci
107db96d56Sopenharmony_ci**Source code:** :source:`Lib/http/cookiejar.py`
117db96d56Sopenharmony_ci
127db96d56Sopenharmony_ci--------------
137db96d56Sopenharmony_ci
147db96d56Sopenharmony_ciThe :mod:`http.cookiejar` module defines classes for automatic handling of HTTP
157db96d56Sopenharmony_cicookies.  It is useful for accessing web sites that require small pieces of data
167db96d56Sopenharmony_ci-- :dfn:`cookies` -- to be set on the client machine by an HTTP response from a
177db96d56Sopenharmony_ciweb server, and then returned to the server in later HTTP requests.
187db96d56Sopenharmony_ci
197db96d56Sopenharmony_ciBoth the regular Netscape cookie protocol and the protocol defined by
207db96d56Sopenharmony_ci:rfc:`2965` are handled.  RFC 2965 handling is switched off by default.
217db96d56Sopenharmony_ci:rfc:`2109` cookies are parsed as Netscape cookies and subsequently treated
227db96d56Sopenharmony_cieither as Netscape or RFC 2965 cookies according to the 'policy' in effect.
237db96d56Sopenharmony_ciNote that the great majority of cookies on the internet are Netscape cookies.
247db96d56Sopenharmony_ci:mod:`http.cookiejar` attempts to follow the de-facto Netscape cookie protocol (which
257db96d56Sopenharmony_cidiffers substantially from that set out in the original Netscape specification),
267db96d56Sopenharmony_ciincluding taking note of the ``max-age`` and ``port`` cookie-attributes
277db96d56Sopenharmony_ciintroduced with RFC 2965.
287db96d56Sopenharmony_ci
297db96d56Sopenharmony_ci.. note::
307db96d56Sopenharmony_ci
317db96d56Sopenharmony_ci   The various named parameters found in :mailheader:`Set-Cookie` and
327db96d56Sopenharmony_ci   :mailheader:`Set-Cookie2` headers (eg. ``domain`` and ``expires``) are
337db96d56Sopenharmony_ci   conventionally referred to as :dfn:`attributes`.  To distinguish them from
347db96d56Sopenharmony_ci   Python attributes, the documentation for this module uses the term
357db96d56Sopenharmony_ci   :dfn:`cookie-attribute` instead.
367db96d56Sopenharmony_ci
377db96d56Sopenharmony_ci
387db96d56Sopenharmony_ciThe module defines the following exception:
397db96d56Sopenharmony_ci
407db96d56Sopenharmony_ci
417db96d56Sopenharmony_ci.. exception:: LoadError
427db96d56Sopenharmony_ci
437db96d56Sopenharmony_ci   Instances of :class:`FileCookieJar` raise this exception on failure to load
447db96d56Sopenharmony_ci   cookies from a file.  :exc:`LoadError` is a subclass of :exc:`OSError`.
457db96d56Sopenharmony_ci
467db96d56Sopenharmony_ci   .. versionchanged:: 3.3
477db96d56Sopenharmony_ci      LoadError was made a subclass of :exc:`OSError` instead of
487db96d56Sopenharmony_ci      :exc:`IOError`.
497db96d56Sopenharmony_ci
507db96d56Sopenharmony_ci
517db96d56Sopenharmony_ciThe following classes are provided:
527db96d56Sopenharmony_ci
537db96d56Sopenharmony_ci
547db96d56Sopenharmony_ci.. class:: CookieJar(policy=None)
557db96d56Sopenharmony_ci
567db96d56Sopenharmony_ci   *policy* is an object implementing the :class:`CookiePolicy` interface.
577db96d56Sopenharmony_ci
587db96d56Sopenharmony_ci   The :class:`CookieJar` class stores HTTP cookies.  It extracts cookies from HTTP
597db96d56Sopenharmony_ci   requests, and returns them in HTTP responses. :class:`CookieJar` instances
607db96d56Sopenharmony_ci   automatically expire contained cookies when necessary.  Subclasses are also
617db96d56Sopenharmony_ci   responsible for storing and retrieving cookies from a file or database.
627db96d56Sopenharmony_ci
637db96d56Sopenharmony_ci
647db96d56Sopenharmony_ci.. class:: FileCookieJar(filename=None, delayload=None, policy=None)
657db96d56Sopenharmony_ci
667db96d56Sopenharmony_ci   *policy* is an object implementing the :class:`CookiePolicy` interface.  For the
677db96d56Sopenharmony_ci   other arguments, see the documentation for the corresponding attributes.
687db96d56Sopenharmony_ci
697db96d56Sopenharmony_ci   A :class:`CookieJar` which can load cookies from, and perhaps save cookies to, a
707db96d56Sopenharmony_ci   file on disk.  Cookies are **NOT** loaded from the named file until either the
717db96d56Sopenharmony_ci   :meth:`load` or :meth:`revert` method is called.  Subclasses of this class are
727db96d56Sopenharmony_ci   documented in section :ref:`file-cookie-jar-classes`.
737db96d56Sopenharmony_ci
747db96d56Sopenharmony_ci   This should not be initialized directly – use its subclasses below instead.
757db96d56Sopenharmony_ci
767db96d56Sopenharmony_ci   .. versionchanged:: 3.8
777db96d56Sopenharmony_ci
787db96d56Sopenharmony_ci      The filename parameter supports a :term:`path-like object`.
797db96d56Sopenharmony_ci
807db96d56Sopenharmony_ci
817db96d56Sopenharmony_ci.. class:: CookiePolicy()
827db96d56Sopenharmony_ci
837db96d56Sopenharmony_ci   This class is responsible for deciding whether each cookie should be accepted
847db96d56Sopenharmony_ci   from / returned to the server.
857db96d56Sopenharmony_ci
867db96d56Sopenharmony_ci
877db96d56Sopenharmony_ci.. class:: DefaultCookiePolicy( blocked_domains=None, allowed_domains=None, netscape=True, rfc2965=False, rfc2109_as_netscape=None, hide_cookie2=False, strict_domain=False, strict_rfc2965_unverifiable=True, strict_ns_unverifiable=False, strict_ns_domain=DefaultCookiePolicy.DomainLiberal, strict_ns_set_initial_dollar=False, strict_ns_set_path=False, secure_protocols=("https", "wss") )
887db96d56Sopenharmony_ci
897db96d56Sopenharmony_ci   Constructor arguments should be passed as keyword arguments only.
907db96d56Sopenharmony_ci   *blocked_domains* is a sequence of domain names that we never accept cookies
917db96d56Sopenharmony_ci   from, nor return cookies to. *allowed_domains* if not :const:`None`, this is a
927db96d56Sopenharmony_ci   sequence of the only domains for which we accept and return cookies.
937db96d56Sopenharmony_ci   *secure_protocols* is a sequence of protocols for which secure cookies can be
947db96d56Sopenharmony_ci   added to. By default *https* and *wss* (secure websocket) are considered
957db96d56Sopenharmony_ci   secure protocols. For all other arguments, see the documentation for
967db96d56Sopenharmony_ci   :class:`CookiePolicy` and :class:`DefaultCookiePolicy` objects.
977db96d56Sopenharmony_ci
987db96d56Sopenharmony_ci   :class:`DefaultCookiePolicy` implements the standard accept / reject rules for
997db96d56Sopenharmony_ci   Netscape and :rfc:`2965` cookies.  By default, :rfc:`2109` cookies (ie. cookies
1007db96d56Sopenharmony_ci   received in a :mailheader:`Set-Cookie` header with a version cookie-attribute of
1017db96d56Sopenharmony_ci   1) are treated according to the RFC 2965 rules.  However, if RFC 2965 handling
1027db96d56Sopenharmony_ci   is turned off or :attr:`rfc2109_as_netscape` is ``True``, RFC 2109 cookies are
1037db96d56Sopenharmony_ci   'downgraded' by the :class:`CookieJar` instance to Netscape cookies, by
1047db96d56Sopenharmony_ci   setting the :attr:`version` attribute of the :class:`Cookie` instance to 0.
1057db96d56Sopenharmony_ci   :class:`DefaultCookiePolicy` also provides some parameters to allow some
1067db96d56Sopenharmony_ci   fine-tuning of policy.
1077db96d56Sopenharmony_ci
1087db96d56Sopenharmony_ci
1097db96d56Sopenharmony_ci.. class:: Cookie()
1107db96d56Sopenharmony_ci
1117db96d56Sopenharmony_ci   This class represents Netscape, :rfc:`2109` and :rfc:`2965` cookies.  It is not
1127db96d56Sopenharmony_ci   expected that users of :mod:`http.cookiejar` construct their own :class:`Cookie`
1137db96d56Sopenharmony_ci   instances.  Instead, if necessary, call :meth:`make_cookies` on a
1147db96d56Sopenharmony_ci   :class:`CookieJar` instance.
1157db96d56Sopenharmony_ci
1167db96d56Sopenharmony_ci
1177db96d56Sopenharmony_ci.. seealso::
1187db96d56Sopenharmony_ci
1197db96d56Sopenharmony_ci   Module :mod:`urllib.request`
1207db96d56Sopenharmony_ci      URL opening with automatic cookie handling.
1217db96d56Sopenharmony_ci
1227db96d56Sopenharmony_ci   Module :mod:`http.cookies`
1237db96d56Sopenharmony_ci      HTTP cookie classes, principally useful for server-side code.  The
1247db96d56Sopenharmony_ci      :mod:`http.cookiejar` and :mod:`http.cookies` modules do not depend on each
1257db96d56Sopenharmony_ci      other.
1267db96d56Sopenharmony_ci
1277db96d56Sopenharmony_ci   https://curl.se/rfc/cookie_spec.html
1287db96d56Sopenharmony_ci      The specification of the original Netscape cookie protocol.  Though this is
1297db96d56Sopenharmony_ci      still the dominant protocol, the 'Netscape cookie protocol' implemented by all
1307db96d56Sopenharmony_ci      the major browsers (and :mod:`http.cookiejar`) only bears a passing resemblance to
1317db96d56Sopenharmony_ci      the one sketched out in ``cookie_spec.html``.
1327db96d56Sopenharmony_ci
1337db96d56Sopenharmony_ci   :rfc:`2109` - HTTP State Management Mechanism
1347db96d56Sopenharmony_ci      Obsoleted by :rfc:`2965`. Uses :mailheader:`Set-Cookie` with version=1.
1357db96d56Sopenharmony_ci
1367db96d56Sopenharmony_ci   :rfc:`2965` - HTTP State Management Mechanism
1377db96d56Sopenharmony_ci      The Netscape protocol with the bugs fixed.  Uses :mailheader:`Set-Cookie2` in
1387db96d56Sopenharmony_ci      place of :mailheader:`Set-Cookie`.  Not widely used.
1397db96d56Sopenharmony_ci
1407db96d56Sopenharmony_ci   http://kristol.org/cookie/errata.html
1417db96d56Sopenharmony_ci      Unfinished errata to :rfc:`2965`.
1427db96d56Sopenharmony_ci
1437db96d56Sopenharmony_ci   :rfc:`2964` - Use of HTTP State Management
1447db96d56Sopenharmony_ci
1457db96d56Sopenharmony_ci.. _cookie-jar-objects:
1467db96d56Sopenharmony_ci
1477db96d56Sopenharmony_ciCookieJar and FileCookieJar Objects
1487db96d56Sopenharmony_ci-----------------------------------
1497db96d56Sopenharmony_ci
1507db96d56Sopenharmony_ci:class:`CookieJar` objects support the :term:`iterator` protocol for iterating over
1517db96d56Sopenharmony_cicontained :class:`Cookie` objects.
1527db96d56Sopenharmony_ci
1537db96d56Sopenharmony_ci:class:`CookieJar` has the following methods:
1547db96d56Sopenharmony_ci
1557db96d56Sopenharmony_ci
1567db96d56Sopenharmony_ci.. method:: CookieJar.add_cookie_header(request)
1577db96d56Sopenharmony_ci
1587db96d56Sopenharmony_ci   Add correct :mailheader:`Cookie` header to *request*.
1597db96d56Sopenharmony_ci
1607db96d56Sopenharmony_ci   If policy allows (ie. the :attr:`rfc2965` and :attr:`hide_cookie2` attributes of
1617db96d56Sopenharmony_ci   the :class:`CookieJar`'s :class:`CookiePolicy` instance are true and false
1627db96d56Sopenharmony_ci   respectively), the :mailheader:`Cookie2` header is also added when appropriate.
1637db96d56Sopenharmony_ci
1647db96d56Sopenharmony_ci   The *request* object (usually a :class:`urllib.request.Request` instance)
1657db96d56Sopenharmony_ci   must support the methods :meth:`get_full_url`, :meth:`has_header`,
1667db96d56Sopenharmony_ci   :meth:`get_header`, :meth:`header_items`, :meth:`add_unredirected_header`
1677db96d56Sopenharmony_ci   and the attributes :attr:`host`, :attr:`!type`, :attr:`unverifiable`
1687db96d56Sopenharmony_ci   and :attr:`origin_req_host` as documented by :mod:`urllib.request`.
1697db96d56Sopenharmony_ci
1707db96d56Sopenharmony_ci   .. versionchanged:: 3.3
1717db96d56Sopenharmony_ci
1727db96d56Sopenharmony_ci    *request* object needs :attr:`origin_req_host` attribute. Dependency on a
1737db96d56Sopenharmony_ci    deprecated method :meth:`get_origin_req_host` has been removed.
1747db96d56Sopenharmony_ci
1757db96d56Sopenharmony_ci
1767db96d56Sopenharmony_ci.. method:: CookieJar.extract_cookies(response, request)
1777db96d56Sopenharmony_ci
1787db96d56Sopenharmony_ci   Extract cookies from HTTP *response* and store them in the :class:`CookieJar`,
1797db96d56Sopenharmony_ci   where allowed by policy.
1807db96d56Sopenharmony_ci
1817db96d56Sopenharmony_ci   The :class:`CookieJar` will look for allowable :mailheader:`Set-Cookie` and
1827db96d56Sopenharmony_ci   :mailheader:`Set-Cookie2` headers in the *response* argument, and store cookies
1837db96d56Sopenharmony_ci   as appropriate (subject to the :meth:`CookiePolicy.set_ok` method's approval).
1847db96d56Sopenharmony_ci
1857db96d56Sopenharmony_ci   The *response* object (usually the result of a call to
1867db96d56Sopenharmony_ci   :meth:`urllib.request.urlopen`, or similar) should support an :meth:`info`
1877db96d56Sopenharmony_ci   method, which returns an :class:`email.message.Message` instance.
1887db96d56Sopenharmony_ci
1897db96d56Sopenharmony_ci   The *request* object (usually a :class:`urllib.request.Request` instance)
1907db96d56Sopenharmony_ci   must support the method :meth:`get_full_url` and the attributes
1917db96d56Sopenharmony_ci   :attr:`host`, :attr:`unverifiable` and :attr:`origin_req_host`,
1927db96d56Sopenharmony_ci   as documented by :mod:`urllib.request`.  The request is used to set
1937db96d56Sopenharmony_ci   default values for cookie-attributes as well as for checking that the
1947db96d56Sopenharmony_ci   cookie is allowed to be set.
1957db96d56Sopenharmony_ci
1967db96d56Sopenharmony_ci   .. versionchanged:: 3.3
1977db96d56Sopenharmony_ci
1987db96d56Sopenharmony_ci    *request* object needs :attr:`origin_req_host` attribute. Dependency on a
1997db96d56Sopenharmony_ci    deprecated method :meth:`get_origin_req_host` has been removed.
2007db96d56Sopenharmony_ci
2017db96d56Sopenharmony_ci.. method:: CookieJar.set_policy(policy)
2027db96d56Sopenharmony_ci
2037db96d56Sopenharmony_ci   Set the :class:`CookiePolicy` instance to be used.
2047db96d56Sopenharmony_ci
2057db96d56Sopenharmony_ci
2067db96d56Sopenharmony_ci.. method:: CookieJar.make_cookies(response, request)
2077db96d56Sopenharmony_ci
2087db96d56Sopenharmony_ci   Return sequence of :class:`Cookie` objects extracted from *response* object.
2097db96d56Sopenharmony_ci
2107db96d56Sopenharmony_ci   See the documentation for :meth:`extract_cookies` for the interfaces required of
2117db96d56Sopenharmony_ci   the *response* and *request* arguments.
2127db96d56Sopenharmony_ci
2137db96d56Sopenharmony_ci
2147db96d56Sopenharmony_ci.. method:: CookieJar.set_cookie_if_ok(cookie, request)
2157db96d56Sopenharmony_ci
2167db96d56Sopenharmony_ci   Set a :class:`Cookie` if policy says it's OK to do so.
2177db96d56Sopenharmony_ci
2187db96d56Sopenharmony_ci
2197db96d56Sopenharmony_ci.. method:: CookieJar.set_cookie(cookie)
2207db96d56Sopenharmony_ci
2217db96d56Sopenharmony_ci   Set a :class:`Cookie`, without checking with policy to see whether or not it
2227db96d56Sopenharmony_ci   should be set.
2237db96d56Sopenharmony_ci
2247db96d56Sopenharmony_ci
2257db96d56Sopenharmony_ci.. method:: CookieJar.clear([domain[, path[, name]]])
2267db96d56Sopenharmony_ci
2277db96d56Sopenharmony_ci   Clear some cookies.
2287db96d56Sopenharmony_ci
2297db96d56Sopenharmony_ci   If invoked without arguments, clear all cookies.  If given a single argument,
2307db96d56Sopenharmony_ci   only cookies belonging to that *domain* will be removed. If given two arguments,
2317db96d56Sopenharmony_ci   cookies belonging to the specified *domain* and URL *path* are removed.  If
2327db96d56Sopenharmony_ci   given three arguments, then the cookie with the specified *domain*, *path* and
2337db96d56Sopenharmony_ci   *name* is removed.
2347db96d56Sopenharmony_ci
2357db96d56Sopenharmony_ci   Raises :exc:`KeyError` if no matching cookie exists.
2367db96d56Sopenharmony_ci
2377db96d56Sopenharmony_ci
2387db96d56Sopenharmony_ci.. method:: CookieJar.clear_session_cookies()
2397db96d56Sopenharmony_ci
2407db96d56Sopenharmony_ci   Discard all session cookies.
2417db96d56Sopenharmony_ci
2427db96d56Sopenharmony_ci   Discards all contained cookies that have a true :attr:`discard` attribute
2437db96d56Sopenharmony_ci   (usually because they had either no ``max-age`` or ``expires`` cookie-attribute,
2447db96d56Sopenharmony_ci   or an explicit ``discard`` cookie-attribute).  For interactive browsers, the end
2457db96d56Sopenharmony_ci   of a session usually corresponds to closing the browser window.
2467db96d56Sopenharmony_ci
2477db96d56Sopenharmony_ci   Note that the :meth:`save` method won't save session cookies anyway, unless you
2487db96d56Sopenharmony_ci   ask otherwise by passing a true *ignore_discard* argument.
2497db96d56Sopenharmony_ci
2507db96d56Sopenharmony_ci:class:`FileCookieJar` implements the following additional methods:
2517db96d56Sopenharmony_ci
2527db96d56Sopenharmony_ci
2537db96d56Sopenharmony_ci.. method:: FileCookieJar.save(filename=None, ignore_discard=False, ignore_expires=False)
2547db96d56Sopenharmony_ci
2557db96d56Sopenharmony_ci   Save cookies to a file.
2567db96d56Sopenharmony_ci
2577db96d56Sopenharmony_ci   This base class raises :exc:`NotImplementedError`.  Subclasses may leave this
2587db96d56Sopenharmony_ci   method unimplemented.
2597db96d56Sopenharmony_ci
2607db96d56Sopenharmony_ci   *filename* is the name of file in which to save cookies.  If *filename* is not
2617db96d56Sopenharmony_ci   specified, :attr:`self.filename` is used (whose default is the value passed to
2627db96d56Sopenharmony_ci   the constructor, if any); if :attr:`self.filename` is :const:`None`,
2637db96d56Sopenharmony_ci   :exc:`ValueError` is raised.
2647db96d56Sopenharmony_ci
2657db96d56Sopenharmony_ci   *ignore_discard*: save even cookies set to be discarded. *ignore_expires*: save
2667db96d56Sopenharmony_ci   even cookies that have expired
2677db96d56Sopenharmony_ci
2687db96d56Sopenharmony_ci   The file is overwritten if it already exists, thus wiping all the cookies it
2697db96d56Sopenharmony_ci   contains.  Saved cookies can be restored later using the :meth:`load` or
2707db96d56Sopenharmony_ci   :meth:`revert` methods.
2717db96d56Sopenharmony_ci
2727db96d56Sopenharmony_ci
2737db96d56Sopenharmony_ci.. method:: FileCookieJar.load(filename=None, ignore_discard=False, ignore_expires=False)
2747db96d56Sopenharmony_ci
2757db96d56Sopenharmony_ci   Load cookies from a file.
2767db96d56Sopenharmony_ci
2777db96d56Sopenharmony_ci   Old cookies are kept unless overwritten by newly loaded ones.
2787db96d56Sopenharmony_ci
2797db96d56Sopenharmony_ci   Arguments are as for :meth:`save`.
2807db96d56Sopenharmony_ci
2817db96d56Sopenharmony_ci   The named file must be in the format understood by the class, or
2827db96d56Sopenharmony_ci   :exc:`LoadError` will be raised.  Also, :exc:`OSError` may be raised, for
2837db96d56Sopenharmony_ci   example if the file does not exist.
2847db96d56Sopenharmony_ci
2857db96d56Sopenharmony_ci   .. versionchanged:: 3.3
2867db96d56Sopenharmony_ci      :exc:`IOError` used to be raised, it is now an alias of :exc:`OSError`.
2877db96d56Sopenharmony_ci
2887db96d56Sopenharmony_ci
2897db96d56Sopenharmony_ci.. method:: FileCookieJar.revert(filename=None, ignore_discard=False, ignore_expires=False)
2907db96d56Sopenharmony_ci
2917db96d56Sopenharmony_ci   Clear all cookies and reload cookies from a saved file.
2927db96d56Sopenharmony_ci
2937db96d56Sopenharmony_ci   :meth:`revert` can raise the same exceptions as :meth:`load`. If there is a
2947db96d56Sopenharmony_ci   failure, the object's state will not be altered.
2957db96d56Sopenharmony_ci
2967db96d56Sopenharmony_ci:class:`FileCookieJar` instances have the following public attributes:
2977db96d56Sopenharmony_ci
2987db96d56Sopenharmony_ci
2997db96d56Sopenharmony_ci.. attribute:: FileCookieJar.filename
3007db96d56Sopenharmony_ci
3017db96d56Sopenharmony_ci   Filename of default file in which to keep cookies.  This attribute may be
3027db96d56Sopenharmony_ci   assigned to.
3037db96d56Sopenharmony_ci
3047db96d56Sopenharmony_ci
3057db96d56Sopenharmony_ci.. attribute:: FileCookieJar.delayload
3067db96d56Sopenharmony_ci
3077db96d56Sopenharmony_ci   If true, load cookies lazily from disk.  This attribute should not be assigned
3087db96d56Sopenharmony_ci   to.  This is only a hint, since this only affects performance, not behaviour
3097db96d56Sopenharmony_ci   (unless the cookies on disk are changing). A :class:`CookieJar` object may
3107db96d56Sopenharmony_ci   ignore it.  None of the :class:`FileCookieJar` classes included in the standard
3117db96d56Sopenharmony_ci   library lazily loads cookies.
3127db96d56Sopenharmony_ci
3137db96d56Sopenharmony_ci
3147db96d56Sopenharmony_ci.. _file-cookie-jar-classes:
3157db96d56Sopenharmony_ci
3167db96d56Sopenharmony_ciFileCookieJar subclasses and co-operation with web browsers
3177db96d56Sopenharmony_ci-----------------------------------------------------------
3187db96d56Sopenharmony_ci
3197db96d56Sopenharmony_ciThe following :class:`CookieJar` subclasses are provided for reading and
3207db96d56Sopenharmony_ciwriting.
3217db96d56Sopenharmony_ci
3227db96d56Sopenharmony_ci.. class:: MozillaCookieJar(filename=None, delayload=None, policy=None)
3237db96d56Sopenharmony_ci
3247db96d56Sopenharmony_ci   A :class:`FileCookieJar` that can load from and save cookies to disk in the
3257db96d56Sopenharmony_ci   Mozilla ``cookies.txt`` file format (which is also used by curl and the Lynx
3267db96d56Sopenharmony_ci   and Netscape browsers).
3277db96d56Sopenharmony_ci
3287db96d56Sopenharmony_ci   .. note::
3297db96d56Sopenharmony_ci
3307db96d56Sopenharmony_ci      This loses information about :rfc:`2965` cookies, and also about newer or
3317db96d56Sopenharmony_ci      non-standard cookie-attributes such as ``port``.
3327db96d56Sopenharmony_ci
3337db96d56Sopenharmony_ci   .. warning::
3347db96d56Sopenharmony_ci
3357db96d56Sopenharmony_ci      Back up your cookies before saving if you have cookies whose loss / corruption
3367db96d56Sopenharmony_ci      would be inconvenient (there are some subtleties which may lead to slight
3377db96d56Sopenharmony_ci      changes in the file over a load / save round-trip).
3387db96d56Sopenharmony_ci
3397db96d56Sopenharmony_ci   Also note that cookies saved while Mozilla is running will get clobbered by
3407db96d56Sopenharmony_ci   Mozilla.
3417db96d56Sopenharmony_ci
3427db96d56Sopenharmony_ci
3437db96d56Sopenharmony_ci.. class:: LWPCookieJar(filename=None, delayload=None, policy=None)
3447db96d56Sopenharmony_ci
3457db96d56Sopenharmony_ci   A :class:`FileCookieJar` that can load from and save cookies to disk in format
3467db96d56Sopenharmony_ci   compatible with the libwww-perl library's ``Set-Cookie3`` file format.  This is
3477db96d56Sopenharmony_ci   convenient if you want to store cookies in a human-readable file.
3487db96d56Sopenharmony_ci
3497db96d56Sopenharmony_ci   .. versionchanged:: 3.8
3507db96d56Sopenharmony_ci
3517db96d56Sopenharmony_ci      The filename parameter supports a :term:`path-like object`.
3527db96d56Sopenharmony_ci
3537db96d56Sopenharmony_ci.. _cookie-policy-objects:
3547db96d56Sopenharmony_ci
3557db96d56Sopenharmony_ciCookiePolicy Objects
3567db96d56Sopenharmony_ci--------------------
3577db96d56Sopenharmony_ci
3587db96d56Sopenharmony_ciObjects implementing the :class:`CookiePolicy` interface have the following
3597db96d56Sopenharmony_cimethods:
3607db96d56Sopenharmony_ci
3617db96d56Sopenharmony_ci
3627db96d56Sopenharmony_ci.. method:: CookiePolicy.set_ok(cookie, request)
3637db96d56Sopenharmony_ci
3647db96d56Sopenharmony_ci   Return boolean value indicating whether cookie should be accepted from server.
3657db96d56Sopenharmony_ci
3667db96d56Sopenharmony_ci   *cookie* is a :class:`Cookie` instance.  *request* is an object
3677db96d56Sopenharmony_ci   implementing the interface defined by the documentation for
3687db96d56Sopenharmony_ci   :meth:`CookieJar.extract_cookies`.
3697db96d56Sopenharmony_ci
3707db96d56Sopenharmony_ci
3717db96d56Sopenharmony_ci.. method:: CookiePolicy.return_ok(cookie, request)
3727db96d56Sopenharmony_ci
3737db96d56Sopenharmony_ci   Return boolean value indicating whether cookie should be returned to server.
3747db96d56Sopenharmony_ci
3757db96d56Sopenharmony_ci   *cookie* is a :class:`Cookie` instance.  *request* is an object
3767db96d56Sopenharmony_ci   implementing the interface defined by the documentation for
3777db96d56Sopenharmony_ci   :meth:`CookieJar.add_cookie_header`.
3787db96d56Sopenharmony_ci
3797db96d56Sopenharmony_ci
3807db96d56Sopenharmony_ci.. method:: CookiePolicy.domain_return_ok(domain, request)
3817db96d56Sopenharmony_ci
3827db96d56Sopenharmony_ci   Return ``False`` if cookies should not be returned, given cookie domain.
3837db96d56Sopenharmony_ci
3847db96d56Sopenharmony_ci   This method is an optimization.  It removes the need for checking every cookie
3857db96d56Sopenharmony_ci   with a particular domain (which might involve reading many files).  Returning
3867db96d56Sopenharmony_ci   true from :meth:`domain_return_ok` and :meth:`path_return_ok` leaves all the
3877db96d56Sopenharmony_ci   work to :meth:`return_ok`.
3887db96d56Sopenharmony_ci
3897db96d56Sopenharmony_ci   If :meth:`domain_return_ok` returns true for the cookie domain,
3907db96d56Sopenharmony_ci   :meth:`path_return_ok` is called for the cookie path.  Otherwise,
3917db96d56Sopenharmony_ci   :meth:`path_return_ok` and :meth:`return_ok` are never called for that cookie
3927db96d56Sopenharmony_ci   domain.  If :meth:`path_return_ok` returns true, :meth:`return_ok` is called
3937db96d56Sopenharmony_ci   with the :class:`Cookie` object itself for a full check.  Otherwise,
3947db96d56Sopenharmony_ci   :meth:`return_ok` is never called for that cookie path.
3957db96d56Sopenharmony_ci
3967db96d56Sopenharmony_ci   Note that :meth:`domain_return_ok` is called for every *cookie* domain, not just
3977db96d56Sopenharmony_ci   for the *request* domain.  For example, the function might be called with both
3987db96d56Sopenharmony_ci   ``".example.com"`` and ``"www.example.com"`` if the request domain is
3997db96d56Sopenharmony_ci   ``"www.example.com"``.  The same goes for :meth:`path_return_ok`.
4007db96d56Sopenharmony_ci
4017db96d56Sopenharmony_ci   The *request* argument is as documented for :meth:`return_ok`.
4027db96d56Sopenharmony_ci
4037db96d56Sopenharmony_ci
4047db96d56Sopenharmony_ci.. method:: CookiePolicy.path_return_ok(path, request)
4057db96d56Sopenharmony_ci
4067db96d56Sopenharmony_ci   Return ``False`` if cookies should not be returned, given cookie path.
4077db96d56Sopenharmony_ci
4087db96d56Sopenharmony_ci   See the documentation for :meth:`domain_return_ok`.
4097db96d56Sopenharmony_ci
4107db96d56Sopenharmony_ciIn addition to implementing the methods above, implementations of the
4117db96d56Sopenharmony_ci:class:`CookiePolicy` interface must also supply the following attributes,
4127db96d56Sopenharmony_ciindicating which protocols should be used, and how.  All of these attributes may
4137db96d56Sopenharmony_cibe assigned to.
4147db96d56Sopenharmony_ci
4157db96d56Sopenharmony_ci
4167db96d56Sopenharmony_ci.. attribute:: CookiePolicy.netscape
4177db96d56Sopenharmony_ci
4187db96d56Sopenharmony_ci   Implement Netscape protocol.
4197db96d56Sopenharmony_ci
4207db96d56Sopenharmony_ci
4217db96d56Sopenharmony_ci.. attribute:: CookiePolicy.rfc2965
4227db96d56Sopenharmony_ci
4237db96d56Sopenharmony_ci   Implement :rfc:`2965` protocol.
4247db96d56Sopenharmony_ci
4257db96d56Sopenharmony_ci
4267db96d56Sopenharmony_ci.. attribute:: CookiePolicy.hide_cookie2
4277db96d56Sopenharmony_ci
4287db96d56Sopenharmony_ci   Don't add :mailheader:`Cookie2` header to requests (the presence of this header
4297db96d56Sopenharmony_ci   indicates to the server that we understand :rfc:`2965` cookies).
4307db96d56Sopenharmony_ci
4317db96d56Sopenharmony_ciThe most useful way to define a :class:`CookiePolicy` class is by subclassing
4327db96d56Sopenharmony_cifrom :class:`DefaultCookiePolicy` and overriding some or all of the methods
4337db96d56Sopenharmony_ciabove.  :class:`CookiePolicy` itself may be used as a 'null policy' to allow
4347db96d56Sopenharmony_cisetting and receiving any and all cookies (this is unlikely to be useful).
4357db96d56Sopenharmony_ci
4367db96d56Sopenharmony_ci
4377db96d56Sopenharmony_ci.. _default-cookie-policy-objects:
4387db96d56Sopenharmony_ci
4397db96d56Sopenharmony_ciDefaultCookiePolicy Objects
4407db96d56Sopenharmony_ci---------------------------
4417db96d56Sopenharmony_ci
4427db96d56Sopenharmony_ciImplements the standard rules for accepting and returning cookies.
4437db96d56Sopenharmony_ci
4447db96d56Sopenharmony_ciBoth :rfc:`2965` and Netscape cookies are covered.  RFC 2965 handling is switched
4457db96d56Sopenharmony_cioff by default.
4467db96d56Sopenharmony_ci
4477db96d56Sopenharmony_ciThe easiest way to provide your own policy is to override this class and call
4487db96d56Sopenharmony_ciits methods in your overridden implementations before adding your own additional
4497db96d56Sopenharmony_cichecks::
4507db96d56Sopenharmony_ci
4517db96d56Sopenharmony_ci   import http.cookiejar
4527db96d56Sopenharmony_ci   class MyCookiePolicy(http.cookiejar.DefaultCookiePolicy):
4537db96d56Sopenharmony_ci       def set_ok(self, cookie, request):
4547db96d56Sopenharmony_ci           if not http.cookiejar.DefaultCookiePolicy.set_ok(self, cookie, request):
4557db96d56Sopenharmony_ci               return False
4567db96d56Sopenharmony_ci           if i_dont_want_to_store_this_cookie(cookie):
4577db96d56Sopenharmony_ci               return False
4587db96d56Sopenharmony_ci           return True
4597db96d56Sopenharmony_ci
4607db96d56Sopenharmony_ciIn addition to the features required to implement the :class:`CookiePolicy`
4617db96d56Sopenharmony_ciinterface, this class allows you to block and allow domains from setting and
4627db96d56Sopenharmony_cireceiving cookies.  There are also some strictness switches that allow you to
4637db96d56Sopenharmony_citighten up the rather loose Netscape protocol rules a little bit (at the cost of
4647db96d56Sopenharmony_ciblocking some benign cookies).
4657db96d56Sopenharmony_ci
4667db96d56Sopenharmony_ciA domain blocklist and allowlist is provided (both off by default). Only domains
4677db96d56Sopenharmony_cinot in the blocklist and present in the allowlist (if the allowlist is active)
4687db96d56Sopenharmony_ciparticipate in cookie setting and returning.  Use the *blocked_domains*
4697db96d56Sopenharmony_ciconstructor argument, and :meth:`blocked_domains` and
4707db96d56Sopenharmony_ci:meth:`set_blocked_domains` methods (and the corresponding argument and methods
4717db96d56Sopenharmony_cifor *allowed_domains*).  If you set an allowlist, you can turn it off again by
4727db96d56Sopenharmony_cisetting it to :const:`None`.
4737db96d56Sopenharmony_ci
4747db96d56Sopenharmony_ciDomains in block or allow lists that do not start with a dot must equal the
4757db96d56Sopenharmony_cicookie domain to be matched.  For example, ``"example.com"`` matches a blocklist
4767db96d56Sopenharmony_cientry of ``"example.com"``, but ``"www.example.com"`` does not.  Domains that do
4777db96d56Sopenharmony_cistart with a dot are matched by more specific domains too. For example, both
4787db96d56Sopenharmony_ci``"www.example.com"`` and ``"www.coyote.example.com"`` match ``".example.com"``
4797db96d56Sopenharmony_ci(but ``"example.com"`` itself does not).  IP addresses are an exception, and
4807db96d56Sopenharmony_cimust match exactly.  For example, if blocked_domains contains ``"192.168.1.2"``
4817db96d56Sopenharmony_ciand ``".168.1.2"``, 192.168.1.2 is blocked, but 193.168.1.2 is not.
4827db96d56Sopenharmony_ci
4837db96d56Sopenharmony_ci:class:`DefaultCookiePolicy` implements the following additional methods:
4847db96d56Sopenharmony_ci
4857db96d56Sopenharmony_ci
4867db96d56Sopenharmony_ci.. method:: DefaultCookiePolicy.blocked_domains()
4877db96d56Sopenharmony_ci
4887db96d56Sopenharmony_ci   Return the sequence of blocked domains (as a tuple).
4897db96d56Sopenharmony_ci
4907db96d56Sopenharmony_ci
4917db96d56Sopenharmony_ci.. method:: DefaultCookiePolicy.set_blocked_domains(blocked_domains)
4927db96d56Sopenharmony_ci
4937db96d56Sopenharmony_ci   Set the sequence of blocked domains.
4947db96d56Sopenharmony_ci
4957db96d56Sopenharmony_ci
4967db96d56Sopenharmony_ci.. method:: DefaultCookiePolicy.is_blocked(domain)
4977db96d56Sopenharmony_ci
4987db96d56Sopenharmony_ci   Return ``True`` if *domain* is on the blocklist for setting or receiving
4997db96d56Sopenharmony_ci   cookies.
5007db96d56Sopenharmony_ci
5017db96d56Sopenharmony_ci
5027db96d56Sopenharmony_ci.. method:: DefaultCookiePolicy.allowed_domains()
5037db96d56Sopenharmony_ci
5047db96d56Sopenharmony_ci   Return :const:`None`, or the sequence of allowed domains (as a tuple).
5057db96d56Sopenharmony_ci
5067db96d56Sopenharmony_ci
5077db96d56Sopenharmony_ci.. method:: DefaultCookiePolicy.set_allowed_domains(allowed_domains)
5087db96d56Sopenharmony_ci
5097db96d56Sopenharmony_ci   Set the sequence of allowed domains, or :const:`None`.
5107db96d56Sopenharmony_ci
5117db96d56Sopenharmony_ci
5127db96d56Sopenharmony_ci.. method:: DefaultCookiePolicy.is_not_allowed(domain)
5137db96d56Sopenharmony_ci
5147db96d56Sopenharmony_ci   Return ``True`` if *domain* is not on the allowlist for setting or receiving
5157db96d56Sopenharmony_ci   cookies.
5167db96d56Sopenharmony_ci
5177db96d56Sopenharmony_ci:class:`DefaultCookiePolicy` instances have the following attributes, which are
5187db96d56Sopenharmony_ciall initialised from the constructor arguments of the same name, and which may
5197db96d56Sopenharmony_ciall be assigned to.
5207db96d56Sopenharmony_ci
5217db96d56Sopenharmony_ci
5227db96d56Sopenharmony_ci.. attribute:: DefaultCookiePolicy.rfc2109_as_netscape
5237db96d56Sopenharmony_ci
5247db96d56Sopenharmony_ci   If true, request that the :class:`CookieJar` instance downgrade :rfc:`2109` cookies
5257db96d56Sopenharmony_ci   (ie. cookies received in a :mailheader:`Set-Cookie` header with a version
5267db96d56Sopenharmony_ci   cookie-attribute of 1) to Netscape cookies by setting the version attribute of
5277db96d56Sopenharmony_ci   the :class:`Cookie` instance to 0.  The default value is :const:`None`, in which
5287db96d56Sopenharmony_ci   case RFC 2109 cookies are downgraded if and only if :rfc:`2965` handling is turned
5297db96d56Sopenharmony_ci   off.  Therefore, RFC 2109 cookies are downgraded by default.
5307db96d56Sopenharmony_ci
5317db96d56Sopenharmony_ci
5327db96d56Sopenharmony_ciGeneral strictness switches:
5337db96d56Sopenharmony_ci
5347db96d56Sopenharmony_ci.. attribute:: DefaultCookiePolicy.strict_domain
5357db96d56Sopenharmony_ci
5367db96d56Sopenharmony_ci   Don't allow sites to set two-component domains with country-code top-level
5377db96d56Sopenharmony_ci   domains like ``.co.uk``, ``.gov.uk``, ``.co.nz``.etc.  This is far from perfect
5387db96d56Sopenharmony_ci   and isn't guaranteed to work!
5397db96d56Sopenharmony_ci
5407db96d56Sopenharmony_ci
5417db96d56Sopenharmony_ci:rfc:`2965` protocol strictness switches:
5427db96d56Sopenharmony_ci
5437db96d56Sopenharmony_ci.. attribute:: DefaultCookiePolicy.strict_rfc2965_unverifiable
5447db96d56Sopenharmony_ci
5457db96d56Sopenharmony_ci   Follow :rfc:`2965` rules on unverifiable transactions (usually, an unverifiable
5467db96d56Sopenharmony_ci   transaction is one resulting from a redirect or a request for an image hosted on
5477db96d56Sopenharmony_ci   another site).  If this is false, cookies are *never* blocked on the basis of
5487db96d56Sopenharmony_ci   verifiability
5497db96d56Sopenharmony_ci
5507db96d56Sopenharmony_ci
5517db96d56Sopenharmony_ciNetscape protocol strictness switches:
5527db96d56Sopenharmony_ci
5537db96d56Sopenharmony_ci.. attribute:: DefaultCookiePolicy.strict_ns_unverifiable
5547db96d56Sopenharmony_ci
5557db96d56Sopenharmony_ci   Apply :rfc:`2965` rules on unverifiable transactions even to Netscape cookies.
5567db96d56Sopenharmony_ci
5577db96d56Sopenharmony_ci
5587db96d56Sopenharmony_ci.. attribute:: DefaultCookiePolicy.strict_ns_domain
5597db96d56Sopenharmony_ci
5607db96d56Sopenharmony_ci   Flags indicating how strict to be with domain-matching rules for Netscape
5617db96d56Sopenharmony_ci   cookies.  See below for acceptable values.
5627db96d56Sopenharmony_ci
5637db96d56Sopenharmony_ci
5647db96d56Sopenharmony_ci.. attribute:: DefaultCookiePolicy.strict_ns_set_initial_dollar
5657db96d56Sopenharmony_ci
5667db96d56Sopenharmony_ci   Ignore cookies in Set-Cookie: headers that have names starting with ``'$'``.
5677db96d56Sopenharmony_ci
5687db96d56Sopenharmony_ci
5697db96d56Sopenharmony_ci.. attribute:: DefaultCookiePolicy.strict_ns_set_path
5707db96d56Sopenharmony_ci
5717db96d56Sopenharmony_ci   Don't allow setting cookies whose path doesn't path-match request URI.
5727db96d56Sopenharmony_ci
5737db96d56Sopenharmony_ci:attr:`strict_ns_domain` is a collection of flags.  Its value is constructed by
5747db96d56Sopenharmony_cior-ing together (for example, ``DomainStrictNoDots|DomainStrictNonDomain`` means
5757db96d56Sopenharmony_ciboth flags are set).
5767db96d56Sopenharmony_ci
5777db96d56Sopenharmony_ci
5787db96d56Sopenharmony_ci.. attribute:: DefaultCookiePolicy.DomainStrictNoDots
5797db96d56Sopenharmony_ci
5807db96d56Sopenharmony_ci   When setting cookies, the 'host prefix' must not contain a dot (eg.
5817db96d56Sopenharmony_ci   ``www.foo.bar.com`` can't set a cookie for ``.bar.com``, because ``www.foo``
5827db96d56Sopenharmony_ci   contains a dot).
5837db96d56Sopenharmony_ci
5847db96d56Sopenharmony_ci
5857db96d56Sopenharmony_ci.. attribute:: DefaultCookiePolicy.DomainStrictNonDomain
5867db96d56Sopenharmony_ci
5877db96d56Sopenharmony_ci   Cookies that did not explicitly specify a ``domain`` cookie-attribute can only
5887db96d56Sopenharmony_ci   be returned to a domain equal to the domain that set the cookie (eg.
5897db96d56Sopenharmony_ci   ``spam.example.com`` won't be returned cookies from ``example.com`` that had no
5907db96d56Sopenharmony_ci   ``domain`` cookie-attribute).
5917db96d56Sopenharmony_ci
5927db96d56Sopenharmony_ci
5937db96d56Sopenharmony_ci.. attribute:: DefaultCookiePolicy.DomainRFC2965Match
5947db96d56Sopenharmony_ci
5957db96d56Sopenharmony_ci   When setting cookies, require a full :rfc:`2965` domain-match.
5967db96d56Sopenharmony_ci
5977db96d56Sopenharmony_ciThe following attributes are provided for convenience, and are the most useful
5987db96d56Sopenharmony_cicombinations of the above flags:
5997db96d56Sopenharmony_ci
6007db96d56Sopenharmony_ci
6017db96d56Sopenharmony_ci.. attribute:: DefaultCookiePolicy.DomainLiberal
6027db96d56Sopenharmony_ci
6037db96d56Sopenharmony_ci   Equivalent to 0 (ie. all of the above Netscape domain strictness flags switched
6047db96d56Sopenharmony_ci   off).
6057db96d56Sopenharmony_ci
6067db96d56Sopenharmony_ci
6077db96d56Sopenharmony_ci.. attribute:: DefaultCookiePolicy.DomainStrict
6087db96d56Sopenharmony_ci
6097db96d56Sopenharmony_ci   Equivalent to ``DomainStrictNoDots|DomainStrictNonDomain``.
6107db96d56Sopenharmony_ci
6117db96d56Sopenharmony_ci
6127db96d56Sopenharmony_ciCookie Objects
6137db96d56Sopenharmony_ci--------------
6147db96d56Sopenharmony_ci
6157db96d56Sopenharmony_ci:class:`Cookie` instances have Python attributes roughly corresponding to the
6167db96d56Sopenharmony_cistandard cookie-attributes specified in the various cookie standards.  The
6177db96d56Sopenharmony_cicorrespondence is not one-to-one, because there are complicated rules for
6187db96d56Sopenharmony_ciassigning default values, because the ``max-age`` and ``expires``
6197db96d56Sopenharmony_cicookie-attributes contain equivalent information, and because :rfc:`2109` cookies
6207db96d56Sopenharmony_cimay be 'downgraded' by :mod:`http.cookiejar` from version 1 to version 0 (Netscape)
6217db96d56Sopenharmony_cicookies.
6227db96d56Sopenharmony_ci
6237db96d56Sopenharmony_ciAssignment to these attributes should not be necessary other than in rare
6247db96d56Sopenharmony_cicircumstances in a :class:`CookiePolicy` method.  The class does not enforce
6257db96d56Sopenharmony_ciinternal consistency, so you should know what you're doing if you do that.
6267db96d56Sopenharmony_ci
6277db96d56Sopenharmony_ci
6287db96d56Sopenharmony_ci.. attribute:: Cookie.version
6297db96d56Sopenharmony_ci
6307db96d56Sopenharmony_ci   Integer or :const:`None`.  Netscape cookies have :attr:`version` 0. :rfc:`2965` and
6317db96d56Sopenharmony_ci   :rfc:`2109` cookies have a ``version`` cookie-attribute of 1.  However, note that
6327db96d56Sopenharmony_ci   :mod:`http.cookiejar` may 'downgrade' RFC 2109 cookies to Netscape cookies, in which
6337db96d56Sopenharmony_ci   case :attr:`version` is 0.
6347db96d56Sopenharmony_ci
6357db96d56Sopenharmony_ci
6367db96d56Sopenharmony_ci.. attribute:: Cookie.name
6377db96d56Sopenharmony_ci
6387db96d56Sopenharmony_ci   Cookie name (a string).
6397db96d56Sopenharmony_ci
6407db96d56Sopenharmony_ci
6417db96d56Sopenharmony_ci.. attribute:: Cookie.value
6427db96d56Sopenharmony_ci
6437db96d56Sopenharmony_ci   Cookie value (a string), or :const:`None`.
6447db96d56Sopenharmony_ci
6457db96d56Sopenharmony_ci
6467db96d56Sopenharmony_ci.. attribute:: Cookie.port
6477db96d56Sopenharmony_ci
6487db96d56Sopenharmony_ci   String representing a port or a set of ports (eg. '80', or '80,8080'), or
6497db96d56Sopenharmony_ci   :const:`None`.
6507db96d56Sopenharmony_ci
6517db96d56Sopenharmony_ci
6527db96d56Sopenharmony_ci.. attribute:: Cookie.path
6537db96d56Sopenharmony_ci
6547db96d56Sopenharmony_ci   Cookie path (a string, eg. ``'/acme/rocket_launchers'``).
6557db96d56Sopenharmony_ci
6567db96d56Sopenharmony_ci
6577db96d56Sopenharmony_ci.. attribute:: Cookie.secure
6587db96d56Sopenharmony_ci
6597db96d56Sopenharmony_ci   ``True`` if cookie should only be returned over a secure connection.
6607db96d56Sopenharmony_ci
6617db96d56Sopenharmony_ci
6627db96d56Sopenharmony_ci.. attribute:: Cookie.expires
6637db96d56Sopenharmony_ci
6647db96d56Sopenharmony_ci   Integer expiry date in seconds since epoch, or :const:`None`.  See also the
6657db96d56Sopenharmony_ci   :meth:`is_expired` method.
6667db96d56Sopenharmony_ci
6677db96d56Sopenharmony_ci
6687db96d56Sopenharmony_ci.. attribute:: Cookie.discard
6697db96d56Sopenharmony_ci
6707db96d56Sopenharmony_ci   ``True`` if this is a session cookie.
6717db96d56Sopenharmony_ci
6727db96d56Sopenharmony_ci
6737db96d56Sopenharmony_ci.. attribute:: Cookie.comment
6747db96d56Sopenharmony_ci
6757db96d56Sopenharmony_ci   String comment from the server explaining the function of this cookie, or
6767db96d56Sopenharmony_ci   :const:`None`.
6777db96d56Sopenharmony_ci
6787db96d56Sopenharmony_ci
6797db96d56Sopenharmony_ci.. attribute:: Cookie.comment_url
6807db96d56Sopenharmony_ci
6817db96d56Sopenharmony_ci   URL linking to a comment from the server explaining the function of this cookie,
6827db96d56Sopenharmony_ci   or :const:`None`.
6837db96d56Sopenharmony_ci
6847db96d56Sopenharmony_ci
6857db96d56Sopenharmony_ci.. attribute:: Cookie.rfc2109
6867db96d56Sopenharmony_ci
6877db96d56Sopenharmony_ci   ``True`` if this cookie was received as an :rfc:`2109` cookie (ie. the cookie
6887db96d56Sopenharmony_ci   arrived in a :mailheader:`Set-Cookie` header, and the value of the Version
6897db96d56Sopenharmony_ci   cookie-attribute in that header was 1).  This attribute is provided because
6907db96d56Sopenharmony_ci   :mod:`http.cookiejar` may 'downgrade' RFC 2109 cookies to Netscape cookies, in
6917db96d56Sopenharmony_ci   which case :attr:`version` is 0.
6927db96d56Sopenharmony_ci
6937db96d56Sopenharmony_ci
6947db96d56Sopenharmony_ci.. attribute:: Cookie.port_specified
6957db96d56Sopenharmony_ci
6967db96d56Sopenharmony_ci   ``True`` if a port or set of ports was explicitly specified by the server (in the
6977db96d56Sopenharmony_ci   :mailheader:`Set-Cookie` / :mailheader:`Set-Cookie2` header).
6987db96d56Sopenharmony_ci
6997db96d56Sopenharmony_ci
7007db96d56Sopenharmony_ci.. attribute:: Cookie.domain_specified
7017db96d56Sopenharmony_ci
7027db96d56Sopenharmony_ci   ``True`` if a domain was explicitly specified by the server.
7037db96d56Sopenharmony_ci
7047db96d56Sopenharmony_ci
7057db96d56Sopenharmony_ci.. attribute:: Cookie.domain_initial_dot
7067db96d56Sopenharmony_ci
7077db96d56Sopenharmony_ci   ``True`` if the domain explicitly specified by the server began with a dot
7087db96d56Sopenharmony_ci   (``'.'``).
7097db96d56Sopenharmony_ci
7107db96d56Sopenharmony_ciCookies may have additional non-standard cookie-attributes.  These may be
7117db96d56Sopenharmony_ciaccessed using the following methods:
7127db96d56Sopenharmony_ci
7137db96d56Sopenharmony_ci
7147db96d56Sopenharmony_ci.. method:: Cookie.has_nonstandard_attr(name)
7157db96d56Sopenharmony_ci
7167db96d56Sopenharmony_ci   Return ``True`` if cookie has the named cookie-attribute.
7177db96d56Sopenharmony_ci
7187db96d56Sopenharmony_ci
7197db96d56Sopenharmony_ci.. method:: Cookie.get_nonstandard_attr(name, default=None)
7207db96d56Sopenharmony_ci
7217db96d56Sopenharmony_ci   If cookie has the named cookie-attribute, return its value. Otherwise, return
7227db96d56Sopenharmony_ci   *default*.
7237db96d56Sopenharmony_ci
7247db96d56Sopenharmony_ci
7257db96d56Sopenharmony_ci.. method:: Cookie.set_nonstandard_attr(name, value)
7267db96d56Sopenharmony_ci
7277db96d56Sopenharmony_ci   Set the value of the named cookie-attribute.
7287db96d56Sopenharmony_ci
7297db96d56Sopenharmony_ciThe :class:`Cookie` class also defines the following method:
7307db96d56Sopenharmony_ci
7317db96d56Sopenharmony_ci
7327db96d56Sopenharmony_ci.. method:: Cookie.is_expired(now=None)
7337db96d56Sopenharmony_ci
7347db96d56Sopenharmony_ci   ``True`` if cookie has passed the time at which the server requested it should
7357db96d56Sopenharmony_ci   expire.  If *now* is given (in seconds since the epoch), return whether the
7367db96d56Sopenharmony_ci   cookie has expired at the specified time.
7377db96d56Sopenharmony_ci
7387db96d56Sopenharmony_ci
7397db96d56Sopenharmony_ciExamples
7407db96d56Sopenharmony_ci--------
7417db96d56Sopenharmony_ci
7427db96d56Sopenharmony_ciThe first example shows the most common usage of :mod:`http.cookiejar`::
7437db96d56Sopenharmony_ci
7447db96d56Sopenharmony_ci   import http.cookiejar, urllib.request
7457db96d56Sopenharmony_ci   cj = http.cookiejar.CookieJar()
7467db96d56Sopenharmony_ci   opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
7477db96d56Sopenharmony_ci   r = opener.open("http://example.com/")
7487db96d56Sopenharmony_ci
7497db96d56Sopenharmony_ciThis example illustrates how to open a URL using your Netscape, Mozilla, or Lynx
7507db96d56Sopenharmony_cicookies (assumes Unix/Netscape convention for location of the cookies file)::
7517db96d56Sopenharmony_ci
7527db96d56Sopenharmony_ci   import os, http.cookiejar, urllib.request
7537db96d56Sopenharmony_ci   cj = http.cookiejar.MozillaCookieJar()
7547db96d56Sopenharmony_ci   cj.load(os.path.join(os.path.expanduser("~"), ".netscape", "cookies.txt"))
7557db96d56Sopenharmony_ci   opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
7567db96d56Sopenharmony_ci   r = opener.open("http://example.com/")
7577db96d56Sopenharmony_ci
7587db96d56Sopenharmony_ciThe next example illustrates the use of :class:`DefaultCookiePolicy`. Turn on
7597db96d56Sopenharmony_ci:rfc:`2965` cookies, be more strict about domains when setting and returning
7607db96d56Sopenharmony_ciNetscape cookies, and block some domains from setting cookies or having them
7617db96d56Sopenharmony_cireturned::
7627db96d56Sopenharmony_ci
7637db96d56Sopenharmony_ci   import urllib.request
7647db96d56Sopenharmony_ci   from http.cookiejar import CookieJar, DefaultCookiePolicy
7657db96d56Sopenharmony_ci   policy = DefaultCookiePolicy(
7667db96d56Sopenharmony_ci       rfc2965=True, strict_ns_domain=Policy.DomainStrict,
7677db96d56Sopenharmony_ci       blocked_domains=["ads.net", ".ads.net"])
7687db96d56Sopenharmony_ci   cj = CookieJar(policy)
7697db96d56Sopenharmony_ci   opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
7707db96d56Sopenharmony_ci   r = opener.open("http://example.com/")
771