|
| 1 | +from email.message import Message |
1 | 2 | from email.parser import Parser
|
2 | 3 | from json import loads
|
3 | 4 | from typing import Any
|
| 5 | +from typing import Iterator |
4 | 6 | from typing import Mapping
|
| 7 | +from typing import Tuple |
5 | 8 | from urllib.parse import parse_qsl
|
6 | 9 | from xml.etree.ElementTree import Element
|
7 | 10 | from xml.etree.ElementTree import fromstring
|
@@ -57,12 +60,14 @@ def data_form_loads(value: bytes, **parameters: str) -> Mapping[str, Any]:
|
57 | 60 | header = f'Content-Type: {mimetype}; boundary="{boundary}"'
|
58 | 61 | text = "\n\n".join([header, decoded])
|
59 | 62 | parts = parser.parsestr(text, headersonly=False)
|
60 |
| - return ImmutableMultiDict( |
61 |
| - [ |
62 |
| - ( |
63 |
| - part.get_param("name", header="content-disposition"), |
64 |
| - part.get_payload(decode=True), |
65 |
| - ) |
66 |
| - for part in parts.get_payload() |
67 |
| - ] |
68 |
| - ) |
| 63 | + return ImmutableMultiDict(list(iter_payloads(parts))) |
| 64 | + |
| 65 | + |
| 66 | +def iter_payloads(parts: Message) -> Iterator[Tuple[str, bytes]]: |
| 67 | + for part in parts.get_payload(): |
| 68 | + assert isinstance(part, Message) |
| 69 | + name = part.get_param("name", header="content-disposition") |
| 70 | + assert isinstance(name, str) |
| 71 | + payload = part.get_payload(decode=True) |
| 72 | + assert isinstance(payload, bytes) |
| 73 | + yield name, payload |
0 commit comments