mirror of
https://github.com/python/cpython.git
synced 2025-08-31 05:58:33 +00:00
#22233: Only split headers on \r and/or \n, per email RFCs.
Original patch by Martin Panter, new policy fixes by me.
This commit is contained in:
parent
6b46ec7733
commit
dc1650ca06
6 changed files with 104 additions and 19 deletions
|
@ -2,6 +2,7 @@
|
|||
code that adds all the email6 features.
|
||||
"""
|
||||
|
||||
import re
|
||||
from email._policybase import Policy, Compat32, compat32, _extend_docstrings
|
||||
from email.utils import _has_surrogates
|
||||
from email.headerregistry import HeaderRegistry as HeaderRegistry
|
||||
|
@ -18,6 +19,8 @@ __all__ = [
|
|||
'HTTP',
|
||||
]
|
||||
|
||||
linesep_splitter = re.compile(r'\n|\r')
|
||||
|
||||
@_extend_docstrings
|
||||
class EmailPolicy(Policy):
|
||||
|
||||
|
@ -135,6 +138,8 @@ class EmailPolicy(Policy):
|
|||
if hasattr(value, 'name') and value.name.lower() == name.lower():
|
||||
return (name, value)
|
||||
if isinstance(value, str) and len(value.splitlines())>1:
|
||||
# XXX this error message isn't quite right when we use splitlines
|
||||
# (see issue 22233), but I'm not sure what should happen here.
|
||||
raise ValueError("Header values may not contain linefeed "
|
||||
"or carriage return characters")
|
||||
return (name, self.header_factory(name, value))
|
||||
|
@ -150,7 +155,9 @@ class EmailPolicy(Policy):
|
|||
"""
|
||||
if hasattr(value, 'name'):
|
||||
return value
|
||||
return self.header_factory(name, ''.join(value.splitlines()))
|
||||
# We can't use splitlines here because it splits on more than \r and \n.
|
||||
value = ''.join(linesep_splitter.split(value))
|
||||
return self.header_factory(name, value)
|
||||
|
||||
def fold(self, name, value):
|
||||
"""+
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue