Mercurial > cpython-lru_cache-weakref
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 |
| 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 | 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") |
