annotate Lib/http/cookiejar.py @ 78069:a8aa77458e12 3.2

Add c_size_t and c_ssize_t to the ctypes summary table.
author Antoine Pitrou <solipsis@pitrou.net>
date Thu, 12 Jul 2012 20:31:50 +0200
parents 4facbfdc7700
children e582ad1aee62 ea8078365d3b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
73430
4facbfdc7700 Don’t interpret backslashes in ASCII diagram in a docstring
Éric Araujo <merwok@netwok.org>
parents: 72985
diff changeset
1 r"""HTTP cookie handling for web clients.
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
2
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
3 This module has (now fairly distant) origins in Gisle Aas' Perl module
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
4 HTTP::Cookies, from the libwww-perl library.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
5
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
6 Docstrings, comments and debug strings in this code refer to the
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
7 attributes of the HTTP cookie system as cookie-attributes, to distinguish
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
8 them clearly from Python attributes.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
9
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
10 Class diagram (note that BSDDBCookieJar and the MSIE* classes are not
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
11 distributed with the Python standard library, but are available from
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
12 http://wwwsearch.sf.net/):
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
13
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
14 CookieJar____
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
15 / \ \
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
16 FileCookieJar \ \
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
17 / | \ \ \
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
18 MozillaCookieJar | LWPCookieJar \ \
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
19 | | \
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
20 | ---MSIEBase | \
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
21 | / | | \
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
22 | / MSIEDBCookieJar BSDDBCookieJar
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
23 |/
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
24 MSIECookieJar
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
25
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
26 """
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
27
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
28 __all__ = ['Cookie', 'CookieJar', 'CookiePolicy', 'DefaultCookiePolicy',
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
29 'FileCookieJar', 'LWPCookieJar', 'LoadError', 'MozillaCookieJar']
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
30
48334
5a416a6417d3 Make a new urllib package .
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 47635
diff changeset
31 import copy
68785
b15f60f9e256 Issue #5537: Fix time2isoz() and time2netscape() functions of httplib.cookiejar
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63444
diff changeset
32 import datetime
48334
5a416a6417d3 Make a new urllib package .
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 47635
diff changeset
33 import re
5a416a6417d3 Make a new urllib package .
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 47635
diff changeset
34 import time
5a416a6417d3 Make a new urllib package .
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 47635
diff changeset
35 import urllib.parse, urllib.request
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
36 try:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
37 import threading as _threading
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
38 except ImportError:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
39 import dummy_threading as _threading
47318
e1fcc3881cb6 Create http package. #2883.
Georg Brandl <georg@python.org>
parents: 46835
diff changeset
40 import http.client # only for the default HTTP port
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
41 from calendar import timegm
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
42
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
43 debug = False # set to True to enable debugging via the logging module
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
44 logger = None
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
45
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
46 def _debug(*args):
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
47 if not debug:
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
48 return
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
49 global logger
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
50 if not logger:
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
51 import logging
47318
e1fcc3881cb6 Create http package. #2883.
Georg Brandl <georg@python.org>
parents: 46835
diff changeset
52 logger = logging.getLogger("http.cookiejar")
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
53 return logger.debug(*args)
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
54
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
55
47318
e1fcc3881cb6 Create http package. #2883.
Georg Brandl <georg@python.org>
parents: 46835
diff changeset
56 DEFAULT_HTTP_PORT = str(http.client.HTTP_PORT)
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
57 MISSING_FILENAME_TEXT = ("a filename was not supplied (nor was the CookieJar "
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
58 "instance initialised with one)")
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
59
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
60 def _warn_unhandled_exception():
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
61 # There are a few catch-all except: statements in this module, for
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
62 # catching input that's bad in unexpected ways. Warn if any
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
63 # exceptions are caught there.
46835
3418f2ebce87 Fixup old, invalid import.
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 45061
diff changeset
64 import io, warnings, traceback
42501
f6069f9dd52d SF patch# 1770008 by Christian Heimes (plus some extras).
Guido van Rossum <guido@python.org>
parents: 42430
diff changeset
65 f = io.StringIO()
32587
4be4c63673eb [Patch #969907] Add traceback to warning output
Andrew M. Kuchling <amk@amk.ca>
parents: 32170
diff changeset
66 traceback.print_exc(None, f)
4be4c63673eb [Patch #969907] Add traceback to warning output
Andrew M. Kuchling <amk@amk.ca>
parents: 32170
diff changeset
67 msg = f.getvalue()
47318
e1fcc3881cb6 Create http package. #2883.
Georg Brandl <georg@python.org>
parents: 46835
diff changeset
68 warnings.warn("http.cookiejar bug!\n%s" % msg, stacklevel=2)
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
69
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
70
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
71 # Date/time conversion
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
72 # -----------------------------------------------------------------------------
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
73
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
74 EPOCH_YEAR = 1970
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
75 def _timegm(tt):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
76 year, month, mday, hour, min, sec = tt[:6]
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
77 if ((year >= EPOCH_YEAR) and (1 <= month <= 12) and (1 <= mday <= 31) and
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
78 (0 <= hour <= 24) and (0 <= min <= 59) and (0 <= sec <= 61)):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
79 return timegm(tt)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
80 else:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
81 return None
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
82
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
83 DAYS = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
84 MONTHS = ["Jan", "Feb", "Mar", "Apr", "May", "Jun",
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
85 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
86 MONTHS_LOWER = []
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
87 for month in MONTHS: MONTHS_LOWER.append(month.lower())
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
88
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
89 def time2isoz(t=None):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
90 """Return a string representing time in seconds since epoch, t.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
91
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
92 If the function is called without an argument, it will use the current
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
93 time.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
94
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
95 The format of the returned string is like "YYYY-MM-DD hh:mm:ssZ",
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
96 representing Universal Time (UTC, aka GMT). An example of this format is:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
97
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
98 1994-11-24 08:49:37Z
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
99
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
100 """
68785
b15f60f9e256 Issue #5537: Fix time2isoz() and time2netscape() functions of httplib.cookiejar
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63444
diff changeset
101 if t is None:
b15f60f9e256 Issue #5537: Fix time2isoz() and time2netscape() functions of httplib.cookiejar
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63444
diff changeset
102 dt = datetime.datetime.utcnow()
b15f60f9e256 Issue #5537: Fix time2isoz() and time2netscape() functions of httplib.cookiejar
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63444
diff changeset
103 else:
b15f60f9e256 Issue #5537: Fix time2isoz() and time2netscape() functions of httplib.cookiejar
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63444
diff changeset
104 dt = datetime.datetime.utcfromtimestamp(t)
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
105 return "%04d-%02d-%02d %02d:%02d:%02dZ" % (
68785
b15f60f9e256 Issue #5537: Fix time2isoz() and time2netscape() functions of httplib.cookiejar
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63444
diff changeset
106 dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second)
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
107
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
108 def time2netscape(t=None):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
109 """Return a string representing time in seconds since epoch, t.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
110
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
111 If the function is called without an argument, it will use the current
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
112 time.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
113
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
114 The format of the returned string is like this:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
115
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
116 Wed, DD-Mon-YYYY HH:MM:SS GMT
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
117
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
118 """
68785
b15f60f9e256 Issue #5537: Fix time2isoz() and time2netscape() functions of httplib.cookiejar
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63444
diff changeset
119 if t is None:
b15f60f9e256 Issue #5537: Fix time2isoz() and time2netscape() functions of httplib.cookiejar
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63444
diff changeset
120 dt = datetime.datetime.utcnow()
b15f60f9e256 Issue #5537: Fix time2isoz() and time2netscape() functions of httplib.cookiejar
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63444
diff changeset
121 else:
b15f60f9e256 Issue #5537: Fix time2isoz() and time2netscape() functions of httplib.cookiejar
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63444
diff changeset
122 dt = datetime.datetime.utcfromtimestamp(t)
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
123 return "%s %02d-%s-%04d %02d:%02d:%02d GMT" % (
68785
b15f60f9e256 Issue #5537: Fix time2isoz() and time2netscape() functions of httplib.cookiejar
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63444
diff changeset
124 DAYS[dt.weekday()], dt.day, MONTHS[dt.month-1],
b15f60f9e256 Issue #5537: Fix time2isoz() and time2netscape() functions of httplib.cookiejar
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63444
diff changeset
125 dt.year, dt.hour, dt.minute, dt.second)
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
126
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
127
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
128 UTC_ZONES = {"GMT": None, "UTC": None, "UT": None, "Z": None}
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
129
48769
83b2d07b475b #2834: Change re module semantics, so that str and bytes mixing is forbidden,
Antoine Pitrou <solipsis@pitrou.net>
parents: 48356
diff changeset
130 TIMEZONE_RE = re.compile(r"^([-+])?(\d\d?):?(\d\d)?$", re.ASCII)
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
131 def offset_from_tz_string(tz):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
132 offset = None
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
133 if tz in UTC_ZONES:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
134 offset = 0
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
135 else:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
136 m = TIMEZONE_RE.search(tz)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
137 if m:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
138 offset = 3600 * int(m.group(2))
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
139 if m.group(3):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
140 offset = offset + 60 * int(m.group(3))
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
141 if m.group(1) == '-':
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
142 offset = -offset
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
143 return offset
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
144
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
145 def _str2time(day, mon, yr, hr, min, sec, tz):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
146 # translate month name to number
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
147 # month numbers start with 1 (January)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
148 try:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
149 mon = MONTHS_LOWER.index(mon.lower())+1
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
150 except ValueError:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
151 # maybe it's already a number
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
152 try:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
153 imon = int(mon)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
154 except ValueError:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
155 return None
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
156 if 1 <= imon <= 12:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
157 mon = imon
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
158 else:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
159 return None
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
160
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
161 # make sure clock elements are defined
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
162 if hr is None: hr = 0
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
163 if min is None: min = 0
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
164 if sec is None: sec = 0
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
165
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
166 yr = int(yr)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
167 day = int(day)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
168 hr = int(hr)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
169 min = int(min)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
170 sec = int(sec)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
171
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
172 if yr < 1000:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
173 # find "obvious" year
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
174 cur_yr = time.localtime(time.time())[0]
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
175 m = cur_yr % 100
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
176 tmp = yr
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
177 yr = yr + cur_yr - m
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
178 m = m - tmp
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
179 if abs(m) > 50:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
180 if m > 0: yr = yr + 100
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
181 else: yr = yr - 100
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
182
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
183 # convert UTC time tuple to seconds since epoch (not timezone-adjusted)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
184 t = _timegm((yr, mon, day, hr, min, sec, tz))
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
185
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
186 if t is not None:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
187 # adjust time using timezone string, to get absolute time since epoch
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
188 if tz is None:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
189 tz = "UTC"
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
190 tz = tz.upper()
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
191 offset = offset_from_tz_string(tz)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
192 if offset is None:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
193 return None
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
194 t = t - offset
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
195
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
196 return t
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
197
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
198 STRICT_DATE_RE = re.compile(
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
199 r"^[SMTWF][a-z][a-z], (\d\d) ([JFMASOND][a-z][a-z]) "
48769
83b2d07b475b #2834: Change re module semantics, so that str and bytes mixing is forbidden,
Antoine Pitrou <solipsis@pitrou.net>
parents: 48356
diff changeset
200 "(\d\d\d\d) (\d\d):(\d\d):(\d\d) GMT$", re.ASCII)
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
201 WEEKDAY_RE = re.compile(
48769
83b2d07b475b #2834: Change re module semantics, so that str and bytes mixing is forbidden,
Antoine Pitrou <solipsis@pitrou.net>
parents: 48356
diff changeset
202 r"^(?:Sun|Mon|Tue|Wed|Thu|Fri|Sat)[a-z]*,?\s*", re.I | re.ASCII)
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
203 LOOSE_HTTP_DATE_RE = re.compile(
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
204 r"""^
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
205 (\d\d?) # day
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
206 (?:\s+|[-\/])
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
207 (\w+) # month
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
208 (?:\s+|[-\/])
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
209 (\d+) # year
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
210 (?:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
211 (?:\s+|:) # separator before clock
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
212 (\d\d?):(\d\d) # hour:min
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
213 (?::(\d\d))? # optional seconds
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
214 )? # optional clock
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
215 \s*
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
216 ([-+]?\d{2,4}|(?![APap][Mm]\b)[A-Za-z]+)? # timezone
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
217 \s*
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
218 (?:\(\w+\))? # ASCII representation of timezone in parens.
48769
83b2d07b475b #2834: Change re module semantics, so that str and bytes mixing is forbidden,
Antoine Pitrou <solipsis@pitrou.net>
parents: 48356
diff changeset
219 \s*$""", re.X | re.ASCII)
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
220 def http2time(text):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
221 """Returns time in seconds since epoch of time represented by a string.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
222
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
223 Return value is an integer.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
224
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
225 None is returned if the format of str is unrecognized, the time is outside
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
226 the representable range, or the timezone string is not recognized. If the
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
227 string contains no timezone, UTC is assumed.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
228
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
229 The timezone in the string may be numerical (like "-0800" or "+0100") or a
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
230 string timezone (like "UTC", "GMT", "BST" or "EST"). Currently, only the
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
231 timezone strings equivalent to UTC (zero offset) are known to the function.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
232
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
233 The function loosely parses the following formats:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
234
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
235 Wed, 09 Feb 1994 22:23:32 GMT -- HTTP format
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
236 Tuesday, 08-Feb-94 14:15:29 GMT -- old rfc850 HTTP format
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
237 Tuesday, 08-Feb-1994 14:15:29 GMT -- broken rfc850 HTTP format
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
238 09 Feb 1994 22:23:32 GMT -- HTTP format (no weekday)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
239 08-Feb-94 14:15:29 GMT -- rfc850 format (no weekday)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
240 08-Feb-1994 14:15:29 GMT -- broken rfc850 format (no weekday)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
241
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
242 The parser ignores leading and trailing whitespace. The time may be
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
243 absent.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
244
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
245 If the year is given with only 2 digits, the function will select the
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
246 century that makes the year closest to the current date.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
247
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
248 """
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
249 # fast exit for strictly conforming string
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
250 m = STRICT_DATE_RE.search(text)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
251 if m:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
252 g = m.groups()
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
253 mon = MONTHS_LOWER.index(g[1].lower()) + 1
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
254 tt = (int(g[2]), mon, int(g[0]),
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
255 int(g[3]), int(g[4]), float(g[5]))
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
256 return _timegm(tt)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
257
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
258 # No, we need some messy parsing...
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
259
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
260 # clean up
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
261 text = text.lstrip()
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
262 text = WEEKDAY_RE.sub("", text, 1) # Useless weekday
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
263
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
264 # tz is time zone specifier string
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
265 day, mon, yr, hr, min, sec, tz = [None]*7
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
266
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
267 # loose regexp parse
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
268 m = LOOSE_HTTP_DATE_RE.search(text)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
269 if m is not None:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
270 day, mon, yr, hr, min, sec, tz = m.groups()
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
271 else:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
272 return None # bad format
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
273
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
274 return _str2time(day, mon, yr, hr, min, sec, tz)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
275
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
276 ISO_DATE_RE = re.compile(
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
277 """^
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
278 (\d{4}) # year
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
279 [-\/]?
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
280 (\d\d?) # numerical month
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
281 [-\/]?
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
282 (\d\d?) # day
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
283 (?:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
284 (?:\s+|[-:Tt]) # separator before clock
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
285 (\d\d?):?(\d\d) # hour:min
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
286 (?::?(\d\d(?:\.\d*)?))? # optional seconds (and fractional)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
287 )? # optional clock
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
288 \s*
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
289 ([-+]?\d\d?:?(:?\d\d)?
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
290 |Z|z)? # timezone (Z is "zero meridian", i.e. GMT)
48769
83b2d07b475b #2834: Change re module semantics, so that str and bytes mixing is forbidden,
Antoine Pitrou <solipsis@pitrou.net>
parents: 48356
diff changeset
291 \s*$""", re.X | re. ASCII)
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
292 def iso2time(text):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
293 """
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
294 As for http2time, but parses the ISO 8601 formats:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
295
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
296 1994-02-03 14:15:29 -0100 -- ISO 8601 format
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
297 1994-02-03 14:15:29 -- zone is optional
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
298 1994-02-03 -- only date
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
299 1994-02-03T14:15:29 -- Use T as separator
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
300 19940203T141529Z -- ISO 8601 compact format
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
301 19940203 -- only date
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
302
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
303 """
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
304 # clean up
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
305 text = text.lstrip()
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
306
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
307 # tz is time zone specifier string
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
308 day, mon, yr, hr, min, sec, tz = [None]*7
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
309
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
310 # loose regexp parse
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
311 m = ISO_DATE_RE.search(text)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
312 if m is not None:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
313 # XXX there's an extra bit of the timezone I'm ignoring here: is
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
314 # this the right thing to do?
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
315 yr, mon, day, hr, min, sec, tz, _ = m.groups()
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
316 else:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
317 return None # bad format
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
318
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
319 return _str2time(day, mon, yr, hr, min, sec, tz)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
320
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
321
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
322 # Header parsing
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
323 # -----------------------------------------------------------------------------
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
324
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
325 def unmatched(match):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
326 """Return unmatched part of re.Match object."""
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
327 start, end = match.span(0)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
328 return match.string[:start]+match.string[end:]
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
329
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
330 HEADER_TOKEN_RE = re.compile(r"^\s*([^=\s;,]+)")
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
331 HEADER_QUOTED_VALUE_RE = re.compile(r"^\s*=\s*\"([^\"\\]*(?:\\.[^\"\\]*)*)\"")
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
332 HEADER_VALUE_RE = re.compile(r"^\s*=\s*([^\s;,]*)")
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
333 HEADER_ESCAPE_RE = re.compile(r"\\(.)")
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
334 def split_header_words(header_values):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
335 r"""Parse header values into a list of lists containing key,value pairs.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
336
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
337 The function knows how to deal with ",", ";" and "=" as well as quoted
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
338 values after "=". A list of space separated tokens are parsed as if they
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
339 were separated by ";".
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
340
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
341 If the header_values passed as argument contains multiple values, then they
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
342 are treated as if they were a single value separated by comma ",".
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
343
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
344 This means that this function is useful for parsing header fields that
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
345 follow this syntax (BNF as from the HTTP/1.1 specification, but we relax
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
346 the requirement for tokens).
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
347
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
348 headers = #header
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
349 header = (token | parameter) *( [";"] (token | parameter))
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
350
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
351 token = 1*<any CHAR except CTLs or separators>
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
352 separators = "(" | ")" | "<" | ">" | "@"
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
353 | "," | ";" | ":" | "\" | <">
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
354 | "/" | "[" | "]" | "?" | "="
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
355 | "{" | "}" | SP | HT
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
356
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
357 quoted-string = ( <"> *(qdtext | quoted-pair ) <"> )
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
358 qdtext = <any TEXT except <">>
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
359 quoted-pair = "\" CHAR
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
360
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
361 parameter = attribute "=" value
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
362 attribute = token
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
363 value = token | quoted-string
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
364
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
365 Each header is represented by a list of key/value pairs. The value for a
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
366 simple token (not part of a parameter) is None. Syntactically incorrect
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
367 headers will not necessarily be parsed as you would want.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
368
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
369 This is easier to describe with some examples:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
370
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
371 >>> split_header_words(['foo="bar"; port="80,81"; discard, bar=baz'])
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
372 [[('foo', 'bar'), ('port', '80,81'), ('discard', None)], [('bar', 'baz')]]
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
373 >>> split_header_words(['text/html; charset="iso-8859-1"'])
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
374 [[('text/html', None), ('charset', 'iso-8859-1')]]
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
375 >>> split_header_words([r'Basic realm="\"foo\bar\""'])
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
376 [[('Basic', None), ('realm', '"foobar"')]]
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
377
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
378 """
43577
ace45b361e87 Patch# 1258 by Christian Heimes: kill basestring.
Guido van Rossum <guido@python.org>
parents: 42501
diff changeset
379 assert not isinstance(header_values, str)
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
380 result = []
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
381 for text in header_values:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
382 orig_text = text
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
383 pairs = []
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
384 while text:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
385 m = HEADER_TOKEN_RE.search(text)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
386 if m:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
387 text = unmatched(m)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
388 name = m.group(1)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
389 m = HEADER_QUOTED_VALUE_RE.search(text)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
390 if m: # quoted value
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
391 text = unmatched(m)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
392 value = m.group(1)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
393 value = HEADER_ESCAPE_RE.sub(r"\1", value)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
394 else:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
395 m = HEADER_VALUE_RE.search(text)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
396 if m: # unquoted value
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
397 text = unmatched(m)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
398 value = m.group(1)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
399 value = value.rstrip()
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
400 else:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
401 # no value, a lone token
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
402 value = None
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
403 pairs.append((name, value))
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
404 elif text.lstrip().startswith(","):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
405 # concatenated headers, as per RFC 2616 section 4.2
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
406 text = text.lstrip()[1:]
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
407 if pairs: result.append(pairs)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
408 pairs = []
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
409 else:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
410 # skip junk
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
411 non_junk, nr_junk_chars = re.subn("^[=\s;]*", "", text)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
412 assert nr_junk_chars > 0, (
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
413 "split_header_words bug: '%s', '%s', %s" %
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
414 (orig_text, text, pairs))
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
415 text = non_junk
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
416 if pairs: result.append(pairs)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
417 return result
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
418
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
419 HEADER_JOIN_ESCAPE_RE = re.compile(r"([\"\\])")
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
420 def join_header_words(lists):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
421 """Do the inverse (almost) of the conversion done by split_header_words.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
422
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
423 Takes a list of lists of (key, value) pairs and produces a single header
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
424 value. Attribute values are quoted if needed.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
425
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
426 >>> join_header_words([[("text/plain", None), ("charset", "iso-8859/1")]])
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
427 'text/plain; charset="iso-8859/1"'
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
428 >>> join_header_words([[("text/plain", None)], [("charset", "iso-8859/1")]])
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
429 'text/plain, charset="iso-8859/1"'
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
430
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
431 """
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
432 headers = []
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
433 for pairs in lists:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
434 attr = []
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
435 for k, v in pairs:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
436 if v is not None:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
437 if not re.search(r"^\w+$", v):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
438 v = HEADER_JOIN_ESCAPE_RE.sub(r"\\\1", v) # escape " and \
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
439 v = '"%s"' % v
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
440 k = "%s=%s" % (k, v)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
441 attr.append(k)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
442 if attr: headers.append("; ".join(attr))
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
443 return ", ".join(headers)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
444
62566
504c499e8c95 Merged revisions 81465-81466,81468,81679,81735,81760,81868,82183 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48769
diff changeset
445 def strip_quotes(text):
504c499e8c95 Merged revisions 81465-81466,81468,81679,81735,81760,81868,82183 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48769
diff changeset
446 if text.startswith('"'):
504c499e8c95 Merged revisions 81465-81466,81468,81679,81735,81760,81868,82183 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48769
diff changeset
447 text = text[1:]
504c499e8c95 Merged revisions 81465-81466,81468,81679,81735,81760,81868,82183 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48769
diff changeset
448 if text.endswith('"'):
504c499e8c95 Merged revisions 81465-81466,81468,81679,81735,81760,81868,82183 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48769
diff changeset
449 text = text[:-1]
504c499e8c95 Merged revisions 81465-81466,81468,81679,81735,81760,81868,82183 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48769
diff changeset
450 return text
504c499e8c95 Merged revisions 81465-81466,81468,81679,81735,81760,81868,82183 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48769
diff changeset
451
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
452 def parse_ns_headers(ns_headers):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
453 """Ad-hoc parser for Netscape protocol cookie-attributes.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
454
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
455 The old Netscape cookie format for Set-Cookie can for instance contain
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
456 an unquoted "," in the expires field, so we have to use this ad-hoc
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
457 parser instead of split_header_words.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
458
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
459 XXX This may not make the best possible effort to parse all the crap
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
460 that Netscape Cookie headers contain. Ronald Tschalar's HTTPClient
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
461 parser is probably better, so could do worse than following that if
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
462 this ever gives any trouble.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
463
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
464 Currently, this is also used for parsing RFC 2109 cookies.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
465
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
466 """
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
467 known_attrs = ("expires", "domain", "path", "secure",
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
468 # RFC 2109 attrs (may turn up in Netscape cookies, too)
62566
504c499e8c95 Merged revisions 81465-81466,81468,81679,81735,81760,81868,82183 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48769
diff changeset
469 "version", "port", "max-age")
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
470
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
471 result = []
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
472 for ns_header in ns_headers:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
473 pairs = []
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
474 version_set = False
34658
e6422525c240 Patch #1117339: Add cookielib special name tests.
Martin v. Löwis <martin@v.loewis.de>
parents: 34551
diff changeset
475 for ii, param in enumerate(re.split(r";\s*", ns_header)):
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
476 param = param.rstrip()
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
477 if param == "": continue
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
478 if "=" not in param:
34660
918bc6d56d26 Patch #1117454: Remove code to special-case cookies without values
Martin v. Löwis <martin@v.loewis.de>
parents: 34658
diff changeset
479 k, v = param, None
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
480 else:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
481 k, v = re.split(r"\s*=\s*", param, 1)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
482 k = k.lstrip()
34658
e6422525c240 Patch #1117339: Add cookielib special name tests.
Martin v. Löwis <martin@v.loewis.de>
parents: 34551
diff changeset
483 if ii != 0:
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
484 lc = k.lower()
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
485 if lc in known_attrs:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
486 k = lc
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
487 if k == "version":
36111
630d01fecfec SF patch #1157027, cookielib mis-handles RFC 2109 cookies in Netscape mode
Neal Norwitz <nnorwitz@gmail.com>
parents: 36107
diff changeset
488 # This is an RFC 2109 cookie.
62566
504c499e8c95 Merged revisions 81465-81466,81468,81679,81735,81760,81868,82183 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48769
diff changeset
489 v = strip_quotes(v)
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
490 version_set = True
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
491 if k == "expires":
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
492 # convert expires date to seconds since epoch
62566
504c499e8c95 Merged revisions 81465-81466,81468,81679,81735,81760,81868,82183 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48769
diff changeset
493 v = http2time(strip_quotes(v)) # None if invalid
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
494 pairs.append((k, v))
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
495
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
496 if pairs:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
497 if not version_set:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
498 pairs.append(("version", "0"))
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
499 result.append(pairs)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
500
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
501 return result
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
502
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
503
48769
83b2d07b475b #2834: Change re module semantics, so that str and bytes mixing is forbidden,
Antoine Pitrou <solipsis@pitrou.net>
parents: 48356
diff changeset
504 IPV4_RE = re.compile(r"\.\d+$", re.ASCII)
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
505 def is_HDN(text):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
506 """Return True if text is a host domain name."""
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
507 # XXX
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
508 # This may well be wrong. Which RFC is HDN defined in, if any (for
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
509 # the purposes of RFC 2965)?
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
510 # For the current implementation, what about IPv6? Remember to look
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
511 # at other uses of IPV4_RE also, if change this.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
512 if IPV4_RE.search(text):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
513 return False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
514 if text == "":
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
515 return False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
516 if text[0] == "." or text[-1] == ".":
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
517 return False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
518 return True
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
519
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
520 def domain_match(A, B):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
521 """Return True if domain A domain-matches domain B, according to RFC 2965.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
522
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
523 A and B may be host domain names or IP addresses.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
524
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
525 RFC 2965, section 1:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
526
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
527 Host names can be specified either as an IP address or a HDN string.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
528 Sometimes we compare one host name with another. (Such comparisons SHALL
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
529 be case-insensitive.) Host A's name domain-matches host B's if
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
530
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
531 * their host name strings string-compare equal; or
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
532
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
533 * A is a HDN string and has the form NB, where N is a non-empty
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
534 name string, B has the form .B', and B' is a HDN string. (So,
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
535 x.y.com domain-matches .Y.com but not Y.com.)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
536
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
537 Note that domain-match is not a commutative operation: a.b.c.com
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
538 domain-matches .c.com, but not the reverse.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
539
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
540 """
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
541 # Note that, if A or B are IP addresses, the only relevant part of the
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
542 # definition of the domain-match algorithm is the direct string-compare.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
543 A = A.lower()
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
544 B = B.lower()
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
545 if A == B:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
546 return True
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
547 if not is_HDN(A):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
548 return False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
549 i = A.rfind(B)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
550 if i == -1 or i == 0:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
551 # A does not have form NB, or N is the empty string
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
552 return False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
553 if not B.startswith("."):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
554 return False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
555 if not is_HDN(B[1:]):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
556 return False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
557 return True
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
558
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
559 def liberal_is_HDN(text):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
560 """Return True if text is a sort-of-like a host domain name.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
561
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
562 For accepting/blocking domains.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
563
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
564 """
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
565 if IPV4_RE.search(text):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
566 return False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
567 return True
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
568
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
569 def user_domain_match(A, B):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
570 """For blocking/accepting domains.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
571
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
572 A and B may be host domain names or IP addresses.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
573
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
574 """
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
575 A = A.lower()
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
576 B = B.lower()
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
577 if not (liberal_is_HDN(A) and liberal_is_HDN(B)):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
578 if A == B:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
579 # equal IP addresses
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
580 return True
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
581 return False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
582 initial_dot = B.startswith(".")
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
583 if initial_dot and A.endswith(B):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
584 return True
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
585 if not initial_dot and A == B:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
586 return True
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
587 return False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
588
48769
83b2d07b475b #2834: Change re module semantics, so that str and bytes mixing is forbidden,
Antoine Pitrou <solipsis@pitrou.net>
parents: 48356
diff changeset
589 cut_port_re = re.compile(r":\d+$", re.ASCII)
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
590 def request_host(request):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
591 """Return request-host, as defined by RFC 2965.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
592
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
593 Variation from RFC: returned value is lowercased, for convenient
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
594 comparison.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
595
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
596 """
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
597 url = request.get_full_url()
48334
5a416a6417d3 Make a new urllib package .
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 47635
diff changeset
598 host = urllib.parse.urlparse(url)[1]
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
599 if host == "":
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
600 host = request.get_header("Host", "")
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
601
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
602 # remove port, if present
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
603 host = cut_port_re.sub("", host, 1)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
604 return host.lower()
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
605
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
606 def eff_request_host(request):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
607 """Return a tuple (request-host, effective request-host name).
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
608
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
609 As defined by RFC 2965, except both are lowercased.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
610
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
611 """
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
612 erhn = req_host = request_host(request)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
613 if req_host.find(".") == -1 and not IPV4_RE.search(req_host):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
614 erhn = req_host + ".local"
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
615 return req_host, erhn
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
616
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
617 def request_path(request):
63212
d86c18568e89 Merged revisions 82985 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 48769
diff changeset
618 """Path component of request-URI, as defined by RFC 2965."""
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
619 url = request.get_full_url()
63212
d86c18568e89 Merged revisions 82985 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 48769
diff changeset
620 parts = urllib.parse.urlsplit(url)
d86c18568e89 Merged revisions 82985 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 48769
diff changeset
621 path = escape_path(parts.path)
d86c18568e89 Merged revisions 82985 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 48769
diff changeset
622 if not path.startswith("/"):
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
623 # fix bad RFC 2396 absoluteURI
63212
d86c18568e89 Merged revisions 82985 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 48769
diff changeset
624 path = "/" + path
d86c18568e89 Merged revisions 82985 via svnmerge from
Gregory P. Smith <greg@mad-scientist.com>
parents: 48769
diff changeset
625 return path
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
626
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
627 def request_port(request):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
628 host = request.get_host()
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
629 i = host.find(':')
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
630 if i >= 0:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
631 port = host[i+1:]
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
632 try:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
633 int(port)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
634 except ValueError:
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
635 _debug("nonnumeric port: '%s'", port)
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
636 return None
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
637 else:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
638 port = DEFAULT_HTTP_PORT
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
639 return port
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
640
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
641 # Characters in addition to A-Z, a-z, 0-9, '_', '.', and '-' that don't
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
642 # need to be escaped to form a valid HTTP URL (RFCs 2396 and 1738).
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
643 HTTP_PATH_SAFE = "%/;:@&=+$,!~*'()"
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
644 ESCAPED_CHAR_RE = re.compile(r"%([0-9a-fA-F][0-9a-fA-F])")
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
645 def uppercase_escaped_char(match):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
646 return "%%%s" % match.group(1).upper()
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
647 def escape_path(path):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
648 """Escape any invalid characters in HTTP URL, and uppercase all escapes."""
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
649 # There's no knowing what character encoding was used to create URLs
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
650 # containing %-escapes, but since we have to pick one to escape invalid
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
651 # path characters, we pick UTF-8, as recommended in the HTML 4.0
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
652 # specification:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
653 # http://www.w3.org/TR/REC-html40/appendix/notes.html#h-B.2.1
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
654 # And here, kind of: draft-fielding-uri-rfc2396bis-03
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
655 # (And in draft IRI specification: draft-duerst-iri-05)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
656 # (And here, for new URI schemes: RFC 2718)
48334
5a416a6417d3 Make a new urllib package .
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 47635
diff changeset
657 path = urllib.parse.quote(path, HTTP_PATH_SAFE)
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
658 path = ESCAPED_CHAR_RE.sub(uppercase_escaped_char, path)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
659 return path
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
660
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
661 def reach(h):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
662 """Return reach of host h, as defined by RFC 2965, section 1.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
663
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
664 The reach R of a host name H is defined as follows:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
665
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
666 * If
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
667
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
668 - H is the host domain name of a host; and,
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
669
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
670 - H has the form A.B; and
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
671
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
672 - A has no embedded (that is, interior) dots; and
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
673
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
674 - B has at least one embedded dot, or B is the string "local".
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
675 then the reach of H is .B.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
676
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
677 * Otherwise, the reach of H is H.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
678
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
679 >>> reach("www.acme.com")
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
680 '.acme.com'
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
681 >>> reach("acme.com")
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
682 'acme.com'
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
683 >>> reach("acme.local")
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
684 '.local'
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
685
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
686 """
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
687 i = h.find(".")
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
688 if i >= 0:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
689 #a = h[:i] # this line is only here to show what a is
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
690 b = h[i+1:]
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
691 i = b.find(".")
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
692 if is_HDN(h) and (i >= 0 or b == "local"):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
693 return "."+b
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
694 return h
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
695
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
696 def is_third_party(request):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
697 """
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
698
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
699 RFC 2965, section 3.3.6:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
700
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
701 An unverifiable transaction is to a third-party host if its request-
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
702 host U does not domain-match the reach R of the request-host O in the
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
703 origin transaction.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
704
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
705 """
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
706 req_host = request_host(request)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
707 if not domain_match(req_host, reach(request.get_origin_req_host())):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
708 return True
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
709 else:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
710 return False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
711
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
712
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
713 class Cookie:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
714 """HTTP Cookie.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
715
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
716 This class represents both Netscape and RFC 2965 cookies.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
717
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
718 This is deliberately a very simple class. It just holds attributes. It's
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
719 possible to construct Cookie instances that don't comply with the cookie
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
720 standards. CookieJar.make_cookies is the factory function for Cookie
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
721 objects -- it deals with cookie parsing, supplying defaults, and
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
722 normalising to the representation used in this class. CookiePolicy is
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
723 responsible for checking them to see whether they should be accepted from
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
724 and returned to the server.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
725
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
726 Note that the port may be present in the headers, but unspecified ("Port"
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
727 rather than"Port=80", for example); if this is the case, port is None.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
728
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
729 """
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
730
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
731 def __init__(self, version, name, value,
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
732 port, port_specified,
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
733 domain, domain_specified, domain_initial_dot,
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
734 path, path_specified,
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
735 secure,
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
736 expires,
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
737 discard,
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
738 comment,
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
739 comment_url,
36111
630d01fecfec SF patch #1157027, cookielib mis-handles RFC 2109 cookies in Netscape mode
Neal Norwitz <nnorwitz@gmail.com>
parents: 36107
diff changeset
740 rest,
630d01fecfec SF patch #1157027, cookielib mis-handles RFC 2109 cookies in Netscape mode
Neal Norwitz <nnorwitz@gmail.com>
parents: 36107
diff changeset
741 rfc2109=False,
630d01fecfec SF patch #1157027, cookielib mis-handles RFC 2109 cookies in Netscape mode
Neal Norwitz <nnorwitz@gmail.com>
parents: 36107
diff changeset
742 ):
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
743
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
744 if version is not None: version = int(version)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
745 if expires is not None: expires = int(expires)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
746 if port is None and port_specified is True:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
747 raise ValueError("if port is None, port_specified must be false")
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
748
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
749 self.version = version
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
750 self.name = name
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
751 self.value = value
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
752 self.port = port
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
753 self.port_specified = port_specified
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
754 # normalise case, as per RFC 2965 section 3.3.3
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
755 self.domain = domain.lower()
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
756 self.domain_specified = domain_specified
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
757 # Sigh. We need to know whether the domain given in the
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
758 # cookie-attribute had an initial dot, in order to follow RFC 2965
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
759 # (as clarified in draft errata). Needed for the returned $Domain
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
760 # value.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
761 self.domain_initial_dot = domain_initial_dot
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
762 self.path = path
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
763 self.path_specified = path_specified
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
764 self.secure = secure
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
765 self.expires = expires
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
766 self.discard = discard
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
767 self.comment = comment
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
768 self.comment_url = comment_url
36111
630d01fecfec SF patch #1157027, cookielib mis-handles RFC 2109 cookies in Netscape mode
Neal Norwitz <nnorwitz@gmail.com>
parents: 36107
diff changeset
769 self.rfc2109 = rfc2109
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
770
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
771 self._rest = copy.copy(rest)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
772
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
773 def has_nonstandard_attr(self, name):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
774 return name in self._rest
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
775 def get_nonstandard_attr(self, name, default=None):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
776 return self._rest.get(name, default)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
777 def set_nonstandard_attr(self, name, value):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
778 self._rest[name] = value
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
779
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
780 def is_expired(self, now=None):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
781 if now is None: now = time.time()
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
782 if (self.expires is not None) and (self.expires <= now):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
783 return True
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
784 return False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
785
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
786 def __str__(self):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
787 if self.port is None: p = ""
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
788 else: p = ":"+self.port
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
789 limit = self.domain + p + self.path
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
790 if self.value is not None:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
791 namevalue = "%s=%s" % (self.name, self.value)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
792 else:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
793 namevalue = self.name
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
794 return "<Cookie %s for %s>" % (namevalue, limit)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
795
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
796 def __repr__(self):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
797 args = []
34545
9d66fba78444 Replace list of constants with tuples of constants.
Raymond Hettinger <python@rcn.com>
parents: 34542
diff changeset
798 for name in ("version", "name", "value",
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
799 "port", "port_specified",
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
800 "domain", "domain_specified", "domain_initial_dot",
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
801 "path", "path_specified",
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
802 "secure", "expires", "discard", "comment", "comment_url",
34545
9d66fba78444 Replace list of constants with tuples of constants.
Raymond Hettinger <python@rcn.com>
parents: 34542
diff changeset
803 ):
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
804 attr = getattr(self, name)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
805 args.append("%s=%s" % (name, repr(attr)))
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
806 args.append("rest=%s" % repr(self._rest))
36111
630d01fecfec SF patch #1157027, cookielib mis-handles RFC 2109 cookies in Netscape mode
Neal Norwitz <nnorwitz@gmail.com>
parents: 36107
diff changeset
807 args.append("rfc2109=%s" % repr(self.rfc2109))
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
808 return "Cookie(%s)" % ", ".join(args)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
809
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
810
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
811 class CookiePolicy:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
812 """Defines which cookies get accepted from and returned to server.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
813
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
814 May also modify cookies, though this is probably a bad idea.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
815
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
816 The subclass DefaultCookiePolicy defines the standard rules for Netscape
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
817 and RFC 2965 cookies -- override that if you want a customised policy.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
818
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
819 """
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
820 def set_ok(self, cookie, request):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
821 """Return true if (and only if) cookie should be accepted from server.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
822
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
823 Currently, pre-expired cookies never get this far -- the CookieJar
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
824 class deletes such cookies itself.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
825
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
826 """
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
827 raise NotImplementedError()
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
828
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
829 def return_ok(self, cookie, request):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
830 """Return true if (and only if) cookie should be returned to server."""
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
831 raise NotImplementedError()
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
832
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
833 def domain_return_ok(self, domain, request):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
834 """Return false if cookies should not be returned, given cookie domain.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
835 """
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
836 return True
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
837
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
838 def path_return_ok(self, path, request):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
839 """Return false if cookies should not be returned, given cookie path.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
840 """
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
841 return True
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
842
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
843
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
844 class DefaultCookiePolicy(CookiePolicy):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
845 """Implements the standard rules for accepting and returning cookies."""
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
846
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
847 DomainStrictNoDots = 1
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
848 DomainStrictNonDomain = 2
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
849 DomainRFC2965Match = 4
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
850
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
851 DomainLiberal = 0
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
852 DomainStrict = DomainStrictNoDots|DomainStrictNonDomain
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
853
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
854 def __init__(self,
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
855 blocked_domains=None, allowed_domains=None,
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
856 netscape=True, rfc2965=False,
36111
630d01fecfec SF patch #1157027, cookielib mis-handles RFC 2109 cookies in Netscape mode
Neal Norwitz <nnorwitz@gmail.com>
parents: 36107
diff changeset
857 rfc2109_as_netscape=None,
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
858 hide_cookie2=False,
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
859 strict_domain=False,
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
860 strict_rfc2965_unverifiable=True,
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
861 strict_ns_unverifiable=False,
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
862 strict_ns_domain=DomainLiberal,
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
863 strict_ns_set_initial_dollar=False,
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
864 strict_ns_set_path=False,
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
865 ):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
866 """Constructor arguments should be passed as keyword arguments only."""
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
867 self.netscape = netscape
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
868 self.rfc2965 = rfc2965
36111
630d01fecfec SF patch #1157027, cookielib mis-handles RFC 2109 cookies in Netscape mode
Neal Norwitz <nnorwitz@gmail.com>
parents: 36107
diff changeset
869 self.rfc2109_as_netscape = rfc2109_as_netscape
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
870 self.hide_cookie2 = hide_cookie2
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
871 self.strict_domain = strict_domain
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
872 self.strict_rfc2965_unverifiable = strict_rfc2965_unverifiable
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
873 self.strict_ns_unverifiable = strict_ns_unverifiable
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
874 self.strict_ns_domain = strict_ns_domain
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
875 self.strict_ns_set_initial_dollar = strict_ns_set_initial_dollar
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
876 self.strict_ns_set_path = strict_ns_set_path
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
877
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
878 if blocked_domains is not None:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
879 self._blocked_domains = tuple(blocked_domains)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
880 else:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
881 self._blocked_domains = ()
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
882
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
883 if allowed_domains is not None:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
884 allowed_domains = tuple(allowed_domains)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
885 self._allowed_domains = allowed_domains
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
886
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
887 def blocked_domains(self):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
888 """Return the sequence of blocked domains (as a tuple)."""
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
889 return self._blocked_domains
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
890 def set_blocked_domains(self, blocked_domains):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
891 """Set the sequence of blocked domains."""
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
892 self._blocked_domains = tuple(blocked_domains)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
893
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
894 def is_blocked(self, domain):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
895 for blocked_domain in self._blocked_domains:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
896 if user_domain_match(domain, blocked_domain):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
897 return True
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
898 return False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
899
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
900 def allowed_domains(self):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
901 """Return None, or the sequence of allowed domains (as a tuple)."""
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
902 return self._allowed_domains
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
903 def set_allowed_domains(self, allowed_domains):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
904 """Set the sequence of allowed domains, or None."""
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
905 if allowed_domains is not None:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
906 allowed_domains = tuple(allowed_domains)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
907 self._allowed_domains = allowed_domains
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
908
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
909 def is_not_allowed(self, domain):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
910 if self._allowed_domains is None:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
911 return False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
912 for allowed_domain in self._allowed_domains:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
913 if user_domain_match(domain, allowed_domain):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
914 return False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
915 return True
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
916
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
917 def set_ok(self, cookie, request):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
918 """
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
919 If you override .set_ok(), be sure to call this method. If it returns
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
920 false, so should your subclass (assuming your subclass wants to be more
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
921 strict about which cookies to accept).
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
922
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
923 """
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
924 _debug(" - checking cookie %s=%s", cookie.name, cookie.value)
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
925
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
926 assert cookie.name is not None
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
927
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
928 for n in "version", "verifiability", "name", "path", "domain", "port":
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
929 fn_name = "set_ok_"+n
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
930 fn = getattr(self, fn_name)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
931 if not fn(cookie, request):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
932 return False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
933
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
934 return True
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
935
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
936 def set_ok_version(self, cookie, request):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
937 if cookie.version is None:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
938 # Version is always set to 0 by parse_ns_headers if it's a Netscape
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
939 # cookie, so this must be an invalid RFC 2965 cookie.
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
940 _debug(" Set-Cookie2 without version attribute (%s=%s)",
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
941 cookie.name, cookie.value)
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
942 return False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
943 if cookie.version > 0 and not self.rfc2965:
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
944 _debug(" RFC 2965 cookies are switched off")
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
945 return False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
946 elif cookie.version == 0 and not self.netscape:
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
947 _debug(" Netscape cookies are switched off")
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
948 return False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
949 return True
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
950
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
951 def set_ok_verifiability(self, cookie, request):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
952 if request.is_unverifiable() and is_third_party(request):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
953 if cookie.version > 0 and self.strict_rfc2965_unverifiable:
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
954 _debug(" third-party RFC 2965 cookie during "
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
955 "unverifiable transaction")
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
956 return False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
957 elif cookie.version == 0 and self.strict_ns_unverifiable:
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
958 _debug(" third-party Netscape cookie during "
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
959 "unverifiable transaction")
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
960 return False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
961 return True
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
962
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
963 def set_ok_name(self, cookie, request):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
964 # Try and stop servers setting V0 cookies designed to hack other
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
965 # servers that know both V0 and V1 protocols.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
966 if (cookie.version == 0 and self.strict_ns_set_initial_dollar and
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
967 cookie.name.startswith("$")):
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
968 _debug(" illegal name (starts with '$'): '%s'", cookie.name)
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
969 return False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
970 return True
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
971
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
972 def set_ok_path(self, cookie, request):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
973 if cookie.path_specified:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
974 req_path = request_path(request)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
975 if ((cookie.version > 0 or
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
976 (cookie.version == 0 and self.strict_ns_set_path)) and
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
977 not req_path.startswith(cookie.path)):
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
978 _debug(" path attribute %s is not a prefix of request "
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
979 "path %s", cookie.path, req_path)
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
980 return False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
981 return True
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
982
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
983 def set_ok_domain(self, cookie, request):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
984 if self.is_blocked(cookie.domain):
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
985 _debug(" domain %s is in user block-list", cookie.domain)
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
986 return False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
987 if self.is_not_allowed(cookie.domain):
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
988 _debug(" domain %s is not in user allow-list", cookie.domain)
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
989 return False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
990 if cookie.domain_specified:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
991 req_host, erhn = eff_request_host(request)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
992 domain = cookie.domain
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
993 if self.strict_domain and (domain.count(".") >= 2):
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
994 # XXX This should probably be compared with the Konqueror
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
995 # (kcookiejar.cpp) and Mozilla implementations, but it's a
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
996 # losing battle.
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
997 i = domain.rfind(".")
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
998 j = domain.rfind(".", 0, i)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
999 if j == 0: # domain like .foo.bar
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1000 tld = domain[i+1:]
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1001 sld = domain[j+1:i]
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1002 if sld.lower() in ("co", "ac", "com", "edu", "org", "net",
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1003 "gov", "mil", "int", "aero", "biz", "cat", "coop",
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1004 "info", "jobs", "mobi", "museum", "name", "pro",
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1005 "travel", "eu") and len(tld) == 2:
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1006 # domain like .co.uk
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1007 _debug(" country-code second level domain %s", domain)
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1008 return False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1009 if domain.startswith("."):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1010 undotted_domain = domain[1:]
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1011 else:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1012 undotted_domain = domain
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1013 embedded_dots = (undotted_domain.find(".") >= 0)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1014 if not embedded_dots and domain != ".local":
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1015 _debug(" non-local domain %s contains no embedded dot",
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1016 domain)
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1017 return False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1018 if cookie.version == 0:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1019 if (not erhn.endswith(domain) and
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1020 (not erhn.startswith(".") and
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1021 not ("."+erhn).endswith(domain))):
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1022 _debug(" effective request-host %s (even with added "
72985
e19ccbbe70dd Remove duplication.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 68786
diff changeset
1023 "initial dot) does not end with %s",
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1024 erhn, domain)
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1025 return False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1026 if (cookie.version > 0 or
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1027 (self.strict_ns_domain & self.DomainRFC2965Match)):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1028 if not domain_match(erhn, domain):
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1029 _debug(" effective request-host %s does not domain-match "
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1030 "%s", erhn, domain)
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1031 return False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1032 if (cookie.version > 0 or
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1033 (self.strict_ns_domain & self.DomainStrictNoDots)):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1034 host_prefix = req_host[:-len(domain)]
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1035 if (host_prefix.find(".") >= 0 and
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1036 not IPV4_RE.search(req_host)):
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1037 _debug(" host prefix %s for domain %s contains a dot",
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1038 host_prefix, domain)
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1039 return False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1040 return True
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1041
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1042 def set_ok_port(self, cookie, request):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1043 if cookie.port_specified:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1044 req_port = request_port(request)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1045 if req_port is None:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1046 req_port = "80"
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1047 else:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1048 req_port = str(req_port)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1049 for p in cookie.port.split(","):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1050 try:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1051 int(p)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1052 except ValueError:
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1053 _debug(" bad port %s (not numeric)", p)
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1054 return False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1055 if p == req_port:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1056 break
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1057 else:
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1058 _debug(" request port (%s) not found in %s",
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1059 req_port, cookie.port)
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1060 return False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1061 return True
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1062
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1063 def return_ok(self, cookie, request):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1064 """
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1065 If you override .return_ok(), be sure to call this method. If it
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1066 returns false, so should your subclass (assuming your subclass wants to
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1067 be more strict about which cookies to return).
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1068
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1069 """
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1070 # Path has already been checked by .path_return_ok(), and domain
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1071 # blocking done by .domain_return_ok().
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1072 _debug(" - checking cookie %s=%s", cookie.name, cookie.value)
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1073
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1074 for n in "version", "verifiability", "secure", "expires", "port", "domain":
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1075 fn_name = "return_ok_"+n
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1076 fn = getattr(self, fn_name)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1077 if not fn(cookie, request):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1078 return False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1079 return True
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1080
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1081 def return_ok_version(self, cookie, request):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1082 if cookie.version > 0 and not self.rfc2965:
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1083 _debug(" RFC 2965 cookies are switched off")
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1084 return False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1085 elif cookie.version == 0 and not self.netscape:
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1086 _debug(" Netscape cookies are switched off")
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1087 return False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1088 return True
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1089
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1090 def return_ok_verifiability(self, cookie, request):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1091 if request.is_unverifiable() and is_third_party(request):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1092 if cookie.version > 0 and self.strict_rfc2965_unverifiable:
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1093 _debug(" third-party RFC 2965 cookie during unverifiable "
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1094 "transaction")
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1095 return False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1096 elif cookie.version == 0 and self.strict_ns_unverifiable:
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1097 _debug(" third-party Netscape cookie during unverifiable "
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1098 "transaction")
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1099 return False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1100 return True
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1101
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1102 def return_ok_secure(self, cookie, request):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1103 if cookie.secure and request.get_type() != "https":
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1104 _debug(" secure cookie with non-secure request")
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1105 return False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1106 return True
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1107
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1108 def return_ok_expires(self, cookie, request):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1109 if cookie.is_expired(self._now):
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1110 _debug(" cookie expired")
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1111 return False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1112 return True
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1113
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1114 def return_ok_port(self, cookie, request):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1115 if cookie.port:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1116 req_port = request_port(request)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1117 if req_port is None:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1118 req_port = "80"
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1119 for p in cookie.port.split(","):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1120 if p == req_port:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1121 break
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1122 else:
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1123 _debug(" request port %s does not match cookie port %s",
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1124 req_port, cookie.port)
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1125 return False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1126 return True
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1127
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1128 def return_ok_domain(self, cookie, request):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1129 req_host, erhn = eff_request_host(request)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1130 domain = cookie.domain
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1131
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1132 # strict check of non-domain cookies: Mozilla does this, MSIE5 doesn't
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1133 if (cookie.version == 0 and
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1134 (self.strict_ns_domain & self.DomainStrictNonDomain) and
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1135 not cookie.domain_specified and domain != erhn):
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1136 _debug(" cookie with unspecified domain does not string-compare "
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1137 "equal to request domain")
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1138 return False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1139
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1140 if cookie.version > 0 and not domain_match(erhn, domain):
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1141 _debug(" effective request-host name %s does not domain-match "
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1142 "RFC 2965 cookie domain %s", erhn, domain)
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1143 return False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1144 if cookie.version == 0 and not ("."+erhn).endswith(domain):
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1145 _debug(" request-host %s does not match Netscape cookie domain "
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1146 "%s", req_host, domain)
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1147 return False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1148 return True
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1149
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1150 def domain_return_ok(self, domain, request):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1151 # Liberal check of. This is here as an optimization to avoid
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1152 # having to load lots of MSIE cookie files unless necessary.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1153 req_host, erhn = eff_request_host(request)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1154 if not req_host.startswith("."):
34542
465724425370 SF patch #1116583: NameError in cookielib domain check
Raymond Hettinger <python@rcn.com>
parents: 33771
diff changeset
1155 req_host = "."+req_host
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1156 if not erhn.startswith("."):
34542
465724425370 SF patch #1116583: NameError in cookielib domain check
Raymond Hettinger <python@rcn.com>
parents: 33771
diff changeset
1157 erhn = "."+erhn
465724425370 SF patch #1116583: NameError in cookielib domain check
Raymond Hettinger <python@rcn.com>
parents: 33771
diff changeset
1158 if not (req_host.endswith(domain) or erhn.endswith(domain)):
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1159 #_debug(" request domain %s does not match cookie domain %s",
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1160 # req_host, domain)
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1161 return False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1162
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1163 if self.is_blocked(domain):
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1164 _debug(" domain %s is in user block-list", domain)
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1165 return False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1166 if self.is_not_allowed(domain):
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1167 _debug(" domain %s is not in user allow-list", domain)
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1168 return False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1169
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1170 return True
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1171
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1172 def path_return_ok(self, path, request):
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1173 _debug("- checking cookie path=%s", path)
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1174 req_path = request_path(request)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1175 if not req_path.startswith(path):
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1176 _debug(" %s does not path-match %s", req_path, path)
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1177 return False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1178 return True
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1179
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1180
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1181 def vals_sorted_by_key(adict):
40809
f340cb045bf9 - PEP 3106: dict.iterkeys(), .iteritems(), .itervalues() are now gone;
Guido van Rossum <guido@python.org>
parents: 40742
diff changeset
1182 keys = sorted(adict.keys())
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1183 return map(adict.get, keys)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1184
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1185 def deepvalues(mapping):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1186 """Iterates over nested mapping, depth-first, in sorted order by key."""
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1187 values = vals_sorted_by_key(mapping)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1188 for obj in values:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1189 mapping = False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1190 try:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1191 obj.items
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1192 except AttributeError:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1193 pass
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1194 else:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1195 mapping = True
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1196 for subobj in deepvalues(obj):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1197 yield subobj
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1198 if not mapping:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1199 yield obj
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1200
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1201
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1202 # Used as second parameter to dict.get() method, to distinguish absent
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1203 # dict key from one with a None value.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1204 class Absent: pass
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1205
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1206 class CookieJar:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1207 """Collection of HTTP cookies.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1208
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1209 You may not need to know about this class: try
48334
5a416a6417d3 Make a new urllib package .
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 47635
diff changeset
1210 urllib.request.build_opener(HTTPCookieProcessor).open(url).
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1211 """
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1212
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1213 non_word_re = re.compile(r"\W")
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1214 quote_re = re.compile(r"([\"\\])")
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1215 strict_domain_re = re.compile(r"\.?[^.]*")
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1216 domain_re = re.compile(r"[^.]*")
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1217 dots_re = re.compile(r"^\.+")
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1218
48769
83b2d07b475b #2834: Change re module semantics, so that str and bytes mixing is forbidden,
Antoine Pitrou <solipsis@pitrou.net>
parents: 48356
diff changeset
1219 magic_re = re.compile(r"^\#LWP-Cookies-(\d+\.\d+)", re.ASCII)
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1220
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1221 def __init__(self, policy=None):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1222 if policy is None:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1223 policy = DefaultCookiePolicy()
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1224 self._policy = policy
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1225
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1226 self._cookies_lock = _threading.RLock()
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1227 self._cookies = {}
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1228
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1229 def set_policy(self, policy):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1230 self._policy = policy
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1231
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1232 def _cookies_for_domain(self, domain, request):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1233 cookies = []
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1234 if not self._policy.domain_return_ok(domain, request):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1235 return []
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1236 _debug("Checking %s for cookies to return", domain)
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1237 cookies_by_path = self._cookies[domain]
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1238 for path in cookies_by_path.keys():
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1239 if not self._policy.path_return_ok(path, request):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1240 continue
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1241 cookies_by_name = cookies_by_path[path]
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1242 for cookie in cookies_by_name.values():
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1243 if not self._policy.return_ok(cookie, request):
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1244 _debug(" not returning cookie")
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1245 continue
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1246 _debug(" it's a match")
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1247 cookies.append(cookie)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1248 return cookies
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1249
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1250 def _cookies_for_request(self, request):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1251 """Return a list of cookies to be returned to server."""
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1252 cookies = []
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1253 for domain in self._cookies.keys():
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1254 cookies.extend(self._cookies_for_domain(domain, request))
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1255 return cookies
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1256
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1257 def _cookie_attrs(self, cookies):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1258 """Return a list of cookie-attributes to be returned to server.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1259
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1260 like ['foo="bar"; $Path="/"', ...]
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1261
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1262 The $Version attribute is also added when appropriate (currently only
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1263 once per request).
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1264
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1265 """
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1266 # add cookies in order of most specific (ie. longest) path first
45061
b9ee31a26f38 Issue #1771: Remove cmp parameter from list.sort() and builtin.sorted().
Raymond Hettinger <python@rcn.com>
parents: 43577
diff changeset
1267 cookies.sort(key=lambda a: len(a.path), reverse=True)
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1268
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1269 version_set = False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1270
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1271 attrs = []
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1272 for cookie in cookies:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1273 # set version of Cookie header
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1274 # XXX
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1275 # What should it be if multiple matching Set-Cookie headers have
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1276 # different versions themselves?
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1277 # Answer: there is no answer; was supposed to be settled by
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1278 # RFC 2965 errata, but that may never appear...
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1279 version = cookie.version
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1280 if not version_set:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1281 version_set = True
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1282 if version > 0:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1283 attrs.append("$Version=%s" % version)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1284
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1285 # quote cookie value if necessary
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1286 # (not for Netscape protocol, which already has any quotes
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1287 # intact, due to the poorly-specified Netscape Cookie: syntax)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1288 if ((cookie.value is not None) and
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1289 self.non_word_re.search(cookie.value) and version > 0):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1290 value = self.quote_re.sub(r"\\\1", cookie.value)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1291 else:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1292 value = cookie.value
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1293
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1294 # add cookie-attributes to be returned in Cookie header
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1295 if cookie.value is None:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1296 attrs.append(cookie.name)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1297 else:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1298 attrs.append("%s=%s" % (cookie.name, value))
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1299 if version > 0:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1300 if cookie.path_specified:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1301 attrs.append('$Path="%s"' % cookie.path)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1302 if cookie.domain.startswith("."):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1303 domain = cookie.domain
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1304 if (not cookie.domain_initial_dot and
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1305 domain.startswith(".")):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1306 domain = domain[1:]
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1307 attrs.append('$Domain="%s"' % domain)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1308 if cookie.port is not None:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1309 p = "$Port"
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1310 if cookie.port_specified:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1311 p = p + ('="%s"' % cookie.port)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1312 attrs.append(p)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1313
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1314 return attrs
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1315
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1316 def add_cookie_header(self, request):
48356
6c04d14994d0 Fix old urllib/urllib2/urlparse usage.
Georg Brandl <georg@python.org>
parents: 48334
diff changeset
1317 """Add correct Cookie: header to request (urllib.request.Request object).
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1318
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1319 The Cookie2 header is also added unless policy.hide_cookie2 is true.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1320
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1321 """
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1322 _debug("add_cookie_header")
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1323 self._cookies_lock.acquire()
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1324 try:
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1325
40742
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1326 self._policy._now = self._now = int(time.time())
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1327
40742
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1328 cookies = self._cookies_for_request(request)
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1329
40742
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1330 attrs = self._cookie_attrs(cookies)
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1331 if attrs:
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1332 if not request.has_header("Cookie"):
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1333 request.add_unredirected_header(
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1334 "Cookie", "; ".join(attrs))
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1335
40742
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1336 # if necessary, advertise that we know RFC 2965
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1337 if (self._policy.rfc2965 and not self._policy.hide_cookie2 and
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1338 not request.has_header("Cookie2")):
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1339 for cookie in cookies:
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1340 if cookie.version != 1:
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1341 request.add_unredirected_header("Cookie2", '$Version="1"')
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1342 break
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1343
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1344 finally:
40742
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1345 self._cookies_lock.release()
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1346
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1347 self.clear_expired_cookies()
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1348
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1349 def _normalized_cookie_tuples(self, attrs_set):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1350 """Return list of tuples containing normalised cookie information.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1351
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1352 attrs_set is the list of lists of key,value pairs extracted from
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1353 the Set-Cookie or Set-Cookie2 headers.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1354
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1355 Tuples are name, value, standard, rest, where name and value are the
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1356 cookie name and value, standard is a dictionary containing the standard
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1357 cookie-attributes (discard, secure, version, expires or max-age,
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1358 domain, path and port) and rest is a dictionary containing the rest of
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1359 the cookie-attributes.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1360
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1361 """
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1362 cookie_tuples = []
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1363
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1364 boolean_attrs = "discard", "secure"
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1365 value_attrs = ("version",
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1366 "expires", "max-age",
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1367 "domain", "path", "port",
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1368 "comment", "commenturl")
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1369
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1370 for cookie_attrs in attrs_set:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1371 name, value = cookie_attrs[0]
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1372
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1373 # Build dictionary of standard cookie-attributes (standard) and
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1374 # dictionary of other cookie-attributes (rest).
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1375
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1376 # Note: expiry time is normalised to seconds since epoch. V0
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1377 # cookies should have the Expires cookie-attribute, and V1 cookies
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1378 # should have Max-Age, but since V1 includes RFC 2109 cookies (and
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1379 # since V0 cookies may be a mish-mash of Netscape and RFC 2109), we
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1380 # accept either (but prefer Max-Age).
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1381 max_age_set = False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1382
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1383 bad_cookie = False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1384
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1385 standard = {}
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1386 rest = {}
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1387 for k, v in cookie_attrs[1:]:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1388 lc = k.lower()
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1389 # don't lose case distinction for unknown fields
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1390 if lc in value_attrs or lc in boolean_attrs:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1391 k = lc
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1392 if k in boolean_attrs and v is None:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1393 # boolean cookie-attribute is present, but has no value
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1394 # (like "discard", rather than "port=80")
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1395 v = True
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1396 if k in standard:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1397 # only first value is significant
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1398 continue
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1399 if k == "domain":
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1400 if v is None:
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1401 _debug(" missing value for domain attribute")
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1402 bad_cookie = True
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1403 break
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1404 # RFC 2965 section 3.3.3
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1405 v = v.lower()
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1406 if k == "expires":
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1407 if max_age_set:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1408 # Prefer max-age to expires (like Mozilla)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1409 continue
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1410 if v is None:
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1411 _debug(" missing or invalid value for expires "
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1412 "attribute: treating as session cookie")
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1413 continue
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1414 if k == "max-age":
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1415 max_age_set = True
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1416 try:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1417 v = int(v)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1418 except ValueError:
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1419 _debug(" missing or invalid (non-numeric) value for "
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1420 "max-age attribute")
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1421 bad_cookie = True
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1422 break
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1423 # convert RFC 2965 Max-Age to seconds since epoch
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1424 # XXX Strictly you're supposed to follow RFC 2616
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1425 # age-calculation rules. Remember that zero Max-Age is a
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1426 # is a request to discard (old and new) cookie, though.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1427 k = "expires"
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1428 v = self._now + v
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1429 if (k in value_attrs) or (k in boolean_attrs):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1430 if (v is None and
34545
9d66fba78444 Replace list of constants with tuples of constants.
Raymond Hettinger <python@rcn.com>
parents: 34542
diff changeset
1431 k not in ("port", "comment", "commenturl")):
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1432 _debug(" missing value for %s attribute" % k)
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1433 bad_cookie = True
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1434 break
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1435 standard[k] = v
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1436 else:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1437 rest[k] = v
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1438
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1439 if bad_cookie:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1440 continue
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1441
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1442 cookie_tuples.append((name, value, standard, rest))
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1443
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1444 return cookie_tuples
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1445
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1446 def _cookie_from_cookie_tuple(self, tup, request):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1447 # standard is dict of standard cookie-attributes, rest is dict of the
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1448 # rest of them
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1449 name, value, standard, rest = tup
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1450
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1451 domain = standard.get("domain", Absent)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1452 path = standard.get("path", Absent)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1453 port = standard.get("port", Absent)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1454 expires = standard.get("expires", Absent)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1455
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1456 # set the easy defaults
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1457 version = standard.get("version", None)
62566
504c499e8c95 Merged revisions 81465-81466,81468,81679,81735,81760,81868,82183 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48769
diff changeset
1458 if version is not None:
504c499e8c95 Merged revisions 81465-81466,81468,81679,81735,81760,81868,82183 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48769
diff changeset
1459 try:
504c499e8c95 Merged revisions 81465-81466,81468,81679,81735,81760,81868,82183 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48769
diff changeset
1460 version = int(version)
504c499e8c95 Merged revisions 81465-81466,81468,81679,81735,81760,81868,82183 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48769
diff changeset
1461 except ValueError:
504c499e8c95 Merged revisions 81465-81466,81468,81679,81735,81760,81868,82183 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48769
diff changeset
1462 return None # invalid version, ignore cookie
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1463 secure = standard.get("secure", False)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1464 # (discard is also set if expires is Absent)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1465 discard = standard.get("discard", False)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1466 comment = standard.get("comment", None)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1467 comment_url = standard.get("commenturl", None)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1468
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1469 # set default path
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1470 if path is not Absent and path != "":
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1471 path_specified = True
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1472 path = escape_path(path)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1473 else:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1474 path_specified = False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1475 path = request_path(request)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1476 i = path.rfind("/")
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1477 if i != -1:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1478 if version == 0:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1479 # Netscape spec parts company from reality here
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1480 path = path[:i]
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1481 else:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1482 path = path[:i+1]
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1483 if len(path) == 0: path = "/"
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1484
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1485 # set default domain
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1486 domain_specified = domain is not Absent
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1487 # but first we have to remember whether it starts with a dot
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1488 domain_initial_dot = False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1489 if domain_specified:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1490 domain_initial_dot = bool(domain.startswith("."))
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1491 if domain is Absent:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1492 req_host, erhn = eff_request_host(request)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1493 domain = erhn
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1494 elif not domain.startswith("."):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1495 domain = "."+domain
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1496
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1497 # set default port
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1498 port_specified = False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1499 if port is not Absent:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1500 if port is None:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1501 # Port attr present, but has no value: default to request port.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1502 # Cookie should then only be sent back on that port.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1503 port = request_port(request)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1504 else:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1505 port_specified = True
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1506 port = re.sub(r"\s+", "", port)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1507 else:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1508 # No port attr present. Cookie can be sent back on any port.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1509 port = None
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1510
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1511 # set default expires and discard
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1512 if expires is Absent:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1513 expires = None
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1514 discard = True
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1515 elif expires <= self._now:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1516 # Expiry date in past is request to delete cookie. This can't be
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1517 # in DefaultCookiePolicy, because can't delete cookies there.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1518 try:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1519 self.clear(domain, path, name)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1520 except KeyError:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1521 pass
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1522 _debug("Expiring cookie, domain='%s', path='%s', name='%s'",
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1523 domain, path, name)
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1524 return None
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1525
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1526 return Cookie(version,
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1527 name, value,
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1528 port, port_specified,
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1529 domain, domain_specified, domain_initial_dot,
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1530 path, path_specified,
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1531 secure,
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1532 expires,
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1533 discard,
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1534 comment,
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1535 comment_url,
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1536 rest)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1537
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1538 def _cookies_from_attrs_set(self, attrs_set, request):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1539 cookie_tuples = self._normalized_cookie_tuples(attrs_set)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1540
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1541 cookies = []
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1542 for tup in cookie_tuples:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1543 cookie = self._cookie_from_cookie_tuple(tup, request)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1544 if cookie: cookies.append(cookie)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1545 return cookies
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1546
36111
630d01fecfec SF patch #1157027, cookielib mis-handles RFC 2109 cookies in Netscape mode
Neal Norwitz <nnorwitz@gmail.com>
parents: 36107
diff changeset
1547 def _process_rfc2109_cookies(self, cookies):
630d01fecfec SF patch #1157027, cookielib mis-handles RFC 2109 cookies in Netscape mode
Neal Norwitz <nnorwitz@gmail.com>
parents: 36107
diff changeset
1548 rfc2109_as_ns = getattr(self._policy, 'rfc2109_as_netscape', None)
630d01fecfec SF patch #1157027, cookielib mis-handles RFC 2109 cookies in Netscape mode
Neal Norwitz <nnorwitz@gmail.com>
parents: 36107
diff changeset
1549 if rfc2109_as_ns is None:
630d01fecfec SF patch #1157027, cookielib mis-handles RFC 2109 cookies in Netscape mode
Neal Norwitz <nnorwitz@gmail.com>
parents: 36107
diff changeset
1550 rfc2109_as_ns = not self._policy.rfc2965
630d01fecfec SF patch #1157027, cookielib mis-handles RFC 2109 cookies in Netscape mode
Neal Norwitz <nnorwitz@gmail.com>
parents: 36107
diff changeset
1551 for cookie in cookies:
630d01fecfec SF patch #1157027, cookielib mis-handles RFC 2109 cookies in Netscape mode
Neal Norwitz <nnorwitz@gmail.com>
parents: 36107
diff changeset
1552 if cookie.version == 1:
630d01fecfec SF patch #1157027, cookielib mis-handles RFC 2109 cookies in Netscape mode
Neal Norwitz <nnorwitz@gmail.com>
parents: 36107
diff changeset
1553 cookie.rfc2109 = True
36121
686306a67e9b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 36111
diff changeset
1554 if rfc2109_as_ns:
36111
630d01fecfec SF patch #1157027, cookielib mis-handles RFC 2109 cookies in Netscape mode
Neal Norwitz <nnorwitz@gmail.com>
parents: 36107
diff changeset
1555 # treat 2109 cookies as Netscape cookies rather than
630d01fecfec SF patch #1157027, cookielib mis-handles RFC 2109 cookies in Netscape mode
Neal Norwitz <nnorwitz@gmail.com>
parents: 36107
diff changeset
1556 # as RFC2965 cookies
630d01fecfec SF patch #1157027, cookielib mis-handles RFC 2109 cookies in Netscape mode
Neal Norwitz <nnorwitz@gmail.com>
parents: 36107
diff changeset
1557 cookie.version = 0
630d01fecfec SF patch #1157027, cookielib mis-handles RFC 2109 cookies in Netscape mode
Neal Norwitz <nnorwitz@gmail.com>
parents: 36107
diff changeset
1558
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1559 def make_cookies(self, response, request):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1560 """Return sequence of Cookie objects extracted from response object."""
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1561 # get cookie-attributes for RFC 2965 and Netscape protocols
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1562 headers = response.info()
47635
f31e32a2013c Patch for issue 2848, mostly by Humberto Diogenes, with a couple of
Barry Warsaw <barry@python.org>
parents: 47326
diff changeset
1563 rfc2965_hdrs = headers.get_all("Set-Cookie2", [])
f31e32a2013c Patch for issue 2848, mostly by Humberto Diogenes, with a couple of
Barry Warsaw <barry@python.org>
parents: 47326
diff changeset
1564 ns_hdrs = headers.get_all("Set-Cookie", [])
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1565
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1566 rfc2965 = self._policy.rfc2965
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1567 netscape = self._policy.netscape
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1568
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1569 if ((not rfc2965_hdrs and not ns_hdrs) or
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1570 (not ns_hdrs and not rfc2965) or
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1571 (not rfc2965_hdrs and not netscape) or
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1572 (not netscape and not rfc2965)):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1573 return [] # no relevant cookie headers: quick exit
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1574
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1575 try:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1576 cookies = self._cookies_from_attrs_set(
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1577 split_header_words(rfc2965_hdrs), request)
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1578 except Exception:
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1579 _warn_unhandled_exception()
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1580 cookies = []
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1581
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1582 if ns_hdrs and netscape:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1583 try:
36111
630d01fecfec SF patch #1157027, cookielib mis-handles RFC 2109 cookies in Netscape mode
Neal Norwitz <nnorwitz@gmail.com>
parents: 36107
diff changeset
1584 # RFC 2109 and Netscape cookies
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1585 ns_cookies = self._cookies_from_attrs_set(
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1586 parse_ns_headers(ns_hdrs), request)
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1587 except Exception:
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1588 _warn_unhandled_exception()
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1589 ns_cookies = []
36111
630d01fecfec SF patch #1157027, cookielib mis-handles RFC 2109 cookies in Netscape mode
Neal Norwitz <nnorwitz@gmail.com>
parents: 36107
diff changeset
1590 self._process_rfc2109_cookies(ns_cookies)
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1591
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1592 # Look for Netscape cookies (from Set-Cookie headers) that match
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1593 # corresponding RFC 2965 cookies (from Set-Cookie2 headers).
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1594 # For each match, keep the RFC 2965 cookie and ignore the Netscape
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1595 # cookie (RFC 2965 section 9.1). Actually, RFC 2109 cookies are
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1596 # bundled in with the Netscape cookies for this purpose, which is
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1597 # reasonable behaviour.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1598 if rfc2965:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1599 lookup = {}
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1600 for cookie in cookies:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1601 lookup[(cookie.domain, cookie.path, cookie.name)] = None
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1602
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1603 def no_matching_rfc2965(ns_cookie, lookup=lookup):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1604 key = ns_cookie.domain, ns_cookie.path, ns_cookie.name
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1605 return key not in lookup
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1606 ns_cookies = filter(no_matching_rfc2965, ns_cookies)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1607
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1608 if ns_cookies:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1609 cookies.extend(ns_cookies)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1610
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1611 return cookies
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1612
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1613 def set_cookie_if_ok(self, cookie, request):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1614 """Set a cookie if policy says it's OK to do so."""
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1615 self._cookies_lock.acquire()
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1616 try:
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1617 self._policy._now = self._now = int(time.time())
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1618
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1619 if self._policy.set_ok(cookie, request):
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1620 self.set_cookie(cookie)
40742
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1621
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1622
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1623 finally:
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1624 self._cookies_lock.release()
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1625
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1626 def set_cookie(self, cookie):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1627 """Set a cookie, without checking whether or not it should be set."""
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1628 c = self._cookies
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1629 self._cookies_lock.acquire()
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1630 try:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1631 if cookie.domain not in c: c[cookie.domain] = {}
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1632 c2 = c[cookie.domain]
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1633 if cookie.path not in c2: c2[cookie.path] = {}
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1634 c3 = c2[cookie.path]
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1635 c3[cookie.name] = cookie
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1636 finally:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1637 self._cookies_lock.release()
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1638
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1639 def extract_cookies(self, response, request):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1640 """Extract cookies from response, where allowable given the request."""
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1641 _debug("extract_cookies: %s", response.info())
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1642 self._cookies_lock.acquire()
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1643 try:
40742
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1644 self._policy._now = self._now = int(time.time())
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1645
40742
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1646 for cookie in self.make_cookies(response, request):
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1647 if self._policy.set_ok(cookie, request):
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1648 _debug(" setting cookie: %s", cookie)
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1649 self.set_cookie(cookie)
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1650 finally:
40742
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1651 self._cookies_lock.release()
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1652
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1653 def clear(self, domain=None, path=None, name=None):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1654 """Clear some cookies.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1655
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1656 Invoking this method without arguments will clear all cookies. If
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1657 given a single argument, only cookies belonging to that domain will be
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1658 removed. If given two arguments, cookies belonging to the specified
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1659 path within that domain are removed. If given three arguments, then
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1660 the cookie with the specified name, path and domain is removed.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1661
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1662 Raises KeyError if no matching cookie exists.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1663
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1664 """
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1665 if name is not None:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1666 if (domain is None) or (path is None):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1667 raise ValueError(
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1668 "domain and path must be given to remove a cookie by name")
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1669 del self._cookies[domain][path][name]
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1670 elif path is not None:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1671 if domain is None:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1672 raise ValueError(
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1673 "domain must be given to remove cookies by path")
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1674 del self._cookies[domain][path]
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1675 elif domain is not None:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1676 del self._cookies[domain]
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1677 else:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1678 self._cookies = {}
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1679
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1680 def clear_session_cookies(self):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1681 """Discard all session cookies.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1682
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1683 Note that the .save() method won't save session cookies anyway, unless
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1684 you ask otherwise by passing a true ignore_discard argument.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1685
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1686 """
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1687 self._cookies_lock.acquire()
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1688 try:
40742
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1689 for cookie in self:
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1690 if cookie.discard:
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1691 self.clear(cookie.domain, cookie.path, cookie.name)
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1692 finally:
40742
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1693 self._cookies_lock.release()
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1694
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1695 def clear_expired_cookies(self):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1696 """Discard all expired cookies.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1697
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1698 You probably don't need to call this method: expired cookies are never
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1699 sent back to the server (provided you're using DefaultCookiePolicy),
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1700 this method is called by CookieJar itself every so often, and the
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1701 .save() method won't save expired cookies anyway (unless you ask
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1702 otherwise by passing a true ignore_expires argument).
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1703
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1704 """
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1705 self._cookies_lock.acquire()
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1706 try:
40742
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1707 now = time.time()
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1708 for cookie in self:
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1709 if cookie.is_expired(now):
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1710 self.clear(cookie.domain, cookie.path, cookie.name)
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1711 finally:
40742
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1712 self._cookies_lock.release()
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1713
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1714 def __iter__(self):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1715 return deepvalues(self._cookies)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1716
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1717 def __len__(self):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1718 """Return number of contained cookies."""
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1719 i = 0
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1720 for cookie in self: i = i + 1
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1721 return i
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1722
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1723 def __repr__(self):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1724 r = []
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1725 for cookie in self: r.append(repr(cookie))
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1726 return "<%s[%s]>" % (self.__class__, ", ".join(r))
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1727
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1728 def __str__(self):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1729 r = []
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1730 for cookie in self: r.append(str(cookie))
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1731 return "<%s[%s]>" % (self.__class__, ", ".join(r))
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1732
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1733
36107
5ce47103f847 Fix SF #1117398, cookielib LWPCookieJar and MozillaCookieJar exceptions
Neal Norwitz <nnorwitz@gmail.com>
parents: 35979
diff changeset
1734 # derives from IOError for backwards-compatibility with Python 2.4.0
5ce47103f847 Fix SF #1117398, cookielib LWPCookieJar and MozillaCookieJar exceptions
Neal Norwitz <nnorwitz@gmail.com>
parents: 35979
diff changeset
1735 class LoadError(IOError): pass
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1736
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1737 class FileCookieJar(CookieJar):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1738 """CookieJar that can be loaded from and saved to a file."""
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1739
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1740 def __init__(self, filename=None, delayload=False, policy=None):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1741 """
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1742 Cookies are NOT loaded from the named file until either the .load() or
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1743 .revert() method is called.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1744
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1745 """
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1746 CookieJar.__init__(self, policy)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1747 if filename is not None:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1748 try:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1749 filename+""
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1750 except:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1751 raise ValueError("filename must be string-like")
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1752 self.filename = filename
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1753 self.delayload = bool(delayload)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1754
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1755 def save(self, filename=None, ignore_discard=False, ignore_expires=False):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1756 """Save cookies to a file."""
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1757 raise NotImplementedError()
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1758
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1759 def load(self, filename=None, ignore_discard=False, ignore_expires=False):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1760 """Load cookies from a file."""
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1761 if filename is None:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1762 if self.filename is not None: filename = self.filename
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1763 else: raise ValueError(MISSING_FILENAME_TEXT)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1764
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1765 f = open(filename)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1766 try:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1767 self._really_load(f, filename, ignore_discard, ignore_expires)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1768 finally:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1769 f.close()
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1770
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1771 def revert(self, filename=None,
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1772 ignore_discard=False, ignore_expires=False):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1773 """Clear all cookies and reload cookies from a saved file.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1774
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1775 Raises LoadError (or IOError) if reversion is not successful; the
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1776 object's state will not be altered if this happens.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1777
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1778 """
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1779 if filename is None:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1780 if self.filename is not None: filename = self.filename
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1781 else: raise ValueError(MISSING_FILENAME_TEXT)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1782
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1783 self._cookies_lock.acquire()
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1784 try:
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1785
40742
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1786 old_state = copy.deepcopy(self._cookies)
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1787 self._cookies = {}
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1788 try:
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1789 self.load(filename, ignore_discard, ignore_expires)
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1790 except (LoadError, IOError):
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1791 self._cookies = old_state
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1792 raise
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1793
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1794 finally:
40742
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1795 self._cookies_lock.release()
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1796
47326
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1797
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1798 def lwp_cookie_str(cookie):
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1799 """Return string representation of Cookie in an the LWP cookie file format.
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1800
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1801 Actually, the format is extended a bit -- see module docstring.
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1802
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1803 """
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1804 h = [(cookie.name, cookie.value),
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1805 ("path", cookie.path),
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1806 ("domain", cookie.domain)]
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1807 if cookie.port is not None: h.append(("port", cookie.port))
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1808 if cookie.path_specified: h.append(("path_spec", None))
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1809 if cookie.port_specified: h.append(("port_spec", None))
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1810 if cookie.domain_initial_dot: h.append(("domain_dot", None))
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1811 if cookie.secure: h.append(("secure", None))
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1812 if cookie.expires: h.append(("expires",
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1813 time2isoz(float(cookie.expires))))
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1814 if cookie.discard: h.append(("discard", None))
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1815 if cookie.comment: h.append(("comment", cookie.comment))
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1816 if cookie.comment_url: h.append(("commenturl", cookie.comment_url))
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1817
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1818 keys = sorted(cookie._rest.keys())
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1819 for k in keys:
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1820 h.append((k, str(cookie._rest[k])))
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1821
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1822 h.append(("version", str(cookie.version)))
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1823
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1824 return join_header_words([h])
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1825
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1826 class LWPCookieJar(FileCookieJar):
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1827 """
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1828 The LWPCookieJar saves a sequence of"Set-Cookie3" lines.
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1829 "Set-Cookie3" is the format used by the libwww-perl libary, not known
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1830 to be compatible with any browser, but which is easy to read and
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1831 doesn't lose information about RFC 2965 cookies.
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1832
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1833 Additional methods
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1834
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1835 as_lwp_str(ignore_discard=True, ignore_expired=True)
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1836
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1837 """
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1838
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1839 def as_lwp_str(self, ignore_discard=True, ignore_expires=True):
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1840 """Return cookies as a string of "\n"-separated "Set-Cookie3" headers.
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1841
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1842 ignore_discard and ignore_expires: see docstring for FileCookieJar.save
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1843
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1844 """
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1845 now = time.time()
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1846 r = []
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1847 for cookie in self:
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1848 if not ignore_discard and cookie.discard:
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1849 continue
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1850 if not ignore_expires and cookie.is_expired(now):
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1851 continue
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1852 r.append("Set-Cookie3: %s" % lwp_cookie_str(cookie))
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1853 return "\n".join(r+[""])
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1854
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1855 def save(self, filename=None, ignore_discard=False, ignore_expires=False):
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1856 if filename is None:
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1857 if self.filename is not None: filename = self.filename
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1858 else: raise ValueError(MISSING_FILENAME_TEXT)
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1859
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1860 f = open(filename, "w")
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1861 try:
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1862 # There really isn't an LWP Cookies 2.0 format, but this indicates
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1863 # that there is extra information in here (domain_dot and
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1864 # port_spec) while still being compatible with libwww-perl, I hope.
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1865 f.write("#LWP-Cookies-2.0\n")
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1866 f.write(self.as_lwp_str(ignore_discard, ignore_expires))
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1867 finally:
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1868 f.close()
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1869
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1870 def _really_load(self, f, filename, ignore_discard, ignore_expires):
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1871 magic = f.readline()
48769
83b2d07b475b #2834: Change re module semantics, so that str and bytes mixing is forbidden,
Antoine Pitrou <solipsis@pitrou.net>
parents: 48356
diff changeset
1872 if not self.magic_re.search(magic):
47326
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1873 msg = ("%r does not look like a Set-Cookie3 (LWP) format "
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1874 "file" % filename)
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1875 raise LoadError(msg)
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1876
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1877 now = time.time()
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1878
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1879 header = "Set-Cookie3:"
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1880 boolean_attrs = ("port_spec", "path_spec", "domain_dot",
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1881 "secure", "discard")
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1882 value_attrs = ("version",
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1883 "port", "path", "domain",
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1884 "expires",
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1885 "comment", "commenturl")
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1886
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1887 try:
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1888 while 1:
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1889 line = f.readline()
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1890 if line == "": break
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1891 if not line.startswith(header):
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1892 continue
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1893 line = line[len(header):].strip()
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1894
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1895 for data in split_header_words([line]):
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1896 name, value = data[0]
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1897 standard = {}
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1898 rest = {}
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1899 for k in boolean_attrs:
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1900 standard[k] = False
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1901 for k, v in data[1:]:
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1902 if k is not None:
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1903 lc = k.lower()
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1904 else:
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1905 lc = None
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1906 # don't lose case distinction for unknown fields
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1907 if (lc in value_attrs) or (lc in boolean_attrs):
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1908 k = lc
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1909 if k in boolean_attrs:
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1910 if v is None: v = True
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1911 standard[k] = v
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1912 elif k in value_attrs:
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1913 standard[k] = v
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1914 else:
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1915 rest[k] = v
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1916
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1917 h = standard.get
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1918 expires = h("expires")
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1919 discard = h("discard")
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1920 if expires is not None:
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1921 expires = iso2time(expires)
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1922 if expires is None:
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1923 discard = True
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1924 domain = h("domain")
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1925 domain_specified = domain.startswith(".")
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1926 c = Cookie(h("version"), name, value,
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1927 h("port"), h("port_spec"),
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1928 domain, domain_specified, h("domain_dot"),
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1929 h("path"), h("path_spec"),
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1930 h("secure"),
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1931 expires,
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1932 discard,
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1933 h("comment"),
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1934 h("commenturl"),
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1935 rest)
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1936 if not ignore_discard and c.discard:
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1937 continue
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1938 if not ignore_expires and c.is_expired(now):
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1939 continue
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1940 self.set_cookie(c)
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1941
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1942 except IOError:
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1943 raise
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1944 except Exception:
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1945 _warn_unhandled_exception()
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1946 raise LoadError("invalid Set-Cookie3 format file %r: %r" %
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1947 (filename, line))
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1948
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1949
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1950 class MozillaCookieJar(FileCookieJar):
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1951 """
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1952
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1953 WARNING: you may want to backup your browser's cookies file if you use
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1954 this class to save cookies. I *think* it works, but there have been
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1955 bugs in the past!
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1956
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1957 This class differs from CookieJar only in the format it uses to save and
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1958 load cookies to and from a file. This class uses the Mozilla/Netscape
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1959 `cookies.txt' format. lynx uses this file format, too.
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1960
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1961 Don't expect cookies saved while the browser is running to be noticed by
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1962 the browser (in fact, Mozilla on unix will overwrite your saved cookies if
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1963 you change them on disk while it's running; on Windows, you probably can't
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1964 save at all while the browser is running).
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1965
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1966 Note that the Mozilla/Netscape format will downgrade RFC2965 cookies to
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1967 Netscape cookies on saving.
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1968
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1969 In particular, the cookie version and port number information is lost,
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1970 together with information about whether or not Path, Port and Discard were
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1971 specified by the Set-Cookie2 (or Set-Cookie) header, and whether or not the
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1972 domain as set in the HTTP header started with a dot (yes, I'm aware some
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1973 domains in Netscape files start with a dot and some don't -- trust me, you
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1974 really don't want to know any more about this).
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1975
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1976 Note that though Mozilla and Netscape use the same format, they use
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1977 slightly different headers. The class saves cookies using the Netscape
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1978 header by default (Mozilla can cope with that).
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1979
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1980 """
48769
83b2d07b475b #2834: Change re module semantics, so that str and bytes mixing is forbidden,
Antoine Pitrou <solipsis@pitrou.net>
parents: 48356
diff changeset
1981 magic_re = re.compile("#( Netscape)? HTTP Cookie File")
47326
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1982 header = """\
63444
10c1b6141d53 Merged revisions 83370,83372-83374,83384 via svnmerge from
Georg Brandl <georg@python.org>
parents: 63212
diff changeset
1983 # Netscape HTTP Cookie File
10c1b6141d53 Merged revisions 83370,83372-83374,83384 via svnmerge from
Georg Brandl <georg@python.org>
parents: 63212
diff changeset
1984 # http://www.netscape.com/newsref/std/cookie_spec.html
10c1b6141d53 Merged revisions 83370,83372-83374,83384 via svnmerge from
Georg Brandl <georg@python.org>
parents: 63212
diff changeset
1985 # This is a generated file! Do not edit.
47326
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1986
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1987 """
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1988
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1989 def _really_load(self, f, filename, ignore_discard, ignore_expires):
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1990 now = time.time()
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1991
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1992 magic = f.readline()
48769
83b2d07b475b #2834: Change re module semantics, so that str and bytes mixing is forbidden,
Antoine Pitrou <solipsis@pitrou.net>
parents: 48356
diff changeset
1993 if not self.magic_re.search(magic):
47326
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1994 f.close()
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1995 raise LoadError(
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1996 "%r does not look like a Netscape format cookies file" %
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1997 filename)
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1998
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1999 try:
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2000 while 1:
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2001 line = f.readline()
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2002 if line == "": break
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2003
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2004 # last field may be absent, so keep any trailing tab
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2005 if line.endswith("\n"): line = line[:-1]
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2006
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2007 # skip comments and blank lines XXX what is $ for?
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2008 if (line.strip().startswith(("#", "$")) or
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2009 line.strip() == ""):
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2010 continue
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2011
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2012 domain, domain_specified, path, secure, expires, name, value = \
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2013 line.split("\t")
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2014 secure = (secure == "TRUE")
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2015 domain_specified = (domain_specified == "TRUE")
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2016 if name == "":
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2017 # cookies.txt regards 'Set-Cookie: foo' as a cookie
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2018 # with no name, whereas http.cookiejar regards it as a
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2019 # cookie with no value.
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2020 name = value
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2021 value = None
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2022
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2023 initial_dot = domain.startswith(".")
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2024 assert domain_specified == initial_dot
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2025
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2026 discard = False
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2027 if expires == "":
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2028 expires = None
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2029 discard = True
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2030
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2031 # assume path_specified is false
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2032 c = Cookie(0, name, value,
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2033 None, False,
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2034 domain, domain_specified, initial_dot,
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2035 path, False,
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2036 secure,
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2037 expires,
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2038 discard,
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2039 None,
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2040 None,
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2041 {})
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2042 if not ignore_discard and c.discard:
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2043 continue
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2044 if not ignore_expires and c.is_expired(now):
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2045 continue
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2046 self.set_cookie(c)
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2047
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2048 except IOError:
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2049 raise
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2050 except Exception:
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2051 _warn_unhandled_exception()
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2052 raise LoadError("invalid Netscape format cookies file %r: %r" %
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2053 (filename, line))
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2054
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2055 def save(self, filename=None, ignore_discard=False, ignore_expires=False):
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2056 if filename is None:
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2057 if self.filename is not None: filename = self.filename
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2058 else: raise ValueError(MISSING_FILENAME_TEXT)
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2059
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2060 f = open(filename, "w")
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2061 try:
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2062 f.write(self.header)
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2063 now = time.time()
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2064 for cookie in self:
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2065 if not ignore_discard and cookie.discard:
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2066 continue
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2067 if not ignore_expires and cookie.is_expired(now):
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2068 continue
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2069 if cookie.secure: secure = "TRUE"
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2070 else: secure = "FALSE"
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2071 if cookie.domain.startswith("."): initial_dot = "TRUE"
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2072 else: initial_dot = "FALSE"
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2073 if cookie.expires is not None:
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2074 expires = str(cookie.expires)
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2075 else:
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2076 expires = ""
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2077 if cookie.value is None:
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2078 # cookies.txt regards 'Set-Cookie: foo' as a cookie
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2079 # with no name, whereas http.cookiejar regards it as a
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2080 # cookie with no value.
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2081 name = ""
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2082 value = cookie.name
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2083 else:
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2084 name = cookie.name
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2085 value = cookie.value
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2086 f.write(
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2087 "\t".join([cookie.domain, initial_dot, cookie.path,
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2088 secure, expires, name, value])+
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2089 "\n")
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2090 finally:
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2091 f.close()