mirror of https://github.com/python/cpython.git
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>
This commit is contained in:
parent
b2ad7e0a2c
commit
359389ed51
|
@ -425,9 +425,11 @@ def OutputString(self, attrs=None):
|
|||
( # 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'
|
||||
|
|
|
@ -59,6 +59,52 @@ def test_basic(self):
|
|||
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="'),
|
||||
|
|
|
@ -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.
|
Loading…
Reference in New Issue