|
4 | 4 | """ |
5 | 5 |
|
6 | 6 | import abc |
| 7 | +import re |
7 | 8 | from email import header |
8 | 9 | from email import charset as _charset |
9 | 10 | from email.utils import _has_surrogates |
|
14 | 15 | 'compat32', |
15 | 16 | ] |
16 | 17 |
|
| 18 | +header_re = re.compile(r'^[^\s:]+$') |
| 19 | +header_ascii_re = re.compile("[\041-\071\073-\176]+$") |
| 20 | + |
| 21 | +def validate_header_name(name): |
| 22 | + # Validate header name according to RFC 5322 |
| 23 | + if not header_re.match(name): |
| 24 | + raise ValueError(f"Invalid header field name {name!r}") |
| 25 | + if not header_ascii_re.match(name): |
| 26 | + raise ValueError(f"Header field name contains invalid characters: {name!r}") |
17 | 27 |
|
18 | 28 | class _PolicyBase: |
19 | 29 |
|
@@ -90,14 +100,6 @@ def __add__(self, other): |
90 | 100 | """ |
91 | 101 | return self.clone(**other.__dict__) |
92 | 102 |
|
93 | | -def validate_header(name): |
94 | | - # Validate header name according to RFC 5322 |
95 | | - import re |
96 | | - if not re.match(r'^[^\s:]+$', name): |
97 | | - raise ValueError(f"Invalid header field name {name!r}") |
98 | | - # Only allow printable ASCII characters |
99 | | - if any(ord(c) < 33 or ord(c) > 126 for c in name): |
100 | | - raise ValueError(f"Invalid header field name {name!r}") |
101 | 103 |
|
102 | 104 | def _append_doc(doc, added_doc): |
103 | 105 | doc = doc.rsplit('\n', 1)[0] |
@@ -322,7 +324,7 @@ def header_store_parse(self, name, value): |
322 | 324 | """+ |
323 | 325 | The name and value are returned unmodified. |
324 | 326 | """ |
325 | | - validate_header(name) |
| 327 | + validate_header_name(name) |
326 | 328 | return (name, value) |
327 | 329 |
|
328 | 330 | def header_fetch_parse(self, name, value): |
|
0 commit comments