14adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# -*- coding: latin-1 -*-
24adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao"""Tests for cookielib.py."""
34adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
44adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport cookielib
54adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport os
64adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport re
74adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport time
84adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
94adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom unittest import TestCase
104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom test import test_support
124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass DateTimeTests(TestCase):
154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_time2isoz(self):
174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from cookielib import time2isoz
184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        base = 1019227000
204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        day = 24*3600
214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(time2isoz(base), "2002-04-19 14:36:40Z")
224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(time2isoz(base+day), "2002-04-20 14:36:40Z")
234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(time2isoz(base+2*day), "2002-04-21 14:36:40Z")
244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(time2isoz(base+3*day), "2002-04-22 14:36:40Z")
254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        az = time2isoz()
274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        bz = time2isoz(500000)
284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for text in (az, bz):
294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertTrue(re.search(r"^\d{4}-\d\d-\d\d \d\d:\d\d:\d\dZ$", text),
304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         "bad time2isoz format: %s %s" % (az, bz))
314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_http2time(self):
334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from cookielib import http2time
344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def parse_date(text):
364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return time.gmtime(http2time(text))[:6]
374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(parse_date("01 Jan 2001"), (2001, 1, 1, 0, 0, 0.0))
394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # this test will break around year 2070
414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(parse_date("03-Feb-20"), (2020, 2, 3, 0, 0, 0.0))
424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # this test will break around year 2048
444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(parse_date("03-Feb-98"), (1998, 2, 3, 0, 0, 0.0))
454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_http2time_formats(self):
474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from cookielib import http2time, time2isoz
484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # test http2time for supported dates.  Test cases with 2 digit year
504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # will probably break in year 2044.
514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        tests = [
524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao         'Thu, 03 Feb 1994 00:00:00 GMT',  # proposed new HTTP format
534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao         'Thursday, 03-Feb-94 00:00:00 GMT',  # old rfc850 HTTP format
544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao         'Thursday, 03-Feb-1994 00:00:00 GMT',  # broken rfc850 HTTP format
554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao         '03 Feb 1994 00:00:00 GMT',  # HTTP format (no weekday)
574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao         '03-Feb-94 00:00:00 GMT',  # old rfc850 (no weekday)
584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao         '03-Feb-1994 00:00:00 GMT',  # broken rfc850 (no weekday)
594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao         '03-Feb-1994 00:00 GMT',  # broken rfc850 (no weekday, no seconds)
604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao         '03-Feb-1994 00:00',  # broken rfc850 (no weekday, no seconds, no tz)
614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao         '03-Feb-94',  # old rfc850 HTTP format (no weekday, no time)
634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao         '03-Feb-1994',  # broken rfc850 HTTP format (no weekday, no time)
644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao         '03 Feb 1994',  # proposed new HTTP format (no weekday, no time)
654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao         # A few tests with extra space at various places
674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao         '  03   Feb   1994  0:00  ',
684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao         '  03-Feb-1994  ',
694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ]
704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        test_t = 760233600  # assume broken POSIX counting of seconds
724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        result = time2isoz(test_t)
734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        expected = "1994-02-03 00:00:00Z"
744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(result, expected,
754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         "%s  =>  '%s' (%s)" % (test_t, result, expected))
764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for s in tests:
784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            t = http2time(s)
794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            t2 = http2time(s.lower())
804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            t3 = http2time(s.upper())
814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertTrue(t == t2 == t3 == test_t,
834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         "'%s'  =>  %s, %s, %s (%s)" % (s, t, t2, t3, test_t))
844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_http2time_garbage(self):
864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from cookielib import http2time
874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for test in [
894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            '',
904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            'Garbage',
914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            'Mandag 16. September 1996',
924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            '01-00-1980',
934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            '01-13-1980',
944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            '00-01-1980',
954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            '32-01-1980',
964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            '01-01-1980 25:00:00',
974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            '01-01-1980 00:61:00',
984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            '01-01-1980 00:00:62',
994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ]:
1004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertTrue(http2time(test) is None,
1014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         "http2time(%s) is not None\n"
1024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         "http2time(test) %s" % (test, http2time(test))
1034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         )
1044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass HeaderTests(TestCase):
1074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_parse_ns_headers_expires(self):
1094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from cookielib import parse_ns_headers
1104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # quotes should be stripped
1124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        expected = [[('foo', 'bar'), ('expires', 2209069412L), ('version', '0')]]
1134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for hdr in [
1144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            'foo=bar; expires=01 Jan 2040 22:23:32 GMT',
1154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            'foo=bar; expires="01 Jan 2040 22:23:32 GMT"',
1164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ]:
1174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(parse_ns_headers([hdr]), expected)
1184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_parse_ns_headers_version(self):
1204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from cookielib import parse_ns_headers
1214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # quotes should be stripped
1234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        expected = [[('foo', 'bar'), ('version', '1')]]
1244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for hdr in [
1254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            'foo=bar; version="1"',
1264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            'foo=bar; Version="1"',
1274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ]:
1284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(parse_ns_headers([hdr]), expected)
1294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_parse_ns_headers_special_names(self):
1314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # names such as 'expires' are not special in first name=value pair
1324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # of Set-Cookie: header
1334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from cookielib import parse_ns_headers
1344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Cookie with name 'expires'
1364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        hdr = 'expires=01 Jan 2040 22:23:32 GMT'
1374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        expected = [[("expires", "01 Jan 2040 22:23:32 GMT"), ("version", "0")]]
1384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(parse_ns_headers([hdr]), expected)
1394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_join_header_words(self):
1414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from cookielib import join_header_words
1424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        joined = join_header_words([[("foo", None), ("bar", "baz")]])
1444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(joined, "foo; bar=baz")
1454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(join_header_words([[]]), "")
1474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_split_header_words(self):
1494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from cookielib import split_header_words
1504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        tests = [
1524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ("foo", [[("foo", None)]]),
1534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ("foo=bar", [[("foo", "bar")]]),
1544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ("   foo   ", [[("foo", None)]]),
1554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ("   foo=   ", [[("foo", "")]]),
1564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ("   foo=", [[("foo", "")]]),
1574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ("   foo=   ; ", [[("foo", "")]]),
1584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ("   foo=   ; bar= baz ", [[("foo", ""), ("bar", "baz")]]),
1594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ("foo=bar bar=baz", [[("foo", "bar"), ("bar", "baz")]]),
1604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # doesn't really matter if this next fails, but it works ATM
1614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ("foo= bar=baz", [[("foo", "bar=baz")]]),
1624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ("foo=bar;bar=baz", [[("foo", "bar"), ("bar", "baz")]]),
1634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ('foo bar baz', [[("foo", None), ("bar", None), ("baz", None)]]),
1644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ("a, b, c", [[("a", None)], [("b", None)], [("c", None)]]),
1654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            (r'foo; bar=baz, spam=, foo="\,\;\"", bar= ',
1664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao             [[("foo", None), ("bar", "baz")],
1674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              [("spam", "")], [("foo", ',;"')], [("bar", "")]]),
1684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ]
1694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for arg, expect in tests:
1714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            try:
1724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                result = split_header_words([arg])
1734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            except:
1744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                import traceback, StringIO
1754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                f = StringIO.StringIO()
1764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                traceback.print_exc(None, f)
1774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                result = "(error -- traceback follows)\n\n%s" % f.getvalue()
1784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(result,  expect, """
1794adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoWhen parsing: '%s'
1804adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoExpected:     '%s'
1814adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoGot:          '%s'
1824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao""" % (arg, expect, result))
1834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_roundtrip(self):
1854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from cookielib import split_header_words, join_header_words
1864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        tests = [
1884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ("foo", "foo"),
1894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ("foo=bar", "foo=bar"),
1904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ("   foo   ", "foo"),
1914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ("foo=", 'foo=""'),
1924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ("foo=bar bar=baz", "foo=bar; bar=baz"),
1934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ("foo=bar;bar=baz", "foo=bar; bar=baz"),
1944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ('foo bar baz', "foo; bar; baz"),
1954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            (r'foo="\"" bar="\\"', r'foo="\""; bar="\\"'),
1964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ('foo,,,bar', 'foo, bar'),
1974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ('foo=bar,bar=baz', 'foo=bar, bar=baz'),
1984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ('text/html; charset=iso-8859-1',
2004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao             'text/html; charset="iso-8859-1"'),
2014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ('foo="bar"; port="80,81"; discard, bar=baz',
2034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao             'foo=bar; port="80,81"; discard, bar=baz'),
2044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            (r'Basic realm="\"foo\\\\bar\""',
2064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao             r'Basic; realm="\"foo\\\\bar\""')
2074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ]
2084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for arg, expect in tests:
2104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            input = split_header_words([arg])
2114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            res = join_header_words(input)
2124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(res, expect, """
2134adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoWhen parsing: '%s'
2144adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoExpected:     '%s'
2154adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoGot:          '%s'
2164adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoInput was:    '%s'
2174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao""" % (arg, expect, res, input))
2184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass FakeResponse:
2214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __init__(self, headers=[], url=None):
2224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """
2234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        headers: list of RFC822-style 'Key: value' strings
2244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """
2254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        import mimetools, StringIO
2264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        f = StringIO.StringIO("\n".join(headers))
2274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._headers = mimetools.Message(f)
2284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self._url = url
2294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def info(self): return self._headers
2304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef interact_2965(cookiejar, url, *set_cookie_hdrs):
2324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return _interact(cookiejar, url, set_cookie_hdrs, "Set-Cookie2")
2334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef interact_netscape(cookiejar, url, *set_cookie_hdrs):
2354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return _interact(cookiejar, url, set_cookie_hdrs, "Set-Cookie")
2364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef _interact(cookiejar, url, set_cookie_hdrs, hdr_name):
2384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Perform a single request / response cycle, returning Cookie: header."""
2394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    from urllib2 import Request
2404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    req = Request(url)
2414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    cookiejar.add_cookie_header(req)
2424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    cookie_hdr = req.get_header("Cookie", "")
2434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    headers = []
2444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    for hdr in set_cookie_hdrs:
2454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        headers.append("%s: %s" % (hdr_name, hdr))
2464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    res = FakeResponse(headers, url)
2474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    cookiejar.extract_cookies(res, req)
2484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    return cookie_hdr
2494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass FileCookieJarTests(TestCase):
2524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_lwp_valueless_cookie(self):
2534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # cookies with no value should be saved and loaded consistently
2544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from cookielib import LWPCookieJar
2554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        filename = test_support.TESTFN
2564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c = LWPCookieJar()
2574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_netscape(c, "http://www.acme.com/", 'boo')
2584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(c._cookies["www.acme.com"]["/"]["boo"].value, None)
2594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
2604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            c.save(filename, ignore_discard=True)
2614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            c = LWPCookieJar()
2624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            c.load(filename, ignore_discard=True)
2634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        finally:
2644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            try: os.unlink(filename)
2654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            except OSError: pass
2664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(c._cookies["www.acme.com"]["/"]["boo"].value, None)
2674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_bad_magic(self):
2694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from cookielib import LWPCookieJar, MozillaCookieJar, LoadError
2704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # IOErrors (eg. file doesn't exist) are allowed to propagate
2714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        filename = test_support.TESTFN
2724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for cookiejar_class in LWPCookieJar, MozillaCookieJar:
2734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            c = cookiejar_class()
2744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            try:
2754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                c.load(filename="for this test to work, a file with this "
2764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                "filename should not exist")
2774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            except IOError, exc:
2784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                # exactly IOError, not LoadError
2794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.assertEqual(exc.__class__, IOError)
2804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            else:
2814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.fail("expected IOError for invalid filename")
2824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Invalid contents of cookies file (eg. bad magic string)
2834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # causes a LoadError.
2844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
2854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            f = open(filename, "w")
2864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            f.write("oops\n")
2874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for cookiejar_class in LWPCookieJar, MozillaCookieJar:
2884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                c = cookiejar_class()
2894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.assertRaises(LoadError, c.load, filename)
2904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        finally:
2914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            try: os.unlink(filename)
2924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            except OSError: pass
2934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass CookieTests(TestCase):
2954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # XXX
2964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Get rid of string comparisons where not actually testing str / repr.
2974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # .clear() etc.
2984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # IP addresses like 50 (single number, no dot) and domain-matching
2994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    #  functions (and is_HDN)?  See draft RFC 2965 errata.
3004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Strictness switches
3014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # is_third_party()
3024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # unverifiability / third-party blocking
3034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Netscape cookies work the same as RFC 2965 with regard to port.
3044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Set-Cookie with negative max age.
3054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # If turn RFC 2965 handling off, Set-Cookie2 cookies should not clobber
3064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    #  Set-Cookie cookies.
3074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Cookie2 should be sent if *any* cookies are not V1 (ie. V0 OR V2 etc.).
3084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Cookies (V1 and V0) with no expiry date should be set to be discarded.
3094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # RFC 2965 Quoting:
3104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    #  Should accept unquoted cookie-attribute values?  check errata draft.
3114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    #   Which are required on the way in and out?
3124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    #  Should always return quoted cookie-attribute values?
3134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Proper testing of when RFC 2965 clobbers Netscape (waiting for errata).
3144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Path-match on return (same for V0 and V1).
3154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # RFC 2965 acceptance and returning rules
3164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    #  Set-Cookie2 without version attribute is rejected.
3174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Netscape peculiarities list from Ronald Tschalar.
3194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # The first two still need tests, the rest are covered.
3204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao## - Quoting: only quotes around the expires value are recognized as such
3214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao##   (and yes, some folks quote the expires value); quotes around any other
3224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao##   value are treated as part of the value.
3234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao## - White space: white space around names and values is ignored
3244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao## - Default path: if no path parameter is given, the path defaults to the
3254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao##   path in the request-uri up to, but not including, the last '/'. Note
3264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao##   that this is entirely different from what the spec says.
3274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao## - Commas and other delimiters: Netscape just parses until the next ';'.
3284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao##   This means it will allow commas etc inside values (and yes, both
3294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao##   commas and equals are commonly appear in the cookie value). This also
3304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao##   means that if you fold multiple Set-Cookie header fields into one,
3314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao##   comma-separated list, it'll be a headache to parse (at least my head
3324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao##   starts hurting everytime I think of that code).
3334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao## - Expires: You'll get all sorts of date formats in the expires,
3344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao##   including emtpy expires attributes ("expires="). Be as flexible as you
3354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao##   can, and certainly don't expect the weekday to be there; if you can't
3364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao##   parse it, just ignore it and pretend it's a session cookie.
3374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao## - Domain-matching: Netscape uses the 2-dot rule for _all_ domains, not
3384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao##   just the 7 special TLD's listed in their spec. And folks rely on
3394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao##   that...
3404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_domain_return_ok(self):
3424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # test optimization: .domain_return_ok() should filter out most
3434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # domains in the CookieJar before we try to access them (because that
3444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # may require disk access -- in particular, with MSIECookieJar)
3454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # This is only a rough check for performance reasons, so it's not too
3464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # critical as long as it's sufficiently liberal.
3474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        import cookielib, urllib2
3484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        pol = cookielib.DefaultCookiePolicy()
3494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for url, domain, ok in [
3504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ("http://foo.bar.com/", "blah.com", False),
3514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ("http://foo.bar.com/", "rhubarb.blah.com", False),
3524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ("http://foo.bar.com/", "rhubarb.foo.bar.com", False),
3534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ("http://foo.bar.com/", ".foo.bar.com", True),
3544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ("http://foo.bar.com/", "foo.bar.com", True),
3554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ("http://foo.bar.com/", ".bar.com", True),
3564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ("http://foo.bar.com/", "com", True),
3574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ("http://foo.com/", "rhubarb.foo.com", False),
3584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ("http://foo.com/", ".foo.com", True),
3594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ("http://foo.com/", "foo.com", True),
3604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ("http://foo.com/", "com", True),
3614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ("http://foo/", "rhubarb.foo", False),
3624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ("http://foo/", ".foo", True),
3634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ("http://foo/", "foo", True),
3644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ("http://foo/", "foo.local", True),
3654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ("http://foo/", ".local", True),
3664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ]:
3674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            request = urllib2.Request(url)
3684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            r = pol.domain_return_ok(domain, request)
3694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            if ok: self.assertTrue(r)
3704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            else: self.assertTrue(not r)
3714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_missing_value(self):
3734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from cookielib import MozillaCookieJar, lwp_cookie_str
3744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # missing = sign in Cookie: header is regarded by Mozilla as a missing
3764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # name, and by cookielib as a missing value
3774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        filename = test_support.TESTFN
3784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c = MozillaCookieJar(filename)
3794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_netscape(c, "http://www.acme.com/", 'eggs')
3804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_netscape(c, "http://www.acme.com/", '"spam"; path=/foo/')
3814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cookie = c._cookies["www.acme.com"]["/"]["eggs"]
3824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(cookie.value is None)
3834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(cookie.name, "eggs")
3844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cookie = c._cookies["www.acme.com"]['/foo/']['"spam"']
3854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(cookie.value is None)
3864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(cookie.name, '"spam"')
3874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(lwp_cookie_str(cookie), (
3884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            r'"spam"; path="/foo/"; domain="www.acme.com"; '
3894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            'path_spec; discard; version=0'))
3904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        old_str = repr(c)
3914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c.save(ignore_expires=True, ignore_discard=True)
3924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
3934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            c = MozillaCookieJar(filename)
3944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            c.revert(ignore_expires=True, ignore_discard=True)
3954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        finally:
3964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            os.unlink(c.filename)
3974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # cookies unchanged apart from lost info re. whether path was specified
3984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(
3994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            repr(c),
4004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            re.sub("path_specified=%s" % True, "path_specified=%s" % False,
4014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                   old_str)
4024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            )
4034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(interact_netscape(c, "http://www.acme.com/foo/"),
4044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         '"spam"; eggs')
4054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_rfc2109_handling(self):
4074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # RFC 2109 cookies are handled as RFC 2965 or Netscape cookies,
4084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # dependent on policy settings
4094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from cookielib import CookieJar, DefaultCookiePolicy
4104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for rfc2109_as_netscape, rfc2965, version in [
4124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # default according to rfc2965 if not explicitly specified
4134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            (None, False, 0),
4144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            (None, True, 1),
4154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # explicit rfc2109_as_netscape
4164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            (False, False, None),  # version None here means no cookie stored
4174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            (False, True, 1),
4184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            (True, False, 0),
4194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            (True, True, 0),
4204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ]:
4214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            policy = DefaultCookiePolicy(
4224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                rfc2109_as_netscape=rfc2109_as_netscape,
4234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                rfc2965=rfc2965)
4244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            c = CookieJar(policy)
4254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            interact_netscape(c, "http://www.example.com/", "ni=ni; Version=1")
4264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            try:
4274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                cookie = c._cookies["www.example.com"]["/"]["ni"]
4284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            except KeyError:
4294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.assertTrue(version is None)  # didn't expect a stored cookie
4304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            else:
4314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.assertEqual(cookie.version, version)
4324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                # 2965 cookies are unaffected
4334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                interact_2965(c, "http://www.example.com/",
4344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                              "foo=bar; Version=1")
4354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if rfc2965:
4364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    cookie2965 = c._cookies["www.example.com"]["/"]["foo"]
4374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    self.assertEqual(cookie2965.version, 1)
4384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_ns_parser(self):
4404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from cookielib import CookieJar, DEFAULT_HTTP_PORT
4414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c = CookieJar()
4434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_netscape(c, "http://www.acme.com/",
4444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          'spam=eggs; DoMain=.acme.com; port; blArgh="feep"')
4454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_netscape(c, "http://www.acme.com/", 'ni=ni; port=80,8080')
4464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_netscape(c, "http://www.acme.com:80/", 'nini=ni')
4474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_netscape(c, "http://www.acme.com:80/", 'foo=bar; expires=')
4484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_netscape(c, "http://www.acme.com:80/", 'spam=eggs; '
4494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          'expires="Foo Bar 25 33:22:11 3022"')
4504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cookie = c._cookies[".acme.com"]["/"]["spam"]
4524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(cookie.domain, ".acme.com")
4534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(cookie.domain_specified)
4544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(cookie.port, DEFAULT_HTTP_PORT)
4554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(not cookie.port_specified)
4564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # case is preserved
4574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(cookie.has_nonstandard_attr("blArgh") and
4584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                     not cookie.has_nonstandard_attr("blargh"))
4594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cookie = c._cookies["www.acme.com"]["/"]["ni"]
4614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(cookie.domain, "www.acme.com")
4624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(not cookie.domain_specified)
4634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(cookie.port, "80,8080")
4644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(cookie.port_specified)
4654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cookie = c._cookies["www.acme.com"]["/"]["nini"]
4674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(cookie.port is None)
4684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(not cookie.port_specified)
4694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # invalid expires should not cause cookie to be dropped
4714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        foo = c._cookies["www.acme.com"]["/"]["foo"]
4724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        spam = c._cookies["www.acme.com"]["/"]["foo"]
4734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(foo.expires is None)
4744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(spam.expires is None)
4754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_ns_parser_special_names(self):
4774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # names such as 'expires' are not special in first name=value pair
4784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # of Set-Cookie: header
4794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from cookielib import CookieJar
4804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c = CookieJar()
4824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_netscape(c, "http://www.acme.com/", 'expires=eggs')
4834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_netscape(c, "http://www.acme.com/", 'version=eggs; spam=eggs')
4844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cookies = c._cookies["www.acme.com"]["/"]
4864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue('expires' in cookies)
4874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue('version' in cookies)
4884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_expires(self):
4904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from cookielib import time2netscape, CookieJar
4914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # if expires is in future, keep cookie...
4934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c = CookieJar()
4944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        future = time2netscape(time.time()+3600)
4954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_netscape(c, "http://www.acme.com/", 'spam="bar"; expires=%s' %
4964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          future)
4974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(c), 1)
4984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        now = time2netscape(time.time()-1)
4994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # ... and if in past or present, discard it
5004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_netscape(c, "http://www.acme.com/", 'foo="eggs"; expires=%s' %
5014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          now)
5024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        h = interact_netscape(c, "http://www.acme.com/")
5034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(c), 1)
5044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue('spam="bar"' in h and "foo" not in h)
5054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # max-age takes precedence over expires, and zero max-age is request to
5074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # delete both new cookie and any old matching cookie
5084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_netscape(c, "http://www.acme.com/", 'eggs="bar"; expires=%s' %
5094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          future)
5104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_netscape(c, "http://www.acme.com/", 'bar="bar"; expires=%s' %
5114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          future)
5124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(c), 3)
5134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_netscape(c, "http://www.acme.com/", 'eggs="bar"; '
5144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          'expires=%s; max-age=0' % future)
5154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_netscape(c, "http://www.acme.com/", 'bar="bar"; '
5164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          'max-age=0; expires=%s' % future)
5174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        h = interact_netscape(c, "http://www.acme.com/")
5184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(c), 1)
5194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # test expiry at end of session for cookies with no expires attribute
5214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_netscape(c, "http://www.rhubarb.net/", 'whum="fizz"')
5224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(c), 2)
5234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c.clear_session_cookies()
5244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(c), 1)
5254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIn('spam="bar"', h)
5264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # XXX RFC 2965 expiry rules (some apply to V0 too)
5284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_default_path(self):
5304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from cookielib import CookieJar, DefaultCookiePolicy
5314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # RFC 2965
5334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        pol = DefaultCookiePolicy(rfc2965=True)
5344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c = CookieJar(pol)
5364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_2965(c, "http://www.acme.com/", 'spam="bar"; Version="1"')
5374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIn("/", c._cookies["www.acme.com"])
5384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c = CookieJar(pol)
5404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_2965(c, "http://www.acme.com/blah", 'eggs="bar"; Version="1"')
5414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIn("/", c._cookies["www.acme.com"])
5424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c = CookieJar(pol)
5444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_2965(c, "http://www.acme.com/blah/rhubarb",
5454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                      'eggs="bar"; Version="1"')
5464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIn("/blah/", c._cookies["www.acme.com"])
5474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c = CookieJar(pol)
5494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_2965(c, "http://www.acme.com/blah/rhubarb/",
5504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                      'eggs="bar"; Version="1"')
5514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIn("/blah/rhubarb/", c._cookies["www.acme.com"])
5524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Netscape
5544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c = CookieJar()
5564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_netscape(c, "http://www.acme.com/", 'spam="bar"')
5574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIn("/", c._cookies["www.acme.com"])
5584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c = CookieJar()
5604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_netscape(c, "http://www.acme.com/blah", 'eggs="bar"')
5614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIn("/", c._cookies["www.acme.com"])
5624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c = CookieJar()
5644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_netscape(c, "http://www.acme.com/blah/rhubarb", 'eggs="bar"')
5654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIn("/blah", c._cookies["www.acme.com"])
5664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c = CookieJar()
5684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_netscape(c, "http://www.acme.com/blah/rhubarb/", 'eggs="bar"')
5694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIn("/blah/rhubarb", c._cookies["www.acme.com"])
5704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_default_path_with_query(self):
5724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cj = cookielib.CookieJar()
5734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        uri = "http://example.com/?spam/eggs"
5744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        value = 'eggs="bar"'
5754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_netscape(cj, uri, value)
5764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # default path does not include query, so is "/", not "/?spam"
5774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIn("/", cj._cookies["example.com"])
5784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # cookie is sent back to the same URI
5794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(interact_netscape(cj, uri), value)
5804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_escape_path(self):
5824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from cookielib import escape_path
5834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cases = [
5844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # quoted safe
5854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ("/foo%2f/bar", "/foo%2F/bar"),
5864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ("/foo%2F/bar", "/foo%2F/bar"),
5874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # quoted %
5884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ("/foo%%/bar", "/foo%%/bar"),
5894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # quoted unsafe
5904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ("/fo%19o/bar", "/fo%19o/bar"),
5914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ("/fo%7do/bar", "/fo%7Do/bar"),
5924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # unquoted safe
5934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ("/foo/bar&", "/foo/bar&"),
5944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ("/foo//bar", "/foo//bar"),
5954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ("\176/foo/bar", "\176/foo/bar"),
5964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # unquoted unsafe
5974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ("/foo\031/bar", "/foo%19/bar"),
5984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ("/\175foo/bar", "/%7Dfoo/bar"),
5994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # unicode
6004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            (u"/foo/bar\uabcd", "/foo/bar%EA%AF%8D"),  # UTF-8 encoded
6014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ]
6024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for arg, result in cases:
6034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(escape_path(arg), result)
6044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_request_path(self):
6064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from urllib2 import Request
6074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from cookielib import request_path
6084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # with parameters
6094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        req = Request("http://www.example.com/rheum/rhaponticum;"
6104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                      "foo=bar;sing=song?apples=pears&spam=eggs#ni")
6114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(request_path(req),
6124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         "/rheum/rhaponticum;foo=bar;sing=song")
6134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # without parameters
6144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        req = Request("http://www.example.com/rheum/rhaponticum?"
6154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                      "apples=pears&spam=eggs#ni")
6164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(request_path(req), "/rheum/rhaponticum")
6174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # missing final slash
6184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        req = Request("http://www.example.com")
6194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(request_path(req), "/")
6204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_request_port(self):
6224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from urllib2 import Request
6234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from cookielib import request_port, DEFAULT_HTTP_PORT
6244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        req = Request("http://www.acme.com:1234/",
6254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                      headers={"Host": "www.acme.com:4321"})
6264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(request_port(req), "1234")
6274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        req = Request("http://www.acme.com/",
6284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                      headers={"Host": "www.acme.com:4321"})
6294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(request_port(req), DEFAULT_HTTP_PORT)
6304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_request_host(self):
6324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from urllib2 import Request
6334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from cookielib import request_host
6344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # this request is illegal (RFC2616, 14.2.3)
6354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        req = Request("http://1.1.1.1/",
6364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                      headers={"Host": "www.acme.com:80"})
6374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # libwww-perl wants this response, but that seems wrong (RFC 2616,
6384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # section 5.2, point 1., and RFC 2965 section 1, paragraph 3)
6394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #self.assertEqual(request_host(req), "www.acme.com")
6404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(request_host(req), "1.1.1.1")
6414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        req = Request("http://www.acme.com/",
6424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                      headers={"Host": "irrelevant.com"})
6434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(request_host(req), "www.acme.com")
6444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # not actually sure this one is valid Request object, so maybe should
6454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # remove test for no host in url in request_host function?
6464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        req = Request("/resource.html",
6474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                      headers={"Host": "www.acme.com"})
6484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(request_host(req), "www.acme.com")
6494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # port shouldn't be in request-host
6504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        req = Request("http://www.acme.com:2345/resource.html",
6514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                      headers={"Host": "www.acme.com:5432"})
6524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(request_host(req), "www.acme.com")
6534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_is_HDN(self):
6554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from cookielib import is_HDN
6564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(is_HDN("foo.bar.com"))
6574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(is_HDN("1foo2.3bar4.5com"))
6584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(not is_HDN("192.168.1.1"))
6594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(not is_HDN(""))
6604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(not is_HDN("."))
6614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(not is_HDN(".foo.bar.com"))
6624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(not is_HDN("..foo"))
6634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(not is_HDN("foo."))
6644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_reach(self):
6664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from cookielib import reach
6674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(reach("www.acme.com"), ".acme.com")
6684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(reach("acme.com"), "acme.com")
6694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(reach("acme.local"), ".local")
6704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(reach(".local"), ".local")
6714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(reach(".com"), ".com")
6724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(reach("."), ".")
6734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(reach(""), "")
6744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(reach("192.168.0.1"), "192.168.0.1")
6754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_domain_match(self):
6774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from cookielib import domain_match, user_domain_match
6784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(domain_match("192.168.1.1", "192.168.1.1"))
6794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(not domain_match("192.168.1.1", ".168.1.1"))
6804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(domain_match("x.y.com", "x.Y.com"))
6814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(domain_match("x.y.com", ".Y.com"))
6824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(not domain_match("x.y.com", "Y.com"))
6834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(domain_match("a.b.c.com", ".c.com"))
6844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(not domain_match(".c.com", "a.b.c.com"))
6854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(domain_match("example.local", ".local"))
6864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(not domain_match("blah.blah", ""))
6874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(not domain_match("", ".rhubarb.rhubarb"))
6884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(domain_match("", ""))
6894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(user_domain_match("acme.com", "acme.com"))
6914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(not user_domain_match("acme.com", ".acme.com"))
6924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(user_domain_match("rhubarb.acme.com", ".acme.com"))
6934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(user_domain_match("www.rhubarb.acme.com", ".acme.com"))
6944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(user_domain_match("x.y.com", "x.Y.com"))
6954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(user_domain_match("x.y.com", ".Y.com"))
6964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(not user_domain_match("x.y.com", "Y.com"))
6974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(user_domain_match("y.com", "Y.com"))
6984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(not user_domain_match(".y.com", "Y.com"))
6994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(user_domain_match(".y.com", ".Y.com"))
7004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(user_domain_match("x.y.com", ".com"))
7014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(not user_domain_match("x.y.com", "com"))
7024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(not user_domain_match("x.y.com", "m"))
7034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(not user_domain_match("x.y.com", ".m"))
7044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(not user_domain_match("x.y.com", ""))
7054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(not user_domain_match("x.y.com", "."))
7064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(user_domain_match("192.168.1.1", "192.168.1.1"))
7074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # not both HDNs, so must string-compare equal to match
7084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(not user_domain_match("192.168.1.1", ".168.1.1"))
7094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(not user_domain_match("192.168.1.1", "."))
7104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # empty string is a special case
7114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(not user_domain_match("192.168.1.1", ""))
7124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_wrong_domain(self):
7144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Cookies whose effective request-host name does not domain-match the
7154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # domain are rejected.
7164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # XXX far from complete
7184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from cookielib import CookieJar
7194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c = CookieJar()
7204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_2965(c, "http://www.nasty.com/",
7214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                      'foo=bar; domain=friendly.org; Version="1"')
7224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(c), 0)
7234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_strict_domain(self):
7254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Cookies whose domain is a country-code tld like .co.uk should
7264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # not be set if CookiePolicy.strict_domain is true.
7274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from cookielib import CookieJar, DefaultCookiePolicy
7284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cp = DefaultCookiePolicy(strict_domain=True)
7304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cj = CookieJar(policy=cp)
7314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_netscape(cj, "http://example.co.uk/", 'no=problemo')
7324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_netscape(cj, "http://example.co.uk/",
7334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          'okey=dokey; Domain=.example.co.uk')
7344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(cj), 2)
7354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for pseudo_tld in [".co.uk", ".org.za", ".tx.us", ".name.us"]:
7364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            interact_netscape(cj, "http://example.%s/" % pseudo_tld,
7374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                              'spam=eggs; Domain=.co.uk')
7384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(len(cj), 2)
7394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_two_component_domain_ns(self):
7414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Netscape: .www.bar.com, www.bar.com, .bar.com, bar.com, no domain
7424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # should all get accepted, as should .acme.com, acme.com and no domain
7434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # for 2-component domains like acme.com.
7444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from cookielib import CookieJar, DefaultCookiePolicy
7454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c = CookieJar()
7474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # two-component V0 domain is OK
7494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_netscape(c, "http://foo.net/", 'ns=bar')
7504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(c), 1)
7514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(c._cookies["foo.net"]["/"]["ns"].value, "bar")
7524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(interact_netscape(c, "http://foo.net/"), "ns=bar")
7534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # *will* be returned to any other domain (unlike RFC 2965)...
7544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(interact_netscape(c, "http://www.foo.net/"),
7554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         "ns=bar")
7564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # ...unless requested otherwise
7574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        pol = DefaultCookiePolicy(
7584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            strict_ns_domain=DefaultCookiePolicy.DomainStrictNonDomain)
7594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c.set_policy(pol)
7604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(interact_netscape(c, "http://www.foo.net/"), "")
7614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # unlike RFC 2965, even explicit two-component domain is OK,
7634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # because .foo.net matches foo.net
7644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_netscape(c, "http://foo.net/foo/",
7654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          'spam1=eggs; domain=foo.net')
7664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # even if starts with a dot -- in NS rules, .foo.net matches foo.net!
7674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_netscape(c, "http://foo.net/foo/bar/",
7684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          'spam2=eggs; domain=.foo.net')
7694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(c), 3)
7704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(c._cookies[".foo.net"]["/foo"]["spam1"].value,
7714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         "eggs")
7724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(c._cookies[".foo.net"]["/foo/bar"]["spam2"].value,
7734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         "eggs")
7744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(interact_netscape(c, "http://foo.net/foo/bar/"),
7754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         "spam2=eggs; spam1=eggs; ns=bar")
7764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # top-level domain is too general
7784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_netscape(c, "http://foo.net/", 'nini="ni"; domain=.net')
7794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(c), 3)
7804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao##         # Netscape protocol doesn't allow non-special top level domains (such
7824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao##         # as co.uk) in the domain attribute unless there are at least three
7834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao##         # dots in it.
7844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Oh yes it does!  Real implementations don't check this, and real
7854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # cookies (of course) rely on that behaviour.
7864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_netscape(c, "http://foo.co.uk", 'nasty=trick; domain=.co.uk')
7874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao##         self.assertEqual(len(c), 2)
7884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(c), 4)
7894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_two_component_domain_rfc2965(self):
7914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from cookielib import CookieJar, DefaultCookiePolicy
7924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        pol = DefaultCookiePolicy(rfc2965=True)
7944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c = CookieJar(pol)
7954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
7964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # two-component V1 domain is OK
7974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_2965(c, "http://foo.net/", 'foo=bar; Version="1"')
7984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(c), 1)
7994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(c._cookies["foo.net"]["/"]["foo"].value, "bar")
8004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(interact_2965(c, "http://foo.net/"),
8014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         "$Version=1; foo=bar")
8024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # won't be returned to any other domain (because domain was implied)
8034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(interact_2965(c, "http://www.foo.net/"), "")
8044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # unless domain is given explicitly, because then it must be
8064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # rewritten to start with a dot: foo.net --> .foo.net, which does
8074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # not domain-match foo.net
8084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_2965(c, "http://foo.net/foo",
8094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                      'spam=eggs; domain=foo.net; path=/foo; Version="1"')
8104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(c), 1)
8114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(interact_2965(c, "http://foo.net/foo"),
8124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         "$Version=1; foo=bar")
8134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # explicit foo.net from three-component domain www.foo.net *does* get
8154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # set, because .foo.net domain-matches .foo.net
8164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_2965(c, "http://www.foo.net/foo/",
8174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                      'spam=eggs; domain=foo.net; Version="1"')
8184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(c._cookies[".foo.net"]["/foo/"]["spam"].value,
8194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         "eggs")
8204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(c), 2)
8214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(interact_2965(c, "http://foo.net/foo/"),
8224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         "$Version=1; foo=bar")
8234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(interact_2965(c, "http://www.foo.net/foo/"),
8244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         '$Version=1; spam=eggs; $Domain="foo.net"')
8254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # top-level domain is too general
8274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_2965(c, "http://foo.net/",
8284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                      'ni="ni"; domain=".net"; Version="1"')
8294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(c), 2)
8304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # RFC 2965 doesn't require blocking this
8324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_2965(c, "http://foo.co.uk/",
8334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                      'nasty=trick; domain=.co.uk; Version="1"')
8344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(c), 3)
8354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_domain_allow(self):
8374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from cookielib import CookieJar, DefaultCookiePolicy
8384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from urllib2 import Request
8394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c = CookieJar(policy=DefaultCookiePolicy(
8414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            blocked_domains=["acme.com"],
8424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            allowed_domains=["www.acme.com"]))
8434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        req = Request("http://acme.com/")
8454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        headers = ["Set-Cookie: CUSTOMER=WILE_E_COYOTE; path=/"]
8464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        res = FakeResponse(headers, "http://acme.com/")
8474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c.extract_cookies(res, req)
8484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(c), 0)
8494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        req = Request("http://www.acme.com/")
8514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        res = FakeResponse(headers, "http://www.acme.com/")
8524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c.extract_cookies(res, req)
8534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(c), 1)
8544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        req = Request("http://www.coyote.com/")
8564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        res = FakeResponse(headers, "http://www.coyote.com/")
8574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c.extract_cookies(res, req)
8584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(c), 1)
8594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # set a cookie with non-allowed domain...
8614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        req = Request("http://www.coyote.com/")
8624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        res = FakeResponse(headers, "http://www.coyote.com/")
8634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cookies = c.make_cookies(res, req)
8644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c.set_cookie(cookies[0])
8654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(c), 2)
8664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # ... and check is doesn't get returned
8674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c.add_cookie_header(req)
8684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(not req.has_header("Cookie"))
8694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_domain_block(self):
8714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from cookielib import CookieJar, DefaultCookiePolicy
8724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from urllib2 import Request
8734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        pol = DefaultCookiePolicy(
8754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            rfc2965=True, blocked_domains=[".acme.com"])
8764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c = CookieJar(policy=pol)
8774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        headers = ["Set-Cookie: CUSTOMER=WILE_E_COYOTE; path=/"]
8784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        req = Request("http://www.acme.com/")
8804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        res = FakeResponse(headers, "http://www.acme.com/")
8814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c.extract_cookies(res, req)
8824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(c), 0)
8834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        p = pol.set_blocked_domains(["acme.com"])
8854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c.extract_cookies(res, req)
8864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(c), 1)
8874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c.clear()
8894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        req = Request("http://www.roadrunner.net/")
8904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        res = FakeResponse(headers, "http://www.roadrunner.net/")
8914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c.extract_cookies(res, req)
8924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(c), 1)
8934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        req = Request("http://www.roadrunner.net/")
8944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c.add_cookie_header(req)
8954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue((req.has_header("Cookie") and
8964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                      req.has_header("Cookie2")))
8974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
8984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c.clear()
8994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        pol.set_blocked_domains([".acme.com"])
9004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c.extract_cookies(res, req)
9014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(c), 1)
9024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # set a cookie with blocked domain...
9044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        req = Request("http://www.acme.com/")
9054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        res = FakeResponse(headers, "http://www.acme.com/")
9064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cookies = c.make_cookies(res, req)
9074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c.set_cookie(cookies[0])
9084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(c), 2)
9094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # ... and check is doesn't get returned
9104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c.add_cookie_header(req)
9114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(not req.has_header("Cookie"))
9124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_secure(self):
9144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from cookielib import CookieJar, DefaultCookiePolicy
9154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for ns in True, False:
9174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for whitespace in " ", "":
9184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                c = CookieJar()
9194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if ns:
9204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    pol = DefaultCookiePolicy(rfc2965=False)
9214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    int = interact_netscape
9224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    vs = ""
9234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                else:
9244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    pol = DefaultCookiePolicy(rfc2965=True)
9254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    int = interact_2965
9264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    vs = "; Version=1"
9274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                c.set_policy(pol)
9284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                url = "http://www.acme.com/"
9294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                int(c, url, "foo1=bar%s%s" % (vs, whitespace))
9304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                int(c, url, "foo2=bar%s; secure%s" %  (vs, whitespace))
9314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.assertTrue(
9324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    not c._cookies["www.acme.com"]["/"]["foo1"].secure,
9334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    "non-secure cookie registered secure")
9344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.assertTrue(
9354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    c._cookies["www.acme.com"]["/"]["foo2"].secure,
9364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    "secure cookie registered non-secure")
9374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_quote_cookie_value(self):
9394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from cookielib import CookieJar, DefaultCookiePolicy
9404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c = CookieJar(policy=DefaultCookiePolicy(rfc2965=True))
9414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_2965(c, "http://www.acme.com/", r'foo=\b"a"r; Version=1')
9424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        h = interact_2965(c, "http://www.acme.com/")
9434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(h, r'$Version=1; foo=\\b\"a\"r')
9444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_missing_final_slash(self):
9464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Missing slash from request URL's abs_path should be assumed present.
9474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from cookielib import CookieJar, DefaultCookiePolicy
9484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from urllib2 import Request
9494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        url = "http://www.acme.com"
9504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c = CookieJar(DefaultCookiePolicy(rfc2965=True))
9514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_2965(c, url, "foo=bar; Version=1")
9524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        req = Request(url)
9534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(c), 1)
9544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c.add_cookie_header(req)
9554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(req.has_header("Cookie"))
9564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_domain_mirror(self):
9584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from cookielib import CookieJar, DefaultCookiePolicy
9594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        pol = DefaultCookiePolicy(rfc2965=True)
9614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c = CookieJar(pol)
9634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        url = "http://foo.bar.com/"
9644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_2965(c, url, "spam=eggs; Version=1")
9654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        h = interact_2965(c, url)
9664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertNotIn("Domain", h,
9674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         "absent domain returned with domain present")
9684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c = CookieJar(pol)
9704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        url = "http://foo.bar.com/"
9714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_2965(c, url, 'spam=eggs; Version=1; Domain=.bar.com')
9724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        h = interact_2965(c, url)
9734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIn('$Domain=".bar.com"', h, "domain not returned")
9744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c = CookieJar(pol)
9764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        url = "http://foo.bar.com/"
9774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # note missing initial dot in Domain
9784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_2965(c, url, 'spam=eggs; Version=1; Domain=bar.com')
9794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        h = interact_2965(c, url)
9804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIn('$Domain="bar.com"', h, "domain not returned")
9814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_path_mirror(self):
9834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from cookielib import CookieJar, DefaultCookiePolicy
9844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        pol = DefaultCookiePolicy(rfc2965=True)
9864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c = CookieJar(pol)
9884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        url = "http://foo.bar.com/"
9894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_2965(c, url, "spam=eggs; Version=1")
9904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        h = interact_2965(c, url)
9914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertNotIn("Path", h, "absent path returned with path present")
9924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c = CookieJar(pol)
9944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        url = "http://foo.bar.com/"
9954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_2965(c, url, 'spam=eggs; Version=1; Path=/')
9964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        h = interact_2965(c, url)
9974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIn('$Path="/"', h, "path not returned")
9984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
9994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_port_mirror(self):
10004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from cookielib import CookieJar, DefaultCookiePolicy
10014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        pol = DefaultCookiePolicy(rfc2965=True)
10034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c = CookieJar(pol)
10054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        url = "http://foo.bar.com/"
10064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_2965(c, url, "spam=eggs; Version=1")
10074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        h = interact_2965(c, url)
10084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertNotIn("Port", h, "absent port returned with port present")
10094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c = CookieJar(pol)
10114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        url = "http://foo.bar.com/"
10124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_2965(c, url, "spam=eggs; Version=1; Port")
10134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        h = interact_2965(c, url)
10144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(re.search("\$Port([^=]|$)", h),
10154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                     "port with no value not returned with no value")
10164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c = CookieJar(pol)
10184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        url = "http://foo.bar.com/"
10194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_2965(c, url, 'spam=eggs; Version=1; Port="80"')
10204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        h = interact_2965(c, url)
10214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIn('$Port="80"', h,
10224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                      "port with single value not returned with single value")
10234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c = CookieJar(pol)
10254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        url = "http://foo.bar.com/"
10264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_2965(c, url, 'spam=eggs; Version=1; Port="80,8080"')
10274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        h = interact_2965(c, url)
10284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIn('$Port="80,8080"', h,
10294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                      "port with multiple values not returned with multiple "
10304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                      "values")
10314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_no_return_comment(self):
10334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from cookielib import CookieJar, DefaultCookiePolicy
10344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c = CookieJar(DefaultCookiePolicy(rfc2965=True))
10364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        url = "http://foo.bar.com/"
10374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_2965(c, url, 'spam=eggs; Version=1; '
10384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                      'Comment="does anybody read these?"; '
10394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                      'CommentURL="http://foo.bar.net/comment.html"')
10404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        h = interact_2965(c, url)
10414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(
10424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "Comment" not in h,
10434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "Comment or CommentURL cookie-attributes returned to server")
10444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_Cookie_iterator(self):
10464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from cookielib import CookieJar, Cookie, DefaultCookiePolicy
10474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cs = CookieJar(DefaultCookiePolicy(rfc2965=True))
10494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # add some random cookies
10504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_2965(cs, "http://blah.spam.org/", 'foo=eggs; Version=1; '
10514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                      'Comment="does anybody read these?"; '
10524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                      'CommentURL="http://foo.bar.net/comment.html"')
10534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_netscape(cs, "http://www.acme.com/blah/", "spam=bar; secure")
10544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_2965(cs, "http://www.acme.com/blah/",
10554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                      "foo=bar; secure; Version=1")
10564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_2965(cs, "http://www.acme.com/blah/",
10574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                      "foo=bar; path=/; Version=1")
10584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_2965(cs, "http://www.sol.no",
10594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                      r'bang=wallop; version=1; domain=".sol.no"; '
10604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                      r'port="90,100, 80,8080"; '
10614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                      r'max-age=100; Comment = "Just kidding! (\"|\\\\) "')
10624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        versions = [1, 1, 1, 0, 1]
10644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        names = ["bang", "foo", "foo", "spam", "foo"]
10654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        domains = [".sol.no", "blah.spam.org", "www.acme.com",
10664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                   "www.acme.com", "www.acme.com"]
10674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        paths = ["/", "/", "/", "/blah", "/blah/"]
10684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for i in range(4):
10704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            i = 0
10714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for c in cs:
10724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.assertIsInstance(c, Cookie)
10734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.assertEqual(c.version, versions[i])
10744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.assertEqual(c.name, names[i])
10754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.assertEqual(c.domain, domains[i])
10764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.assertEqual(c.path, paths[i])
10774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                i = i + 1
10784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_parse_ns_headers(self):
10804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from cookielib import parse_ns_headers
10814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
10824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # missing domain value (invalid cookie)
10834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(
10844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            parse_ns_headers(["foo=bar; path=/; domain"]),
10854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            [[("foo", "bar"),
10864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao              ("path", "/"), ("domain", None), ("version", "0")]]
10874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            )
10884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # invalid expires value
10894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(
10904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            parse_ns_headers(["foo=bar; expires=Foo Bar 12 33:22:11 2000"]),
10914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            [[("foo", "bar"), ("expires", None), ("version", "0")]]
10924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            )
10934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # missing cookie value (valid cookie)
10944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(
10954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            parse_ns_headers(["foo"]),
10964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            [[("foo", None), ("version", "0")]]
10974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            )
10984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # shouldn't add version if header is empty
10994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(parse_ns_headers([""]), [])
11004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_bad_cookie_header(self):
11024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def cookiejar_from_cookie_headers(headers):
11044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            from cookielib import CookieJar
11054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            from urllib2 import Request
11064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            c = CookieJar()
11074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            req = Request("http://www.example.com/")
11084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            r = FakeResponse(headers, "http://www.example.com/")
11094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            c.extract_cookies(r, req)
11104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return c
11114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # none of these bad headers should cause an exception to be raised
11134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for headers in [
11144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ["Set-Cookie: "],  # actually, nothing wrong with this
11154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ["Set-Cookie2: "],  # ditto
11164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # missing domain value
11174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ["Set-Cookie2: a=foo; path=/; Version=1; domain"],
11184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # bad max-age
11194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ["Set-Cookie: b=foo; max-age=oops"],
11204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # bad version
11214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ["Set-Cookie: b=foo; version=spam"],
11224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ]:
11234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            c = cookiejar_from_cookie_headers(headers)
11244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # these bad cookies shouldn't be set
11254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(len(c), 0)
11264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # cookie with invalid expires is treated as session cookie
11284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        headers = ["Set-Cookie: c=foo; expires=Foo Bar 12 33:22:11 2000"]
11294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c = cookiejar_from_cookie_headers(headers)
11304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cookie = c._cookies["www.example.com"]["/"]["c"]
11314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(cookie.expires is None)
11324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass LWPCookieTests(TestCase):
11354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Tests taken from libwww-perl, with a few modifications and additions.
11364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_netscape_example_1(self):
11384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from cookielib import CookieJar, DefaultCookiePolicy
11394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from urllib2 import Request
11404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #-------------------------------------------------------------------
11424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # First we check that it works for the original example at
11434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # http://www.netscape.com/newsref/std/cookie_spec.html
11444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Client requests a document, and receives in the response:
11464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
11474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #       Set-Cookie: CUSTOMER=WILE_E_COYOTE; path=/; expires=Wednesday, 09-Nov-99 23:12:40 GMT
11484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
11494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # When client requests a URL in path "/" on this server, it sends:
11504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
11514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #       Cookie: CUSTOMER=WILE_E_COYOTE
11524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
11534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Client requests a document, and receives in the response:
11544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
11554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #       Set-Cookie: PART_NUMBER=ROCKET_LAUNCHER_0001; path=/
11564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
11574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # When client requests a URL in path "/" on this server, it sends:
11584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
11594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #       Cookie: CUSTOMER=WILE_E_COYOTE; PART_NUMBER=ROCKET_LAUNCHER_0001
11604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
11614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Client receives:
11624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
11634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #       Set-Cookie: SHIPPING=FEDEX; path=/fo
11644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
11654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # When client requests a URL in path "/" on this server, it sends:
11664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
11674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #       Cookie: CUSTOMER=WILE_E_COYOTE; PART_NUMBER=ROCKET_LAUNCHER_0001
11684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
11694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # When client requests a URL in path "/foo" on this server, it sends:
11704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
11714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #       Cookie: CUSTOMER=WILE_E_COYOTE; PART_NUMBER=ROCKET_LAUNCHER_0001; SHIPPING=FEDEX
11724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
11734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # The last Cookie is buggy, because both specifications say that the
11744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # most specific cookie must be sent first.  SHIPPING=FEDEX is the
11754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # most specific and should thus be first.
11764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        year_plus_one = time.localtime()[0] + 1
11784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        headers = []
11804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c = CookieJar(DefaultCookiePolicy(rfc2965 = True))
11824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #req = Request("http://1.1.1.1/",
11844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #              headers={"Host": "www.acme.com:80"})
11854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        req = Request("http://www.acme.com:80/",
11864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                      headers={"Host": "www.acme.com:80"})
11874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        headers.append(
11894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "Set-Cookie: CUSTOMER=WILE_E_COYOTE; path=/ ; "
11904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "expires=Wednesday, 09-Nov-%d 23:12:40 GMT" % year_plus_one)
11914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        res = FakeResponse(headers, "http://www.acme.com/")
11924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c.extract_cookies(res, req)
11934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        req = Request("http://www.acme.com/")
11954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c.add_cookie_header(req)
11964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
11974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(req.get_header("Cookie"), "CUSTOMER=WILE_E_COYOTE")
11984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(req.get_header("Cookie2"), '$Version="1"')
11994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        headers.append("Set-Cookie: PART_NUMBER=ROCKET_LAUNCHER_0001; path=/")
12014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        res = FakeResponse(headers, "http://www.acme.com/")
12024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c.extract_cookies(res, req)
12034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        req = Request("http://www.acme.com/foo/bar")
12054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c.add_cookie_header(req)
12064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        h = req.get_header("Cookie")
12084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIn("PART_NUMBER=ROCKET_LAUNCHER_0001", h)
12094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIn("CUSTOMER=WILE_E_COYOTE", h)
12104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        headers.append('Set-Cookie: SHIPPING=FEDEX; path=/foo')
12124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        res = FakeResponse(headers, "http://www.acme.com")
12134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c.extract_cookies(res, req)
12144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        req = Request("http://www.acme.com/")
12164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c.add_cookie_header(req)
12174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        h = req.get_header("Cookie")
12194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIn("PART_NUMBER=ROCKET_LAUNCHER_0001", h)
12204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIn("CUSTOMER=WILE_E_COYOTE", h)
12214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertNotIn("SHIPPING=FEDEX", h)
12224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        req = Request("http://www.acme.com/foo/")
12244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c.add_cookie_header(req)
12254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        h = req.get_header("Cookie")
12274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIn("PART_NUMBER=ROCKET_LAUNCHER_0001", h)
12284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIn("CUSTOMER=WILE_E_COYOTE", h)
12294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(h.startswith("SHIPPING=FEDEX;"))
12304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_netscape_example_2(self):
12324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from cookielib import CookieJar
12334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from urllib2 import Request
12344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Second Example transaction sequence:
12364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
12374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Assume all mappings from above have been cleared.
12384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
12394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Client receives:
12404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
12414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #       Set-Cookie: PART_NUMBER=ROCKET_LAUNCHER_0001; path=/
12424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
12434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # When client requests a URL in path "/" on this server, it sends:
12444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
12454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #       Cookie: PART_NUMBER=ROCKET_LAUNCHER_0001
12464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
12474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Client receives:
12484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
12494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #       Set-Cookie: PART_NUMBER=RIDING_ROCKET_0023; path=/ammo
12504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
12514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # When client requests a URL in path "/ammo" on this server, it sends:
12524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
12534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #       Cookie: PART_NUMBER=RIDING_ROCKET_0023; PART_NUMBER=ROCKET_LAUNCHER_0001
12544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
12554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #       NOTE: There are two name/value pairs named "PART_NUMBER" due to
12564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #       the inheritance of the "/" mapping in addition to the "/ammo" mapping.
12574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c = CookieJar()
12594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        headers = []
12604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        req = Request("http://www.acme.com/")
12624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        headers.append("Set-Cookie: PART_NUMBER=ROCKET_LAUNCHER_0001; path=/")
12634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        res = FakeResponse(headers, "http://www.acme.com/")
12644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c.extract_cookies(res, req)
12664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        req = Request("http://www.acme.com/")
12684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c.add_cookie_header(req)
12694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(req.get_header("Cookie"),
12714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          "PART_NUMBER=ROCKET_LAUNCHER_0001")
12724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        headers.append(
12744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "Set-Cookie: PART_NUMBER=RIDING_ROCKET_0023; path=/ammo")
12754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        res = FakeResponse(headers, "http://www.acme.com/")
12764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c.extract_cookies(res, req)
12774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        req = Request("http://www.acme.com/ammo")
12794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c.add_cookie_header(req)
12804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(re.search(r"PART_NUMBER=RIDING_ROCKET_0023;\s*"
12824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                               "PART_NUMBER=ROCKET_LAUNCHER_0001",
12834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                               req.get_header("Cookie")))
12844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_ietf_example_1(self):
12864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from cookielib import CookieJar, DefaultCookiePolicy
12874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #-------------------------------------------------------------------
12884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Then we test with the examples from draft-ietf-http-state-man-mec-03.txt
12894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
12904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # 5.  EXAMPLES
12914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c = CookieJar(DefaultCookiePolicy(rfc2965=True))
12934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
12944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
12954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # 5.1  Example 1
12964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
12974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Most detail of request and response headers has been omitted.  Assume
12984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # the user agent has no stored cookies.
12994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
13004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #   1.  User Agent -> Server
13014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
13024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #       POST /acme/login HTTP/1.1
13034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #       [form data]
13044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
13054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #       User identifies self via a form.
13064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
13074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #   2.  Server -> User Agent
13084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
13094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #       HTTP/1.1 200 OK
13104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #       Set-Cookie2: Customer="WILE_E_COYOTE"; Version="1"; Path="/acme"
13114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
13124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #       Cookie reflects user's identity.
13134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cookie = interact_2965(
13154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            c, 'http://www.acme.com/acme/login',
13164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            'Customer="WILE_E_COYOTE"; Version="1"; Path="/acme"')
13174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(not cookie)
13184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
13204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #   3.  User Agent -> Server
13214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
13224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #       POST /acme/pickitem HTTP/1.1
13234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #       Cookie: $Version="1"; Customer="WILE_E_COYOTE"; $Path="/acme"
13244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #       [form data]
13254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
13264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #       User selects an item for ``shopping basket.''
13274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
13284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #   4.  Server -> User Agent
13294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
13304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #       HTTP/1.1 200 OK
13314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #       Set-Cookie2: Part_Number="Rocket_Launcher_0001"; Version="1";
13324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #               Path="/acme"
13334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
13344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #       Shopping basket contains an item.
13354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cookie = interact_2965(c, 'http://www.acme.com/acme/pickitem',
13374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                               'Part_Number="Rocket_Launcher_0001"; '
13384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                               'Version="1"; Path="/acme"');
13394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(re.search(
13404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            r'^\$Version="?1"?; Customer="?WILE_E_COYOTE"?; \$Path="/acme"$',
13414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            cookie))
13424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
13444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #   5.  User Agent -> Server
13454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
13464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #       POST /acme/shipping HTTP/1.1
13474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #       Cookie: $Version="1";
13484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #               Customer="WILE_E_COYOTE"; $Path="/acme";
13494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #               Part_Number="Rocket_Launcher_0001"; $Path="/acme"
13504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #       [form data]
13514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
13524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #       User selects shipping method from form.
13534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
13544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #   6.  Server -> User Agent
13554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
13564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #       HTTP/1.1 200 OK
13574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #       Set-Cookie2: Shipping="FedEx"; Version="1"; Path="/acme"
13584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
13594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #       New cookie reflects shipping method.
13604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cookie = interact_2965(c, "http://www.acme.com/acme/shipping",
13624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                               'Shipping="FedEx"; Version="1"; Path="/acme"')
13634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(re.search(r'^\$Version="?1"?;', cookie))
13654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(re.search(r'Part_Number="?Rocket_Launcher_0001"?;'
13664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                               '\s*\$Path="\/acme"', cookie))
13674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(re.search(r'Customer="?WILE_E_COYOTE"?;\s*\$Path="\/acme"',
13684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                               cookie))
13694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
13714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #   7.  User Agent -> Server
13724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
13734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #       POST /acme/process HTTP/1.1
13744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #       Cookie: $Version="1";
13754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #               Customer="WILE_E_COYOTE"; $Path="/acme";
13764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #               Part_Number="Rocket_Launcher_0001"; $Path="/acme";
13774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #               Shipping="FedEx"; $Path="/acme"
13784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #       [form data]
13794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
13804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #       User chooses to process order.
13814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
13824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #   8.  Server -> User Agent
13834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
13844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #       HTTP/1.1 200 OK
13854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
13864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #       Transaction is complete.
13874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cookie = interact_2965(c, "http://www.acme.com/acme/process")
13894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(
13904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            re.search(r'Shipping="?FedEx"?;\s*\$Path="\/acme"', cookie) and
13914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "WILE_E_COYOTE" in cookie)
13924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
13934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
13944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # The user agent makes a series of requests on the origin server, after
13954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # each of which it receives a new cookie.  All the cookies have the same
13964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Path attribute and (default) domain.  Because the request URLs all have
13974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # /acme as a prefix, and that matches the Path attribute, each request
13984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # contains all the cookies received so far.
13994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_ietf_example_2(self):
14014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from cookielib import CookieJar, DefaultCookiePolicy
14024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # 5.2  Example 2
14044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
14054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # This example illustrates the effect of the Path attribute.  All detail
14064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # of request and response headers has been omitted.  Assume the user agent
14074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # has no stored cookies.
14084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c = CookieJar(DefaultCookiePolicy(rfc2965=True))
14104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Imagine the user agent has received, in response to earlier requests,
14124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # the response headers
14134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
14144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Set-Cookie2: Part_Number="Rocket_Launcher_0001"; Version="1";
14154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #         Path="/acme"
14164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
14174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # and
14184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
14194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Set-Cookie2: Part_Number="Riding_Rocket_0023"; Version="1";
14204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #         Path="/acme/ammo"
14214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_2965(
14234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            c, "http://www.acme.com/acme/ammo/specific",
14244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            'Part_Number="Rocket_Launcher_0001"; Version="1"; Path="/acme"',
14254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            'Part_Number="Riding_Rocket_0023"; Version="1"; Path="/acme/ammo"')
14264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # A subsequent request by the user agent to the (same) server for URLs of
14284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # the form /acme/ammo/...  would include the following request header:
14294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
14304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Cookie: $Version="1";
14314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #         Part_Number="Riding_Rocket_0023"; $Path="/acme/ammo";
14324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #         Part_Number="Rocket_Launcher_0001"; $Path="/acme"
14334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
14344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Note that the NAME=VALUE pair for the cookie with the more specific Path
14354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # attribute, /acme/ammo, comes before the one with the less specific Path
14364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # attribute, /acme.  Further note that the same cookie name appears more
14374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # than once.
14384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cookie = interact_2965(c, "http://www.acme.com/acme/ammo/...")
14404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(
14414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            re.search(r"Riding_Rocket_0023.*Rocket_Launcher_0001", cookie))
14424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # A subsequent request by the user agent to the (same) server for a URL of
14444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # the form /acme/parts/ would include the following request header:
14454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
14464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Cookie: $Version="1"; Part_Number="Rocket_Launcher_0001"; $Path="/acme"
14474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
14484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Here, the second cookie's Path attribute /acme/ammo is not a prefix of
14494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # the request URL, /acme/parts/, so the cookie does not get forwarded to
14504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # the server.
14514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cookie = interact_2965(c, "http://www.acme.com/acme/parts/")
14534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIn("Rocket_Launcher_0001", cookie)
14544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertNotIn("Riding_Rocket_0023", cookie)
14554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_rejection(self):
14574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Test rejection of Set-Cookie2 responses based on domain, path, port.
14584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from cookielib import DefaultCookiePolicy, LWPCookieJar
14594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        pol = DefaultCookiePolicy(rfc2965=True)
14614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c = LWPCookieJar(policy=pol)
14634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        max_age = "max-age=3600"
14654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # illegal domain (no embedded dots)
14674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cookie = interact_2965(c, "http://www.acme.com",
14684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                               'foo=bar; domain=".com"; version=1')
14694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(not c)
14704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # legal domain
14724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cookie = interact_2965(c, "http://www.acme.com",
14734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                               'ping=pong; domain="acme.com"; version=1')
14744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(c), 1)
14754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # illegal domain (host prefix "www.a" contains a dot)
14774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cookie = interact_2965(c, "http://www.a.acme.com",
14784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                               'whiz=bang; domain="acme.com"; version=1')
14794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(c), 1)
14804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # legal domain
14824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cookie = interact_2965(c, "http://www.a.acme.com",
14834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                               'wow=flutter; domain=".a.acme.com"; version=1')
14844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(c), 2)
14854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # can't partially match an IP-address
14874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cookie = interact_2965(c, "http://125.125.125.125",
14884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                               'zzzz=ping; domain="125.125.125"; version=1')
14894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(c), 2)
14904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # illegal path (must be prefix of request path)
14924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cookie = interact_2965(c, "http://www.sol.no",
14934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                               'blah=rhubarb; domain=".sol.no"; path="/foo"; '
14944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                               'version=1')
14954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(c), 2)
14964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
14974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # legal path
14984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cookie = interact_2965(c, "http://www.sol.no/foo/bar",
14994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                               'bing=bong; domain=".sol.no"; path="/foo"; '
15004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                               'version=1')
15014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(c), 3)
15024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # illegal port (request-port not in list)
15044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cookie = interact_2965(c, "http://www.sol.no",
15054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                               'whiz=ffft; domain=".sol.no"; port="90,100"; '
15064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                               'version=1')
15074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(c), 3)
15084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # legal port
15104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cookie = interact_2965(
15114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            c, "http://www.sol.no",
15124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            r'bang=wallop; version=1; domain=".sol.no"; '
15134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            r'port="90,100, 80,8080"; '
15144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            r'max-age=100; Comment = "Just kidding! (\"|\\\\) "')
15154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(c), 4)
15164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # port attribute without any value (current port)
15184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cookie = interact_2965(c, "http://www.sol.no",
15194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                               'foo9=bar; version=1; domain=".sol.no"; port; '
15204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                               'max-age=100;')
15214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(c), 5)
15224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # encoded path
15244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # LWP has this test, but unescaping allowed path characters seems
15254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # like a bad idea, so I think this should fail:
15264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao##         cookie = interact_2965(c, "http://www.sol.no/foo/",
15274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao##                           r'foo8=bar; version=1; path="/%66oo"')
15284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # but this is OK, because '<' is not an allowed HTTP URL path
15294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # character:
15304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cookie = interact_2965(c, "http://www.sol.no/<oo/",
15314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                               r'foo8=bar; version=1; path="/%3coo"')
15324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(c), 6)
15334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # save and restore
15354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        filename = test_support.TESTFN
15364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
15384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            c.save(filename, ignore_discard=True)
15394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            old = repr(c)
15404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            c = LWPCookieJar(policy=pol)
15424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            c.load(filename, ignore_discard=True)
15434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        finally:
15444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            try: os.unlink(filename)
15454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            except OSError: pass
15464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(old, repr(c))
15484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_url_encoding(self):
15504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Try some URL encodings of the PATHs.
15514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # (the behaviour here has changed from libwww-perl)
15524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from cookielib import CookieJar, DefaultCookiePolicy
15534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c = CookieJar(DefaultCookiePolicy(rfc2965=True))
15554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_2965(c, "http://www.acme.com/foo%2f%25/%3c%3c%0Anew%E5/%E5",
15564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                      "foo  =   bar; version    =   1")
15574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cookie = interact_2965(
15594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            c, "http://www.acme.com/foo%2f%25/<<%0anew�/���",
15604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            'bar=baz; path="/foo/"; version=1');
15614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        version_re = re.compile(r'^\$version=\"?1\"?', re.I)
15624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue("foo=bar" in cookie and version_re.search(cookie))
15634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cookie = interact_2965(
15654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            c, "http://www.acme.com/foo/%25/<<%0anew�/���")
15664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(not cookie)
15674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # unicode URL doesn't raise exception
15694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cookie = interact_2965(c, u"http://www.acme.com/\xfc")
15704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_mozilla(self):
15724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Save / load Mozilla/Netscape cookie file format.
15734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from cookielib import MozillaCookieJar, DefaultCookiePolicy
15744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        year_plus_one = time.localtime()[0] + 1
15764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        filename = test_support.TESTFN
15784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c = MozillaCookieJar(filename,
15804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                             policy=DefaultCookiePolicy(rfc2965=True))
15814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_2965(c, "http://www.acme.com/",
15824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                      "foo1=bar; max-age=100; Version=1")
15834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_2965(c, "http://www.acme.com/",
15844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                      'foo2=bar; port="80"; max-age=100; Discard; Version=1')
15854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_2965(c, "http://www.acme.com/", "foo3=bar; secure; Version=1")
15864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        expires = "expires=09-Nov-%d 23:12:40 GMT" % (year_plus_one,)
15884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_netscape(c, "http://www.foo.com/",
15894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          "fooa=bar; %s" % expires)
15904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_netscape(c, "http://www.foo.com/",
15914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          "foob=bar; Domain=.foo.com; %s" % expires)
15924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_netscape(c, "http://www.foo.com/",
15934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                          "fooc=bar; Domain=www.foo.com; %s" % expires)
15944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
15954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def save_and_restore(cj, ignore_discard):
15964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            try:
15974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                cj.save(ignore_discard=ignore_discard)
15984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                new_c = MozillaCookieJar(filename,
15994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                         DefaultCookiePolicy(rfc2965=True))
16004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                new_c.load(ignore_discard=ignore_discard)
16014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            finally:
16024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                try: os.unlink(filename)
16034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                except OSError: pass
16044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return new_c
16054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        new_c = save_and_restore(c, True)
16074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(new_c), 6)  # none discarded
16084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIn("name='foo1', value='bar'", repr(new_c))
16094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        new_c = save_and_restore(c, False)
16114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(new_c), 4)  # 2 of them discarded on save
16124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIn("name='foo1', value='bar'", repr(new_c))
16134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_netscape_misc(self):
16154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Some additional Netscape cookies tests.
16164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from cookielib import CookieJar
16174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from urllib2 import Request
16184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c = CookieJar()
16204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        headers = []
16214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        req = Request("http://foo.bar.acme.com/foo")
16224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Netscape allows a host part that contains dots
16244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        headers.append("Set-Cookie: Customer=WILE_E_COYOTE; domain=.acme.com")
16254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        res = FakeResponse(headers, "http://www.acme.com/foo")
16264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c.extract_cookies(res, req)
16274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # and that the domain is the same as the host without adding a leading
16294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # dot to the domain.  Should not quote even if strange chars are used
16304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # in the cookie value.
16314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        headers.append("Set-Cookie: PART_NUMBER=3,4; domain=foo.bar.acme.com")
16324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        res = FakeResponse(headers, "http://www.acme.com/foo")
16334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c.extract_cookies(res, req)
16344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        req = Request("http://foo.bar.acme.com/foo")
16364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c.add_cookie_header(req)
16374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(
16384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "PART_NUMBER=3,4" in req.get_header("Cookie") and
16394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            "Customer=WILE_E_COYOTE" in req.get_header("Cookie"))
16404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_intranet_domains_2965(self):
16424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Test handling of local intranet hostnames without a dot.
16434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from cookielib import CookieJar, DefaultCookiePolicy
16444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c = CookieJar(DefaultCookiePolicy(rfc2965=True))
16464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_2965(c, "http://example/",
16474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                      "foo1=bar; PORT; Discard; Version=1;")
16484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cookie = interact_2965(c, "http://example/",
16494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                               'foo2=bar; domain=".local"; Version=1')
16504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIn("foo1=bar", cookie)
16514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_2965(c, "http://example/", 'foo3=bar; Version=1')
16534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cookie = interact_2965(c, "http://example/")
16544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIn("foo2=bar", cookie)
16554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(c), 3)
16564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_intranet_domains_ns(self):
16584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from cookielib import CookieJar, DefaultCookiePolicy
16594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c = CookieJar(DefaultCookiePolicy(rfc2965 = False))
16614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        interact_netscape(c, "http://example/", "foo1=bar")
16624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cookie = interact_netscape(c, "http://example/",
16634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                                   'foo2=bar; domain=.local')
16644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(c), 2)
16654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIn("foo1=bar", cookie)
16664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        cookie = interact_netscape(c, "http://example/")
16684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIn("foo2=bar", cookie)
16694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(c), 2)
16704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_empty_path(self):
16724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from cookielib import CookieJar, DefaultCookiePolicy
16734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from urllib2 import Request
16744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Test for empty path
16764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Broken web-server ORION/1.3.38 returns to the client response like
16774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
16784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #       Set-Cookie: JSESSIONID=ABCDERANDOM123; Path=
16794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #
16804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # ie. with Path set to nothing.
16814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # In this case, extract_cookies() must set cookie to / (root)
16824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c = CookieJar(DefaultCookiePolicy(rfc2965 = True))
16834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        headers = []
16844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        req = Request("http://www.ants.com/")
16864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        headers.append("Set-Cookie: JSESSIONID=ABCDERANDOM123; Path=")
16874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        res = FakeResponse(headers, "http://www.ants.com/")
16884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c.extract_cookies(res, req)
16894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        req = Request("http://www.ants.com/")
16914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c.add_cookie_header(req)
16924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(req.get_header("Cookie"),
16944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         "JSESSIONID=ABCDERANDOM123")
16954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(req.get_header("Cookie2"), '$Version="1"')
16964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
16974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # missing path in the request URI
16984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        req = Request("http://www.ants.com:8080")
16994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c.add_cookie_header(req)
17004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
17014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(req.get_header("Cookie"),
17024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                         "JSESSIONID=ABCDERANDOM123")
17034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(req.get_header("Cookie2"), '$Version="1"')
17044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
17054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_session_cookies(self):
17064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from cookielib import CookieJar
17074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        from urllib2 import Request
17084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
17094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        year_plus_one = time.localtime()[0] + 1
17104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
17114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Check session cookies are deleted properly by
17124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # CookieJar.clear_session_cookies method
17134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
17144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        req = Request('http://www.perlmeister.com/scripts')
17154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        headers = []
17164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        headers.append("Set-Cookie: s1=session;Path=/scripts")
17174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        headers.append("Set-Cookie: p1=perm; Domain=.perlmeister.com;"
17184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                       "Path=/;expires=Fri, 02-Feb-%d 23:24:20 GMT" %
17194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                       year_plus_one)
17204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        headers.append("Set-Cookie: p2=perm;Path=/;expires=Fri, "
17214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                       "02-Feb-%d 23:24:20 GMT" % year_plus_one)
17224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        headers.append("Set-Cookie: s2=session;Path=/scripts;"
17234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                       "Domain=.perlmeister.com")
17244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        headers.append('Set-Cookie2: s3=session;Version=1;Discard;Path="/"')
17254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        res = FakeResponse(headers, 'http://www.perlmeister.com/scripts')
17264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
17274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c = CookieJar()
17284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c.extract_cookies(res, req)
17294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # How many session/permanent cookies do we have?
17304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        counter = {"session_after": 0,
17314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                   "perm_after": 0,
17324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                   "session_before": 0,
17334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                   "perm_before": 0}
17344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for cookie in c:
17354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            key = "%s_before" % cookie.value
17364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            counter[key] = counter[key] + 1
17374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        c.clear_session_cookies()
17384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # How many now?
17394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for cookie in c:
17404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            key = "%s_after" % cookie.value
17414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            counter[key] = counter[key] + 1
17424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
17434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(not (
17444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # a permanent cookie got lost accidentally
17454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            counter["perm_after"] != counter["perm_before"] or
17464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # a session cookie hasn't been cleared
17474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            counter["session_after"] != 0 or
17484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # we didn't have session cookies in the first place
17494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            counter["session_before"] == 0))
17504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
17514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
17524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef test_main(verbose=None):
17534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    test_support.run_unittest(
17544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        DateTimeTests,
17554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        HeaderTests,
17564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        CookieTests,
17574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        FileCookieJarTests,
17584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        LWPCookieTests,
17594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        )
17604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
17614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoif __name__ == "__main__":
17624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    test_main(verbose=True)
1763