"http.cookiejar" --- HTTP 用戶端的 Cookie 處理
**********************************************

**原始碼：**Lib/http/cookiejar.py

======================================================================

"http.cookiejar" 模組定義了自動處理 HTTP cookie 的類別。當需要存取小量
資料 —— *cookies* —— 的網站時會非常有用。這些資料會依據網頁伺服器的
HTTP 回應來設置於用戶端機器，並在之後的請求中被回傳到伺服器。

一般的 Netscape cookie 協定和 **RFC 2965** 定義的 cookie 協定都會被處
理。RFC 2965 的處理預設是關閉的。**RFC 2109** cookie 會被剖析為
Netscape cookie，然後根據有生效的「策略」來被看作為 Netscape 或 RFC
2965 cookie。"http.cookiejar" 會嘗試遵循實際上的 Netscape cookie 協定
（與原始的 Netscape 規格中的協定有很大的不同），包括 RFC 2965 所引進的
"max-age" 和 "port" cookie 屬性。

備註:

  在 *Set-Cookie* 和 *Set-Cookie2* 標頭中出現的各種命名參數（例如
  "domain" 和 "expires"）通常被稱為 *attributes*。為了與 Python 的屬性
  分別開，這個模組的說明檔案改用 *cookie-attribute* 來稱呼。

模組定義了以下例外：

exception http.cookiejar.LoadError

   當從檔案載入 cookies 失敗時，"FileCookieJar" 的實例會引發這個例外。
   "LoadError" 是 "OSError" 的子類別。

   在 3.3 版的變更: "LoadError" 以前是 "IOError" 的子型別，現在是
   "OSError" 的別名。

這個模組提供了以下類別：

class http.cookiejar.CookieJar(policy=None)

   *policy* 是實作了 "CookiePolicy" 介面的一個物件。

   "CookieJar" 類別會儲存 HTTP cookies。它會從 HTTP 請求中抽取出
   cookies，並在 HTTP 回應中將它們回傳。"CookieJar" 實例會在必要時自動
   使包含的 cookies 過期。它的子類別也負責從檔案或資料庫中儲存和擷取
   cookies。

class http.cookiejar.FileCookieJar(filename=None, delayload=None, policy=None)

   *policy* 是實作了 "CookiePolicy" 介面的一個物件。至於其他引數，請參
   閱對應屬性的說明文件。

   一個可以從磁碟上的檔案載入 Cookie，也可以儲存 Cookie 到磁碟上檔案的
   "CookieJar"。在 "load()" 或 "revert()" 方法被呼叫之前，Cookie 並**
   不會**從指定的檔案載入。這個類別的子類別有記載於 FileCookieJar 子類
   別及與網頁瀏覽器的合作 章節。

   這個類別不應該直接初始化 - 請使用下面的子類別代替。

   在 3.8 版的變更: filename 參數支援傳入一個 *path-like object*。

class http.cookiejar.CookiePolicy

   此類別負責決定是否應從伺服器接受 / 回傳每個 cookie。

class http.cookiejar.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'))

   建構函式引數只能以關鍵字引數的形式傳送。*blocked_domains* 是我們從
   不接受 cookies 或回傳 cookies 的網域名稱序列。*allowed_domains* 如
   果不是 "None"，這是我們接受並回傳 cookies 的唯一網域名稱序列。
   *secure_protocols* 是可以加入安全 cookies 的通訊協定序列。預設情況
   下，*https* 和 *wss*（安全 websocket）會被視為安全通訊協定。所有其
   他引數請參閱 "CookiePolicy" 及 "DefaultCookiePolicy" 物件的說明文件
   。

   "DefaultCookiePolicy" 實作了 Netscape 和 **RFC 2965** cookies 的標
   準接受/拒絕規則。預設情況下，**RFC 2109** cookies（即在 *Set-
   Cookie* 標頭中接收到的版本 cookie-attribute 為 1 的 cookies）會根據
   RFC 2965 規則處理。 但是，如果 RFC 2965 處理被關閉，或者
   "rfc2109_as_netscape" 是 "True"，RFC 2109 cookie 會被 "CookieJar"
   實例「降級 」為 Netscape cookie，方法是將 "Cookie" 實例的 "version"
   屬性設為 0。"DefaultCookiePolicy" 也提供了一些參數來允許對策略進行
   一些微調。

class http.cookiejar.Cookie

   這個類別代表 Netscape、**RFC 2109** 和 **RFC 2965** cookies。 我們
   不希望 "http.cookiejar" 的使用者建立自己的 "Cookie" 實例。 如有必要
   ，請在 "CookieJar" 實例上呼叫 "make_cookies()"。

