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