Skip to content

Commit

Permalink
[3.12] pythongh-123401: Fix http.cookies module to support obsolete R…
Browse files Browse the repository at this point in the history
…FC 850 date format (pythonGH-123405) (python#127829)

pythongh-123401: Fix http.cookies module to support obsolete RFC 850 date format (pythonGH-123405)
(cherry picked from commit 359389e)

Co-authored-by: Nano <[email protected]>
Co-authored-by: Wulian <[email protected]>
Co-authored-by: Bénédikt Tran <[email protected]>
Co-authored-by: Victor Stinner <[email protected]>
  • Loading branch information
5 people authored Dec 11, 2024
1 parent 65bca19 commit b0615a8
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 2 deletions.
6 changes: 4 additions & 2 deletions Lib/http/cookies.py
Original file line number Diff line number Diff line change
Expand Up @@ -424,9 +424,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'
Expand Down
46 changes: 46 additions & 0 deletions Lib/test/test_http_cookies.py
Original file line number Diff line number Diff line change
Expand Up @@ -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="'),
Expand Down
Original file line number Diff line number Diff line change
@@ -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.

0 comments on commit b0615a8

Please sign in to comment.