也參考:

  "urllib.request" 模組
     URL 打開時會自動處理 cookie。

  "http.cookies" 模組
     HTTP cookie 類別，主要用於伺服器端程式碼。 "http.cookiejar" 和
     "http.cookies" 模組不互相依賴。

  https://curl.se/rfc/cookie_spec.html
     原始 Netscape cookie 協定的規範。雖然這仍是主流協定，但所有主要瀏
     覽器（以及 "http.cookiejar"）實作的「Netscape cookie 協定」與
     "cookie_spec.html" 中實作的協定只有一點相似之處。

  **RFC 2109** - HTTP 狀態管理機制
     被 **RFC 2965** 所取代，會使用 *Set-Cookie* 設定 version=1。

  **RFC 2965** - HTTP 狀態管理機制
     有錯誤修正的 Netscape 通訊協定。使用 *Set-Cookie2* 取代 *Set-
     Cookie*。未被廣泛使用。

  https://kristol.org/cookie/errata.html
     未完成的 **RFC 2965** 勘誤表。

  **RFC 2964** - HTTP 狀態管理使用方法


CookieJar 與 FileCookieJar 物件
===============================

"CookieJar" 物件支援 *iterator* 協定來遍歷包含的 "Cookie" 物件。

"CookieJar" 擁有以下方法：

CookieJar.add_cookie_header(request)

   將正確的 *Cookie* 標頭加入 *request*。

   如果策略允許（即 "CookieJar" 的 "CookiePolicy" 實例的 "rfc2965" 和
   "hide_cookie2" 屬性分別為 true 和 false），*Cookie2* 標頭也會在適當
   的時候加入。

   如 "urllib.request" 文件所述，*request* 物件（通常是
   "urllib.request.Request" 的實例）必須支援 "get_full_url()"、
   "has_header()"、"get_header()"、"header_items()"、
   "add_unredirected_header()" 方法與 "host"、"type"、"unverifiable"、
   "origin_req_host" 屬性。

   在 3.3 版的變更: *request* 物件需要 "origin_req_host" 屬性。已移除
   對已廢棄方法 "get_origin_req_host()" 的依賴。

CookieJar.extract_cookies(response, request)

   在策略允許的情況下，從 HTTP *response* 抽取出 cookies 並儲存到
   "CookieJar" 中。

   "CookieJar" 會在 *response* 引數中尋找允許的 *Set-Cookie* 和 *Set-
   Cookie2* 標頭，並視情況儲存 cookies（需經 "CookiePolicy.set_ok()"
   方法的檢測）。

   *response* 物件（通常是呼叫 "urllib.request.urlopen()" 的結果或類似
   的東西）應該支援 "info()" 方法，它會回傳一個
   "email.message.Message" 的實例。

   如 "urllib.request" 的檔案所說，*request* 物件（通常是
   "urllib.request.Request" 的實例）必須支援 "get_full_url()" 方法以及
   "host"、"unverifiable" 和 "origin_req_host" 等屬性，該請求被用於設
   置 cookie-attributes 的預設值並檢查 cookie 是否允許被設置。

   在 3.3 版的變更: *request* 物件需要 "origin_req_host" 屬性。已移除
   對已廢棄方法 "get_origin_req_host()" 的依賴。

CookieJar.set_policy(policy)

   設定要使用的 "CookiePolicy" 實例。

CookieJar.make_cookies(response, request)

   回傳從 *response* 物件抽取出的 "Cookie" 物件序列。

   有關 *response* 和 *request* 引數所需的介面，請參閱
   "extract_cookies()" 的說明檔案。

CookieJar.set_cookie_if_ok(cookie, request)

   如果策略允許這麼做，設定 "Cookie"。

CookieJar.set_cookie(cookie)

   設定一個 "Cookie"，不經過策略檢查。

CookieJar.clear([domain[, path[, name]]])

   清除一些 cookies。

   如果不帶引數地叫用，則清除所有 cookies。如果給定單一引數，則只移除
   屬於該 *domain* 的 cookies。如果給定兩個引數，則會移除屬於指定
   *domain* 和 URL *path* 的 cookie。 如果給定三個引數，則會移除指定
   *domain*、*path* 和 *name* 的 cookie。

   如果沒有符合的 cookie 存在，則引發 "KeyError"。

