10bfac6e5d8671f21327b1a8413d68cf23285105fBrett Cannon# -*- coding: latin-1 -*- 22a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis"""Tests for cookielib.py.""" 32a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 42a91ce8960d98fe2c98936a73d5e0e7a24856824Gregory P. Smithimport cookielib 52a91ce8960d98fe2c98936a73d5e0e7a24856824Gregory P. Smithimport os 62a91ce8960d98fe2c98936a73d5e0e7a24856824Gregory P. Smithimport re 72a91ce8960d98fe2c98936a73d5e0e7a24856824Gregory P. Smithimport time 82a91ce8960d98fe2c98936a73d5e0e7a24856824Gregory P. Smith 92d2e6be39a06a96e877b13f00acb85b01eb93bcaSenthil Kumaranfrom cookielib import http2time, time2isoz, time2netscape 102a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwisfrom unittest import TestCase 112a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 122a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwisfrom test import test_support 132a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 142a91ce8960d98fe2c98936a73d5e0e7a24856824Gregory P. Smith 152a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwisclass DateTimeTests(TestCase): 162a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 172a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis def test_time2isoz(self): 182a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis base = 1019227000 192a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis day = 24*3600 202623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(time2isoz(base), "2002-04-19 14:36:40Z") 212623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(time2isoz(base+day), "2002-04-20 14:36:40Z") 222623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(time2isoz(base+2*day), "2002-04-21 14:36:40Z") 232623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(time2isoz(base+3*day), "2002-04-22 14:36:40Z") 242a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 252a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis az = time2isoz() 262a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis bz = time2isoz(500000) 272a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis for text in (az, bz): 28be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertRegexpMatches(text, 29be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka r"^\d{4}-\d\d-\d\d \d\d:\d\d:\d\dZ$", 30be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka "bad time2isoz format: %s %s" % (az, bz)) 312a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 322d2e6be39a06a96e877b13f00acb85b01eb93bcaSenthil Kumaran def test_time2netscape(self): 332d2e6be39a06a96e877b13f00acb85b01eb93bcaSenthil Kumaran base = 1019227000 342d2e6be39a06a96e877b13f00acb85b01eb93bcaSenthil Kumaran day = 24*3600 352d2e6be39a06a96e877b13f00acb85b01eb93bcaSenthil Kumaran self.assertEqual(time2netscape(base), "Fri, 19-Apr-2002 14:36:40 GMT") 362d2e6be39a06a96e877b13f00acb85b01eb93bcaSenthil Kumaran self.assertEqual(time2netscape(base+day), 372d2e6be39a06a96e877b13f00acb85b01eb93bcaSenthil Kumaran "Sat, 20-Apr-2002 14:36:40 GMT") 382d2e6be39a06a96e877b13f00acb85b01eb93bcaSenthil Kumaran 392d2e6be39a06a96e877b13f00acb85b01eb93bcaSenthil Kumaran self.assertEqual(time2netscape(base+2*day), 402d2e6be39a06a96e877b13f00acb85b01eb93bcaSenthil Kumaran "Sun, 21-Apr-2002 14:36:40 GMT") 412d2e6be39a06a96e877b13f00acb85b01eb93bcaSenthil Kumaran 422d2e6be39a06a96e877b13f00acb85b01eb93bcaSenthil Kumaran self.assertEqual(time2netscape(base+3*day), 432d2e6be39a06a96e877b13f00acb85b01eb93bcaSenthil Kumaran "Mon, 22-Apr-2002 14:36:40 GMT") 442a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 452d2e6be39a06a96e877b13f00acb85b01eb93bcaSenthil Kumaran az = time2netscape() 462d2e6be39a06a96e877b13f00acb85b01eb93bcaSenthil Kumaran bz = time2netscape(500000) 472d2e6be39a06a96e877b13f00acb85b01eb93bcaSenthil Kumaran for text in (az, bz): 482d2e6be39a06a96e877b13f00acb85b01eb93bcaSenthil Kumaran # Format "%s, %02d-%s-%04d %02d:%02d:%02d GMT" 492d2e6be39a06a96e877b13f00acb85b01eb93bcaSenthil Kumaran self.assertRegexpMatches( 502d2e6be39a06a96e877b13f00acb85b01eb93bcaSenthil Kumaran text, 512d2e6be39a06a96e877b13f00acb85b01eb93bcaSenthil Kumaran r"[a-zA-Z]{3}, \d{2}-[a-zA-Z]{3}-\d{4} \d{2}:\d{2}:\d{2} GMT$", 522d2e6be39a06a96e877b13f00acb85b01eb93bcaSenthil Kumaran "bad time2netscape format: %s %s" % (az, bz)) 532d2e6be39a06a96e877b13f00acb85b01eb93bcaSenthil Kumaran 542d2e6be39a06a96e877b13f00acb85b01eb93bcaSenthil Kumaran def test_http2time(self): 552a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis def parse_date(text): 562a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis return time.gmtime(http2time(text))[:6] 572a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 582623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(parse_date("01 Jan 2001"), (2001, 1, 1, 0, 0, 0.0)) 592a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 602a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # this test will break around year 2070 612623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(parse_date("03-Feb-20"), (2020, 2, 3, 0, 0, 0.0)) 622a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 632a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # this test will break around year 2048 642623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(parse_date("03-Feb-98"), (1998, 2, 3, 0, 0, 0.0)) 652a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 662a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis def test_http2time_formats(self): 672d2e6be39a06a96e877b13f00acb85b01eb93bcaSenthil Kumaran 682a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 692a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # test http2time for supported dates. Test cases with 2 digit year 702a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # will probably break in year 2044. 712a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis tests = [ 722a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 'Thu, 03 Feb 1994 00:00:00 GMT', # proposed new HTTP format 732a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 'Thursday, 03-Feb-94 00:00:00 GMT', # old rfc850 HTTP format 742a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 'Thursday, 03-Feb-1994 00:00:00 GMT', # broken rfc850 HTTP format 752a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 762a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis '03 Feb 1994 00:00:00 GMT', # HTTP format (no weekday) 772a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis '03-Feb-94 00:00:00 GMT', # old rfc850 (no weekday) 782a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis '03-Feb-1994 00:00:00 GMT', # broken rfc850 (no weekday) 792a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis '03-Feb-1994 00:00 GMT', # broken rfc850 (no weekday, no seconds) 802a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis '03-Feb-1994 00:00', # broken rfc850 (no weekday, no seconds, no tz) 812a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 822a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis '03-Feb-94', # old rfc850 HTTP format (no weekday, no time) 832a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis '03-Feb-1994', # broken rfc850 HTTP format (no weekday, no time) 842a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis '03 Feb 1994', # proposed new HTTP format (no weekday, no time) 852a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 862a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # A few tests with extra space at various places 872a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ' 03 Feb 1994 0:00 ', 882a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ' 03-Feb-1994 ', 892a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ] 902a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 912a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis test_t = 760233600 # assume broken POSIX counting of seconds 922a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis result = time2isoz(test_t) 932a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis expected = "1994-02-03 00:00:00Z" 942623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(result, expected, 952623a37852153363335956afab010cb0beb7e74eEzio Melotti "%s => '%s' (%s)" % (test_t, result, expected)) 962a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 972a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis for s in tests: 98be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertEqual(http2time(s), test_t, s) 99be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertEqual(http2time(s.lower()), test_t, s.lower()) 100be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertEqual(http2time(s.upper()), test_t, s.upper()) 1012a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 1022a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis def test_http2time_garbage(self): 1032a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis for test in [ 1042a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis '', 1052a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 'Garbage', 1062a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 'Mandag 16. September 1996', 1072a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis '01-00-1980', 1082a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis '01-13-1980', 1092a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis '00-01-1980', 1102a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis '32-01-1980', 1112a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis '01-01-1980 25:00:00', 1122a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis '01-01-1980 00:61:00', 1132a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis '01-01-1980 00:00:62', 1142a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ]: 1155c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue(http2time(test) is None, 1162a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis "http2time(%s) is not None\n" 1172a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis "http2time(test) %s" % (test, http2time(test)) 1182a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ) 1192a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 1202a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 1212a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwisclass HeaderTests(TestCase): 1225d0ca2c8323b39e392c0c0bd31340cc3e1113c97Georg Brandl 1235d0ca2c8323b39e392c0c0bd31340cc3e1113c97Georg Brandl def test_parse_ns_headers_expires(self): 1242a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from cookielib import parse_ns_headers 1252a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 1262a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # quotes should be stripped 1274ea3eade518c6a48b0708736442deefe669fe287Martin v. Löwis expected = [[('foo', 'bar'), ('expires', 2209069412L), ('version', '0')]] 1282a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis for hdr in [ 1294ea3eade518c6a48b0708736442deefe669fe287Martin v. Löwis 'foo=bar; expires=01 Jan 2040 22:23:32 GMT', 1304ea3eade518c6a48b0708736442deefe669fe287Martin v. Löwis 'foo=bar; expires="01 Jan 2040 22:23:32 GMT"', 1312a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ]: 1322623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(parse_ns_headers([hdr]), expected) 1332a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 1345d0ca2c8323b39e392c0c0bd31340cc3e1113c97Georg Brandl def test_parse_ns_headers_version(self): 1355d0ca2c8323b39e392c0c0bd31340cc3e1113c97Georg Brandl from cookielib import parse_ns_headers 1365d0ca2c8323b39e392c0c0bd31340cc3e1113c97Georg Brandl 1375d0ca2c8323b39e392c0c0bd31340cc3e1113c97Georg Brandl # quotes should be stripped 1385d0ca2c8323b39e392c0c0bd31340cc3e1113c97Georg Brandl expected = [[('foo', 'bar'), ('version', '1')]] 1395d0ca2c8323b39e392c0c0bd31340cc3e1113c97Georg Brandl for hdr in [ 1405d0ca2c8323b39e392c0c0bd31340cc3e1113c97Georg Brandl 'foo=bar; version="1"', 1415d0ca2c8323b39e392c0c0bd31340cc3e1113c97Georg Brandl 'foo=bar; Version="1"', 1425d0ca2c8323b39e392c0c0bd31340cc3e1113c97Georg Brandl ]: 1432623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(parse_ns_headers([hdr]), expected) 1445d0ca2c8323b39e392c0c0bd31340cc3e1113c97Georg Brandl 1454ea3eade518c6a48b0708736442deefe669fe287Martin v. Löwis def test_parse_ns_headers_special_names(self): 1464ea3eade518c6a48b0708736442deefe669fe287Martin v. Löwis # names such as 'expires' are not special in first name=value pair 1474ea3eade518c6a48b0708736442deefe669fe287Martin v. Löwis # of Set-Cookie: header 1484ea3eade518c6a48b0708736442deefe669fe287Martin v. Löwis from cookielib import parse_ns_headers 1494ea3eade518c6a48b0708736442deefe669fe287Martin v. Löwis 1504ea3eade518c6a48b0708736442deefe669fe287Martin v. Löwis # Cookie with name 'expires' 1514ea3eade518c6a48b0708736442deefe669fe287Martin v. Löwis hdr = 'expires=01 Jan 2040 22:23:32 GMT' 1524ea3eade518c6a48b0708736442deefe669fe287Martin v. Löwis expected = [[("expires", "01 Jan 2040 22:23:32 GMT"), ("version", "0")]] 1532623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(parse_ns_headers([hdr]), expected) 1544ea3eade518c6a48b0708736442deefe669fe287Martin v. Löwis 1552a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis def test_join_header_words(self): 1562a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from cookielib import join_header_words 1572a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 1582a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis joined = join_header_words([[("foo", None), ("bar", "baz")]]) 1592623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(joined, "foo; bar=baz") 1602a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 1612623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(join_header_words([[]]), "") 1622a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 1632a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis def test_split_header_words(self): 1642a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from cookielib import split_header_words 1652a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 1662a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis tests = [ 1672a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ("foo", [[("foo", None)]]), 1682a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ("foo=bar", [[("foo", "bar")]]), 1692a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis (" foo ", [[("foo", None)]]), 1702a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis (" foo= ", [[("foo", "")]]), 1712a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis (" foo=", [[("foo", "")]]), 1722a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis (" foo= ; ", [[("foo", "")]]), 1732a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis (" foo= ; bar= baz ", [[("foo", ""), ("bar", "baz")]]), 1742a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ("foo=bar bar=baz", [[("foo", "bar"), ("bar", "baz")]]), 1752a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # doesn't really matter if this next fails, but it works ATM 1762a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ("foo= bar=baz", [[("foo", "bar=baz")]]), 1772a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ("foo=bar;bar=baz", [[("foo", "bar"), ("bar", "baz")]]), 1782a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ('foo bar baz', [[("foo", None), ("bar", None), ("baz", None)]]), 1792a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ("a, b, c", [[("a", None)], [("b", None)], [("c", None)]]), 1802a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis (r'foo; bar=baz, spam=, foo="\,\;\"", bar= ', 1812a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis [[("foo", None), ("bar", "baz")], 1822a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis [("spam", "")], [("foo", ',;"')], [("bar", "")]]), 1832a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ] 1842a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 1852a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis for arg, expect in tests: 1862a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis try: 1872a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis result = split_header_words([arg]) 1882a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis except: 1892a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis import traceback, StringIO 1902a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis f = StringIO.StringIO() 1912a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis traceback.print_exc(None, f) 1922a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis result = "(error -- traceback follows)\n\n%s" % f.getvalue() 1932623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(result, expect, """ 1942a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. LöwisWhen parsing: '%s' 1952a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. LöwisExpected: '%s' 1962a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. LöwisGot: '%s' 1972a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis""" % (arg, expect, result)) 1982a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 1992a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis def test_roundtrip(self): 2002a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from cookielib import split_header_words, join_header_words 2012a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 2022a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis tests = [ 2032a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ("foo", "foo"), 2042a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ("foo=bar", "foo=bar"), 2052a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis (" foo ", "foo"), 2062a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ("foo=", 'foo=""'), 2072a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ("foo=bar bar=baz", "foo=bar; bar=baz"), 2082a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ("foo=bar;bar=baz", "foo=bar; bar=baz"), 2092a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ('foo bar baz', "foo; bar; baz"), 2102a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis (r'foo="\"" bar="\\"', r'foo="\""; bar="\\"'), 2112a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ('foo,,,bar', 'foo, bar'), 2122a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ('foo=bar,bar=baz', 'foo=bar, bar=baz'), 2132a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 2142a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ('text/html; charset=iso-8859-1', 2152a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 'text/html; charset="iso-8859-1"'), 2162a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 2172a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ('foo="bar"; port="80,81"; discard, bar=baz', 2182a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 'foo=bar; port="80,81"; discard, bar=baz'), 2192a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 2202a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis (r'Basic realm="\"foo\\\\bar\""', 2212a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis r'Basic; realm="\"foo\\\\bar\""') 2222a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ] 2232a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 2242a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis for arg, expect in tests: 2252a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis input = split_header_words([arg]) 2262a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis res = join_header_words(input) 2272623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(res, expect, """ 2282a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. LöwisWhen parsing: '%s' 2292a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. LöwisExpected: '%s' 2302a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. LöwisGot: '%s' 2312a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. LöwisInput was: '%s' 2322a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis""" % (arg, expect, res, input)) 2332a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 2342a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 2352a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwisclass FakeResponse: 2362a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis def __init__(self, headers=[], url=None): 2372a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis """ 2382a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis headers: list of RFC822-style 'Key: value' strings 2392a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis """ 2402a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis import mimetools, StringIO 2412a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis f = StringIO.StringIO("\n".join(headers)) 2422a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis self._headers = mimetools.Message(f) 2432a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis self._url = url 2442a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis def info(self): return self._headers 2452a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 2462a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwisdef interact_2965(cookiejar, url, *set_cookie_hdrs): 2472a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis return _interact(cookiejar, url, set_cookie_hdrs, "Set-Cookie2") 2482a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 2492a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwisdef interact_netscape(cookiejar, url, *set_cookie_hdrs): 2502a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis return _interact(cookiejar, url, set_cookie_hdrs, "Set-Cookie") 2512a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 2522a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwisdef _interact(cookiejar, url, set_cookie_hdrs, hdr_name): 2532a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis """Perform a single request / response cycle, returning Cookie: header.""" 2542a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from urllib2 import Request 2552a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis req = Request(url) 2562a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis cookiejar.add_cookie_header(req) 2572a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis cookie_hdr = req.get_header("Cookie", "") 2582a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis headers = [] 2592a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis for hdr in set_cookie_hdrs: 2602a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis headers.append("%s: %s" % (hdr_name, hdr)) 2612a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis res = FakeResponse(headers, url) 2622a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis cookiejar.extract_cookies(res, req) 2632a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis return cookie_hdr 2642a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 2652a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 266c5574e809b18d517f81e93542db76642662823cdMartin v. Löwisclass FileCookieJarTests(TestCase): 267c5574e809b18d517f81e93542db76642662823cdMartin v. Löwis def test_lwp_valueless_cookie(self): 268c5574e809b18d517f81e93542db76642662823cdMartin v. Löwis # cookies with no value should be saved and loaded consistently 269c5574e809b18d517f81e93542db76642662823cdMartin v. Löwis from cookielib import LWPCookieJar 270c5574e809b18d517f81e93542db76642662823cdMartin v. Löwis filename = test_support.TESTFN 271c5574e809b18d517f81e93542db76642662823cdMartin v. Löwis c = LWPCookieJar() 272c5574e809b18d517f81e93542db76642662823cdMartin v. Löwis interact_netscape(c, "http://www.acme.com/", 'boo') 273c5574e809b18d517f81e93542db76642662823cdMartin v. Löwis self.assertEqual(c._cookies["www.acme.com"]["/"]["boo"].value, None) 274c5574e809b18d517f81e93542db76642662823cdMartin v. Löwis try: 275c5574e809b18d517f81e93542db76642662823cdMartin v. Löwis c.save(filename, ignore_discard=True) 276c5574e809b18d517f81e93542db76642662823cdMartin v. Löwis c = LWPCookieJar() 277c5574e809b18d517f81e93542db76642662823cdMartin v. Löwis c.load(filename, ignore_discard=True) 278c5574e809b18d517f81e93542db76642662823cdMartin v. Löwis finally: 279c5574e809b18d517f81e93542db76642662823cdMartin v. Löwis try: os.unlink(filename) 280c5574e809b18d517f81e93542db76642662823cdMartin v. Löwis except OSError: pass 281c5574e809b18d517f81e93542db76642662823cdMartin v. Löwis self.assertEqual(c._cookies["www.acme.com"]["/"]["boo"].value, None) 282c5574e809b18d517f81e93542db76642662823cdMartin v. Löwis 2833e7de59bd2ac22f677f3a053ade22f44785f15f4Neal Norwitz def test_bad_magic(self): 2843e7de59bd2ac22f677f3a053ade22f44785f15f4Neal Norwitz from cookielib import LWPCookieJar, MozillaCookieJar, LoadError 2853e7de59bd2ac22f677f3a053ade22f44785f15f4Neal Norwitz # IOErrors (eg. file doesn't exist) are allowed to propagate 2863e7de59bd2ac22f677f3a053ade22f44785f15f4Neal Norwitz filename = test_support.TESTFN 2873e7de59bd2ac22f677f3a053ade22f44785f15f4Neal Norwitz for cookiejar_class in LWPCookieJar, MozillaCookieJar: 2883e7de59bd2ac22f677f3a053ade22f44785f15f4Neal Norwitz c = cookiejar_class() 2893e7de59bd2ac22f677f3a053ade22f44785f15f4Neal Norwitz try: 2903e7de59bd2ac22f677f3a053ade22f44785f15f4Neal Norwitz c.load(filename="for this test to work, a file with this " 2913e7de59bd2ac22f677f3a053ade22f44785f15f4Neal Norwitz "filename should not exist") 2923e7de59bd2ac22f677f3a053ade22f44785f15f4Neal Norwitz except IOError, exc: 2933e7de59bd2ac22f677f3a053ade22f44785f15f4Neal Norwitz # exactly IOError, not LoadError 2943e7de59bd2ac22f677f3a053ade22f44785f15f4Neal Norwitz self.assertEqual(exc.__class__, IOError) 2953e7de59bd2ac22f677f3a053ade22f44785f15f4Neal Norwitz else: 2963e7de59bd2ac22f677f3a053ade22f44785f15f4Neal Norwitz self.fail("expected IOError for invalid filename") 2973e7de59bd2ac22f677f3a053ade22f44785f15f4Neal Norwitz # Invalid contents of cookies file (eg. bad magic string) 2983e7de59bd2ac22f677f3a053ade22f44785f15f4Neal Norwitz # causes a LoadError. 2993e7de59bd2ac22f677f3a053ade22f44785f15f4Neal Norwitz try: 3003e7de59bd2ac22f677f3a053ade22f44785f15f4Neal Norwitz f = open(filename, "w") 3013e7de59bd2ac22f677f3a053ade22f44785f15f4Neal Norwitz f.write("oops\n") 3023e7de59bd2ac22f677f3a053ade22f44785f15f4Neal Norwitz for cookiejar_class in LWPCookieJar, MozillaCookieJar: 3033e7de59bd2ac22f677f3a053ade22f44785f15f4Neal Norwitz c = cookiejar_class() 3043e7de59bd2ac22f677f3a053ade22f44785f15f4Neal Norwitz self.assertRaises(LoadError, c.load, filename) 3053e7de59bd2ac22f677f3a053ade22f44785f15f4Neal Norwitz finally: 3063e7de59bd2ac22f677f3a053ade22f44785f15f4Neal Norwitz try: os.unlink(filename) 3073e7de59bd2ac22f677f3a053ade22f44785f15f4Neal Norwitz except OSError: pass 308c5574e809b18d517f81e93542db76642662823cdMartin v. Löwis 3092a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwisclass CookieTests(TestCase): 3102a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # XXX 3112a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Get rid of string comparisons where not actually testing str / repr. 3122a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # .clear() etc. 3132a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # IP addresses like 50 (single number, no dot) and domain-matching 3142a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # functions (and is_HDN)? See draft RFC 2965 errata. 3152a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Strictness switches 3162a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # is_third_party() 3172a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # unverifiability / third-party blocking 3182a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Netscape cookies work the same as RFC 2965 with regard to port. 3192a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Set-Cookie with negative max age. 3202a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # If turn RFC 2965 handling off, Set-Cookie2 cookies should not clobber 3212a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Set-Cookie cookies. 3222a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Cookie2 should be sent if *any* cookies are not V1 (ie. V0 OR V2 etc.). 3232a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Cookies (V1 and V0) with no expiry date should be set to be discarded. 3242a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # RFC 2965 Quoting: 3252a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Should accept unquoted cookie-attribute values? check errata draft. 3262a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Which are required on the way in and out? 3272a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Should always return quoted cookie-attribute values? 3282a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Proper testing of when RFC 2965 clobbers Netscape (waiting for errata). 3292a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Path-match on return (same for V0 and V1). 3302a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # RFC 2965 acceptance and returning rules 3312a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Set-Cookie2 without version attribute is rejected. 3322a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 3332a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Netscape peculiarities list from Ronald Tschalar. 3342a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # The first two still need tests, the rest are covered. 3352a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis## - Quoting: only quotes around the expires value are recognized as such 3362a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis## (and yes, some folks quote the expires value); quotes around any other 3372a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis## value are treated as part of the value. 3382a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis## - White space: white space around names and values is ignored 3392a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis## - Default path: if no path parameter is given, the path defaults to the 3402a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis## path in the request-uri up to, but not including, the last '/'. Note 3412a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis## that this is entirely different from what the spec says. 3422a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis## - Commas and other delimiters: Netscape just parses until the next ';'. 3432a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis## This means it will allow commas etc inside values (and yes, both 3442a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis## commas and equals are commonly appear in the cookie value). This also 3452a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis## means that if you fold multiple Set-Cookie header fields into one, 3462a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis## comma-separated list, it'll be a headache to parse (at least my head 347419e23cbb07a624609a219919eaecd3c61d8e9b4Ezio Melotti## starts hurting every time I think of that code). 3482a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis## - Expires: You'll get all sorts of date formats in the expires, 349a850ef698e55d07173051747e96207496c6f1bdbMartin Panter## including empty expires attributes ("expires="). Be as flexible as you 3502a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis## can, and certainly don't expect the weekday to be there; if you can't 3512a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis## parse it, just ignore it and pretend it's a session cookie. 3522a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis## - Domain-matching: Netscape uses the 2-dot rule for _all_ domains, not 3532a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis## just the 7 special TLD's listed in their spec. And folks rely on 3542a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis## that... 3552a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 3562a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis def test_domain_return_ok(self): 3572a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # test optimization: .domain_return_ok() should filter out most 3582a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # domains in the CookieJar before we try to access them (because that 3592a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # may require disk access -- in particular, with MSIECookieJar) 3602a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # This is only a rough check for performance reasons, so it's not too 3612a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # critical as long as it's sufficiently liberal. 3622a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis import cookielib, urllib2 3632a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis pol = cookielib.DefaultCookiePolicy() 3642a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis for url, domain, ok in [ 3652a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ("http://foo.bar.com/", "blah.com", False), 3662a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ("http://foo.bar.com/", "rhubarb.blah.com", False), 3672a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ("http://foo.bar.com/", "rhubarb.foo.bar.com", False), 3682a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ("http://foo.bar.com/", ".foo.bar.com", True), 3692a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ("http://foo.bar.com/", "foo.bar.com", True), 3702a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ("http://foo.bar.com/", ".bar.com", True), 3712a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ("http://foo.bar.com/", "com", True), 3722a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ("http://foo.com/", "rhubarb.foo.com", False), 3732a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ("http://foo.com/", ".foo.com", True), 3742a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ("http://foo.com/", "foo.com", True), 3752a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ("http://foo.com/", "com", True), 3762a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ("http://foo/", "rhubarb.foo", False), 3772a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ("http://foo/", ".foo", True), 3782a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ("http://foo/", "foo", True), 3792a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ("http://foo/", "foo.local", True), 3802a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ("http://foo/", ".local", True), 3812a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ]: 3822a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis request = urllib2.Request(url) 3832a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis r = pol.domain_return_ok(domain, request) 3845c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson if ok: self.assertTrue(r) 385be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka else: self.assertFalse(r) 3862a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 3872a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis def test_missing_value(self): 3882a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from cookielib import MozillaCookieJar, lwp_cookie_str 3892a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 3902a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # missing = sign in Cookie: header is regarded by Mozilla as a missing 3912a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # name, and by cookielib as a missing value 3922a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis filename = test_support.TESTFN 3932a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c = MozillaCookieJar(filename) 3942a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_netscape(c, "http://www.acme.com/", 'eggs') 3952a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_netscape(c, "http://www.acme.com/", '"spam"; path=/foo/') 3962a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis cookie = c._cookies["www.acme.com"]["/"]["eggs"] 397be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertIsNone(cookie.value) 3982623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(cookie.name, "eggs") 3992a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis cookie = c._cookies["www.acme.com"]['/foo/']['"spam"'] 400be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertIsNone(cookie.value) 4012623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(cookie.name, '"spam"') 4022623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(lwp_cookie_str(cookie), ( 4032a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis r'"spam"; path="/foo/"; domain="www.acme.com"; ' 4042a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 'path_spec; discard; version=0')) 4052a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis old_str = repr(c) 4062a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c.save(ignore_expires=True, ignore_discard=True) 4072a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis try: 4082a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c = MozillaCookieJar(filename) 4092a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c.revert(ignore_expires=True, ignore_discard=True) 4102a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis finally: 4112a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis os.unlink(c.filename) 4122a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # cookies unchanged apart from lost info re. whether path was specified 4132623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual( 4142a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis repr(c), 4152a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis re.sub("path_specified=%s" % True, "path_specified=%s" % False, 4162a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis old_str) 4172a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ) 4182623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(interact_netscape(c, "http://www.acme.com/foo/"), 4192623a37852153363335956afab010cb0beb7e74eEzio Melotti '"spam"; eggs') 4202a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 42171dad72ebe97e41394ff2969d9a2e45dcf197403Neal Norwitz def test_rfc2109_handling(self): 42271dad72ebe97e41394ff2969d9a2e45dcf197403Neal Norwitz # RFC 2109 cookies are handled as RFC 2965 or Netscape cookies, 42371dad72ebe97e41394ff2969d9a2e45dcf197403Neal Norwitz # dependent on policy settings 42471dad72ebe97e41394ff2969d9a2e45dcf197403Neal Norwitz from cookielib import CookieJar, DefaultCookiePolicy 42571dad72ebe97e41394ff2969d9a2e45dcf197403Neal Norwitz 42671dad72ebe97e41394ff2969d9a2e45dcf197403Neal Norwitz for rfc2109_as_netscape, rfc2965, version in [ 42771dad72ebe97e41394ff2969d9a2e45dcf197403Neal Norwitz # default according to rfc2965 if not explicitly specified 42871dad72ebe97e41394ff2969d9a2e45dcf197403Neal Norwitz (None, False, 0), 42971dad72ebe97e41394ff2969d9a2e45dcf197403Neal Norwitz (None, True, 1), 43071dad72ebe97e41394ff2969d9a2e45dcf197403Neal Norwitz # explicit rfc2109_as_netscape 43171dad72ebe97e41394ff2969d9a2e45dcf197403Neal Norwitz (False, False, None), # version None here means no cookie stored 43271dad72ebe97e41394ff2969d9a2e45dcf197403Neal Norwitz (False, True, 1), 43371dad72ebe97e41394ff2969d9a2e45dcf197403Neal Norwitz (True, False, 0), 43471dad72ebe97e41394ff2969d9a2e45dcf197403Neal Norwitz (True, True, 0), 43571dad72ebe97e41394ff2969d9a2e45dcf197403Neal Norwitz ]: 43671dad72ebe97e41394ff2969d9a2e45dcf197403Neal Norwitz policy = DefaultCookiePolicy( 43771dad72ebe97e41394ff2969d9a2e45dcf197403Neal Norwitz rfc2109_as_netscape=rfc2109_as_netscape, 43871dad72ebe97e41394ff2969d9a2e45dcf197403Neal Norwitz rfc2965=rfc2965) 43971dad72ebe97e41394ff2969d9a2e45dcf197403Neal Norwitz c = CookieJar(policy) 44071dad72ebe97e41394ff2969d9a2e45dcf197403Neal Norwitz interact_netscape(c, "http://www.example.com/", "ni=ni; Version=1") 44171dad72ebe97e41394ff2969d9a2e45dcf197403Neal Norwitz try: 44271dad72ebe97e41394ff2969d9a2e45dcf197403Neal Norwitz cookie = c._cookies["www.example.com"]["/"]["ni"] 44371dad72ebe97e41394ff2969d9a2e45dcf197403Neal Norwitz except KeyError: 444be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertIsNone(version) # didn't expect a stored cookie 44571dad72ebe97e41394ff2969d9a2e45dcf197403Neal Norwitz else: 44671dad72ebe97e41394ff2969d9a2e45dcf197403Neal Norwitz self.assertEqual(cookie.version, version) 44771dad72ebe97e41394ff2969d9a2e45dcf197403Neal Norwitz # 2965 cookies are unaffected 44871dad72ebe97e41394ff2969d9a2e45dcf197403Neal Norwitz interact_2965(c, "http://www.example.com/", 44971dad72ebe97e41394ff2969d9a2e45dcf197403Neal Norwitz "foo=bar; Version=1") 45071dad72ebe97e41394ff2969d9a2e45dcf197403Neal Norwitz if rfc2965: 45171dad72ebe97e41394ff2969d9a2e45dcf197403Neal Norwitz cookie2965 = c._cookies["www.example.com"]["/"]["foo"] 45271dad72ebe97e41394ff2969d9a2e45dcf197403Neal Norwitz self.assertEqual(cookie2965.version, 1) 45371dad72ebe97e41394ff2969d9a2e45dcf197403Neal Norwitz 4542a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis def test_ns_parser(self): 4552a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from cookielib import CookieJar, DEFAULT_HTTP_PORT 4562a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 4572a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c = CookieJar() 4582a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_netscape(c, "http://www.acme.com/", 4592a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 'spam=eggs; DoMain=.acme.com; port; blArgh="feep"') 4602a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_netscape(c, "http://www.acme.com/", 'ni=ni; port=80,8080') 4612a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_netscape(c, "http://www.acme.com:80/", 'nini=ni') 4622a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_netscape(c, "http://www.acme.com:80/", 'foo=bar; expires=') 4632a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_netscape(c, "http://www.acme.com:80/", 'spam=eggs; ' 4642a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 'expires="Foo Bar 25 33:22:11 3022"') 465f249671d023d2529841f21294dc002273beb6f2fSerhiy Storchaka interact_netscape(c, 'http://www.acme.com/', 'fortytwo=') 466f249671d023d2529841f21294dc002273beb6f2fSerhiy Storchaka interact_netscape(c, 'http://www.acme.com/', '=unladenswallow') 467f249671d023d2529841f21294dc002273beb6f2fSerhiy Storchaka interact_netscape(c, 'http://www.acme.com/', 'holyhandgrenade') 4682a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 4692a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis cookie = c._cookies[".acme.com"]["/"]["spam"] 4702623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(cookie.domain, ".acme.com") 4715c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue(cookie.domain_specified) 4722623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(cookie.port, DEFAULT_HTTP_PORT) 473be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertFalse(cookie.port_specified) 4742a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # case is preserved 475be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertTrue(cookie.has_nonstandard_attr("blArgh")) 476be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertFalse(cookie.has_nonstandard_attr("blargh")) 4772a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 4782a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis cookie = c._cookies["www.acme.com"]["/"]["ni"] 4792623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(cookie.domain, "www.acme.com") 480be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertFalse(cookie.domain_specified) 4812623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(cookie.port, "80,8080") 4825c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue(cookie.port_specified) 4832a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 4842a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis cookie = c._cookies["www.acme.com"]["/"]["nini"] 485be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertIsNone(cookie.port) 486be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertFalse(cookie.port_specified) 4872a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 4882a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # invalid expires should not cause cookie to be dropped 4892a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis foo = c._cookies["www.acme.com"]["/"]["foo"] 4902a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis spam = c._cookies["www.acme.com"]["/"]["foo"] 491be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertIsNone(foo.expires) 492be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertIsNone(spam.expires) 4932a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 494f249671d023d2529841f21294dc002273beb6f2fSerhiy Storchaka cookie = c._cookies['www.acme.com']['/']['fortytwo'] 495f249671d023d2529841f21294dc002273beb6f2fSerhiy Storchaka self.assertIsNotNone(cookie.value) 496f249671d023d2529841f21294dc002273beb6f2fSerhiy Storchaka self.assertEqual(cookie.value, '') 497f249671d023d2529841f21294dc002273beb6f2fSerhiy Storchaka 498f249671d023d2529841f21294dc002273beb6f2fSerhiy Storchaka # there should be a distinction between a present but empty value 499f249671d023d2529841f21294dc002273beb6f2fSerhiy Storchaka # (above) and a value that's entirely missing (below) 500f249671d023d2529841f21294dc002273beb6f2fSerhiy Storchaka 501f249671d023d2529841f21294dc002273beb6f2fSerhiy Storchaka cookie = c._cookies['www.acme.com']['/']['holyhandgrenade'] 502f249671d023d2529841f21294dc002273beb6f2fSerhiy Storchaka self.assertIsNone(cookie.value) 503f249671d023d2529841f21294dc002273beb6f2fSerhiy Storchaka 5044ea3eade518c6a48b0708736442deefe669fe287Martin v. Löwis def test_ns_parser_special_names(self): 5054ea3eade518c6a48b0708736442deefe669fe287Martin v. Löwis # names such as 'expires' are not special in first name=value pair 5064ea3eade518c6a48b0708736442deefe669fe287Martin v. Löwis # of Set-Cookie: header 5074ea3eade518c6a48b0708736442deefe669fe287Martin v. Löwis from cookielib import CookieJar 5084ea3eade518c6a48b0708736442deefe669fe287Martin v. Löwis 5094ea3eade518c6a48b0708736442deefe669fe287Martin v. Löwis c = CookieJar() 5104ea3eade518c6a48b0708736442deefe669fe287Martin v. Löwis interact_netscape(c, "http://www.acme.com/", 'expires=eggs') 5114ea3eade518c6a48b0708736442deefe669fe287Martin v. Löwis interact_netscape(c, "http://www.acme.com/", 'version=eggs; spam=eggs') 5124ea3eade518c6a48b0708736442deefe669fe287Martin v. Löwis 5134ea3eade518c6a48b0708736442deefe669fe287Martin v. Löwis cookies = c._cookies["www.acme.com"]["/"] 5145c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue('expires' in cookies) 5155c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue('version' in cookies) 5164ea3eade518c6a48b0708736442deefe669fe287Martin v. Löwis 5172a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis def test_expires(self): 5182a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from cookielib import time2netscape, CookieJar 5192a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 5202a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # if expires is in future, keep cookie... 5212a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c = CookieJar() 5222a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis future = time2netscape(time.time()+3600) 5232a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_netscape(c, "http://www.acme.com/", 'spam="bar"; expires=%s' % 5242a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis future) 5252623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(len(c), 1) 5262a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis now = time2netscape(time.time()-1) 5272a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # ... and if in past or present, discard it 5282a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_netscape(c, "http://www.acme.com/", 'foo="eggs"; expires=%s' % 5292a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis now) 5302a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis h = interact_netscape(c, "http://www.acme.com/") 5312623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(len(c), 1) 5325c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue('spam="bar"' in h and "foo" not in h) 5332a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 5342a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # max-age takes precedence over expires, and zero max-age is request to 5352a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # delete both new cookie and any old matching cookie 5362a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_netscape(c, "http://www.acme.com/", 'eggs="bar"; expires=%s' % 5372a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis future) 5382a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_netscape(c, "http://www.acme.com/", 'bar="bar"; expires=%s' % 5392a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis future) 5402623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(len(c), 3) 5412a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_netscape(c, "http://www.acme.com/", 'eggs="bar"; ' 5422a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 'expires=%s; max-age=0' % future) 5432a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_netscape(c, "http://www.acme.com/", 'bar="bar"; ' 5442a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 'max-age=0; expires=%s' % future) 5452a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis h = interact_netscape(c, "http://www.acme.com/") 5462623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(len(c), 1) 5472a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 5482a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # test expiry at end of session for cookies with no expires attribute 5492a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_netscape(c, "http://www.rhubarb.net/", 'whum="fizz"') 5502623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(len(c), 2) 5512a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c.clear_session_cookies() 5522623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(len(c), 1) 553aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn('spam="bar"', h) 5542a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 5552a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # XXX RFC 2965 expiry rules (some apply to V0 too) 5562a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 5572a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis def test_default_path(self): 5582a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from cookielib import CookieJar, DefaultCookiePolicy 5592a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 5602a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # RFC 2965 5612a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis pol = DefaultCookiePolicy(rfc2965=True) 5622a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 5632a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c = CookieJar(pol) 5642a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_2965(c, "http://www.acme.com/", 'spam="bar"; Version="1"') 565aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn("/", c._cookies["www.acme.com"]) 5662a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 5672a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c = CookieJar(pol) 5682a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_2965(c, "http://www.acme.com/blah", 'eggs="bar"; Version="1"') 569aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn("/", c._cookies["www.acme.com"]) 5702a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 5712a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c = CookieJar(pol) 5722a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_2965(c, "http://www.acme.com/blah/rhubarb", 5732a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 'eggs="bar"; Version="1"') 574aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn("/blah/", c._cookies["www.acme.com"]) 5752a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 5762a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c = CookieJar(pol) 5772a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_2965(c, "http://www.acme.com/blah/rhubarb/", 5782a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 'eggs="bar"; Version="1"') 579aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn("/blah/rhubarb/", c._cookies["www.acme.com"]) 5802a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 5812a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Netscape 5822a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 5832a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c = CookieJar() 5842a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_netscape(c, "http://www.acme.com/", 'spam="bar"') 585aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn("/", c._cookies["www.acme.com"]) 5862a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 5872a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c = CookieJar() 5882a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_netscape(c, "http://www.acme.com/blah", 'eggs="bar"') 589aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn("/", c._cookies["www.acme.com"]) 5902a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 5912a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c = CookieJar() 5922a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_netscape(c, "http://www.acme.com/blah/rhubarb", 'eggs="bar"') 593aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn("/blah", c._cookies["www.acme.com"]) 5942a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 5952a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c = CookieJar() 5962a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_netscape(c, "http://www.acme.com/blah/rhubarb/", 'eggs="bar"') 597aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn("/blah/rhubarb", c._cookies["www.acme.com"]) 5982a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 5992a91ce8960d98fe2c98936a73d5e0e7a24856824Gregory P. Smith def test_default_path_with_query(self): 6002a91ce8960d98fe2c98936a73d5e0e7a24856824Gregory P. Smith cj = cookielib.CookieJar() 6012a91ce8960d98fe2c98936a73d5e0e7a24856824Gregory P. Smith uri = "http://example.com/?spam/eggs" 6022a91ce8960d98fe2c98936a73d5e0e7a24856824Gregory P. Smith value = 'eggs="bar"' 6032a91ce8960d98fe2c98936a73d5e0e7a24856824Gregory P. Smith interact_netscape(cj, uri, value) 6042a91ce8960d98fe2c98936a73d5e0e7a24856824Gregory P. Smith # default path does not include query, so is "/", not "/?spam" 6052a91ce8960d98fe2c98936a73d5e0e7a24856824Gregory P. Smith self.assertIn("/", cj._cookies["example.com"]) 6062a91ce8960d98fe2c98936a73d5e0e7a24856824Gregory P. Smith # cookie is sent back to the same URI 6072623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(interact_netscape(cj, uri), value) 6082a91ce8960d98fe2c98936a73d5e0e7a24856824Gregory P. Smith 6092a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis def test_escape_path(self): 6102a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from cookielib import escape_path 6112a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis cases = [ 6122a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # quoted safe 6132a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ("/foo%2f/bar", "/foo%2F/bar"), 6142a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ("/foo%2F/bar", "/foo%2F/bar"), 6152a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # quoted % 6162a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ("/foo%%/bar", "/foo%%/bar"), 6172a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # quoted unsafe 6182a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ("/fo%19o/bar", "/fo%19o/bar"), 6192a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ("/fo%7do/bar", "/fo%7Do/bar"), 6202a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # unquoted safe 6212a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ("/foo/bar&", "/foo/bar&"), 6222a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ("/foo//bar", "/foo//bar"), 6232a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ("\176/foo/bar", "\176/foo/bar"), 6242a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # unquoted unsafe 6252a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ("/foo\031/bar", "/foo%19/bar"), 6262a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ("/\175foo/bar", "/%7Dfoo/bar"), 6272a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # unicode 6282a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis (u"/foo/bar\uabcd", "/foo/bar%EA%AF%8D"), # UTF-8 encoded 6292a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ] 6302a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis for arg, result in cases: 6312623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(escape_path(arg), result) 6322a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 6332a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis def test_request_path(self): 6342a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from urllib2 import Request 6352a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from cookielib import request_path 6362a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # with parameters 6372a91ce8960d98fe2c98936a73d5e0e7a24856824Gregory P. Smith req = Request("http://www.example.com/rheum/rhaponticum;" 6382a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis "foo=bar;sing=song?apples=pears&spam=eggs#ni") 6392623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(request_path(req), 6402623a37852153363335956afab010cb0beb7e74eEzio Melotti "/rheum/rhaponticum;foo=bar;sing=song") 6412a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # without parameters 6422a91ce8960d98fe2c98936a73d5e0e7a24856824Gregory P. Smith req = Request("http://www.example.com/rheum/rhaponticum?" 6432a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis "apples=pears&spam=eggs#ni") 6442623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(request_path(req), "/rheum/rhaponticum") 6452a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # missing final slash 6462a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis req = Request("http://www.example.com") 6472623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(request_path(req), "/") 6482a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 6492a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis def test_request_port(self): 6502a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from urllib2 import Request 6512a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from cookielib import request_port, DEFAULT_HTTP_PORT 6522a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis req = Request("http://www.acme.com:1234/", 6532a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis headers={"Host": "www.acme.com:4321"}) 6542623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(request_port(req), "1234") 6552a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis req = Request("http://www.acme.com/", 6562a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis headers={"Host": "www.acme.com:4321"}) 6572623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(request_port(req), DEFAULT_HTTP_PORT) 6582a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 6592a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis def test_request_host(self): 6602a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from urllib2 import Request 6612a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from cookielib import request_host 6622a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # this request is illegal (RFC2616, 14.2.3) 6632a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis req = Request("http://1.1.1.1/", 6642a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis headers={"Host": "www.acme.com:80"}) 6652a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # libwww-perl wants this response, but that seems wrong (RFC 2616, 6662a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # section 5.2, point 1., and RFC 2965 section 1, paragraph 3) 6672623a37852153363335956afab010cb0beb7e74eEzio Melotti #self.assertEqual(request_host(req), "www.acme.com") 6682623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(request_host(req), "1.1.1.1") 6692a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis req = Request("http://www.acme.com/", 6702a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis headers={"Host": "irrelevant.com"}) 6712623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(request_host(req), "www.acme.com") 6722a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # not actually sure this one is valid Request object, so maybe should 6732a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # remove test for no host in url in request_host function? 6742a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis req = Request("/resource.html", 6752a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis headers={"Host": "www.acme.com"}) 6762623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(request_host(req), "www.acme.com") 6772a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # port shouldn't be in request-host 6782a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis req = Request("http://www.acme.com:2345/resource.html", 6792a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis headers={"Host": "www.acme.com:5432"}) 6802623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(request_host(req), "www.acme.com") 6812a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 6822a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis def test_is_HDN(self): 6832a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from cookielib import is_HDN 6845c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue(is_HDN("foo.bar.com")) 6855c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue(is_HDN("1foo2.3bar4.5com")) 686be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertFalse(is_HDN("192.168.1.1")) 687be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertFalse(is_HDN("")) 688be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertFalse(is_HDN(".")) 689be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertFalse(is_HDN(".foo.bar.com")) 690be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertFalse(is_HDN("..foo")) 691be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertFalse(is_HDN("foo.")) 6922a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 6932a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis def test_reach(self): 6942a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from cookielib import reach 6952623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(reach("www.acme.com"), ".acme.com") 6962623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(reach("acme.com"), "acme.com") 6972623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(reach("acme.local"), ".local") 6982623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(reach(".local"), ".local") 6992623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(reach(".com"), ".com") 7002623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(reach("."), ".") 7012623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(reach(""), "") 7022623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(reach("192.168.0.1"), "192.168.0.1") 7032a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 7042a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis def test_domain_match(self): 7052a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from cookielib import domain_match, user_domain_match 7065c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue(domain_match("192.168.1.1", "192.168.1.1")) 707be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertFalse(domain_match("192.168.1.1", ".168.1.1")) 7085c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue(domain_match("x.y.com", "x.Y.com")) 7095c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue(domain_match("x.y.com", ".Y.com")) 710be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertFalse(domain_match("x.y.com", "Y.com")) 7115c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue(domain_match("a.b.c.com", ".c.com")) 712be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertFalse(domain_match(".c.com", "a.b.c.com")) 7135c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue(domain_match("example.local", ".local")) 714be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertFalse(domain_match("blah.blah", "")) 715be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertFalse(domain_match("", ".rhubarb.rhubarb")) 7165c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue(domain_match("", "")) 7175c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson 7185c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue(user_domain_match("acme.com", "acme.com")) 719be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertFalse(user_domain_match("acme.com", ".acme.com")) 7205c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue(user_domain_match("rhubarb.acme.com", ".acme.com")) 7215c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue(user_domain_match("www.rhubarb.acme.com", ".acme.com")) 7225c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue(user_domain_match("x.y.com", "x.Y.com")) 7235c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue(user_domain_match("x.y.com", ".Y.com")) 724be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertFalse(user_domain_match("x.y.com", "Y.com")) 7255c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue(user_domain_match("y.com", "Y.com")) 726be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertFalse(user_domain_match(".y.com", "Y.com")) 7275c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue(user_domain_match(".y.com", ".Y.com")) 7285c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue(user_domain_match("x.y.com", ".com")) 729be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertFalse(user_domain_match("x.y.com", "com")) 730be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertFalse(user_domain_match("x.y.com", "m")) 731be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertFalse(user_domain_match("x.y.com", ".m")) 732be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertFalse(user_domain_match("x.y.com", "")) 733be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertFalse(user_domain_match("x.y.com", ".")) 7345c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue(user_domain_match("192.168.1.1", "192.168.1.1")) 7352a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # not both HDNs, so must string-compare equal to match 736be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertFalse(user_domain_match("192.168.1.1", ".168.1.1")) 737be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertFalse(user_domain_match("192.168.1.1", ".")) 7382a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # empty string is a special case 739be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertFalse(user_domain_match("192.168.1.1", "")) 7402a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 7412a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis def test_wrong_domain(self): 7422a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Cookies whose effective request-host name does not domain-match the 7432a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # domain are rejected. 7442a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 7452a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # XXX far from complete 7462a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from cookielib import CookieJar 7472a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c = CookieJar() 7482a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_2965(c, "http://www.nasty.com/", 7492a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 'foo=bar; domain=friendly.org; Version="1"') 7502623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(len(c), 0) 7512a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 752a166a91659795b97144bbd9f1c2adf89c8adc694Georg Brandl def test_strict_domain(self): 753a166a91659795b97144bbd9f1c2adf89c8adc694Georg Brandl # Cookies whose domain is a country-code tld like .co.uk should 754a166a91659795b97144bbd9f1c2adf89c8adc694Georg Brandl # not be set if CookiePolicy.strict_domain is true. 755a166a91659795b97144bbd9f1c2adf89c8adc694Georg Brandl from cookielib import CookieJar, DefaultCookiePolicy 756a166a91659795b97144bbd9f1c2adf89c8adc694Georg Brandl 757a166a91659795b97144bbd9f1c2adf89c8adc694Georg Brandl cp = DefaultCookiePolicy(strict_domain=True) 758a166a91659795b97144bbd9f1c2adf89c8adc694Georg Brandl cj = CookieJar(policy=cp) 759a166a91659795b97144bbd9f1c2adf89c8adc694Georg Brandl interact_netscape(cj, "http://example.co.uk/", 'no=problemo') 760a166a91659795b97144bbd9f1c2adf89c8adc694Georg Brandl interact_netscape(cj, "http://example.co.uk/", 761a166a91659795b97144bbd9f1c2adf89c8adc694Georg Brandl 'okey=dokey; Domain=.example.co.uk') 7622623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(len(cj), 2) 763a166a91659795b97144bbd9f1c2adf89c8adc694Georg Brandl for pseudo_tld in [".co.uk", ".org.za", ".tx.us", ".name.us"]: 764a166a91659795b97144bbd9f1c2adf89c8adc694Georg Brandl interact_netscape(cj, "http://example.%s/" % pseudo_tld, 765a166a91659795b97144bbd9f1c2adf89c8adc694Georg Brandl 'spam=eggs; Domain=.co.uk') 7662623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(len(cj), 2) 767a166a91659795b97144bbd9f1c2adf89c8adc694Georg Brandl 7682a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis def test_two_component_domain_ns(self): 7692a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Netscape: .www.bar.com, www.bar.com, .bar.com, bar.com, no domain 7702a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # should all get accepted, as should .acme.com, acme.com and no domain 7712a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # for 2-component domains like acme.com. 7722a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from cookielib import CookieJar, DefaultCookiePolicy 7732a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 7742a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c = CookieJar() 7752a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 7762a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # two-component V0 domain is OK 7772a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_netscape(c, "http://foo.net/", 'ns=bar') 7782623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(len(c), 1) 7792623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(c._cookies["foo.net"]["/"]["ns"].value, "bar") 7802623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(interact_netscape(c, "http://foo.net/"), "ns=bar") 7812a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # *will* be returned to any other domain (unlike RFC 2965)... 7822623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(interact_netscape(c, "http://www.foo.net/"), 7832623a37852153363335956afab010cb0beb7e74eEzio Melotti "ns=bar") 7842a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # ...unless requested otherwise 7852a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis pol = DefaultCookiePolicy( 7862a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis strict_ns_domain=DefaultCookiePolicy.DomainStrictNonDomain) 7872a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c.set_policy(pol) 7882623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(interact_netscape(c, "http://www.foo.net/"), "") 7892a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 7902a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # unlike RFC 2965, even explicit two-component domain is OK, 7912a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # because .foo.net matches foo.net 7922a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_netscape(c, "http://foo.net/foo/", 7932a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 'spam1=eggs; domain=foo.net') 7942a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # even if starts with a dot -- in NS rules, .foo.net matches foo.net! 7952a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_netscape(c, "http://foo.net/foo/bar/", 7962a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 'spam2=eggs; domain=.foo.net') 7972623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(len(c), 3) 7982623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(c._cookies[".foo.net"]["/foo"]["spam1"].value, 7992623a37852153363335956afab010cb0beb7e74eEzio Melotti "eggs") 8002623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(c._cookies[".foo.net"]["/foo/bar"]["spam2"].value, 8012623a37852153363335956afab010cb0beb7e74eEzio Melotti "eggs") 8022623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(interact_netscape(c, "http://foo.net/foo/bar/"), 8032623a37852153363335956afab010cb0beb7e74eEzio Melotti "spam2=eggs; spam1=eggs; ns=bar") 8042a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 8052a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # top-level domain is too general 8062a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_netscape(c, "http://foo.net/", 'nini="ni"; domain=.net') 8072623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(len(c), 3) 8082a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 8092a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis## # Netscape protocol doesn't allow non-special top level domains (such 8102a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis## # as co.uk) in the domain attribute unless there are at least three 8112a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis## # dots in it. 8122a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Oh yes it does! Real implementations don't check this, and real 8132a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # cookies (of course) rely on that behaviour. 8142a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_netscape(c, "http://foo.co.uk", 'nasty=trick; domain=.co.uk') 8152623a37852153363335956afab010cb0beb7e74eEzio Melotti## self.assertEqual(len(c), 2) 8162623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(len(c), 4) 8172a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 8182a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis def test_two_component_domain_rfc2965(self): 8192a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from cookielib import CookieJar, DefaultCookiePolicy 8202a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 8212a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis pol = DefaultCookiePolicy(rfc2965=True) 8222a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c = CookieJar(pol) 8232a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 8242a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # two-component V1 domain is OK 8252a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_2965(c, "http://foo.net/", 'foo=bar; Version="1"') 8262623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(len(c), 1) 8272623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(c._cookies["foo.net"]["/"]["foo"].value, "bar") 8282623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(interact_2965(c, "http://foo.net/"), 8292623a37852153363335956afab010cb0beb7e74eEzio Melotti "$Version=1; foo=bar") 8302a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # won't be returned to any other domain (because domain was implied) 8312623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(interact_2965(c, "http://www.foo.net/"), "") 8322a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 8332a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # unless domain is given explicitly, because then it must be 8342a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # rewritten to start with a dot: foo.net --> .foo.net, which does 8352a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # not domain-match foo.net 8362a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_2965(c, "http://foo.net/foo", 8372a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 'spam=eggs; domain=foo.net; path=/foo; Version="1"') 8382623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(len(c), 1) 8392623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(interact_2965(c, "http://foo.net/foo"), 8402623a37852153363335956afab010cb0beb7e74eEzio Melotti "$Version=1; foo=bar") 8412a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 8422a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # explicit foo.net from three-component domain www.foo.net *does* get 8432a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # set, because .foo.net domain-matches .foo.net 8442a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_2965(c, "http://www.foo.net/foo/", 8452a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 'spam=eggs; domain=foo.net; Version="1"') 8462623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(c._cookies[".foo.net"]["/foo/"]["spam"].value, 8472623a37852153363335956afab010cb0beb7e74eEzio Melotti "eggs") 8482623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(len(c), 2) 8492623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(interact_2965(c, "http://foo.net/foo/"), 8502623a37852153363335956afab010cb0beb7e74eEzio Melotti "$Version=1; foo=bar") 8512623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(interact_2965(c, "http://www.foo.net/foo/"), 8522623a37852153363335956afab010cb0beb7e74eEzio Melotti '$Version=1; spam=eggs; $Domain="foo.net"') 8532a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 8542a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # top-level domain is too general 8552a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_2965(c, "http://foo.net/", 8562a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 'ni="ni"; domain=".net"; Version="1"') 8572623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(len(c), 2) 8582a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 8592a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # RFC 2965 doesn't require blocking this 8602a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_2965(c, "http://foo.co.uk/", 8612a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 'nasty=trick; domain=.co.uk; Version="1"') 8622623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(len(c), 3) 8632a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 8642a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis def test_domain_allow(self): 8652a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from cookielib import CookieJar, DefaultCookiePolicy 8662a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from urllib2 import Request 8672a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 8682a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c = CookieJar(policy=DefaultCookiePolicy( 8692a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis blocked_domains=["acme.com"], 8702a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis allowed_domains=["www.acme.com"])) 8712a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 8722a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis req = Request("http://acme.com/") 8732a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis headers = ["Set-Cookie: CUSTOMER=WILE_E_COYOTE; path=/"] 8742a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis res = FakeResponse(headers, "http://acme.com/") 8752a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c.extract_cookies(res, req) 8762623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(len(c), 0) 8772a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 8782a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis req = Request("http://www.acme.com/") 8792a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis res = FakeResponse(headers, "http://www.acme.com/") 8802a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c.extract_cookies(res, req) 8812623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(len(c), 1) 8822a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 8832a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis req = Request("http://www.coyote.com/") 8842a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis res = FakeResponse(headers, "http://www.coyote.com/") 8852a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c.extract_cookies(res, req) 8862623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(len(c), 1) 8872a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 8882a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # set a cookie with non-allowed domain... 8892a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis req = Request("http://www.coyote.com/") 8902a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis res = FakeResponse(headers, "http://www.coyote.com/") 8912a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis cookies = c.make_cookies(res, req) 8922a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c.set_cookie(cookies[0]) 8932623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(len(c), 2) 8942a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # ... and check is doesn't get returned 8952a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c.add_cookie_header(req) 896be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertFalse(req.has_header("Cookie")) 8972a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 8982a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis def test_domain_block(self): 8992a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from cookielib import CookieJar, DefaultCookiePolicy 9002a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from urllib2 import Request 9012a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 9022a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis pol = DefaultCookiePolicy( 9032a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis rfc2965=True, blocked_domains=[".acme.com"]) 9042a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c = CookieJar(policy=pol) 9052a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis headers = ["Set-Cookie: CUSTOMER=WILE_E_COYOTE; path=/"] 9062a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 9072a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis req = Request("http://www.acme.com/") 9082a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis res = FakeResponse(headers, "http://www.acme.com/") 9092a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c.extract_cookies(res, req) 9102623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(len(c), 0) 9112a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 9122a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis p = pol.set_blocked_domains(["acme.com"]) 9132a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c.extract_cookies(res, req) 9142623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(len(c), 1) 9152a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 9162a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c.clear() 9172a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis req = Request("http://www.roadrunner.net/") 9182a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis res = FakeResponse(headers, "http://www.roadrunner.net/") 9192a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c.extract_cookies(res, req) 9202623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(len(c), 1) 9212a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis req = Request("http://www.roadrunner.net/") 9222a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c.add_cookie_header(req) 923be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertTrue(req.has_header("Cookie")) 924be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertTrue(req.has_header("Cookie2")) 9252a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 9262a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c.clear() 9272a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis pol.set_blocked_domains([".acme.com"]) 9282a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c.extract_cookies(res, req) 9292623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(len(c), 1) 9302a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 9312a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # set a cookie with blocked domain... 9322a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis req = Request("http://www.acme.com/") 9332a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis res = FakeResponse(headers, "http://www.acme.com/") 9342a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis cookies = c.make_cookies(res, req) 9352a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c.set_cookie(cookies[0]) 9362623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(len(c), 2) 9372a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # ... and check is doesn't get returned 9382a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c.add_cookie_header(req) 939be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertFalse(req.has_header("Cookie")) 9402a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 9412a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis def test_secure(self): 9422a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from cookielib import CookieJar, DefaultCookiePolicy 9432a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 9442a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis for ns in True, False: 9452a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis for whitespace in " ", "": 9462a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c = CookieJar() 9472a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis if ns: 9482a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis pol = DefaultCookiePolicy(rfc2965=False) 9492a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis int = interact_netscape 9502a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis vs = "" 9512a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis else: 9522a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis pol = DefaultCookiePolicy(rfc2965=True) 9532a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis int = interact_2965 9542a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis vs = "; Version=1" 9552a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c.set_policy(pol) 9562a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis url = "http://www.acme.com/" 9572a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis int(c, url, "foo1=bar%s%s" % (vs, whitespace)) 9582a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis int(c, url, "foo2=bar%s; secure%s" % (vs, whitespace)) 959be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertFalse( 960be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka c._cookies["www.acme.com"]["/"]["foo1"].secure, 9612a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis "non-secure cookie registered secure") 9625c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue( 9632a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c._cookies["www.acme.com"]["/"]["foo2"].secure, 9642a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis "secure cookie registered non-secure") 9652a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 9662a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis def test_quote_cookie_value(self): 9672a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from cookielib import CookieJar, DefaultCookiePolicy 9682a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c = CookieJar(policy=DefaultCookiePolicy(rfc2965=True)) 9692a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_2965(c, "http://www.acme.com/", r'foo=\b"a"r; Version=1') 9702a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis h = interact_2965(c, "http://www.acme.com/") 9712623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(h, r'$Version=1; foo=\\b\"a\"r') 9722a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 9732a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis def test_missing_final_slash(self): 9742a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Missing slash from request URL's abs_path should be assumed present. 9752a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from cookielib import CookieJar, DefaultCookiePolicy 9762a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from urllib2 import Request 9772a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis url = "http://www.acme.com" 9782a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c = CookieJar(DefaultCookiePolicy(rfc2965=True)) 9792a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_2965(c, url, "foo=bar; Version=1") 9802a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis req = Request(url) 9812623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(len(c), 1) 9822a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c.add_cookie_header(req) 9835c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue(req.has_header("Cookie")) 9842a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 9852a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis def test_domain_mirror(self): 9862a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from cookielib import CookieJar, DefaultCookiePolicy 9872a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 9882a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis pol = DefaultCookiePolicy(rfc2965=True) 9892a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 9902a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c = CookieJar(pol) 9912a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis url = "http://foo.bar.com/" 9922a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_2965(c, url, "spam=eggs; Version=1") 9932a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis h = interact_2965(c, url) 994aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertNotIn("Domain", h, 995aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti "absent domain returned with domain present") 9962a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 9972a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c = CookieJar(pol) 9982a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis url = "http://foo.bar.com/" 9992a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_2965(c, url, 'spam=eggs; Version=1; Domain=.bar.com') 10002a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis h = interact_2965(c, url) 1001aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn('$Domain=".bar.com"', h, "domain not returned") 10022a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 10032a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c = CookieJar(pol) 10042a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis url = "http://foo.bar.com/" 10052a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # note missing initial dot in Domain 10062a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_2965(c, url, 'spam=eggs; Version=1; Domain=bar.com') 10072a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis h = interact_2965(c, url) 1008aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn('$Domain="bar.com"', h, "domain not returned") 10092a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 10102a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis def test_path_mirror(self): 10112a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from cookielib import CookieJar, DefaultCookiePolicy 10122a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 10132a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis pol = DefaultCookiePolicy(rfc2965=True) 10142a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 10152a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c = CookieJar(pol) 10162a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis url = "http://foo.bar.com/" 10172a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_2965(c, url, "spam=eggs; Version=1") 10182a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis h = interact_2965(c, url) 1019aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertNotIn("Path", h, "absent path returned with path present") 10202a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 10212a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c = CookieJar(pol) 10222a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis url = "http://foo.bar.com/" 10232a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_2965(c, url, 'spam=eggs; Version=1; Path=/') 10242a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis h = interact_2965(c, url) 1025aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn('$Path="/"', h, "path not returned") 10262a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 10272a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis def test_port_mirror(self): 10282a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from cookielib import CookieJar, DefaultCookiePolicy 10292a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 10302a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis pol = DefaultCookiePolicy(rfc2965=True) 10312a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 10322a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c = CookieJar(pol) 10332a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis url = "http://foo.bar.com/" 10342a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_2965(c, url, "spam=eggs; Version=1") 10352a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis h = interact_2965(c, url) 1036aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertNotIn("Port", h, "absent port returned with port present") 10372a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 10382a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c = CookieJar(pol) 10392a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis url = "http://foo.bar.com/" 10402a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_2965(c, url, "spam=eggs; Version=1; Port") 10412a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis h = interact_2965(c, url) 1042be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertRegexpMatches(h, "\$Port([^=]|$)", 1043be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka "port with no value not returned with no value") 10442a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 10452a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c = CookieJar(pol) 10462a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis url = "http://foo.bar.com/" 10472a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_2965(c, url, 'spam=eggs; Version=1; Port="80"') 10482a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis h = interact_2965(c, url) 1049aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn('$Port="80"', h, 1050aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti "port with single value not returned with single value") 10512a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 10522a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c = CookieJar(pol) 10532a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis url = "http://foo.bar.com/" 10542a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_2965(c, url, 'spam=eggs; Version=1; Port="80,8080"') 10552a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis h = interact_2965(c, url) 1056aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn('$Port="80,8080"', h, 1057aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti "port with multiple values not returned with multiple " 1058aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti "values") 10592a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 10602a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis def test_no_return_comment(self): 10612a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from cookielib import CookieJar, DefaultCookiePolicy 10622a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 10632a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c = CookieJar(DefaultCookiePolicy(rfc2965=True)) 10642a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis url = "http://foo.bar.com/" 10652a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_2965(c, url, 'spam=eggs; Version=1; ' 10662a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 'Comment="does anybody read these?"; ' 10672a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 'CommentURL="http://foo.bar.net/comment.html"') 10682a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis h = interact_2965(c, url) 1069be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertNotIn("Comment", h, 10702a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis "Comment or CommentURL cookie-attributes returned to server") 10712a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 10722a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis def test_Cookie_iterator(self): 10732a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from cookielib import CookieJar, Cookie, DefaultCookiePolicy 10742a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 10752a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis cs = CookieJar(DefaultCookiePolicy(rfc2965=True)) 10762a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # add some random cookies 10772a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_2965(cs, "http://blah.spam.org/", 'foo=eggs; Version=1; ' 10782a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 'Comment="does anybody read these?"; ' 10792a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 'CommentURL="http://foo.bar.net/comment.html"') 10802a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_netscape(cs, "http://www.acme.com/blah/", "spam=bar; secure") 10812a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_2965(cs, "http://www.acme.com/blah/", 10822a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis "foo=bar; secure; Version=1") 10832a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_2965(cs, "http://www.acme.com/blah/", 10842a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis "foo=bar; path=/; Version=1") 10852a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_2965(cs, "http://www.sol.no", 10862a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis r'bang=wallop; version=1; domain=".sol.no"; ' 10872a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis r'port="90,100, 80,8080"; ' 10882a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis r'max-age=100; Comment = "Just kidding! (\"|\\\\) "') 10892a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 10902a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis versions = [1, 1, 1, 0, 1] 10912a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis names = ["bang", "foo", "foo", "spam", "foo"] 10922a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis domains = [".sol.no", "blah.spam.org", "www.acme.com", 10932a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis "www.acme.com", "www.acme.com"] 10942a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis paths = ["/", "/", "/", "/blah", "/blah/"] 10952a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 10962a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis for i in range(4): 10972a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis i = 0 10982a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis for c in cs: 1099b0f5adc3f4e098b1744eeac65fc830fb1df2b8abEzio Melotti self.assertIsInstance(c, Cookie) 11002623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(c.version, versions[i]) 11012623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(c.name, names[i]) 11022623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(c.domain, domains[i]) 11032623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(c.path, paths[i]) 11042a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis i = i + 1 11052a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 11062a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis def test_parse_ns_headers(self): 11072a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from cookielib import parse_ns_headers 11082a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 11092a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # missing domain value (invalid cookie) 11102623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual( 11112a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis parse_ns_headers(["foo=bar; path=/; domain"]), 11122a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis [[("foo", "bar"), 11132a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ("path", "/"), ("domain", None), ("version", "0")]] 11142a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ) 11152a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # invalid expires value 11162623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual( 11172a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis parse_ns_headers(["foo=bar; expires=Foo Bar 12 33:22:11 2000"]), 11182a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis [[("foo", "bar"), ("expires", None), ("version", "0")]] 11192a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ) 11202a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # missing cookie value (valid cookie) 11212623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual( 11222a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis parse_ns_headers(["foo"]), 11232a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis [[("foo", None), ("version", "0")]] 11242a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ) 1125f249671d023d2529841f21294dc002273beb6f2fSerhiy Storchaka # missing cookie values for parsed attributes 1126f249671d023d2529841f21294dc002273beb6f2fSerhiy Storchaka self.assertEqual( 1127f249671d023d2529841f21294dc002273beb6f2fSerhiy Storchaka parse_ns_headers(['foo=bar; expires']), 1128f249671d023d2529841f21294dc002273beb6f2fSerhiy Storchaka [[('foo', 'bar'), ('expires', None), ('version', '0')]]) 1129f249671d023d2529841f21294dc002273beb6f2fSerhiy Storchaka self.assertEqual( 1130f249671d023d2529841f21294dc002273beb6f2fSerhiy Storchaka parse_ns_headers(['foo=bar; version']), 1131f249671d023d2529841f21294dc002273beb6f2fSerhiy Storchaka [[('foo', 'bar'), ('version', None)]]) 11322a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # shouldn't add version if header is empty 11332623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(parse_ns_headers([""]), []) 11342a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 11352a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis def test_bad_cookie_header(self): 11362a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 11372a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis def cookiejar_from_cookie_headers(headers): 11382a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from cookielib import CookieJar 11392a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from urllib2 import Request 11402a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c = CookieJar() 11412a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis req = Request("http://www.example.com/") 11422a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis r = FakeResponse(headers, "http://www.example.com/") 11432a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c.extract_cookies(r, req) 11442a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis return c 11452a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 1146f249671d023d2529841f21294dc002273beb6f2fSerhiy Storchaka future = cookielib.time2netscape(time.time()+3600) 1147f249671d023d2529841f21294dc002273beb6f2fSerhiy Storchaka 11482a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # none of these bad headers should cause an exception to be raised 11492a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis for headers in [ 11502a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ["Set-Cookie: "], # actually, nothing wrong with this 11512a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ["Set-Cookie2: "], # ditto 11522a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # missing domain value 11532a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ["Set-Cookie2: a=foo; path=/; Version=1; domain"], 11542a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # bad max-age 11552a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ["Set-Cookie: b=foo; max-age=oops"], 11565d0ca2c8323b39e392c0c0bd31340cc3e1113c97Georg Brandl # bad version 11575d0ca2c8323b39e392c0c0bd31340cc3e1113c97Georg Brandl ["Set-Cookie: b=foo; version=spam"], 1158f249671d023d2529841f21294dc002273beb6f2fSerhiy Storchaka ["Set-Cookie:; Expires=%s" % future], 11592a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ]: 11602a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c = cookiejar_from_cookie_headers(headers) 11612a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # these bad cookies shouldn't be set 11622623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(len(c), 0) 11632a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 11642a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # cookie with invalid expires is treated as session cookie 11652a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis headers = ["Set-Cookie: c=foo; expires=Foo Bar 12 33:22:11 2000"] 11662a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c = cookiejar_from_cookie_headers(headers) 11672a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis cookie = c._cookies["www.example.com"]["/"]["c"] 1168be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertIsNone(cookie.expires) 11692a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 11702a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 11712a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwisclass LWPCookieTests(TestCase): 11722a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Tests taken from libwww-perl, with a few modifications and additions. 11732a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 11742a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis def test_netscape_example_1(self): 11752a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from cookielib import CookieJar, DefaultCookiePolicy 11762a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from urllib2 import Request 11772a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 11782a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis #------------------------------------------------------------------- 11792a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # First we check that it works for the original example at 11802a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # http://www.netscape.com/newsref/std/cookie_spec.html 11812a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 11822a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Client requests a document, and receives in the response: 11832a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 11842a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Set-Cookie: CUSTOMER=WILE_E_COYOTE; path=/; expires=Wednesday, 09-Nov-99 23:12:40 GMT 11852a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 11862a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # When client requests a URL in path "/" on this server, it sends: 11872a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 11882a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Cookie: CUSTOMER=WILE_E_COYOTE 11892a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 11902a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Client requests a document, and receives in the response: 11912a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 11922a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Set-Cookie: PART_NUMBER=ROCKET_LAUNCHER_0001; path=/ 11932a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 11942a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # When client requests a URL in path "/" on this server, it sends: 11952a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 11962a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Cookie: CUSTOMER=WILE_E_COYOTE; PART_NUMBER=ROCKET_LAUNCHER_0001 11972a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 11982a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Client receives: 11992a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 12002a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Set-Cookie: SHIPPING=FEDEX; path=/fo 12012a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 12022a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # When client requests a URL in path "/" on this server, it sends: 12032a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 12042a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Cookie: CUSTOMER=WILE_E_COYOTE; PART_NUMBER=ROCKET_LAUNCHER_0001 12052a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 12062a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # When client requests a URL in path "/foo" on this server, it sends: 12072a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 12082a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Cookie: CUSTOMER=WILE_E_COYOTE; PART_NUMBER=ROCKET_LAUNCHER_0001; SHIPPING=FEDEX 12092a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 12102a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # The last Cookie is buggy, because both specifications say that the 12112a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # most specific cookie must be sent first. SHIPPING=FEDEX is the 12122a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # most specific and should thus be first. 12132a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 12142a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis year_plus_one = time.localtime()[0] + 1 12152a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 12162a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis headers = [] 12172a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 12182a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c = CookieJar(DefaultCookiePolicy(rfc2965 = True)) 12192a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 12202a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis #req = Request("http://1.1.1.1/", 12212a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # headers={"Host": "www.acme.com:80"}) 12222a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis req = Request("http://www.acme.com:80/", 12232a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis headers={"Host": "www.acme.com:80"}) 12242a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 12252a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis headers.append( 12262a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis "Set-Cookie: CUSTOMER=WILE_E_COYOTE; path=/ ; " 12272a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis "expires=Wednesday, 09-Nov-%d 23:12:40 GMT" % year_plus_one) 12282a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis res = FakeResponse(headers, "http://www.acme.com/") 12292a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c.extract_cookies(res, req) 12302a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 12312a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis req = Request("http://www.acme.com/") 12322a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c.add_cookie_header(req) 12332a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 12342a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis self.assertEqual(req.get_header("Cookie"), "CUSTOMER=WILE_E_COYOTE") 12352a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis self.assertEqual(req.get_header("Cookie2"), '$Version="1"') 12362a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 12372a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis headers.append("Set-Cookie: PART_NUMBER=ROCKET_LAUNCHER_0001; path=/") 12382a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis res = FakeResponse(headers, "http://www.acme.com/") 12392a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c.extract_cookies(res, req) 12402a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 12412a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis req = Request("http://www.acme.com/foo/bar") 12422a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c.add_cookie_header(req) 12432a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 12442a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis h = req.get_header("Cookie") 1245aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn("PART_NUMBER=ROCKET_LAUNCHER_0001", h) 1246aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn("CUSTOMER=WILE_E_COYOTE", h) 12472a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 12482a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis headers.append('Set-Cookie: SHIPPING=FEDEX; path=/foo') 12492a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis res = FakeResponse(headers, "http://www.acme.com") 12502a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c.extract_cookies(res, req) 12512a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 12522a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis req = Request("http://www.acme.com/") 12532a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c.add_cookie_header(req) 12542a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 12552a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis h = req.get_header("Cookie") 1256aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn("PART_NUMBER=ROCKET_LAUNCHER_0001", h) 1257aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn("CUSTOMER=WILE_E_COYOTE", h) 1258aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertNotIn("SHIPPING=FEDEX", h) 12592a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 12602a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis req = Request("http://www.acme.com/foo/") 12612a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c.add_cookie_header(req) 12622a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 12632a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis h = req.get_header("Cookie") 1264aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn("PART_NUMBER=ROCKET_LAUNCHER_0001", h) 1265aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn("CUSTOMER=WILE_E_COYOTE", h) 1266aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertTrue(h.startswith("SHIPPING=FEDEX;")) 12672a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 12682a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis def test_netscape_example_2(self): 12692a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from cookielib import CookieJar 12702a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from urllib2 import Request 12712a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 12722a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Second Example transaction sequence: 12732a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 12742a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Assume all mappings from above have been cleared. 12752a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 12762a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Client receives: 12772a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 12782a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Set-Cookie: PART_NUMBER=ROCKET_LAUNCHER_0001; path=/ 12792a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 12802a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # When client requests a URL in path "/" on this server, it sends: 12812a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 12822a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Cookie: PART_NUMBER=ROCKET_LAUNCHER_0001 12832a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 12842a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Client receives: 12852a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 12862a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Set-Cookie: PART_NUMBER=RIDING_ROCKET_0023; path=/ammo 12872a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 12882a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # When client requests a URL in path "/ammo" on this server, it sends: 12892a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 12902a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Cookie: PART_NUMBER=RIDING_ROCKET_0023; PART_NUMBER=ROCKET_LAUNCHER_0001 12912a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 12922a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # NOTE: There are two name/value pairs named "PART_NUMBER" due to 12932a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # the inheritance of the "/" mapping in addition to the "/ammo" mapping. 12942a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 12952a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c = CookieJar() 12962a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis headers = [] 12972a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 12982a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis req = Request("http://www.acme.com/") 12992a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis headers.append("Set-Cookie: PART_NUMBER=ROCKET_LAUNCHER_0001; path=/") 13002a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis res = FakeResponse(headers, "http://www.acme.com/") 13012a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 13022a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c.extract_cookies(res, req) 13032a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 13042a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis req = Request("http://www.acme.com/") 13052a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c.add_cookie_header(req) 13062a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 13072623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(req.get_header("Cookie"), 13082a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis "PART_NUMBER=ROCKET_LAUNCHER_0001") 13092a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 13102a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis headers.append( 13112a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis "Set-Cookie: PART_NUMBER=RIDING_ROCKET_0023; path=/ammo") 13122a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis res = FakeResponse(headers, "http://www.acme.com/") 13132a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c.extract_cookies(res, req) 13142a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 13152a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis req = Request("http://www.acme.com/ammo") 13162a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c.add_cookie_header(req) 13172a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 1318be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertRegexpMatches(req.get_header("Cookie"), 1319be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka r"PART_NUMBER=RIDING_ROCKET_0023;\s*" 1320be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka "PART_NUMBER=ROCKET_LAUNCHER_0001") 13212a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 13222a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis def test_ietf_example_1(self): 13232a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from cookielib import CookieJar, DefaultCookiePolicy 13242a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis #------------------------------------------------------------------- 13252a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Then we test with the examples from draft-ietf-http-state-man-mec-03.txt 13262a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 13272a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 5. EXAMPLES 13282a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 13292a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c = CookieJar(DefaultCookiePolicy(rfc2965=True)) 13302a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 13312a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 13322a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 5.1 Example 1 13332a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 13342a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Most detail of request and response headers has been omitted. Assume 13352a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # the user agent has no stored cookies. 13362a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 13372a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 1. User Agent -> Server 13382a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 13392a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # POST /acme/login HTTP/1.1 13402a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # [form data] 13412a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 13422a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # User identifies self via a form. 13432a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 13442a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 2. Server -> User Agent 13452a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 13462a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # HTTP/1.1 200 OK 13472a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Set-Cookie2: Customer="WILE_E_COYOTE"; Version="1"; Path="/acme" 13482a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 13492a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Cookie reflects user's identity. 13502a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 13512a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis cookie = interact_2965( 13522a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c, 'http://www.acme.com/acme/login', 13532a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 'Customer="WILE_E_COYOTE"; Version="1"; Path="/acme"') 1354be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertFalse(cookie) 13552a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 13562a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 13572a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 3. User Agent -> Server 13582a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 13592a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # POST /acme/pickitem HTTP/1.1 13602a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Cookie: $Version="1"; Customer="WILE_E_COYOTE"; $Path="/acme" 13612a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # [form data] 13622a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 13632a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # User selects an item for ``shopping basket.'' 13642a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 13652a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 4. Server -> User Agent 13662a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 13672a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # HTTP/1.1 200 OK 13682a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Set-Cookie2: Part_Number="Rocket_Launcher_0001"; Version="1"; 13692a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Path="/acme" 13702a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 13712a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Shopping basket contains an item. 13722a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 13732a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis cookie = interact_2965(c, 'http://www.acme.com/acme/pickitem', 13742a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 'Part_Number="Rocket_Launcher_0001"; ' 13752a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 'Version="1"; Path="/acme"'); 1376be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertRegexpMatches(cookie, 1377be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka r'^\$Version="?1"?; Customer="?WILE_E_COYOTE"?; \$Path="/acme"$') 13782a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 13792a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 13802a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 5. User Agent -> Server 13812a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 13822a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # POST /acme/shipping HTTP/1.1 13832a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Cookie: $Version="1"; 13842a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Customer="WILE_E_COYOTE"; $Path="/acme"; 13852a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Part_Number="Rocket_Launcher_0001"; $Path="/acme" 13862a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # [form data] 13872a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 13882a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # User selects shipping method from form. 13892a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 13902a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 6. Server -> User Agent 13912a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 13922a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # HTTP/1.1 200 OK 13932a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Set-Cookie2: Shipping="FedEx"; Version="1"; Path="/acme" 13942a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 13952a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # New cookie reflects shipping method. 13962a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 13972a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis cookie = interact_2965(c, "http://www.acme.com/acme/shipping", 13982a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 'Shipping="FedEx"; Version="1"; Path="/acme"') 13992a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 1400be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertRegexpMatches(cookie, r'^\$Version="?1"?;') 1401be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertRegexpMatches(cookie, 1402be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka r'Part_Number="?Rocket_Launcher_0001"?;\s*\$Path="\/acme"') 1403be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertRegexpMatches(cookie, 1404be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka r'Customer="?WILE_E_COYOTE"?;\s*\$Path="\/acme"') 14052a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 14062a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 14072a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 7. User Agent -> Server 14082a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 14092a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # POST /acme/process HTTP/1.1 14102a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Cookie: $Version="1"; 14112a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Customer="WILE_E_COYOTE"; $Path="/acme"; 14122a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Part_Number="Rocket_Launcher_0001"; $Path="/acme"; 14132a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Shipping="FedEx"; $Path="/acme" 14142a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # [form data] 14152a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 14162a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # User chooses to process order. 14172a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 14182a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 8. Server -> User Agent 14192a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 14202a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # HTTP/1.1 200 OK 14212a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 14222a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Transaction is complete. 14232a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 14242a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis cookie = interact_2965(c, "http://www.acme.com/acme/process") 1425be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertRegexpMatches(cookie, 1426be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka r'Shipping="?FedEx"?;\s*\$Path="\/acme"') 1427be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertIn("WILE_E_COYOTE", cookie) 14282a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 14292a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 14302a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # The user agent makes a series of requests on the origin server, after 14312a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # each of which it receives a new cookie. All the cookies have the same 14322a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Path attribute and (default) domain. Because the request URLs all have 14332a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # /acme as a prefix, and that matches the Path attribute, each request 14342a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # contains all the cookies received so far. 14352a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 14362a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis def test_ietf_example_2(self): 14372a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from cookielib import CookieJar, DefaultCookiePolicy 14382a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 14392a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 5.2 Example 2 14402a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 14412a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # This example illustrates the effect of the Path attribute. All detail 14422a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # of request and response headers has been omitted. Assume the user agent 14432a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # has no stored cookies. 14442a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 14452a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c = CookieJar(DefaultCookiePolicy(rfc2965=True)) 14462a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 14472a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Imagine the user agent has received, in response to earlier requests, 14482a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # the response headers 14492a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 14502a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Set-Cookie2: Part_Number="Rocket_Launcher_0001"; Version="1"; 14512a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Path="/acme" 14522a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 14532a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # and 14542a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 14552a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Set-Cookie2: Part_Number="Riding_Rocket_0023"; Version="1"; 14562a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Path="/acme/ammo" 14572a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 14582a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_2965( 14592a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c, "http://www.acme.com/acme/ammo/specific", 14602a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 'Part_Number="Rocket_Launcher_0001"; Version="1"; Path="/acme"', 14612a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 'Part_Number="Riding_Rocket_0023"; Version="1"; Path="/acme/ammo"') 14622a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 14632a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # A subsequent request by the user agent to the (same) server for URLs of 14642a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # the form /acme/ammo/... would include the following request header: 14652a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 14662a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Cookie: $Version="1"; 14672a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Part_Number="Riding_Rocket_0023"; $Path="/acme/ammo"; 14682a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Part_Number="Rocket_Launcher_0001"; $Path="/acme" 14692a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 14702a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Note that the NAME=VALUE pair for the cookie with the more specific Path 14712a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # attribute, /acme/ammo, comes before the one with the less specific Path 14722a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # attribute, /acme. Further note that the same cookie name appears more 14732a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # than once. 14742a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 14752a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis cookie = interact_2965(c, "http://www.acme.com/acme/ammo/...") 1476be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertRegexpMatches(cookie, 1477be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka r"Riding_Rocket_0023.*Rocket_Launcher_0001") 14782a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 14792a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # A subsequent request by the user agent to the (same) server for a URL of 14802a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # the form /acme/parts/ would include the following request header: 14812a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 14822a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Cookie: $Version="1"; Part_Number="Rocket_Launcher_0001"; $Path="/acme" 14832a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 14842a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Here, the second cookie's Path attribute /acme/ammo is not a prefix of 14852a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # the request URL, /acme/parts/, so the cookie does not get forwarded to 14862a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # the server. 14872a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 14882a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis cookie = interact_2965(c, "http://www.acme.com/acme/parts/") 1489aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn("Rocket_Launcher_0001", cookie) 1490aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertNotIn("Riding_Rocket_0023", cookie) 14912a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 14922a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis def test_rejection(self): 14932a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Test rejection of Set-Cookie2 responses based on domain, path, port. 14942a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from cookielib import DefaultCookiePolicy, LWPCookieJar 14952a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 14962a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis pol = DefaultCookiePolicy(rfc2965=True) 14972a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 14982a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c = LWPCookieJar(policy=pol) 14992a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 15002a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis max_age = "max-age=3600" 15012a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 15022a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # illegal domain (no embedded dots) 15032a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis cookie = interact_2965(c, "http://www.acme.com", 15042a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 'foo=bar; domain=".com"; version=1') 1505be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertFalse(c) 15062a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 15072a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # legal domain 15082a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis cookie = interact_2965(c, "http://www.acme.com", 15092a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 'ping=pong; domain="acme.com"; version=1') 15102623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(len(c), 1) 15112a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 15122a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # illegal domain (host prefix "www.a" contains a dot) 15132a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis cookie = interact_2965(c, "http://www.a.acme.com", 15142a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 'whiz=bang; domain="acme.com"; version=1') 15152623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(len(c), 1) 15162a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 15172a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # legal domain 15182a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis cookie = interact_2965(c, "http://www.a.acme.com", 15192a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 'wow=flutter; domain=".a.acme.com"; version=1') 15202623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(len(c), 2) 15212a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 15222a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # can't partially match an IP-address 15232a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis cookie = interact_2965(c, "http://125.125.125.125", 15242a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 'zzzz=ping; domain="125.125.125"; version=1') 15252623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(len(c), 2) 15262a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 15272a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # illegal path (must be prefix of request path) 15282a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis cookie = interact_2965(c, "http://www.sol.no", 15292a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 'blah=rhubarb; domain=".sol.no"; path="/foo"; ' 15302a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 'version=1') 15312623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(len(c), 2) 15322a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 15332a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # legal path 15342a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis cookie = interact_2965(c, "http://www.sol.no/foo/bar", 15352a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 'bing=bong; domain=".sol.no"; path="/foo"; ' 15362a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 'version=1') 15372623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(len(c), 3) 15382a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 15392a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # illegal port (request-port not in list) 15402a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis cookie = interact_2965(c, "http://www.sol.no", 15412a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 'whiz=ffft; domain=".sol.no"; port="90,100"; ' 15422a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 'version=1') 15432623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(len(c), 3) 15442a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 15452a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # legal port 15462a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis cookie = interact_2965( 15472a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c, "http://www.sol.no", 15482a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis r'bang=wallop; version=1; domain=".sol.no"; ' 15492a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis r'port="90,100, 80,8080"; ' 15502a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis r'max-age=100; Comment = "Just kidding! (\"|\\\\) "') 15512623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(len(c), 4) 15522a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 15532a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # port attribute without any value (current port) 15542a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis cookie = interact_2965(c, "http://www.sol.no", 15552a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 'foo9=bar; version=1; domain=".sol.no"; port; ' 15562a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 'max-age=100;') 15572623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(len(c), 5) 15582a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 15592a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # encoded path 15602a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # LWP has this test, but unescaping allowed path characters seems 15612a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # like a bad idea, so I think this should fail: 15622a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis## cookie = interact_2965(c, "http://www.sol.no/foo/", 15632a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis## r'foo8=bar; version=1; path="/%66oo"') 15642a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # but this is OK, because '<' is not an allowed HTTP URL path 15652a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # character: 15662a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis cookie = interact_2965(c, "http://www.sol.no/<oo/", 15672a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis r'foo8=bar; version=1; path="/%3coo"') 15682623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(len(c), 6) 15692a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 15702a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # save and restore 15712a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis filename = test_support.TESTFN 15722a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 15732a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis try: 15742a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c.save(filename, ignore_discard=True) 15752a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis old = repr(c) 15762a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 15772a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c = LWPCookieJar(policy=pol) 15782a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c.load(filename, ignore_discard=True) 15792a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis finally: 15802a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis try: os.unlink(filename) 15812a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis except OSError: pass 15822a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 15832623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(old, repr(c)) 15842a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 15852a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis def test_url_encoding(self): 15862a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Try some URL encodings of the PATHs. 15872a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # (the behaviour here has changed from libwww-perl) 15882a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from cookielib import CookieJar, DefaultCookiePolicy 15892a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 15902a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c = CookieJar(DefaultCookiePolicy(rfc2965=True)) 15912a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_2965(c, "http://www.acme.com/foo%2f%25/%3c%3c%0Anew%E5/%E5", 15922a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis "foo = bar; version = 1") 15932a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 15942a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis cookie = interact_2965( 15950bfac6e5d8671f21327b1a8413d68cf23285105fBrett Cannon c, "http://www.acme.com/foo%2f%25/<<%0anew�/���", 15962a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 'bar=baz; path="/foo/"; version=1'); 15972a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis version_re = re.compile(r'^\$version=\"?1\"?', re.I) 1598be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertIn("foo=bar", cookie) 1599be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertRegexpMatches(cookie, version_re) 16002a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 16012a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis cookie = interact_2965( 16020bfac6e5d8671f21327b1a8413d68cf23285105fBrett Cannon c, "http://www.acme.com/foo/%25/<<%0anew�/���") 1603be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertFalse(cookie) 16042a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 16052a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # unicode URL doesn't raise exception 16062a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis cookie = interact_2965(c, u"http://www.acme.com/\xfc") 16072a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 16082a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis def test_mozilla(self): 16092a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Save / load Mozilla/Netscape cookie file format. 16102a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from cookielib import MozillaCookieJar, DefaultCookiePolicy 16112a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 16122a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis year_plus_one = time.localtime()[0] + 1 16132a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 16142a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis filename = test_support.TESTFN 16152a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 16162a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c = MozillaCookieJar(filename, 16172a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis policy=DefaultCookiePolicy(rfc2965=True)) 16182a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_2965(c, "http://www.acme.com/", 16192a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis "foo1=bar; max-age=100; Version=1") 16202a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_2965(c, "http://www.acme.com/", 16212a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 'foo2=bar; port="80"; max-age=100; Discard; Version=1') 16222a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_2965(c, "http://www.acme.com/", "foo3=bar; secure; Version=1") 16232a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 16242a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis expires = "expires=09-Nov-%d 23:12:40 GMT" % (year_plus_one,) 16252a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_netscape(c, "http://www.foo.com/", 16262a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis "fooa=bar; %s" % expires) 16272a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_netscape(c, "http://www.foo.com/", 16282a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis "foob=bar; Domain=.foo.com; %s" % expires) 16292a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_netscape(c, "http://www.foo.com/", 16302a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis "fooc=bar; Domain=www.foo.com; %s" % expires) 16312a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 16322a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis def save_and_restore(cj, ignore_discard): 16332a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis try: 16342a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis cj.save(ignore_discard=ignore_discard) 16352a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis new_c = MozillaCookieJar(filename, 16362a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis DefaultCookiePolicy(rfc2965=True)) 16372a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis new_c.load(ignore_discard=ignore_discard) 16382a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis finally: 16392a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis try: os.unlink(filename) 16402a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis except OSError: pass 16412a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis return new_c 16422a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 16432a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis new_c = save_and_restore(c, True) 16442623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(len(new_c), 6) # none discarded 1645aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn("name='foo1', value='bar'", repr(new_c)) 16462a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 16472a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis new_c = save_and_restore(c, False) 16482623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(len(new_c), 4) # 2 of them discarded on save 1649aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn("name='foo1', value='bar'", repr(new_c)) 16502a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 16512a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis def test_netscape_misc(self): 16522a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Some additional Netscape cookies tests. 16532a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from cookielib import CookieJar 16542a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from urllib2 import Request 16552a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 16562a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c = CookieJar() 16572a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis headers = [] 16582a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis req = Request("http://foo.bar.acme.com/foo") 16592a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 16602a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Netscape allows a host part that contains dots 16612a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis headers.append("Set-Cookie: Customer=WILE_E_COYOTE; domain=.acme.com") 16622a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis res = FakeResponse(headers, "http://www.acme.com/foo") 16632a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c.extract_cookies(res, req) 16642a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 16652a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # and that the domain is the same as the host without adding a leading 16662a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # dot to the domain. Should not quote even if strange chars are used 16672a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # in the cookie value. 16682a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis headers.append("Set-Cookie: PART_NUMBER=3,4; domain=foo.bar.acme.com") 16692a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis res = FakeResponse(headers, "http://www.acme.com/foo") 16702a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c.extract_cookies(res, req) 16712a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 16722a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis req = Request("http://foo.bar.acme.com/foo") 16732a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c.add_cookie_header(req) 16745c8da86f3a515ce1a6d5f27fd15e3c5f4d8e931eBenjamin Peterson self.assertTrue( 16752a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis "PART_NUMBER=3,4" in req.get_header("Cookie") and 16762a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis "Customer=WILE_E_COYOTE" in req.get_header("Cookie")) 16772a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 16782a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis def test_intranet_domains_2965(self): 16792a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Test handling of local intranet hostnames without a dot. 16802a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from cookielib import CookieJar, DefaultCookiePolicy 16812a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 16822a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c = CookieJar(DefaultCookiePolicy(rfc2965=True)) 16832a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_2965(c, "http://example/", 16842a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis "foo1=bar; PORT; Discard; Version=1;") 16852a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis cookie = interact_2965(c, "http://example/", 16862a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 'foo2=bar; domain=".local"; Version=1') 1687aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn("foo1=bar", cookie) 16882a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 16892a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_2965(c, "http://example/", 'foo3=bar; Version=1') 16902a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis cookie = interact_2965(c, "http://example/") 1691aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn("foo2=bar", cookie) 1692aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertEqual(len(c), 3) 16932a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 16942a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis def test_intranet_domains_ns(self): 16952a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from cookielib import CookieJar, DefaultCookiePolicy 16962a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 16972a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c = CookieJar(DefaultCookiePolicy(rfc2965 = False)) 16982a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis interact_netscape(c, "http://example/", "foo1=bar") 16992a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis cookie = interact_netscape(c, "http://example/", 17002a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 'foo2=bar; domain=.local') 17012623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(len(c), 2) 1702aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn("foo1=bar", cookie) 17032a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 17042a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis cookie = interact_netscape(c, "http://example/") 1705aa98058cc44ba20f35c106d20918c6196b737561Ezio Melotti self.assertIn("foo2=bar", cookie) 17062623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(len(c), 2) 17072a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 17082a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis def test_empty_path(self): 17092a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from cookielib import CookieJar, DefaultCookiePolicy 17102a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from urllib2 import Request 17112a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 17122a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Test for empty path 17132a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Broken web-server ORION/1.3.38 returns to the client response like 17142a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 17152a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Set-Cookie: JSESSIONID=ABCDERANDOM123; Path= 17162a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # 17172a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # ie. with Path set to nothing. 17182a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # In this case, extract_cookies() must set cookie to / (root) 17192a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c = CookieJar(DefaultCookiePolicy(rfc2965 = True)) 17202a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis headers = [] 17212a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 17222a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis req = Request("http://www.ants.com/") 17232a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis headers.append("Set-Cookie: JSESSIONID=ABCDERANDOM123; Path=") 17242a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis res = FakeResponse(headers, "http://www.ants.com/") 17252a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c.extract_cookies(res, req) 17262a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 17272a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis req = Request("http://www.ants.com/") 17282a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c.add_cookie_header(req) 17292a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 17302623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(req.get_header("Cookie"), 17312623a37852153363335956afab010cb0beb7e74eEzio Melotti "JSESSIONID=ABCDERANDOM123") 17322623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(req.get_header("Cookie2"), '$Version="1"') 17332a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 17342a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # missing path in the request URI 17352a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis req = Request("http://www.ants.com:8080") 17362a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c.add_cookie_header(req) 17372a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 17382623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(req.get_header("Cookie"), 17392623a37852153363335956afab010cb0beb7e74eEzio Melotti "JSESSIONID=ABCDERANDOM123") 17402623a37852153363335956afab010cb0beb7e74eEzio Melotti self.assertEqual(req.get_header("Cookie2"), '$Version="1"') 17412a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 17422a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis def test_session_cookies(self): 17432a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from cookielib import CookieJar 17442a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis from urllib2 import Request 17452a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 17462a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis year_plus_one = time.localtime()[0] + 1 17472a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 17482a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # Check session cookies are deleted properly by 17492a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # CookieJar.clear_session_cookies method 17502a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 17512a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis req = Request('http://www.perlmeister.com/scripts') 17522a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis headers = [] 17532a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis headers.append("Set-Cookie: s1=session;Path=/scripts") 17542a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis headers.append("Set-Cookie: p1=perm; Domain=.perlmeister.com;" 17552a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis "Path=/;expires=Fri, 02-Feb-%d 23:24:20 GMT" % 17562a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis year_plus_one) 17572a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis headers.append("Set-Cookie: p2=perm;Path=/;expires=Fri, " 17582a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis "02-Feb-%d 23:24:20 GMT" % year_plus_one) 17592a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis headers.append("Set-Cookie: s2=session;Path=/scripts;" 17602a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis "Domain=.perlmeister.com") 17612a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis headers.append('Set-Cookie2: s3=session;Version=1;Discard;Path="/"') 17622a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis res = FakeResponse(headers, 'http://www.perlmeister.com/scripts') 17632a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 17642a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c = CookieJar() 17652a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c.extract_cookies(res, req) 17662a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # How many session/permanent cookies do we have? 17672a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis counter = {"session_after": 0, 17682a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis "perm_after": 0, 17692a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis "session_before": 0, 17702a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis "perm_before": 0} 17712a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis for cookie in c: 17722a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis key = "%s_before" % cookie.value 17732a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis counter[key] = counter[key] + 1 17742a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis c.clear_session_cookies() 17752a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # How many now? 17762a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis for cookie in c: 17772a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis key = "%s_after" % cookie.value 17782a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis counter[key] = counter[key] + 1 17792a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 1780b1d867f14965e2369d31a3fcdab5bca34b4d81b4Martin Panter # a permanent cookie got lost accidentally 1781be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertEqual(counter["perm_after"], counter["perm_before"]) 17822a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # a session cookie hasn't been cleared 1783be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertEqual(counter["session_after"], 0) 17842a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis # we didn't have session cookies in the first place 1785be1d3c1818840626c2d5a4f8e29a32c777537681Serhiy Storchaka self.assertNotEqual(counter["session_before"], 0) 17862a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 17872a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 17882a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwisdef test_main(verbose=None): 17892a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis test_support.run_unittest( 17902a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis DateTimeTests, 17912a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis HeaderTests, 17922a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis CookieTests, 1793c5574e809b18d517f81e93542db76642662823cdMartin v. Löwis FileCookieJarTests, 17942a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis LWPCookieTests, 17952a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis ) 17962a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis 17972a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwisif __name__ == "__main__": 17982a6ba9097ee3942ae328befaf074ce9722b93ca0Martin v. Löwis test_main(verbose=True) 1799