|
| 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