我们从Python开源项目中,提取了以下41个代码示例,用于说明如何使用mechanize.DefaultCookiePolicy()。
def test_rfc2109_handling(self): # 2109 cookies have rfc2109 attr set correctly, and are handled # as 2965 or Netscape cookies depending on policy settings from mechanize import CookieJar, DefaultCookiePolicy for policy, version in [ (DefaultCookiePolicy(), 0), (DefaultCookiePolicy(rfc2965=True), 1), (DefaultCookiePolicy(rfc2109_as_netscape=True), 0), (DefaultCookiePolicy(rfc2965=True, rfc2109_as_netscape=True), 0), ]: c = CookieJar(policy) interact_netscape(c, "http://www.example.com/", "ni=ni; Version=1") cookie = c._cookies["www.example.com"]["/"]["ni"] self.assert_(cookie.rfc2109) self.assertEqual(cookie.version, version)
def test_strict_domain(self): # Cookies whose domain is a country-code tld like .co.uk should # not be set if CookiePolicy.strict_domain is true. from mechanize import CookieJar, DefaultCookiePolicy cp = DefaultCookiePolicy(strict_domain=True) cj = CookieJar(policy=cp) interact_netscape(cj, "http://example.co.uk/", 'no=problemo') interact_netscape(cj, "http://example.co.uk/", 'okey=dokey; Domain=.example.co.uk') self.assertEquals(len(cj), 2) for pseudo_tld in [".co.uk", ".org.za", ".tx.us", ".name.us"]: interact_netscape(cj, "http://example.%s/" % pseudo_tld, 'spam=eggs; Domain=.co.uk') self.assertEquals(len(cj), 2) # XXXX This should be compared with the Konqueror (kcookiejar.cpp) and # Mozilla implementations.
def test_secure(self): from mechanize import CookieJar, DefaultCookiePolicy for ns in True, False: for whitespace in " ", "": c = CookieJar() if ns: pol = DefaultCookiePolicy(rfc2965=False) int = interact_netscape vs = "" else: pol = DefaultCookiePolicy(rfc2965=True) int = interact_2965 vs = "; Version=1" c.set_policy(pol) url = "http://www.acme.com/" int(c, url, "foo1=bar%s%s" % (vs, whitespace)) int(c, url, "foo2=bar%s; secure%s" % (vs, whitespace)) assert not c._cookies["www.acme.com"]["/"]["foo1"].secure, \ "non-secure cookie registered secure" assert c._cookies["www.acme.com"]["/"]["foo2"].secure, \ "secure cookie registered non-secure"
def test_path_mirror(self): from mechanize import CookieJar, DefaultCookiePolicy pol = DefaultCookiePolicy(rfc2965=True) c = CookieJar(pol) url = "http://foo.bar.com/" interact_2965(c, url, "spam=eggs; Version=1") h = interact_2965(c, url) assert h.find("Path") == -1, \ "absent path returned with path present" c = CookieJar(pol) url = "http://foo.bar.com/" interact_2965(c, url, 'spam=eggs; Version=1; Path=/') h = interact_2965(c, url) assert h.find('$Path="/"') != -1, "path not returned"
def test_no_return_comment(self): from mechanize import CookieJar, DefaultCookiePolicy c = CookieJar(DefaultCookiePolicy(rfc2965=True)) url = "http://foo.bar.com/" interact_2965(c, url, 'spam=eggs; Version=1; ' 'Comment="does anybody read these?"; ' 'CommentURL="http://foo.bar.net/comment.html"') h = interact_2965(c, url) assert h.find("Comment") == -1, \ "Comment or CommentURL cookie-attributes returned to server" # just pondering security here -- this isn't really a test (yet) # def test_hack(self): ## from mechanize import CookieJar ## c = CookieJar() # interact_netscape(c, "http://victim.mall.com/", # 'prefs="foo"') # interact_netscape(c, "http://cracker.mall.com/", # 'prefs="bar"; Domain=.mall.com') # interact_netscape(c, "http://cracker.mall.com/", # '$Version="1"; Domain=.mall.com') ## h = interact_netscape(c, "http://victim.mall.com/") # print h
def test_firefox3_cookiejar_iteration(self): try: from mechanize import Firefox3CookieJar except ImportError: pass else: from mechanize import DefaultCookiePolicy filename = self.mktemp() hide_experimental_warnings() try: cj = Firefox3CookieJar( filename, policy=DefaultCookiePolicy(rfc2965=True)) finally: reset_experimental_warnings() cj.connect() self._interact(cj) summary = "\n".join([str(cookie) for cookie in cj]) self.assertEquals(summary, """\ <Cookie foo2=bar for www.acme.com:80/> <Cookie foo3=bar for www.acme.com/> <Cookie foo1=bar for www.acme.com/> <Cookie fooa=bar for www.foo.com/> <Cookie foob=bar for .foo.com/> <Cookie fooc=bar for .www.foo.com/>""")
def test_url_encoding(self): # Try some URL encodings of the PATHs. # (the behaviour here has changed from libwww-perl) from mechanize import CookieJar, DefaultCookiePolicy c = CookieJar(DefaultCookiePolicy(rfc2965=True)) interact_2965(c, "http://www.acme.com/foo%2f%25/%3c%3c%0Anew%E5/%E5", "foo = bar; version = 1") cookie = interact_2965( c, "http://www.acme.com/foo%2f%25/<<%0anew\345/\346\370\345", 'bar=baz; path="/foo/"; version=1') version_re = re.compile(r'^\$version=\"?1\"?', re.I) assert (cookie.find("foo=bar") != -1 and version_re.search(cookie)) cookie = interact_2965( c, "http://www.acme.com/foo/%25/<<%0anew\345/\346\370\345") assert not cookie # unicode URL doesn't raise exception, as it used to! cookie = interact_2965(c, u"http://www.acme.com/\xfc")
def __init__(self, policy=None): """ See CookieJar.__doc__ for argument documentation. """ if policy is None: policy = DefaultCookiePolicy() self._policy = policy self._cookies = {} # for __getitem__ iteration in pre-2.2 Pythons self._prev_getitem_index = 0
def extract_cookies(self, response, request): """Extract cookies from response, where allowable given the request. Look for allowable Set-Cookie: and Set-Cookie2: headers in the response object passed as argument. Any of these headers that are found are used to update the state of the object (subject to the policy.set_ok method's approval). The response object (usually be the result of a call to mechanize.urlopen, or similar) should support an info method, which returns a mimetools.Message object (in fact, the 'mimetools.Message object' may be any object that provides a getheaders method). The request object (usually a mechanize.Request instance) must support the methods get_full_url, get_type, get_host, and is_unverifiable, as documented by mechanize, and the port attribute (the port number). The request is used to set default values for cookie-attributes as well as for checking that the cookie is OK to be set. """ debug("extract_cookies: %s", response.info()) self._policy._now = self._now = int(time.time()) for cookie in self._make_cookies(response, request): if cookie.expires is not None and cookie.expires <= self._now: # Expiry date in past is request to delete cookie. This can't be # in DefaultCookiePolicy, because can't delete cookies there. try: self.clear(cookie.domain, cookie.path, cookie.name) except KeyError: pass debug("Expiring cookie, domain='%s', path='%s', name='%s'", cookie.domain, cookie.path, cookie.name) elif self._policy.set_ok(cookie, request): debug(" setting cookie: %s", cookie) self.set_cookie(cookie)
def clear_expired_cookies(self): """Discard all expired cookies. You probably don't need to call this method: expired cookies are never sent back to the server (provided you're using DefaultCookiePolicy), this method is called by CookieJar itself every so often, and the save method won't save expired cookies anyway (unless you ask otherwise by passing a true ignore_expires argument). """ now = time.time() for cookie in self: if cookie.is_expired(now): self.clear(cookie.domain, cookie.path, cookie.name)
def test_policy(self): policy = mechanize.DefaultCookiePolicy() jar = mechanize.CookieJar() jar.set_policy(policy) self.assertEquals(jar.get_policy(), policy)
def test_domain_return_ok(self): # test optimization: .domain_return_ok() should filter out most # domains in the CookieJar before we try to access them (because that # may require disk access -- in particular, with MSIECookieJar) # This is only a rough check for performance reasons, so it's not too # critical as long as it's sufficiently liberal. import mechanize pol = mechanize.DefaultCookiePolicy() for url, domain, ok in [ ("http://foo.bar.com/", "blah.com", False), ("http://foo.bar.com/", "rhubarb.blah.com", False), ("http://foo.bar.com/", "rhubarb.foo.bar.com", False), ("http://foo.bar.com/", ".foo.bar.com", True), ("http://foo.bar.com/", "foo.bar.com", True), ("http://foo.bar.com/", ".bar.com", True), ("http://foo.bar.com/", "com", True), ("http://foo.com/", "rhubarb.foo.com", False), ("http://foo.com/", ".foo.com", True), ("http://foo.com/", "foo.com", True), ("http://foo.com/", "com", True), ("http://foo/", "rhubarb.foo", False), ("http://foo/", ".foo", True), ("http://foo/", "foo", True), ("http://foo/", "foo.local", True), ("http://foo/", ".local", True), ]: request = mechanize.Request(url) r = pol.domain_return_ok(domain, request) if ok: self.assert_(r) else: self.assert_(not r)
def test_default_path(self): from mechanize import CookieJar, DefaultCookiePolicy # RFC 2965 pol = DefaultCookiePolicy(rfc2965=True) c = CookieJar(pol) interact_2965(c, "http://www.acme.com/", 'spam="bar"; Version="1"') assert "/" in c._cookies["www.acme.com"] c = CookieJar(pol) interact_2965(c, "http://www.acme.com/blah", 'eggs="bar"; Version="1"') assert "/" in c._cookies["www.acme.com"] c = CookieJar(pol) interact_2965(c, "http://www.acme.com/blah/rhubarb", 'eggs="bar"; Version="1"') assert "/blah/" in c._cookies["www.acme.com"] c = CookieJar(pol) interact_2965(c, "http://www.acme.com/blah/rhubarb/", 'eggs="bar"; Version="1"') assert "/blah/rhubarb/" in c._cookies["www.acme.com"] # Netscape c = CookieJar() interact_netscape(c, "http://www.acme.com/", 'spam="bar"') assert "/" in c._cookies["www.acme.com"] c = CookieJar() interact_netscape(c, "http://www.acme.com/blah", 'eggs="bar"') assert "/" in c._cookies["www.acme.com"] c = CookieJar() interact_netscape(c, "http://www.acme.com/blah/rhubarb", 'eggs="bar"') assert "/blah" in c._cookies["www.acme.com"] c = CookieJar() interact_netscape(c, "http://www.acme.com/blah/rhubarb/", 'eggs="bar"') assert "/blah/rhubarb" in c._cookies["www.acme.com"]
def test_two_component_domain_rfc2965(self): from mechanize import CookieJar, DefaultCookiePolicy pol = DefaultCookiePolicy(rfc2965=True) c = CookieJar(pol) # two-component V1 domain is OK interact_2965(c, "http://foo.net/", 'foo=bar; Version="1"') assert len(c) == 1 assert c._cookies["foo.net"]["/"]["foo"].value == "bar" assert interact_2965(c, "http://foo.net/") == "$Version=1; foo=bar" # won't be returned to any other domain (because domain was implied) assert interact_2965(c, "http://www.foo.net/") == "" # unless domain is given explicitly, because then it must be # rewritten to start with a dot: foo.net --> .foo.net, which does # not domain-match foo.net interact_2965(c, "http://foo.net/foo", 'spam=eggs; domain=foo.net; path=/foo; Version="1"') assert len(c) == 1 assert interact_2965(c, "http://foo.net/foo") == "$Version=1; foo=bar" # explicit foo.net from three-component domain www.foo.net *does* get # set, because .foo.net domain-matches .foo.net interact_2965(c, "http://www.foo.net/foo/", 'spam=eggs; domain=foo.net; Version="1"') assert c._cookies[".foo.net"]["/foo/"]["spam"].value == "eggs" assert len(c) == 2 assert interact_2965(c, "http://foo.net/foo/") == "$Version=1; foo=bar" assert interact_2965(c, "http://www.foo.net/foo/") == \ '$Version=1; spam=eggs; $Domain="foo.net"' # top-level domain is too general interact_2965(c, "http://foo.net/", 'ni="ni"; domain=".net"; Version="1"') assert len(c) == 2 # RFC 2965 doesn't require blocking this interact_2965(c, "http://foo.co.uk/", 'nasty=trick; domain=.co.uk; Version="1"') assert len(c) == 3
def test_domain_allow(self): from mechanize import CookieJar, DefaultCookiePolicy c = CookieJar(policy=DefaultCookiePolicy( blocked_domains=["acme.com"], allowed_domains=["www.acme.com"])) req = Request("http://acme.com/") headers = ["Set-Cookie: CUSTOMER=WILE_E_COYOTE; path=/"] res = FakeResponse(headers, "http://acme.com/") c.extract_cookies(res, req) assert len(c) == 0 req = Request("http://www.acme.com/") res = FakeResponse(headers, "http://www.acme.com/") c.extract_cookies(res, req) assert len(c) == 1 req = Request("http://www.coyote.com/") res = FakeResponse(headers, "http://www.coyote.com/") c.extract_cookies(res, req) assert len(c) == 1 # set a cookie with non-allowed domain... req = Request("http://www.coyote.com/") res = FakeResponse(headers, "http://www.coyote.com/") cookies = c.make_cookies(res, req) c.set_cookie(cookies[0]) assert len(c) == 2 # ... and check is doesn't get returned c.add_cookie_header(req) assert not req.has_header("Cookie")
def test_domain_block(self): from mechanize import CookieJar, DefaultCookiePolicy #import logging; logging.getLogger("mechanize").setLevel(logging.DEBUG) pol = DefaultCookiePolicy(rfc2965=True, blocked_domains=[".acme.com"]) c = CookieJar(policy=pol) headers = ["Set-Cookie: CUSTOMER=WILE_E_COYOTE; path=/"] req = Request("http://www.acme.com/") res = FakeResponse(headers, "http://www.acme.com/") c.extract_cookies(res, req) assert len(c) == 0 pol.set_blocked_domains(["acme.com"]) c.extract_cookies(res, req) assert len(c) == 1 c.clear() req = Request("http://www.roadrunner.net/") res = FakeResponse(headers, "http://www.roadrunner.net/") c.extract_cookies(res, req) assert len(c) == 1 req = Request("http://www.roadrunner.net/") c.add_cookie_header(req) assert (req.has_header("Cookie") and req.has_header("Cookie2")) c.clear() pol.set_blocked_domains([".acme.com"]) c.extract_cookies(res, req) assert len(c) == 1 # set a cookie with blocked domain... req = Request("http://www.acme.com/") res = FakeResponse(headers, "http://www.acme.com/") cookies = c.make_cookies(res, req) c.set_cookie(cookies[0]) assert len(c) == 2 # ... and check it doesn't get returned c.add_cookie_header(req) assert not req.has_header("Cookie")
def test_quote_cookie_value(self): from mechanize import CookieJar, DefaultCookiePolicy c = CookieJar(policy=DefaultCookiePolicy(rfc2965=True)) interact_2965(c, "http://www.acme.com/", r'foo=\b"a"r; Version=1') h = interact_2965(c, "http://www.acme.com/") assert h == r'$Version=1; foo=\\b\"a\"r'
def test_domain_mirror(self): from mechanize import CookieJar, DefaultCookiePolicy pol = DefaultCookiePolicy(rfc2965=True) c = CookieJar(pol) url = "http://foo.bar.com/" interact_2965(c, url, "spam=eggs; Version=1") h = interact_2965(c, url) assert h.find( "Domain") == -1, \ "absent domain returned with domain present" c = CookieJar(pol) url = "http://foo.bar.com/" interact_2965(c, url, 'spam=eggs; Version=1; Domain=.bar.com') h = interact_2965(c, url) assert h.find('$Domain=".bar.com"') != -1, \ "domain not returned" c = CookieJar(pol) url = "http://foo.bar.com/" # note missing initial dot in Domain interact_2965(c, url, 'spam=eggs; Version=1; Domain=bar.com') h = interact_2965(c, url) assert h.find('$Domain="bar.com"') != -1, \ "domain not returned"
def test_port_mirror(self): from mechanize import CookieJar, DefaultCookiePolicy pol = DefaultCookiePolicy(rfc2965=True) c = CookieJar(pol) url = "http://foo.bar.com/" interact_2965(c, url, "spam=eggs; Version=1") h = interact_2965(c, url) assert h.find("Port") == -1, \ "absent port returned with port present" c = CookieJar(pol) url = "http://foo.bar.com/" interact_2965(c, url, "spam=eggs; Version=1; Port") h = interact_2965(c, url) assert re.search("\$Port([^=]|$)", h), \ "port with no value not returned with no value" c = CookieJar(pol) url = "http://foo.bar.com/" interact_2965(c, url, 'spam=eggs; Version=1; Port="80"') h = interact_2965(c, url) assert h.find('$Port="80"') != -1, \ "port with single value not returned with single value" c = CookieJar(pol) url = "http://foo.bar.com/" interact_2965(c, url, 'spam=eggs; Version=1; Port="80,8080"') h = interact_2965(c, url) assert h.find('$Port="80,8080"') != -1, \ "port with multiple values not returned with multiple values"
def test_Cookie_iterator(self): from mechanize import CookieJar, Cookie, DefaultCookiePolicy cs = CookieJar(DefaultCookiePolicy(rfc2965=True)) # add some random cookies interact_2965(cs, "http://blah.spam.org/", 'foo=eggs; Version=1; ' 'Comment="does anybody read these?"; ' 'CommentURL="http://foo.bar.net/comment.html"') interact_netscape(cs, "http://www.acme.com/blah/", "spam=bar; secure") interact_2965(cs, "http://www.acme.com/blah/", "foo=bar; secure; Version=1") interact_2965(cs, "http://www.acme.com/blah/", "foo=bar; path=/; Version=1") interact_2965(cs, "http://www.sol.no", r'bang=wallop; version=1; domain=".sol.no"; ' r'port="90,100, 80,8080"; ' r'max-age=100; Comment = "Just kidding! (\"|\\\\) "') versions = [1, 1, 1, 0, 1] names = ["bang", "foo", "foo", "spam", "foo"] domains = [ ".sol.no", "blah.spam.org", "www.acme.com", "www.acme.com", "www.acme.com" ] paths = ["/", "/", "/", "/blah", "/blah/"] # sequential iteration for i in range(4): i = 0 for c in cs: # assert isinstance(c, Cookie) assert c.version == versions[i] assert c.name == names[i] assert c.domain == domains[i] assert c.path == paths[i] i = i + 1 self.assertRaises(IndexError, lambda cs=cs: cs[5])
def test_firefox3_cookiejar_clear(self): try: from mechanize import Firefox3CookieJar except ImportError: pass else: from mechanize import DefaultCookiePolicy filename = self.mktemp() hide_experimental_warnings() try: cj = Firefox3CookieJar( filename, policy=DefaultCookiePolicy(rfc2965=True)) finally: reset_experimental_warnings() cj.connect() self._interact(cj) cj.clear("www.acme.com", "/", "foo2") def summary(): return "\n".join([str(cookie) for cookie in cj]) self.assertEquals(summary(), """\ <Cookie foo3=bar for www.acme.com/> <Cookie foo1=bar for www.acme.com/> <Cookie fooa=bar for www.foo.com/> <Cookie foob=bar for .foo.com/> <Cookie fooc=bar for .www.foo.com/>""") cj.clear("www.acme.com") self.assertEquals(summary(), """\ <Cookie fooa=bar for www.foo.com/> <Cookie foob=bar for .foo.com/> <Cookie fooc=bar for .www.foo.com/>""") # if name is given, so must path and domain self.assertRaises( ValueError, cj.clear, domain=".foo.com", name="foob") # nonexistent domain self.assertRaises(KeyError, cj.clear, domain=".spam.com")
def test_mozilla_cookiejar(self): # Save / load Mozilla/Netscape cookie file format. from mechanize import MozillaCookieJar, DefaultCookiePolicy filename = tempfile.mktemp() c = MozillaCookieJar( filename, policy=DefaultCookiePolicy(rfc2965=True)) self._interact(c) def save_and_restore(cj, ignore_discard, filename=filename): from mechanize import MozillaCookieJar, DefaultCookiePolicy try: cj.save(ignore_discard=ignore_discard) new_c = MozillaCookieJar( filename, DefaultCookiePolicy(rfc2965=True)) new_c.load(ignore_discard=ignore_discard) finally: try: os.unlink(filename) except OSError: pass return new_c new_c = save_and_restore(c, True) assert len(new_c) == 6 # none discarded assert repr(new_c).find("name='foo1', value='bar'") != -1 new_c = save_and_restore(c, False) assert len(new_c) == 4 # 2 of them discarded on save assert repr(new_c).find("name='foo1', value='bar'") != -1
def test_intranet_domains_ns(self): from mechanize import CookieJar, DefaultCookiePolicy c = CookieJar(DefaultCookiePolicy(rfc2965=False)) interact_netscape(c, "http://example/", "foo1=bar") cookie = interact_netscape(c, "http://example/", 'foo2=bar; domain=.local') assert len(c) == 2 assert cookie.find("foo1=bar") >= 0 cookie = interact_netscape(c, "http://example/") assert cookie.find("foo2=bar") >= 0 and len(c) == 2
def __init__(self, blocked_domains=None, allowed_domains=None, netscape=True, rfc2965=False, # WARNING: this argument will change or go away if is not # accepted into the Python standard library in this form! # default, ie. treat 2109 as netscape iff not rfc2965 rfc2109_as_netscape=None, hide_cookie2=False, strict_domain=False, strict_rfc2965_unverifiable=True, strict_ns_unverifiable=False, strict_ns_domain=DomainLiberal, strict_ns_set_initial_dollar=False, strict_ns_set_path=False, ): """ Constructor arguments should be used as keyword arguments only. blocked_domains: sequence of domain names that we never accept cookies from, nor return cookies to allowed_domains: if not None, this is a sequence of the only domains for which we accept and return cookies For other arguments, see CookiePolicy.__doc__ and DefaultCookiePolicy.__doc__.. """ self.netscape = netscape self.rfc2965 = rfc2965 self.rfc2109_as_netscape = rfc2109_as_netscape self.hide_cookie2 = hide_cookie2 self.strict_domain = strict_domain self.strict_rfc2965_unverifiable = strict_rfc2965_unverifiable self.strict_ns_unverifiable = strict_ns_unverifiable self.strict_ns_domain = strict_ns_domain self.strict_ns_set_initial_dollar = strict_ns_set_initial_dollar self.strict_ns_set_path = strict_ns_set_path if blocked_domains is not None: self._blocked_domains = tuple(blocked_domains) else: self._blocked_domains = () if allowed_domains is not None: allowed_domains = tuple(allowed_domains) self._allowed_domains = allowed_domains
def test_ietf_example_2(self): from mechanize import CookieJar, DefaultCookiePolicy # 5.2 Example 2 # # This example illustrates the effect of the Path attribute. All detail # of request and response headers has been omitted. Assume the user agent # has no stored cookies. c = CookieJar(DefaultCookiePolicy(rfc2965=True)) # Imagine the user agent has received, in response to earlier requests, # the response headers # # Set-Cookie2: Part_Number="Rocket_Launcher_0001"; Version="1"; # Path="/acme" # # and # # Set-Cookie2: Part_Number="Riding_Rocket_0023"; Version="1"; # Path="/acme/ammo" interact_2965( c, "http://www.acme.com/acme/ammo/specific", 'Part_Number="Rocket_Launcher_0001"; Version="1"; Path="/acme"', 'Part_Number="Riding_Rocket_0023"; Version="1"; Path="/acme/ammo"') # A subsequent request by the user agent to the (same) server for URLs of # the form /acme/ammo/... would include the following request header: # # Cookie: $Version="1"; # Part_Number="Riding_Rocket_0023"; $Path="/acme/ammo"; # Part_Number="Rocket_Launcher_0001"; $Path="/acme" # # Note that the NAME=VALUE pair for the cookie with the more specific Path # attribute, /acme/ammo, comes before the one with the less specific Path # attribute, /acme. Further note that the same cookie name appears more # than once. cookie = interact_2965(c, "http://www.acme.com/acme/ammo/...") assert re.search(r"Riding_Rocket_0023.*Rocket_Launcher_0001", cookie) # A subsequent request by the user agent to the (same) server for a URL of # the form /acme/parts/ would include the following request header: # # Cookie: $Version="1"; Part_Number="Rocket_Launcher_0001"; $Path="/acme" # # Here, the second cookie's Path attribute /acme/ammo is not a prefix of # the request URL, /acme/parts/, so the cookie does not get forwarded to # the server. cookie = interact_2965(c, "http://www.acme.com/acme/parts/") assert (cookie.find("Rocket_Launcher_0001") != -1 and not cookie.find("Riding_Rocket_0023") != -1)