CookieJar.clear_session_cookies()

   刪除所有 session cookies。

   刪除所有包含有 true "discard" 屬性的 cookie (通常是因為它們沒有
   *max-age* 或 *expires* cookie 屬性，或有明確的 *discard* cookie 屬
   性)。 對於互動式瀏覽器，工作階段的結束通常對應於關閉瀏覽器視窗。

   請注意 "save()" 方法無論如何都不會儲存 session cookies，除非你透過
   傳入 true *ignore_discard* 引數來要求。

"FileCookieJar" 實例有下列附加方法：

FileCookieJar.save(filename=None, ignore_discard=False, ignore_expires=False)

   將 cookies 儲存到檔案中。

   這個基底類別會產生 "NotImplementedError"。子類別可以不實作此方法。

   *filename* 是儲存 cookies 的檔案名稱。 如果 *filename* 未指定，則會
   使用 "self.filename" (其預設值是傳給建構函式的值（如果有）)；如果
   "self.filename" 是 "None"，則會產生 "ValueError"。

   *ignore_discard*: 即使設定為捨棄的 cookies 也會儲存。
   *ignore_expires*: 保存過期的 cookie

   如果檔案已經存在，則會被覆寫，因此會抹除其中包含的所有 cookies。 儲
   存的 cookies 可以稍後使用 "load()" 或 "revert()" 方法還原。

FileCookieJar.load(filename=None, ignore_discard=False, ignore_expires=False)

   從檔案中載入 cookies。

   舊的 cookies 會被保留，除非被新載入的 cookies 覆蓋。

   引數與 "save()" 相同。

   被命名的檔案必須是類別所能正確剖析的格式，否則會產生 "LoadError"。
   此外，"OSError" 可能會被引發，例如檔案不存在時。

   在 3.3 版的變更: 以前會引發 "IOError"，現在它是 "OSError" 的別名。

FileCookieJar.revert(filename=None, ignore_discard=False, ignore_expires=False)

   清除所有 cookies， 並從儲存的檔案重新載入 cookies。

   "revert()" 可以產生與 "load()" 相同的例外。如果失敗，物件的狀態不會
   被改變。

"FileCookieJar" 實例擁有以下公開屬性：

FileCookieJar.filename

   保存 cookie 的預設檔案的檔案名稱。 此屬性可以被指定。

FileCookieJar.delayload

   若為 true，則從硬盤惰性地載入 cookies。 此屬性不應被指定。 這只是一
   個提示，因為這只會影響效能，不會影響行為 (除非磁碟上的 cookies 正在
   改變)。一個 "CookieJar" 物件可以忽略它。 沒有一個包含在標準函式庫中
   的 "FileCookieJar" 類別會惰性地載入 cookies。


FileCookieJar 子類別及與網頁瀏覽器的合作
========================================

以下 "CookieJar" 子類別提供用於讀取和寫入。

class http.cookiejar.MozillaCookieJar(filename=None, delayload=None, policy=None)

   一個能夠以 Mozilla "cookies.txt" 檔案格式（該格式也被 curl 和 Lynx
   以及 Netscape 瀏覽器所使用）從磁碟載入和儲存 cookie 的
   "FileCookieJar"。

   備註:

     這會遺失關於 **RFC 2965** cookie 的訊息，以及較新或非標準 cookie
     屬性（例如 "port"）的訊息。

   警告:

     如果 Cookie 遺失或損壞會造成不便，請在儲存之前先備份 Cookie（有些
     微妙的情況可能會導致檔案在載入/儲存往返過程中發生輕微變化）。

   另外請注意，在 Mozilla 執行時儲存的 cookies 會被 Mozilla 刪除。

class http.cookiejar.LWPCookieJar(filename=None, delayload=None, policy=None)

   一個 "FileCookieJar" 可以從 libwww-perl 函式庫的 *Set-Cookie3* 檔案
   格式載入 cookies 並儲存 cookies 到磁碟。如果你想要將 cookie 儲存在
   人類可讀的檔案中，這是很方便的。

   在 3.8 版的變更: filename 參數支援傳入一個 *path-like object*。


CookiePolicy 物件
=================

實作 "CookiePolicy" 介面的物件有以下方法：

CookiePolicy.set_ok(cookie, request)

   回傳值表示的是否接受伺服器 cookie 的布林值。

   *cookie* 是一個 "Cookie" 實例。 *request* 是一個實作了
   "CookieJar.extract_cookies()" 文件所定義的介面的物件。

