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