| \section{\module{cookielib} --- | 
 |          Cookie handling for HTTP clients} | 
 |  | 
 | \declaremodule{standard}{cookielib} | 
 | \moduleauthor{John J. Lee}{jjl@pobox.com} | 
 | \sectionauthor{John J. Lee}{jjl@pobox.com} | 
 |  | 
 | \versionadded{2.4} | 
 |  | 
 | \modulesynopsis{Cookie handling for HTTP clients} | 
 |  | 
 | The \module{cookielib} module defines classes for automatic handling | 
 | of HTTP cookies.  It is useful for accessing web sites that require | 
 | small pieces of data -- \dfn{cookies} -- to be set on the client | 
 | machine by an HTTP response from a web server, and then returned to | 
 | the server in later HTTP requests. | 
 |  | 
 | Both the regular Netscape cookie protocol and the protocol defined by | 
 | \rfc{2965} are handled.  RFC 2965 handling is switched off by default. | 
 | \rfc{2109} cookies are parsed as Netscape cookies and subsequently | 
 | treated either as Netscape or RFC 2965 cookies according to the | 
 | 'policy' in effect.  Note that the great majority of cookies on the | 
 | Internet are Netscape cookies.  \module{cookielib} attempts to follow | 
 | the de-facto Netscape cookie protocol (which differs substantially | 
 | from that set out in the original Netscape specification), including | 
 | taking note of the \code{max-age} and \code{port} cookie-attributes | 
 | introduced with RFC 2109.  \note{The various named parameters found in | 
 | \mailheader{Set-Cookie} and \mailheader{Set-Cookie2} headers | 
 | (eg. \code{domain} and \code{expires}) are conventionally referred to | 
 | as \dfn{attributes}.  To distinguish them from Python attributes, the | 
 | documentation for this module uses the term \dfn{cookie-attribute} | 
 | instead}. | 
 |  | 
 |  | 
 | The module defines the following exception: | 
 |  | 
 | \begin{excdesc}{LoadError} | 
 | Instances of \class{FileCookieJar} raise this exception on failure to | 
 | load cookies from a file.  \note{For backwards-compatibility | 
 | with Python 2.4 (which raised an \exception{IOError}), | 
 | \exception{LoadError} is a subclass of \exception{IOError}}. | 
 | \end{excdesc} | 
 |  | 
 |  | 
 | The following classes are provided: | 
 |  | 
 | \begin{classdesc}{CookieJar}{policy=\constant{None}} | 
 | \var{policy} is an object implementing the \class{CookiePolicy} | 
 | interface. | 
 |  | 
 | The \class{CookieJar} class stores HTTP cookies.  It extracts cookies | 
 | from HTTP requests, and returns them in HTTP responses. | 
 | \class{CookieJar} instances automatically expire contained cookies | 
 | when necessary.  Subclasses are also responsible for storing and | 
 | retrieving cookies from a file or database. | 
 | \end{classdesc} | 
 |  | 
 | \begin{classdesc}{FileCookieJar}{filename, delayload=\constant{None}, | 
 |  policy=\constant{None}} | 
 | \var{policy} is an object implementing the \class{CookiePolicy} | 
 | interface.  For the other arguments, see the documentation for the | 
 | corresponding attributes. | 
 |  | 
 | A \class{CookieJar} which can load cookies from, and perhaps save | 
 | cookies to, a file on disk.  Cookies are \strong{NOT} loaded from the | 
 | named file until either the \method{load()} or \method{revert()} | 
 | method is called.  Subclasses of this class are documented in section | 
 | \ref{file-cookie-jar-classes}. | 
 | \end{classdesc} | 
 |  | 
 | \begin{classdesc}{CookiePolicy}{} | 
 | This class is responsible for deciding whether each cookie should be | 
 | accepted from / returned to the server. | 
 | \end{classdesc} | 
 |  | 
 | \begin{classdesc}{DefaultCookiePolicy}{ | 
 |     blocked_domains=\constant{None}, | 
 |     allowed_domains=\constant{None}, | 
 |     netscape=\constant{True}, rfc2965=\constant{False}, | 
 |     rfc2109_as_netscape=\constant{None}, | 
 |     hide_cookie2=\constant{False}, | 
 |     strict_domain=\constant{False}, | 
 |     strict_rfc2965_unverifiable=\constant{True}, | 
 |     strict_ns_unverifiable=\constant{False}, | 
 |     strict_ns_domain=\constant{DefaultCookiePolicy.DomainLiberal}, | 
 |     strict_ns_set_initial_dollar=\constant{False}, | 
 |     strict_ns_set_path=\constant{False} | 
 |   } | 
 |  | 
 | Constructor arguments should be passed as keyword arguments only. | 
 | \var{blocked_domains} is a sequence of domain names that we never | 
 | accept cookies from, nor return cookies to. \var{allowed_domains} if | 
 | not \constant{None}, this is a sequence of the only domains for which | 
 | we accept and return cookies.  For all other arguments, see the | 
 | documentation for \class{CookiePolicy} and \class{DefaultCookiePolicy} | 
 | objects. | 
 |  | 
 | \class{DefaultCookiePolicy} implements the standard accept / reject | 
 | rules for Netscape and RFC 2965 cookies.  By default, RFC 2109 cookies | 
 | (ie. cookies received in a \mailheader{Set-Cookie} header with a | 
 | version cookie-attribute of 1) are treated according to the RFC 2965 | 
 | rules.  However, if RFC 2965 handling is turned off or | 
 | \member{rfc2109_as_netscape} is True, RFC 2109 cookies are | 
 | 'downgraded' by the \class{CookieJar} instance to Netscape cookies, by | 
 | setting the \member{version} attribute of the \class{Cookie} instance | 
 | to 0.  \class{DefaultCookiePolicy} also provides some parameters to | 
 | allow some fine-tuning of policy. | 
 | \end{classdesc} | 
 |  | 
 | \begin{classdesc}{Cookie}{} | 
 | This class represents Netscape, RFC 2109 and RFC 2965 cookies.  It is | 
 | not expected that users of \module{cookielib} construct their own | 
 | \class{Cookie} instances.  Instead, if necessary, call | 
 | \method{make_cookies()} on a \class{CookieJar} instance. | 
 | \end{classdesc} | 
 |  | 
 | \begin{seealso} | 
 |  | 
 | \seemodule{urllib2}{URL opening with automatic cookie handling.} | 
 |  | 
 | \seemodule{Cookie}{HTTP cookie classes, principally useful for | 
 | server-side code.  The \module{cookielib} and \module{Cookie} modules | 
 | do not depend on each other.} | 
 |  | 
 | \seeurl{http://wwwsearch.sf.net/ClientCookie/}{Extensions to this | 
 | module, including a class for reading Microsoft Internet Explorer | 
 | cookies on Windows.} | 
 |  | 
 | \seeurl{http://www.netscape.com/newsref/std/cookie_spec.html}{The | 
 | specification of the original Netscape cookie protocol.  Though this | 
 | is still the dominant protocol, the 'Netscape cookie protocol' | 
 | implemented by all the major browsers (and \module{cookielib}) only | 
 | bears a passing resemblance to the one sketched out in | 
 | \code{cookie_spec.html}.} | 
 |  | 
 | \seerfc{2109}{HTTP State Management Mechanism}{Obsoleted by RFC 2965. | 
 | Uses \mailheader{Set-Cookie} with version=1.} | 
 |  | 
 | \seerfc{2965}{HTTP State Management Mechanism}{The Netscape protocol | 
 | with the bugs fixed.  Uses \mailheader{Set-Cookie2} in place of | 
 | \mailheader{Set-Cookie}.  Not widely used.} | 
 |  | 
 | \seeurl{http://kristol.org/cookie/errata.html}{Unfinished errata to | 
 | RFC 2965.} | 
 |  | 
 | \seerfc{2964}{Use of HTTP State Management}{} | 
 |  | 
 | \end{seealso} | 
 |  | 
 |  | 
 | \subsection{CookieJar and FileCookieJar Objects \label{cookie-jar-objects}} | 
 |  | 
 | \class{CookieJar} objects support the iterator protocol for iterating | 
 | over contained \class{Cookie} objects. | 
 |  | 
 | \class{CookieJar} has the following methods: | 
 |  | 
 | \begin{methoddesc}[CookieJar]{add_cookie_header}{request} | 
 | Add correct \mailheader{Cookie} header to \var{request}. | 
 |  | 
 | If policy allows (ie. the \member{rfc2965} and \member{hide_cookie2} | 
 | attributes of the \class{CookieJar}'s \class{CookiePolicy} instance | 
 | are true and false respectively), the \mailheader{Cookie2} header is | 
 | also added when appropriate. | 
 |  | 
 | The \var{request} object (usually a \class{urllib2.Request} instance) | 
 | must support the methods \method{get_full_url()}, \method{get_host()}, | 
 | \method{get_type()}, \method{unverifiable()}, | 
 | \method{get_origin_req_host()}, \method{has_header()}, | 
 | \method{get_header()}, \method{header_items()}, and | 
 | \method{add_unredirected_header()},as documented by \module{urllib2}. | 
 | \end{methoddesc} | 
 |  | 
 | \begin{methoddesc}[CookieJar]{extract_cookies}{response, request} | 
 | Extract cookies from HTTP \var{response} and store them in the | 
 | \class{CookieJar}, where allowed by policy. | 
 |  | 
 | The \class{CookieJar} will look for allowable \mailheader{Set-Cookie} | 
 | and \mailheader{Set-Cookie2} headers in the \var{response} argument, | 
 | and store cookies as appropriate (subject to the | 
 | \method{CookiePolicy.set_ok()} method's approval). | 
 |  | 
 | The \var{response} object (usually the result of a call to | 
 | \method{urllib2.urlopen()}, or similar) should support an | 
 | \method{info()} method, which returns an object with a | 
 | \method{getallmatchingheaders()} method (usually a | 
 | \class{mimetools.Message} instance). | 
 |  | 
 | The \var{request} object (usually a \class{urllib2.Request} instance) | 
 | must support the methods \method{get_full_url()}, \method{get_host()}, | 
 | \method{unverifiable()}, and \method{get_origin_req_host()}, as | 
 | documented by \module{urllib2}.  The request is used to set default | 
 | values for cookie-attributes as well as for checking that the cookie | 
 | is allowed to be set. | 
 | \end{methoddesc} | 
 |  | 
 | \begin{methoddesc}[CookieJar]{set_policy}{policy} | 
 | Set the \class{CookiePolicy} instance to be used. | 
 | \end{methoddesc} | 
 |  | 
 | \begin{methoddesc}[CookieJar]{make_cookies}{response, request} | 
 | Return sequence of \class{Cookie} objects extracted from | 
 | \var{response} object. | 
 |  | 
 | See the documentation for \method{extract_cookies} for the interfaces | 
 | required of the \var{response} and \var{request} arguments. | 
 | \end{methoddesc} | 
 |  | 
 | \begin{methoddesc}[CookieJar]{set_cookie_if_ok}{cookie, request} | 
 | Set a \class{Cookie} if policy says it's OK to do so. | 
 | \end{methoddesc} | 
 |  | 
 | \begin{methoddesc}[CookieJar]{set_cookie}{cookie} | 
 | Set a \class{Cookie}, without checking with policy to see whether or | 
 | not it should be set. | 
 | \end{methoddesc} | 
 |  | 
 | \begin{methoddesc}[CookieJar]{clear}{\optional{domain\optional{, | 
 |       path\optional{, name}}}} | 
 | Clear some cookies. | 
 |  | 
 | If invoked without arguments, clear all cookies.  If given a single | 
 | argument, only cookies belonging to that \var{domain} will be removed. | 
 | If given two arguments, cookies belonging to the specified | 
 | \var{domain} and URL \var{path} are removed.  If given three | 
 | arguments, then the cookie with the specified \var{domain}, \var{path} | 
 | and \var{name} is removed. | 
 |  | 
 | Raises \exception{KeyError} if no matching cookie exists. | 
 | \end{methoddesc} | 
 |  | 
 | \begin{methoddesc}[CookieJar]{clear_session_cookies}{} | 
 | Discard all session cookies. | 
 |  | 
 | Discards all contained cookies that have a true \member{discard} | 
 | attribute (usually because they had either no \code{max-age} or | 
 | \code{expires} cookie-attribute, or an explicit \code{discard} | 
 | cookie-attribute).  For interactive browsers, the end of a session | 
 | usually corresponds to closing the browser window. | 
 |  | 
 | Note that the \method{save()} method won't save session cookies | 
 | anyway, unless you ask otherwise by passing a true | 
 | \var{ignore_discard} argument. | 
 | \end{methoddesc} | 
 |  | 
 | \class{FileCookieJar} implements the following additional methods: | 
 |  | 
 | \begin{methoddesc}[FileCookieJar]{save}{filename=\constant{None}, | 
 |     ignore_discard=\constant{False}, ignore_expires=\constant{False}} | 
 | Save cookies to a file. | 
 |  | 
 | This base class raises \exception{NotImplementedError}.  Subclasses may | 
 | leave this method unimplemented. | 
 |  | 
 | \var{filename} is the name of file in which to save cookies.  If | 
 | \var{filename} is not specified, \member{self.filename} is used (whose | 
 | default is the value passed to the constructor, if any); if | 
 | \member{self.filename} is \constant{None}, \exception{ValueError} is | 
 | raised. | 
 |  | 
 | \var{ignore_discard}: save even cookies set to be discarded. | 
 | \var{ignore_expires}: save even cookies that have expired | 
 |  | 
 | The file is overwritten if it already exists, thus wiping all the | 
 | cookies it contains.  Saved cookies can be restored later using the | 
 | \method{load()} or \method{revert()} methods. | 
 | \end{methoddesc} | 
 |  | 
 | \begin{methoddesc}[FileCookieJar]{load}{filename=\constant{None}, | 
 |     ignore_discard=\constant{False}, ignore_expires=\constant{False}} | 
 | Load cookies from a file. | 
 |  | 
 | Old cookies are kept unless overwritten by newly loaded ones. | 
 |  | 
 | Arguments are as for \method{save()}. | 
 |  | 
 | The named file must be in the format understood by the class, or | 
 | \exception{LoadError} will be raised.  Also, \exception{IOError} may | 
 | be raised, for example if the file does not exist.  \note{For | 
 | backwards-compatibility with Python 2.4 (which raised | 
 | an \exception{IOError}), \exception{LoadError} is a subclass | 
 | of \exception{IOError}.} | 
 | \end{methoddesc} | 
 |  | 
 | \begin{methoddesc}[FileCookieJar]{revert}{filename=\constant{None}, | 
 |     ignore_discard=\constant{False}, ignore_expires=\constant{False}} | 
 | Clear all cookies and reload cookies from a saved file. | 
 |  | 
 | \method{revert()} can raise the same exceptions as \method{load()}. | 
 | If there is a failure, the object's state will not be altered. | 
 | \end{methoddesc} | 
 |  | 
 | \class{FileCookieJar} instances have the following public attributes: | 
 |  | 
 | \begin{memberdesc}{filename} | 
 | Filename of default file in which to keep cookies.  This attribute may | 
 | be assigned to. | 
 | \end{memberdesc} | 
 |  | 
 | \begin{memberdesc}{delayload} | 
 | If true, load cookies lazily from disk.  This attribute should not be | 
 | assigned to.  This is only a hint, since this only affects | 
 | performance, not behaviour (unless the cookies on disk are changing). | 
 | A \class{CookieJar} object may ignore it.  None of the | 
 | \class{FileCookieJar} classes included in the standard library lazily | 
 | loads cookies. | 
 | \end{memberdesc} | 
 |  | 
 |  | 
 | \subsection{FileCookieJar subclasses and co-operation with web browsers | 
 |   \label{file-cookie-jar-classes}} | 
 |  | 
 | The following \class{CookieJar} subclasses are provided for reading | 
 | and writing .  Further \class{CookieJar} subclasses, including one | 
 | that reads Microsoft Internet Explorer cookies, are available at | 
 | \url{http://wwwsearch.sf.net/ClientCookie/}. | 
 |  | 
 | \begin{classdesc}{MozillaCookieJar}{filename, delayload=\constant{None}, | 
 |  policy=\constant{None}} | 
 | A \class{FileCookieJar} that can load from and save cookies to disk in | 
 | the Mozilla \code{cookies.txt} file format (which is also used by the | 
 | Lynx and Netscape browsers).  \note{This loses information about RFC | 
 | 2965 cookies, and also about newer or non-standard cookie-attributes | 
 | such as \code{port}.} | 
 |  | 
 | \warning{Back up your cookies before saving if you have cookies whose | 
 | loss / corruption would be inconvenient (there are some subtleties | 
 | which may lead to slight changes in the file over a load / save | 
 | round-trip).} | 
 |  | 
 | Also note that cookies saved while Mozilla is running will get | 
 | clobbered by Mozilla. | 
 | \end{classdesc} | 
 |  | 
 | \begin{classdesc}{LWPCookieJar}{filename, delayload=\constant{None}, | 
 |  policy=\constant{None}} | 
 | A \class{FileCookieJar} that can load from and save cookies to disk in | 
 | format compatible with the libwww-perl library's \code{Set-Cookie3} | 
 | file format.  This is convenient if you want to store cookies in a | 
 | human-readable file. | 
 | \end{classdesc} | 
 |  | 
 |  | 
 | \subsection{CookiePolicy Objects \label{cookie-policy-objects}} | 
 |  | 
 | Objects implementing the \class{CookiePolicy} interface have the | 
 | following methods: | 
 |  | 
 | \begin{methoddesc}[CookiePolicy]{set_ok}{cookie, request} | 
 | Return boolean value indicating whether cookie should be accepted from server. | 
 |  | 
 | \var{cookie} is a \class{cookielib.Cookie} instance.  \var{request} is | 
 | an object implementing the interface defined by the documentation for | 
 | \method{CookieJar.extract_cookies()}. | 
 | \end{methoddesc} | 
 |  | 
 | \begin{methoddesc}[CookiePolicy]{return_ok}{cookie, request} | 
 | Return boolean value indicating whether cookie should be returned to server. | 
 |  | 
 | \var{cookie} is a \class{cookielib.Cookie} instance.  \var{request} is | 
 | an object implementing the interface defined by the documentation for | 
 | \method{CookieJar.add_cookie_header()}. | 
 | \end{methoddesc} | 
 |  | 
 | \begin{methoddesc}[CookiePolicy]{domain_return_ok}{domain, request} | 
 | Return false if cookies should not be returned, given cookie domain. | 
 |  | 
 | This method is an optimization.  It removes the need for checking | 
 | every cookie with a particular domain (which might involve reading | 
 | many files).  Returning true from \method{domain_return_ok()} and | 
 | \method{path_return_ok()} leaves all the work to \method{return_ok()}. | 
 |  | 
 | If \method{domain_return_ok()} returns true for the cookie domain, | 
 | \method{path_return_ok()} is called for the cookie path.  Otherwise, | 
 | \method{path_return_ok()} and \method{return_ok()} are never called | 
 | for that cookie domain.  If \method{path_return_ok()} returns true, | 
 | \method{return_ok()} is called with the \class{Cookie} object itself | 
 | for a full check.  Otherwise, \method{return_ok()} is never called for | 
 | that cookie path. | 
 |  | 
 | Note that \method{domain_return_ok()} is called for every | 
 | \emph{cookie} domain, not just for the \emph{request} domain.  For | 
 | example, the function might be called with both \code{".example.com"} | 
 | and \code{"www.example.com"} if the request domain is | 
 | \code{"www.example.com"}.  The same goes for | 
 | \method{path_return_ok()}. | 
 |  | 
 | The \var{request} argument is as documented for \method{return_ok()}. | 
 | \end{methoddesc} | 
 |  | 
 | \begin{methoddesc}[CookiePolicy]{path_return_ok}{path, request} | 
 | Return false if cookies should not be returned, given cookie path. | 
 |  | 
 | See the documentation for \method{domain_return_ok()}. | 
 | \end{methoddesc} | 
 |  | 
 |  | 
 | In addition to implementing the methods above, implementations of the | 
 | \class{CookiePolicy} interface must also supply the following | 
 | attributes, indicating which protocols should be used, and how.  All | 
 | of these attributes may be assigned to. | 
 |  | 
 | \begin{memberdesc}{netscape} | 
 | Implement Netscape protocol. | 
 | \end{memberdesc} | 
 | \begin{memberdesc}{rfc2965} | 
 | Implement RFC 2965 protocol. | 
 | \end{memberdesc} | 
 | \begin{memberdesc}{hide_cookie2} | 
 | Don't add \mailheader{Cookie2} header to requests (the presence of | 
 | this header indicates to the server that we understand RFC 2965 | 
 | cookies). | 
 | \end{memberdesc} | 
 |  | 
 | The most useful way to define a \class{CookiePolicy} class is by | 
 | subclassing from \class{DefaultCookiePolicy} and overriding some or | 
 | all of the methods above.  \class{CookiePolicy} itself may be used as | 
 | a 'null policy' to allow setting and receiving any and all cookies | 
 | (this is unlikely to be useful). | 
 |  | 
 |  | 
 | \subsection{DefaultCookiePolicy Objects \label{default-cookie-policy-objects}} | 
 |  | 
 | Implements the standard rules for accepting and returning cookies. | 
 |  | 
 | Both RFC 2965 and Netscape cookies are covered.  RFC 2965 handling is | 
 | switched off by default. | 
 |  | 
 | The easiest way to provide your own policy is to override this class | 
 | and call its methods in your overridden implementations before adding | 
 | your own additional checks: | 
 |  | 
 | \begin{verbatim} | 
 | import cookielib | 
 | class MyCookiePolicy(cookielib.DefaultCookiePolicy): | 
 |     def set_ok(self, cookie, request): | 
 |         if not cookielib.DefaultCookiePolicy.set_ok(self, cookie, request): | 
 |             return False | 
 |         if i_dont_want_to_store_this_cookie(cookie): | 
 |             return False | 
 |         return True | 
 | \end{verbatim} | 
 |  | 
 | In addition to the features required to implement the | 
 | \class{CookiePolicy} interface, this class allows you to block and | 
 | allow domains from setting and receiving cookies.  There are also some | 
 | strictness switches that allow you to tighten up the rather loose | 
 | Netscape protocol rules a little bit (at the cost of blocking some | 
 | benign cookies). | 
 |  | 
 | A domain blacklist and whitelist is provided (both off by default). | 
 | Only domains not in the blacklist and present in the whitelist (if the | 
 | whitelist is active) participate in cookie setting and returning.  Use | 
 | the \var{blocked_domains} constructor argument, and | 
 | \method{blocked_domains()} and \method{set_blocked_domains()} methods | 
 | (and the corresponding argument and methods for | 
 | \var{allowed_domains}).  If you set a whitelist, you can turn it off | 
 | again by setting it to \constant{None}. | 
 |  | 
 | Domains in block or allow lists that do not start with a dot must | 
 | equal the cookie domain to be matched.  For example, | 
 | \code{"example.com"} matches a blacklist entry of | 
 | \code{"example.com"}, but \code{"www.example.com"} does not.  Domains | 
 | that do start with a dot are matched by more specific domains too. | 
 | For example, both \code{"www.example.com"} and | 
 | \code{"www.coyote.example.com"} match \code{".example.com"} (but | 
 | \code{"example.com"} itself does not).  IP addresses are an exception, | 
 | and must match exactly.  For example, if blocked_domains contains | 
 | \code{"192.168.1.2"} and \code{".168.1.2"}, 192.168.1.2 is blocked, | 
 | but 193.168.1.2 is not. | 
 |  | 
 | \class{DefaultCookiePolicy} implements the following additional | 
 | methods: | 
 |  | 
 | \begin{methoddesc}[DefaultCookiePolicy]{blocked_domains}{} | 
 | Return the sequence of blocked domains (as a tuple). | 
 | \end{methoddesc} | 
 |  | 
 | \begin{methoddesc}[DefaultCookiePolicy]{set_blocked_domains} | 
 |   {blocked_domains} | 
 | Set the sequence of blocked domains. | 
 | \end{methoddesc} | 
 |  | 
 | \begin{methoddesc}[DefaultCookiePolicy]{is_blocked}{domain} | 
 | Return whether \var{domain} is on the blacklist for setting or | 
 | receiving cookies. | 
 | \end{methoddesc} | 
 |  | 
 | \begin{methoddesc}[DefaultCookiePolicy]{allowed_domains}{} | 
 | Return \constant{None}, or the sequence of allowed domains (as a tuple). | 
 | \end{methoddesc} | 
 |  | 
 | \begin{methoddesc}[DefaultCookiePolicy]{set_allowed_domains} | 
 |   {allowed_domains} | 
 | Set the sequence of allowed domains, or \constant{None}. | 
 | \end{methoddesc} | 
 |  | 
 | \begin{methoddesc}[DefaultCookiePolicy]{is_not_allowed}{domain} | 
 | Return whether \var{domain} is not on the whitelist for setting or | 
 | receiving cookies. | 
 | \end{methoddesc} | 
 |  | 
 | \class{DefaultCookiePolicy} instances have the following attributes, | 
 | which are all initialised from the constructor arguments of the same | 
 | name, and which may all be assigned to. | 
 |  | 
 | \begin{memberdesc}{rfc2109_as_netscape} | 
 | If true, request that the \class{CookieJar} instance downgrade RFC | 
 | 2109 cookies (ie. cookies received in a \mailheader{Set-Cookie} header | 
 | with a version cookie-attribute of 1) to Netscape cookies by setting | 
 | the version attribute of the \class{Cookie} instance to 0.  The | 
 | default value is \constant{None}, in which case RFC 2109 cookies are | 
 | downgraded if and only if RFC 2965 handling is turned off.  Therefore, | 
 | RFC 2109 cookies are downgraded by default. | 
 | \versionadded{2.5} | 
 | \end{memberdesc} | 
 |  | 
 | General strictness switches: | 
 |  | 
 | \begin{memberdesc}{strict_domain} | 
 | Don't allow sites to set two-component domains with country-code | 
 | top-level domains like \code{.co.uk}, \code{.gov.uk}, | 
 | \code{.co.nz}.etc.  This is far from perfect and isn't guaranteed to | 
 | work! | 
 | \end{memberdesc} | 
 |  | 
 | RFC 2965 protocol strictness switches: | 
 |  | 
 | \begin{memberdesc}{strict_rfc2965_unverifiable} | 
 | Follow RFC 2965 rules on unverifiable transactions (usually, an | 
 | unverifiable transaction is one resulting from a redirect or a request | 
 | for an image hosted on another site).  If this is false, cookies are | 
 | \emph{never} blocked on the basis of verifiability | 
 | \end{memberdesc} | 
 |  | 
 | Netscape protocol strictness switches: | 
 |  | 
 | \begin{memberdesc}{strict_ns_unverifiable} | 
 | apply RFC 2965 rules on unverifiable transactions even to Netscape | 
 | cookies | 
 | \end{memberdesc} | 
 | \begin{memberdesc}{strict_ns_domain} | 
 | Flags indicating how strict to be with domain-matching rules for | 
 | Netscape cookies.  See below for acceptable values. | 
 | \end{memberdesc} | 
 | \begin{memberdesc}{strict_ns_set_initial_dollar} | 
 | Ignore cookies in Set-Cookie: headers that have names starting with | 
 | \code{'\$'}. | 
 | \end{memberdesc} | 
 | \begin{memberdesc}{strict_ns_set_path} | 
 | Don't allow setting cookies whose path doesn't path-match request URI. | 
 | \end{memberdesc} | 
 |  | 
 | \member{strict_ns_domain} is a collection of flags.  Its value is | 
 | constructed by or-ing together (for example, | 
 | \code{DomainStrictNoDots|DomainStrictNonDomain} means both flags are | 
 | set). | 
 |  | 
 | \begin{memberdesc}{DomainStrictNoDots} | 
 | When setting cookies, the 'host prefix' must not contain a dot | 
 | (eg. \code{www.foo.bar.com} can't set a cookie for \code{.bar.com}, | 
 | because \code{www.foo} contains a dot). | 
 | \end{memberdesc} | 
 | \begin{memberdesc}{DomainStrictNonDomain} | 
 | Cookies that did not explicitly specify a \code{domain} | 
 | cookie-attribute can only be returned to a domain equal to the domain | 
 | that set the cookie (eg. \code{spam.example.com} won't be returned | 
 | cookies from \code{example.com} that had no \code{domain} | 
 | cookie-attribute). | 
 | \end{memberdesc} | 
 | \begin{memberdesc}{DomainRFC2965Match} | 
 | When setting cookies, require a full RFC 2965 domain-match. | 
 | \end{memberdesc} | 
 |  | 
 | The following attributes are provided for convenience, and are the | 
 | most useful combinations of the above flags: | 
 |  | 
 | \begin{memberdesc}{DomainLiberal} | 
 | Equivalent to 0 (ie. all of the above Netscape domain strictness flags | 
 | switched off). | 
 | \end{memberdesc} | 
 | \begin{memberdesc}{DomainStrict} | 
 | Equivalent to \code{DomainStrictNoDots|DomainStrictNonDomain}. | 
 | \end{memberdesc} | 
 |  | 
 |  | 
 | \subsection{Cookie Objects \label{cookie-objects}} | 
 |  | 
 | \class{Cookie} instances have Python attributes roughly corresponding | 
 | to the standard cookie-attributes specified in the various cookie | 
 | standards.  The correspondence is not one-to-one, because there are | 
 | complicated rules for assigning default values, because the | 
 | \code{max-age} and \code{expires} cookie-attributes contain equivalent | 
 | information, and because RFC 2109 cookies may be 'downgraded' by | 
 | \module{cookielib} from version 1 to version 0 (Netscape) cookies. | 
 |  | 
 | Assignment to these attributes should not be necessary other than in | 
 | rare circumstances in a \class{CookiePolicy} method.  The class does | 
 | not enforce internal consistency, so you should know what you're | 
 | doing if you do that. | 
 |  | 
 | \begin{memberdesc}[Cookie]{version} | 
 | Integer or \constant{None}.  Netscape cookies have \member{version} 0. | 
 | RFC 2965 and RFC 2109 cookies have a \code{version} cookie-attribute | 
 | of 1.  However, note that \module{cookielib} may 'downgrade' RFC 2109 | 
 | cookies to Netscape cookies, in which case \member{version} is 0. | 
 | \end{memberdesc} | 
 | \begin{memberdesc}[Cookie]{name} | 
 | Cookie name (a string). | 
 | \end{memberdesc} | 
 | \begin{memberdesc}[Cookie]{value} | 
 | Cookie value (a string), or \constant{None}. | 
 | \end{memberdesc} | 
 | \begin{memberdesc}[Cookie]{port} | 
 | String representing a port or a set of ports (eg. '80', or '80,8080'), | 
 | or \constant{None}. | 
 | \end{memberdesc} | 
 | \begin{memberdesc}[Cookie]{path} | 
 | Cookie path (a string, eg. \code{'/acme/rocket_launchers'}). | 
 | \end{memberdesc} | 
 | \begin{memberdesc}[Cookie]{secure} | 
 | True if cookie should only be returned over a secure connection. | 
 | \end{memberdesc} | 
 | \begin{memberdesc}[Cookie]{expires} | 
 | Integer expiry date in seconds since epoch, or \constant{None}.  See | 
 | also the \method{is_expired()} method. | 
 | \end{memberdesc} | 
 | \begin{memberdesc}[Cookie]{discard} | 
 | True if this is a session cookie. | 
 | \end{memberdesc} | 
 | \begin{memberdesc}[Cookie]{comment} | 
 | String comment from the server explaining the function of this cookie, | 
 | or \constant{None}. | 
 | \end{memberdesc} | 
 | \begin{memberdesc}[Cookie]{comment_url} | 
 | URL linking to a comment from the server explaining the function of | 
 | this cookie, or \constant{None}. | 
 | \end{memberdesc} | 
 | \begin{memberdesc}[Cookie]{rfc2109} | 
 | True if this cookie was received as an RFC 2109 cookie (ie. the cookie | 
 | arrived in a \mailheader{Set-Cookie} header, and the value of the | 
 | Version cookie-attribute in that header was 1).  This attribute is | 
 | provided because \module{cookielib} may 'downgrade' RFC 2109 cookies | 
 | to Netscape cookies, in which case \member{version} is 0. | 
 | \versionadded{2.5} | 
 | \end{memberdesc} | 
 |  | 
 | \begin{memberdesc}[Cookie]{port_specified} | 
 | True if a port or set of ports was explicitly specified by the server | 
 | (in the \mailheader{Set-Cookie} / \mailheader{Set-Cookie2} header). | 
 | \end{memberdesc} | 
 | \begin{memberdesc}[Cookie]{domain_specified} | 
 | True if a domain was explicitly specified by the server. | 
 | \end{memberdesc} | 
 | \begin{memberdesc}[Cookie]{domain_initial_dot} | 
 | True if the domain explicitly specified by the server began with a | 
 | dot (\code{'.'}). | 
 | \end{memberdesc} | 
 |  | 
 | Cookies may have additional non-standard cookie-attributes.  These may | 
 | be accessed using the following methods: | 
 |  | 
 | \begin{methoddesc}[Cookie]{has_nonstandard_attr}{name} | 
 | Return true if cookie has the named cookie-attribute. | 
 | \end{methoddesc} | 
 | \begin{methoddesc}[Cookie]{get_nonstandard_attr}{name, default=\constant{None}} | 
 | If cookie has the named cookie-attribute, return its value. | 
 | Otherwise, return \var{default}. | 
 | \end{methoddesc} | 
 | \begin{methoddesc}[Cookie]{set_nonstandard_attr}{name, value} | 
 | Set the value of the named cookie-attribute. | 
 | \end{methoddesc} | 
 |  | 
 | The \class{Cookie} class also defines the following method: | 
 |  | 
 | \begin{methoddesc}[Cookie]{is_expired}{\optional{now=\constant{None}}} | 
 | True if cookie has passed the time at which the server requested it | 
 | should expire.  If \var{now} is given (in seconds since the epoch), | 
 | return whether the cookie has expired at the specified time. | 
 | \end{methoddesc} | 
 |  | 
 |  | 
 | \subsection{Examples \label{cookielib-examples}} | 
 |  | 
 | The first example shows the most common usage of \module{cookielib}: | 
 |  | 
 | \begin{verbatim} | 
 | import cookielib, urllib2 | 
 | cj = cookielib.CookieJar() | 
 | opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) | 
 | r = opener.open("http://example.com/") | 
 | \end{verbatim} | 
 |  | 
 | This example illustrates how to open a URL using your Netscape, | 
 | Mozilla, or Lynx cookies (assumes \UNIX{}/Netscape convention for | 
 | location of the cookies file): | 
 |  | 
 | \begin{verbatim} | 
 | import os, cookielib, urllib2 | 
 | cj = cookielib.MozillaCookieJar() | 
 | cj.load(os.path.join(os.environ["HOME"], ".netscape/cookies.txt")) | 
 | opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) | 
 | r = opener.open("http://example.com/") | 
 | \end{verbatim} | 
 |  | 
 | The next example illustrates the use of \class{DefaultCookiePolicy}. | 
 | Turn on RFC 2965 cookies, be more strict about domains when setting | 
 | and returning Netscape cookies, and block some domains from setting | 
 | cookies or having them returned: | 
 |  | 
 | \begin{verbatim} | 
 | import urllib2 | 
 | from cookielib import CookieJar, DefaultCookiePolicy | 
 | policy = DefaultCookiePolicy( | 
 |     rfc2965=True, strict_ns_domain=Policy.DomainStrict, | 
 |     blocked_domains=["ads.net", ".ads.net"]) | 
 | cj = CookieJar(policy) | 
 | opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) | 
 | r = opener.open("http://example.com/") | 
 | \end{verbatim} |