annotate Lib/http/cookiejar.py @ 87690:66c1c9f32567 default tip

Add use_weakref option to functools.lru_cache The use_weakref option makes lru_cache create weak references to the function arguments when creating the cache key, which prevents them from staying in the memory forever even after all other references to them are gone. This is a proof of concept for http://bugs.python.org/issue19859
author Radomir Dopieralski <devel@sheep.art.pl>
date Tue, 03 Dec 2013 16:02:48 +0100
parents 7769c4d72806
children
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
84442
7769c4d72806 Issue #18200: Back out usage of ModuleNotFoundError (8d28d44f3a9a)
Brett Cannon <brett@python.org>
parents: 84114
diff changeset
38 except ImportError:
32164
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):
78209
ea8078365d3b Issue #15409: Replace use of deprecated urllib.request.Request methods in http.cookijar
Meador Inge <meadori@gmail.com>
parents: 73430
diff changeset
628 host = request.host
32164
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)
83211
b3d5621511db #17678: Fix DeprecationWarning in the http/cookiejar.py by changing the usage
Senthil Kumaran <senthil@uthcode.com>
parents: 79085
diff changeset
707 if not domain_match(req_host, reach(request.origin_req_host)):
32164
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):
78209
ea8078365d3b Issue #15409: Replace use of deprecated urllib.request.Request methods in http.cookijar
Meador Inge <meadori@gmail.com>
parents: 73430
diff changeset
952 if request.unverifiable and is_third_party(request):
32164
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):
78209
ea8078365d3b Issue #15409: Replace use of deprecated urllib.request.Request methods in http.cookijar
Meador Inge <meadori@gmail.com>
parents: 73430
diff changeset
1091 if request.unverifiable and is_third_party(request):
32164
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):
78209
ea8078365d3b Issue #15409: Replace use of deprecated urllib.request.Request methods in http.cookijar
Meador Inge <meadori@gmail.com>
parents: 73430
diff changeset
1103 if cookie.secure and request.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
79389
33a221662f39 more yield from
Philip Jenvey <pjenvey@underboss.org>
parents: 79085
diff changeset
1196 yield from deepvalues(obj)
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1197 if not mapping:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1198 yield obj
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1199
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 # 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
1202 # 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
1203 class Absent: pass
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1204
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1205 class CookieJar:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1206 """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
1207
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1208 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
1209 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
1210 """
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 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
1213 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
1214 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
1215 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 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
1217
48769
83b2d07b475b #2834: Change re module semantics, so that str and bytes mixing is forbidden,
Antoine Pitrou <solipsis@pitrou.net>
parents: 48356
diff changeset
1218 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
1219
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1220 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
1221 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
1222 policy = DefaultCookiePolicy()
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1223 self._policy = policy
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1224
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1225 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
1226 self._cookies = {}
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1227
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1228 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
1229 self._policy = policy
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1230
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1231 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
1232 cookies = []
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1233 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
1234 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
1235 _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
1236 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
1237 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
1238 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
1239 continue
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1240 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
1241 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
1242 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
1243 _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
1244 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
1245 _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
1246 cookies.append(cookie)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1247 return cookies
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1248
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1249 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
1250 """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
1251 cookies = []
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1252 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
1253 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
1254 return cookies
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1255
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1256 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
1257 """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
1258
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1259 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
1260
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1261 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
1262 once per request).
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1263
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 # 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
1266 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
1267
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1268 version_set = False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1269
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1270 attrs = []
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1271 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
1272 # 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
1273 # XXX
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1274 # 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
1275 # different versions themselves?
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1276 # 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
1277 # 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
1278 version = cookie.version
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1279 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
1280 version_set = True
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1281 if version > 0:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1282 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
1283
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1284 # 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
1285 # (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
1286 # 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
1287 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
1288 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
1289 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
1290 else:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1291 value = cookie.value
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1292
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1293 # 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
1294 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
1295 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
1296 else:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1297 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
1298 if version > 0:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1299 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
1300 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
1301 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
1302 domain = cookie.domain
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1303 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
1304 domain.startswith(".")):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1305 domain = domain[1:]
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1306 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
1307 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
1308 p = "$Port"
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1309 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
1310 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
1311 attrs.append(p)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1312
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1313 return attrs
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1314
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1315 def add_cookie_header(self, request):
48356
6c04d14994d0 Fix old urllib/urllib2/urlparse usage.
Georg Brandl <georg@python.org>
parents: 48334
diff changeset
1316 """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
1317
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1318 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
1319
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1320 """
38453
29ae5e0fc348 Much-needed merge (using svnmerge.py this time) of trunk changes into p3yk.
Thomas Wouters <thomas@python.org>
parents: 36121
diff changeset
1321 _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
1322 self._cookies_lock.acquire()
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1323 try:
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1324
40742
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1325 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
1326
40742
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1327 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
1328
40742
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1329 attrs = self._cookie_attrs(cookies)
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1330 if attrs:
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1331 if not request.has_header("Cookie"):
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1332 request.add_unredirected_header(
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1333 "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
1334
40742
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1335 # 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
1336 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
1337 not request.has_header("Cookie2")):
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1338 for cookie in cookies:
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1339 if cookie.version != 1:
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1340 request.add_unredirected_header("Cookie2", '$Version="1"')
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1341 break
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1342
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1343 finally:
40742
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1344 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
1345
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1346 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
1347
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1348 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
1349 """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
1350
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1351 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
1352 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
1353
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1354 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
1355 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
1356 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
1357 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
1358 the cookie-attributes.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1359
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 cookie_tuples = []
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1362
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1363 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
1364 value_attrs = ("version",
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1365 "expires", "max-age",
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1366 "domain", "path", "port",
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1367 "comment", "commenturl")
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1368
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1369 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
1370 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
1371
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1372 # 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
1373 # 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
1374
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1375 # 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
1376 # 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
1377 # 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
1378 # 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
1379 # 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
1380 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
1381
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1382 bad_cookie = False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1383
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1384 standard = {}
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1385 rest = {}
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1386 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
1387 lc = k.lower()
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1388 # 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
1389 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
1390 k = lc
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1391 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
1392 # 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
1393 # (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
1394 v = True
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1395 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
1396 # 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
1397 continue
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1398 if k == "domain":
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1399 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
1400 _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
1401 bad_cookie = True
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1402 break
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1403 # 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
1404 v = v.lower()
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1405 if k == "expires":
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1406 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
1407 # 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
1408 continue
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1409 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
1410 _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
1411 "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
1412 continue
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1413 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
1414 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
1415 try:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1416 v = int(v)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1417 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
1418 _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
1419 "max-age attribute")
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1420 bad_cookie = True
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1421 break
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1422 # 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
1423 # 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
1424 # 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
1425 # 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
1426 k = "expires"
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1427 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
1428 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
1429 if (v is None and
34545
9d66fba78444 Replace list of constants with tuples of constants.
Raymond Hettinger <python@rcn.com>
parents: 34542
diff changeset
1430 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
1431 _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
1432 bad_cookie = True
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1433 break
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1434 standard[k] = v
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1435 else:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1436 rest[k] = v
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1437
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1438 if bad_cookie:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1439 continue
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1440
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1441 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
1442
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1443 return cookie_tuples
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1444
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1445 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
1446 # 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
1447 # rest of them
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1448 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
1449
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1450 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
1451 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
1452 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
1453 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
1454
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1455 # 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
1456 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
1457 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
1458 try:
504c499e8c95 Merged revisions 81465-81466,81468,81679,81735,81760,81868,82183 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48769
diff changeset
1459 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
1460 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
1461 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
1462 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
1463 # (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
1464 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
1465 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
1466 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
1467
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1468 # set default path
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1469 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
1470 path_specified = True
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1471 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
1472 else:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1473 path_specified = False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1474 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
1475 i = path.rfind("/")
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1476 if i != -1:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1477 if version == 0:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1478 # 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
1479 path = path[:i]
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1480 else:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1481 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
1482 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
1483
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1484 # set default domain
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1485 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
1486 # 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
1487 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
1488 if domain_specified:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1489 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
1490 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
1491 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
1492 domain = erhn
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1493 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
1494 domain = "."+domain
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1495
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1496 # set default port
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1497 port_specified = False
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1498 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
1499 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
1500 # 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
1501 # 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
1502 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
1503 else:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1504 port_specified = True
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1505 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
1506 else:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1507 # 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
1508 port = None
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1509
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1510 # 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
1511 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
1512 expires = None
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1513 discard = True
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1514 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
1515 # 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
1516 # 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
1517 try:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1518 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
1519 except KeyError:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1520 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
1521 _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
1522 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
1523 return None
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1524
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1525 return Cookie(version,
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1526 name, value,
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1527 port, port_specified,
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1528 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
1529 path, path_specified,
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1530 secure,
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1531 expires,
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1532 discard,
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1533 comment,
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1534 comment_url,
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1535 rest)
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1536
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1537 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
1538 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
1539
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1540 cookies = []
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1541 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
1542 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
1543 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
1544 return cookies
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1545
36111
630d01fecfec SF patch #1157027, cookielib mis-handles RFC 2109 cookies in Netscape mode
Neal Norwitz <nnorwitz@gmail.com>
parents: 36107
diff changeset
1546 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
1547 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
1548 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
1549 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
1550 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
1551 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
1552 cookie.rfc2109 = True
36121
686306a67e9b Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents: 36111
diff changeset
1553 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
1554 # 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
1555 # 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
1556 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
1557
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1558 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
1559 """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
1560 # 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
1561 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
1562 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
1563 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
1564
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1565 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
1566 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
1567
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1568 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
1569 (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
1570 (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
1571 (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
1572 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
1573
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1574 try:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1575 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
1576 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
1577 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
1578 _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
1579 cookies = []
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1580
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1581 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
1582 try:
36111
630d01fecfec SF patch #1157027, cookielib mis-handles RFC 2109 cookies in Netscape mode
Neal Norwitz <nnorwitz@gmail.com>
parents: 36107
diff changeset
1583 # 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
1584 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
1585 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
1586 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
1587 _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
1588 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
1589 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
1590
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1591 # 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
1592 # 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
1593 # 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
1594 # 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
1595 # 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
1596 # reasonable behaviour.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1597 if rfc2965:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1598 lookup = {}
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1599 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
1600 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
1601
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1602 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
1603 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
1604 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
1605 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
1606
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1607 if ns_cookies:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1608 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
1609
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1610 return cookies
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1611
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1612 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
1613 """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
1614 self._cookies_lock.acquire()
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1615 try:
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1616 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
1617
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1618 if self._policy.set_ok(cookie, request):
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1619 self.set_cookie(cookie)
40742
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1620
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1621
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1622 finally:
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1623 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
1624
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1625 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
1626 """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
1627 c = self._cookies
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1628 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
1629 try:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1630 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
1631 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
1632 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
1633 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
1634 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
1635 finally:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1636 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
1637
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1638 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
1639 """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
1640 _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
1641 self._cookies_lock.acquire()
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1642 try:
40742
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1643 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
1644
40742
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1645 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
1646 if self._policy.set_ok(cookie, request):
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1647 _debug(" setting cookie: %s", cookie)
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1648 self.set_cookie(cookie)
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1649 finally:
40742
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1650 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
1651
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1652 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
1653 """Clear some cookies.
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1654
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1655 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
1656 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
1657 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
1658 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
1659 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
1660
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1661 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
1662
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 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
1665 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
1666 raise ValueError(
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1667 "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
1668 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
1669 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
1670 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
1671 raise ValueError(
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1672 "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
1673 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
1674 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
1675 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
1676 else:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1677 self._cookies = {}
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1678
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1679 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
1680 """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
1681
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1682 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
1683 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
1684
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 self._cookies_lock.acquire()
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1687 try:
40742
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1688 for cookie in self:
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1689 if cookie.discard:
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1690 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
1691 finally:
40742
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1692 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
1693
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1694 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
1695 """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
1696
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1697 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
1698 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
1699 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
1700 .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
1701 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
1702
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 self._cookies_lock.acquire()
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1705 try:
40742
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1706 now = time.time()
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1707 for cookie in self:
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1708 if cookie.is_expired(now):
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1709 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
1710 finally:
40742
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1711 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
1712
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1713 def __iter__(self):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1714 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
1715
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1716 def __len__(self):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1717 """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
1718 i = 0
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1719 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
1720 return i
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1721
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1722 def __repr__(self):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1723 r = []
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1724 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
1725 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
1726
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1727 def __str__(self):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1728 r = []
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1729 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
1730 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
1731
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1732
81039
7d69d04522e3 Replace IOError with OSError (#16715)
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79389
diff changeset
1733 # derives from OSError for backwards-compatibility with Python 2.4.0
7d69d04522e3 Replace IOError with OSError (#16715)
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79389
diff changeset
1734 class LoadError(OSError): pass
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1735
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1736 class FileCookieJar(CookieJar):
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1737 """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
1738
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1739 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
1740 """
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1741 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
1742 .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
1743
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 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
1746 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
1747 try:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1748 filename+""
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1749 except:
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1750 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
1751 self.filename = filename
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1752 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
1753
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1754 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
1755 """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
1756 raise NotImplementedError()
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1757
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1758 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
1759 """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
1760 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
1761 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
1762 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
1763
82168
cb876235f29d modernize some modules' code by using with statement around open()
Giampaolo Rodola' <g.rodola@gmail.com>
parents: 81039
diff changeset
1764 with open(filename) as f:
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1765 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
1766
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1767 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
1768 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
1769 """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
1770
81039
7d69d04522e3 Replace IOError with OSError (#16715)
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79389
diff changeset
1771 Raises LoadError (or OSError) if reversion is not successful; the
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1772 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
1773
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 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
1776 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
1777 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
1778
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1779 self._cookies_lock.acquire()
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1780 try:
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1781
40742
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1782 old_state = copy.deepcopy(self._cookies)
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1783 self._cookies = {}
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1784 try:
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1785 self.load(filename, ignore_discard, ignore_expires)
81039
7d69d04522e3 Replace IOError with OSError (#16715)
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79389
diff changeset
1786 except OSError:
40742
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1787 self._cookies = old_state
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1788 raise
32164
18d6a8f99823 Patch #963318: Add support for client-side cookie management.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1789
40582
67287ca4e1e8 Merged revisions 53005-53303 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 38453
diff changeset
1790 finally:
40742
f1701ba2452b Merged revisions 53538-53622 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40582
diff changeset
1791 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
1792
47326
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1793
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1794 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
1795 """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
1796
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1797 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
1798
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1799 """
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1800 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
1801 ("path", cookie.path),
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1802 ("domain", cookie.domain)]
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1803 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
1804 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
1805 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
1806 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
1807 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
1808 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
1809 time2isoz(float(cookie.expires))))
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1810 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
1811 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
1812 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
1813
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1814 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
1815 for k in keys:
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1816 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
1817
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1818 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
1819
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1820 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
1821
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1822 class LWPCookieJar(FileCookieJar):
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1823 """
79084
e582ad1aee62 #15980: properly escape newlines in docstrings. Patch by Serhiy Storchaka.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 73430
diff changeset
1824 The LWPCookieJar saves a sequence of "Set-Cookie3" lines.
47326
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1825 "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
1826 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
1827 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
1828
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1829 Additional methods
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1830
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1831 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
1832
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1833 """
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 def as_lwp_str(self, ignore_discard=True, ignore_expires=True):
79084
e582ad1aee62 #15980: properly escape newlines in docstrings. Patch by Serhiy Storchaka.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 73430
diff changeset
1836 """Return cookies as a string of "\\n"-separated "Set-Cookie3" headers.
47326
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 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
1839
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1840 """
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1841 now = time.time()
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1842 r = []
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1843 for cookie in self:
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1844 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
1845 continue
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1846 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
1847 continue
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1848 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
1849 return "\n".join(r+[""])
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1850
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1851 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
1852 if filename is None:
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1853 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
1854 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
1855
82168
cb876235f29d modernize some modules' code by using with statement around open()
Giampaolo Rodola' <g.rodola@gmail.com>
parents: 81039
diff changeset
1856 with open(filename, "w") as f:
47326
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1857 # 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
1858 # 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
1859 # 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
1860 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
1861 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
1862
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1863 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
1864 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
1865 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
1866 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
1867 "file" % filename)
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1868 raise LoadError(msg)
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 now = time.time()
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1871
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1872 header = "Set-Cookie3:"
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1873 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
1874 "secure", "discard")
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1875 value_attrs = ("version",
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1876 "port", "path", "domain",
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1877 "expires",
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1878 "comment", "commenturl")
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1879
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1880 try:
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1881 while 1:
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1882 line = f.readline()
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1883 if line == "": break
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1884 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
1885 continue
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1886 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
1887
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1888 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
1889 name, value = data[0]
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1890 standard = {}
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1891 rest = {}
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1892 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
1893 standard[k] = False
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1894 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
1895 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
1896 lc = k.lower()
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1897 else:
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1898 lc = None
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1899 # 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
1900 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
1901 k = lc
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1902 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
1903 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
1904 standard[k] = v
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1905 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
1906 standard[k] = v
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1907 else:
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1908 rest[k] = v
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1909
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1910 h = standard.get
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1911 expires = h("expires")
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1912 discard = h("discard")
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1913 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
1914 expires = iso2time(expires)
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1915 if expires is None:
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1916 discard = True
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1917 domain = h("domain")
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1918 domain_specified = domain.startswith(".")
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1919 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
1920 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
1921 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
1922 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
1923 h("secure"),
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1924 expires,
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1925 discard,
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1926 h("comment"),
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1927 h("commenturl"),
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1928 rest)
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1929 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
1930 continue
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1931 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
1932 continue
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1933 self.set_cookie(c)
81039
7d69d04522e3 Replace IOError with OSError (#16715)
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79389
diff changeset
1934 except OSError:
47326
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1935 raise
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1936 except Exception:
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1937 _warn_unhandled_exception()
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1938 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
1939 (filename, line))
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1940
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 class MozillaCookieJar(FileCookieJar):
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1943 """
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1944
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1945 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
1946 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
1947 bugs in the past!
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 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
1950 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
1951 `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
1952
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1953 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
1954 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
1955 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
1956 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
1957
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1958 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
1959 Netscape cookies on saving.
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 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
1962 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
1963 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
1964 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
1965 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
1966 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
1967
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1968 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
1969 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
1970 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
1971
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1972 """
48769
83b2d07b475b #2834: Change re module semantics, so that str and bytes mixing is forbidden,
Antoine Pitrou <solipsis@pitrou.net>
parents: 48356
diff changeset
1973 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
1974 header = """\
63444
10c1b6141d53 Merged revisions 83370,83372-83374,83384 via svnmerge from
Georg Brandl <georg@python.org>
parents: 63212
diff changeset
1975 # Netscape HTTP Cookie File
10c1b6141d53 Merged revisions 83370,83372-83374,83384 via svnmerge from
Georg Brandl <georg@python.org>
parents: 63212
diff changeset
1976 # 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
1977 # 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
1978
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
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1981 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
1982 now = time.time()
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1983
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1984 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
1985 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
1986 f.close()
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1987 raise LoadError(
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1988 "%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
1989 filename)
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1990
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1991 try:
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1992 while 1:
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1993 line = f.readline()
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1994 if line == "": break
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1995
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1996 # 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
1997 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
1998
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
1999 # 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
2000 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
2001 line.strip() == ""):
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2002 continue
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 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
2005 line.split("\t")
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2006 secure = (secure == "TRUE")
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2007 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
2008 if name == "":
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2009 # 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
2010 # 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
2011 # cookie with no value.
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2012 name = value
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2013 value = None
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2014
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2015 initial_dot = domain.startswith(".")
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2016 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
2017
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2018 discard = False
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2019 if expires == "":
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2020 expires = None
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2021 discard = True
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 # 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
2024 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
2025 None, False,
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2026 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
2027 path, False,
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2028 secure,
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2029 expires,
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2030 discard,
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2031 None,
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2032 None,
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2033 {})
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2034 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
2035 continue
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2036 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
2037 continue
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2038 self.set_cookie(c)
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2039
81039
7d69d04522e3 Replace IOError with OSError (#16715)
Andrew Svetlov <andrew.svetlov@gmail.com>
parents: 79389
diff changeset
2040 except OSError:
47326
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2041 raise
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2042 except Exception:
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2043 _warn_unhandled_exception()
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2044 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
2045 (filename, line))
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2046
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2047 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
2048 if filename is None:
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2049 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
2050 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
2051
82168
cb876235f29d modernize some modules' code by using with statement around open()
Giampaolo Rodola' <g.rodola@gmail.com>
parents: 81039
diff changeset
2052 with open(filename, "w") as f:
47326
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2053 f.write(self.header)
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2054 now = time.time()
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2055 for cookie in self:
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2056 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
2057 continue
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2058 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
2059 continue
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2060 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
2061 else: secure = "FALSE"
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2062 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
2063 else: initial_dot = "FALSE"
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2064 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
2065 expires = str(cookie.expires)
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2066 else:
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2067 expires = ""
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2068 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
2069 # 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
2070 # 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
2071 # cookie with no value.
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2072 name = ""
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2073 value = cookie.name
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2074 else:
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2075 name = cookie.name
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2076 value = cookie.value
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2077 f.write(
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2078 "\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
2079 secure, expires, name, value])+
79c7e848ea17 Remove _FooCookieJar modules and merge their content into http.cookiejar.
Georg Brandl <georg@python.org>
parents: 47318
diff changeset
2080 "\n")