@@ -1137,7 +1137,6 @@ def test_parse_cookie_header_empty() -> None:
11371137 assert parse_cookie_header (" " ) == []
11381138
11391139
1140- @pytest .mark .xfail (reason = "https://github.com/aio-libs/aiohttp/issues/11632" )
11411140def test_parse_cookie_gstate_header () -> None :
11421141 header = (
11431142 "_ga=ga; "
@@ -1444,6 +1443,142 @@ def test_parse_cookie_header_illegal_names(caplog: pytest.LogCaptureFixture) ->
14441443 assert "Can not load cookie: Illegal cookie name 'invalid,cookie'" in caplog .text
14451444
14461445
1446+ def test_parse_cookie_header_large_value () -> None :
1447+ """Test that large cookie values don't cause DoS."""
1448+ large_value = "A" * 8192
1449+ header = f"normal=value; large={ large_value } ; after=cookie"
1450+
1451+ result = parse_cookie_header (header )
1452+ cookie_names = [name for name , _ in result ]
1453+
1454+ assert len (result ) == 3
1455+ assert "normal" in cookie_names
1456+ assert "large" in cookie_names
1457+ assert "after" in cookie_names
1458+
1459+ large_cookie = next (morsel for name , morsel in result if name == "large" )
1460+ assert len (large_cookie .value ) == 8192
1461+
1462+
1463+ def test_parse_cookie_header_multiple_equals () -> None :
1464+ """Test handling of multiple equals signs in cookie values."""
1465+ header = "session=abc123; data=key1=val1&key2=val2; token=xyz"
1466+
1467+ result = parse_cookie_header (header )
1468+
1469+ assert len (result ) == 3
1470+
1471+ name1 , morsel1 = result [0 ]
1472+ assert name1 == "session"
1473+ assert morsel1 .value == "abc123"
1474+
1475+ name2 , morsel2 = result [1 ]
1476+ assert name2 == "data"
1477+ assert morsel2 .value == "key1=val1&key2=val2"
1478+
1479+ name3 , morsel3 = result [2 ]
1480+ assert name3 == "token"
1481+ assert morsel3 .value == "xyz"
1482+
1483+
1484+ def test_parse_cookie_header_fallback_preserves_subsequent_cookies () -> None :
1485+ """Test that fallback parser doesn't lose subsequent cookies."""
1486+ header = 'normal=value; malformed={"json":"value"}; after1=cookie1; after2=cookie2'
1487+
1488+ result = parse_cookie_header (header )
1489+ cookie_names = [name for name , _ in result ]
1490+
1491+ assert len (result ) == 4
1492+ assert cookie_names == ["normal" , "malformed" , "after1" , "after2" ]
1493+
1494+ name1 , morsel1 = result [0 ]
1495+ assert morsel1 .value == "value"
1496+
1497+ name2 , morsel2 = result [1 ]
1498+ assert morsel2 .value == '{"json":"value"}'
1499+
1500+ name3 , morsel3 = result [2 ]
1501+ assert morsel3 .value == "cookie1"
1502+
1503+ name4 , morsel4 = result [3 ]
1504+ assert morsel4 .value == "cookie2"
1505+
1506+
1507+ def test_parse_cookie_header_whitespace_in_fallback () -> None :
1508+ """Test that fallback parser handles whitespace correctly."""
1509+ header = "a=1; b = 2 ; c= 3; d =4"
1510+
1511+ result = parse_cookie_header (header )
1512+
1513+ assert len (result ) == 4
1514+ for name , morsel in result :
1515+ assert name in ("a" , "b" , "c" , "d" )
1516+ assert morsel .value in ("1" , "2" , "3" , "4" )
1517+
1518+
1519+ def test_parse_cookie_header_empty_value_in_fallback () -> None :
1520+ """Test that fallback handles empty values correctly."""
1521+ header = "normal=value; empty=; another=test"
1522+
1523+ result = parse_cookie_header (header )
1524+
1525+ assert len (result ) == 3
1526+
1527+ name1 , morsel1 = result [0 ]
1528+ assert name1 == "normal"
1529+ assert morsel1 .value == "value"
1530+
1531+ name2 , morsel2 = result [1 ]
1532+ assert name2 == "empty"
1533+ assert morsel2 .value == ""
1534+
1535+ name3 , morsel3 = result [2 ]
1536+ assert name3 == "another"
1537+ assert morsel3 .value == "test"
1538+
1539+
1540+ def test_parse_cookie_header_invalid_name_in_fallback (
1541+ caplog : pytest .LogCaptureFixture ,
1542+ ) -> None :
1543+ """Test that fallback parser rejects cookies with invalid names."""
1544+ header = 'normal=value; invalid,name={"x":"y"}; another=test'
1545+
1546+ result = parse_cookie_header (header )
1547+
1548+ assert len (result ) == 2
1549+
1550+ name1 , morsel1 = result [0 ]
1551+ assert name1 == "normal"
1552+ assert morsel1 .value == "value"
1553+
1554+ name2 , morsel2 = result [1 ]
1555+ assert name2 == "another"
1556+ assert morsel2 .value == "test"
1557+
1558+ assert "Can not load cookie: Illegal cookie name 'invalid,name'" in caplog .text
1559+
1560+
1561+ def test_parse_cookie_header_empty_key_in_fallback (
1562+ caplog : pytest .LogCaptureFixture ,
1563+ ) -> None :
1564+ """Test that fallback parser logs warning for empty cookie names."""
1565+ header = 'normal=value; ={"malformed":"json"}; another=test'
1566+
1567+ result = parse_cookie_header (header )
1568+
1569+ assert len (result ) == 2
1570+
1571+ name1 , morsel1 = result [0 ]
1572+ assert name1 == "normal"
1573+ assert morsel1 .value == "value"
1574+
1575+ name2 , morsel2 = result [1 ]
1576+ assert name2 == "another"
1577+ assert morsel2 .value == "test"
1578+
1579+ assert "Can not load cookie: Illegal cookie name ''" in caplog .text
1580+
1581+
14471582@pytest .mark .parametrize (
14481583 ("input_str" , "expected" ),
14491584 [
0 commit comments