summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNano <nanoapezlk@gmail.com>2024-12-11 13:28:19 (GMT)
committerGitHub <noreply@github.com>2024-12-11 13:28:19 (GMT)
commit359389ed51aecc107681e600b71852c0a97304e1 (patch)
tree69602af88713c6ff71dd0d388cf727a58d9e839f
parentb2ad7e0a2c1518539d9b0ef83c9f7a09d10fd303 (diff)
downloadcpython-359389ed51aecc107681e600b71852c0a97304e1.zip
cpython-359389ed51aecc107681e600b71852c0a97304e1.tar.gz
cpython-359389ed51aecc107681e600b71852c0a97304e1.tar.bz2
gh-123401: Fix http.cookies module to support obsolete RFC 850 date format (#123405)
Co-authored-by: Wulian <1055917385@qq.com> Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> Co-authored-by: Victor Stinner <vstinner@python.org>
-rw-r--r--Lib/http/cookies.py6
-rw-r--r--Lib/test/test_http_cookies.py46
-rw-r--r--Misc/NEWS.d/next/Library/2024-08-27-18-58-01.gh-issue-123401.t4-FpI.rst3
3 files changed, 53 insertions, 2 deletions
diff --git a/Lib/http/cookies.py b/Lib/http/cookies.py
index d7e8d08..23d5461 100644
--- a/Lib/http/cookies.py
+++ b/Lib/http/cookies.py
@@ -425,9 +425,11 @@ _CookiePattern = re.compile(r"""
( # Optional group: there may not be a value.
\s*=\s* # Equal Sign
(?P<val> # Start of group 'val'
- "(?:[^\\"]|\\.)*" # Any doublequoted string
+ "(?:[^\\"]|\\.)*" # Any double-quoted string
| # or
- \w{3},\s[\w\d\s-]{9,11}\s[\d:]{8}\sGMT # Special case for "expires" attr
+ # Special case for "expires" attr
+ (\w{3,6}day|\w{3}),\s # Day of the week or abbreviated day
+ [\w\d\s-]{9,11}\s[\d:]{8}\sGMT # Date and time in specific format
| # or
[""" + _LegalValueChars + r"""]* # Any word or empty string
) # End of group 'val'
diff --git a/Lib/test/test_http_cookies.py b/Lib/test/test_http_cookies.py
index 8879902..7b3dc0f 100644
--- a/Lib/test/test_http_cookies.py
+++ b/Lib/test/test_http_cookies.py
@@ -59,6 +59,52 @@ class CookieTests(unittest.TestCase):
for k, v in sorted(case['dict'].items()):
self.assertEqual(C[k].value, v)
+ def test_obsolete_rfc850_date_format(self):
+ # Test cases with different days and dates in obsolete RFC 850 format
+ test_cases = [
+ # from RFC 850, change EST to GMT
+ # https://datatracker.ietf.org/doc/html/rfc850#section-2
+ {
+ 'data': 'key=value; expires=Saturday, 01-Jan-83 00:00:00 GMT',
+ 'output': 'Saturday, 01-Jan-83 00:00:00 GMT'
+ },
+ {
+ 'data': 'key=value; expires=Friday, 19-Nov-82 16:59:30 GMT',
+ 'output': 'Friday, 19-Nov-82 16:59:30 GMT'
+ },
+ # from RFC 9110
+ # https://www.rfc-editor.org/rfc/rfc9110.html#section-5.6.7-6
+ {
+ 'data': 'key=value; expires=Sunday, 06-Nov-94 08:49:37 GMT',
+ 'output': 'Sunday, 06-Nov-94 08:49:37 GMT'
+ },
+ # other test cases
+ {
+ 'data': 'key=value; expires=Wednesday, 09-Nov-94 08:49:37 GMT',
+ 'output': 'Wednesday, 09-Nov-94 08:49:37 GMT'
+ },
+ {
+ 'data': 'key=value; expires=Friday, 11-Nov-94 08:49:37 GMT',
+ 'output': 'Friday, 11-Nov-94 08:49:37 GMT'
+ },
+ {
+ 'data': 'key=value; expires=Monday, 14-Nov-94 08:49:37 GMT',
+ 'output': 'Monday, 14-Nov-94 08:49:37 GMT'
+ },
+ ]
+
+ for case in test_cases:
+ with self.subTest(data=case['data']):
+ C = cookies.SimpleCookie()
+ C.load(case['data'])
+
+ # Extract the cookie name from the data string
+ cookie_name = case['data'].split('=')[0]
+
+ # Check if the cookie is loaded correctly
+ self.assertIn(cookie_name, C)
+ self.assertEqual(C[cookie_name].get('expires'), case['output'])
+
def test_unquote(self):
cases = [
(r'a="b=\""', 'b="'),
diff --git a/Misc/NEWS.d/next/Library/2024-08-27-18-58-01.gh-issue-123401.t4-FpI.rst b/Misc/NEWS.d/next/Library/2024-08-27-18-58-01.gh-issue-123401.t4-FpI.rst
new file mode 100644
index 0000000..638f3f7
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2024-08-27-18-58-01.gh-issue-123401.t4-FpI.rst
@@ -0,0 +1,3 @@
+The :mod:`http.cookies` module now supports parsing obsolete :rfc:`850`
+date formats, in accordance with :rfc:`9110` requirements.
+Patch by Nano Zheng.