CookiePolicy.return_ok(cookie, request)

   回傳布林值，表示 cookie 是否應回傳伺服器。

   *cookie* 是一個 "Cookie" 實例。 *request* 是一個實作了
   "CookieJar.add_cookie_header()" 文件所定義的介面的物件。

CookiePolicy.domain_return_ok(domain, request)

   在給定 cookie 網域如果不應回傳 cookie，則回傳 "False"。

   此方法為一種最佳化。它消除了檢查每個具有特定網域的 cookie 的需要（
   這可能需要讀取許多檔案）。從 "domain_return_ok()" 和
   "path_return_ok()" 回傳 true 會把所有的工作留給 "return_ok()"。

   如果 "domain_return_ok()" 對 cookie 網域回傳 true，
   "path_return_ok()" 就會被用來呼叫 cookie 路徑。否則
   "path_return_ok()" 和 "return_ok()" 永遠不會被呼叫。如果
   "path_return_ok()" 回傳 true，則會呼叫 "return_ok()" 附帶的
   "Cookie" 物件本身以進行全面檢查。否則，"return_ok()" 將永遠不會被呼
   叫。

   請注意，"domain_return_ok()" 是針對每個 *cookie* 網域來呼叫的，而不
   只是針對 *request* 網域。 例如，如果請求網域是 ""www.example.com""
   ，這個函式可能會同時被 "".example.com"" 和 ""www.example.com"" 呼叫
   。 同樣的道理也適用於 "path_return_ok()"。

   *request* 引數與 "return_ok()" 的說明文件相同。

CookiePolicy.path_return_ok(path, request)

   給定 cookie 路徑如不應該回傳 cookie，則回傳 "False" 。

   關於 "domain_return_ok()" 請見文件。

除了實作上述方法外， "CookiePolicy" 介面的實作也必須提供下列屬性，指出
應該使用哪些通訊協定，以及如何使用。所有這些屬性都可以被指定。

CookiePolicy.netscape

   實作 Netscape 協定。

CookiePolicy.rfc2965

   實作 **RFC 2965** 協定。

CookiePolicy.hide_cookie2

   不要在請求中加入 *Cookie2* 標頭（這個標頭的存在向伺服器表明我們能夠
   正確剖析 **RFC 2965** cookie）。

以 "DefaultCookiePolicy" 為子類別定義 "CookiePolicy" 類別，並覆寫其中
的一些或全部方法是最有用的。"CookiePolicy" 本身可以用做 '無策略'，允許
設定和接收任何和所有的 cookies (這不太可能有用)。


DefaultCookiePolicy 物件
========================

執行接受和回傳 cookie 的標準規則。

同時支援 **RFC 2965** 和 Netscape cookies。 RFC 2965 的處理預設為關閉
。

提供你自己的策略的最簡單方法是覆寫此類別，並在你覆寫的實作中呼叫其方法
，然後再加入你自己的額外檢查：

   import http.cookiejar
   class MyCookiePolicy(http.cookiejar.DefaultCookiePolicy):
       def set_ok(self, cookie, request):
           if not http.cookiejar.DefaultCookiePolicy.set_ok(self, cookie, request):
               return False
           if i_dont_want_to_store_this_cookie(cookie):
               return False
           return True

除了實作 "CookiePolicy" 介面所需的功能外，這個類別還允許你阻止或允許網
域名稱設定和接收 cookies。 還有調整嚴格度的控制選項，可讓你稍微收緊相
對寬鬆的 Netscape 通訊協定（代價是阻擋一些良性 cookies）。

提供網域阻止清單和允許清單（預設都關閉）。只有不在阻止清單中和在允許清
單中（如果允許清單是有效的）的網域才參與 cookie 設定和回傳。使用
*blocked_domains* 構造函式引數，以及 "blocked_domains()" 和
"set_blocked_domains()" 方法（以及 *allowed_domains* 的相應引數和方法
）。如果你設定了允許清單，你可以透過設定為 "None" 來再次關閉它。

封鎖或允許清單中不以點開頭的網域必須與 cookie 網域相等才能匹配。 例如
，""example.com"" 會與封鎖清單項目 ""example.com"" 匹配，但
""www.example.com"" 則不會。 以點開頭的網域也會與更特定的網域相匹配。
例如，""www.example.com"" 和 ""www.coyote.example.com"" 都匹配
"".example.com""（但 ""example.com"" 本身不匹配）。 IP 位址是例外，它
們必須完全匹配。例如，如果 blocked_domains 包含 ""192.168.1.2"" 和
"".168.1.2""，則 192.168.1.2 會被封鎖，但 193.168.1.2 則不會。

