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