"DefaultCookiePolicy" 實作了下列附加方法：

DefaultCookiePolicy.blocked_domains()

   回傳被阻止網域的序列（以元組形式）。

DefaultCookiePolicy.set_blocked_domains(blocked_domains)

   設定阻止網域的順序。

DefaultCookiePolicy.is_blocked(domain)

   如果 *domain* 在設定或接收 cookies 的阻止列表上，則回傳 "True"。

DefaultCookiePolicy.allowed_domains()

   回傳 "None"，或允許網域的序列（以元組形式）。

DefaultCookiePolicy.set_allowed_domains(allowed_domains)

   設定允許網域的序列，或 "None"。

DefaultCookiePolicy.is_not_allowed(domain)

   如果 *domain* 不在設定或接收 cookies 的允許清單上，則回傳 "True"。

"DefaultCookiePolicy" 實例有以下屬性，這些屬性都是由同名的建構函式引數
初始化，而且都可以被指定。

DefaultCookiePolicy.rfc2109_as_netscape

   如果為 true，請求 "CookieJar" 實例透過設定 "Cookie" 實例的版本屬性
   為 0，將 **RFC 2109** cookies (即在 *Set-Cookie* 標頭中收到的、版本
   cookie 屬性為 1 的 cookies) 降級為 Netscape cookies。 預設值是
   "None"，在這種情況下，如果且僅如果 **RFC 2965** 處理被關閉，RFC
   2109 cookies 才會被降級。 因此，RFC 2109 cookie 在預設情況下被降級
   。

一般的調整嚴格度的控制選項：

DefaultCookiePolicy.strict_domain

   不允許網站設定具有國家代碼頂層域名的兩層域名，如 ".co.uk"、
   ".gov.uk"、".co.nz" 等。 這遠遠不夠完美，也不能保證一定有效！

**RFC 2965** 通訊協定調整嚴格度的控制選項：

DefaultCookiePolicy.strict_rfc2965_unverifiable

   遵循針對不可驗證事務（transaction）的 **RFC 2965** 規則（不可驗證事
   務通常是由重定向或請求發佈在其它網站的圖片導致的）。 如果該屬性為假
   值，則*永遠不會*基於可驗證性而阻止 cookie

Netscape 通訊協定調整嚴格度的控制選項：

DefaultCookiePolicy.strict_ns_unverifiable

   即便是對 Netscape cookie 也要應用 **RFC 2965** 規則。

DefaultCookiePolicy.strict_ns_domain

   指明針對 Netscape cookie 的網域匹配規則的嚴格程度。 可接受的值見下
   文。

DefaultCookiePolicy.strict_ns_set_initial_dollar

   忽略 Set-Cookie: 標頭中名稱以 "'$'" 開頭的 cookies。

DefaultCookiePolicy.strict_ns_set_path

   不允許設置路徑與請求 URL 路徑不匹配的 cookie。

"strict_ns_domain" 是一系列旗標。它的值由將旗標按位元或組成（例如，
"DomainStrictNoDots|DomainStrictNonDomain" 表示兩個旗標都被設定）。

DefaultCookiePolicy.DomainStrictNoDots

   設定 cookie 時，「host 前綴」不得包含點（例如，"www.foo.bar.com" 不
   能為 ".bar.com" 設定 cookie，因為 "www.foo" 包含一個點）。

DefaultCookiePolicy.DomainStrictNonDomain

   未明確指定 "domain" cookie-attribute 的 Cookie 只能回傳給與設定
   Cookie 的網域相同的網域（例如，"spam.example.com" 將不會回傳來自
   "example.com" 但沒有 "domain" cookie-attribute 的 Cookie）。

DefaultCookiePolicy.DomainRFC2965Match

   設定 cookie 時，需要完整的 **RFC 2965** 網域匹配。

為了方便起見，以下屬性是上述旗標最有用的組合：

DefaultCookiePolicy.DomainLiberal

   等於 0（即關閉上述所有 Netscape 網域嚴格度旗標）。

DefaultCookiePolicy.DomainStrict

   等價於 "DomainStrictNoDots|DomainStrictNonDomain"。


Cookie 物件
===========

"Cookie" 實例的 Python 屬性大致對應於各種 cookie 標準中指定的標準
cookie 屬性。 這個對應關係不是一一對應的，因為有複雜的規則來指定預設值
，因為 "max-age" 和 "expires" cookie 屬性包含相等的訊息，也因為 **RFC
2109** cookie 可能會被 "http.cookiejar" 從版本 1「降級」到版本 0
(Netscape) cookie。

除了在 "CookiePolicy" 方法中的罕見情況外，不應該對這些屬性進行指定。
這個類別不會強制執行內部一致性，所以如果你這麼做，你應該要知道你在做什
麼。

Cookie.version

   整數或 "None"。 Netscape cookie 的 "version" 為 0。 **RFC 2965** 和
   **RFC 2109** cookie 的 "version" cookie 屬性為 1。但是，請注意
   "http.cookiejar" 可能會將 RFC 2109 cookie 「降級」 為 Netscape
   cookie，在這種情況下 "version" 為 0。

Cookie.name

   Cookie 名稱（字串）。

Cookie.value

   Cookie 值（字串），或 "None"。

Cookie.port

   代表一個連接埠或一組連接埠的字串 (例如「80」，或「880,8080」)，或
   "None"。

Cookie.domain

   Cookie 網域（字串）。

Cookie.path

   Cookie 路徑（字串，例如 "'/acme/rocket_launchers'"）。

Cookie.secure

   如果 cookie 只能透過安全連線回傳，則為 "True"。

Cookie.expires

   自 epoch 起計算的整數到期時間，以秒為單位，或 "None"。另請參閱
   "is_expired()" 方法。

Cookie.discard

   如果這是 session cookie，即為 "True"。

Cookie.comment

   來自伺服器解釋此 cookie 功能的字串註解，或 "None"。

Cookie.comment_url

   鏈接到來自伺服器的解釋此 cookie 功能的註釋的 URL，或者為 "None"。

Cookie.rfc2109

   "True" 如果這個 cookie 是以 **RFC 2109** cookie 的形式收到的 (即這
   個 cookie 是在 *Set-Cookie* 標頭中收到的，而且在那個標頭中的
   Version cookie-attribute 的值是 1)。 提供這個屬性的原因是
   "http.cookiejar" 可能會將 RFC 2109 cookie 「降級」 為 Netscape
   cookie，在這種情況下 "version" 的值是 0。

Cookie.port_specified

   如果伺服器顯式地指定了一個連接埠或一組連接埠（在 *Set-Cookie* /
   *Set-Cookie2* 標頭中)。

Cookie.domain_specified

   如果伺服器明確指定網域，則為 "True"。

Cookie.domain_initial_dot

   如果伺服器明確指定的網域以點 ("'.'") 開頭，則為 "True"。

Cookies 可能具有額外的非標準 cookie 屬性。你可以使用下列方法存取這些屬
性：

Cookie.has_nonstandard_attr(name)

   如果 cookie 具有指定的 cookie 屬性，則回傳 "True" 。

Cookie.get_nonstandard_attr(name, default=None)

   如果 cookie 具有指定的 cookie 屬性，則回傳其值。否則，回傳
   *default*。

Cookie.set_nonstandard_attr(name, value)

   設定指定 cookie 屬性的值。

"Cookie" 類別也定義了以下方法：

Cookie.is_expired(now=None)

   如果 cookie 已經超過伺服器要求的過期時間，則回傳 "True" 。 如果給定
   了 *now* （以自紀元起的秒數為單位），則會回傳 cookie 是否已在指定時
   間過期。


範例
====

第一個範例展示了 "http.cookiejar": 最常見的用法：

   import http.cookiejar, urllib.request
   cj = http.cookiejar.CookieJar()
   opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
   r = opener.open("http://example.com/")

本範例說明如何使用你的 Netscape、Mozilla 或 Lynx cookies 打開 URL (假
設 Unix/Netscape 會慣用 cookies 檔案的位置)：

   import os, http.cookiejar, urllib.request
   cj = http.cookiejar.MozillaCookieJar()
   cj.load(os.path.join(os.path.expanduser("~"), ".netscape", "cookies.txt"))
   opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
   r = opener.open("http://example.com/")

下一個範例說明 "DefaultCookiePolicy" 的使用。開啟 **RFC 2965** cookies
，在設定和回傳 Netscape cookies 時對網域更嚴格，並阻止某些網域設定
cookies 或讓其回傳：

   import urllib.request
   from http.cookiejar import CookieJar, DefaultCookiePolicy
   policy = DefaultCookiePolicy(
       rfc2965=True, strict_ns_domain=Policy.DomainStrict,
       blocked_domains=["ads.net", ".ads.net"])
   cj = CookieJar(policy)
   opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
   r = opener.open("http://example.com/")
