| 1503 | |
| 1504 | @classmethod |
| 1505 | def iter_items(cls, src, markup, max_read): |
| 1506 | iter_markup = iter(markup) |
| 1507 | # check & skip empty data (body should start from empty data) |
| 1508 | null_data = next(iter_markup, None) |
| 1509 | if null_data is None: return |
| 1510 | sec_name, [start, end] = null_data |
| 1511 | assert sec_name == 'data' |
| 1512 | if end > 0: |
| 1513 | raise HTTPError( |
| 1514 | 422, 'Malformed multipart/formdata, unexpected data before the first boundary at: [%d:%d]' |
| 1515 | % (start, end)) |
| 1516 | headers = next(iter_markup, None) |
| 1517 | data = next(iter_markup, None) |
| 1518 | while headers: |
| 1519 | sec_name, headers_slice = headers |
| 1520 | assert sec_name == 'headers' |
| 1521 | if not data: |
| 1522 | raise HTTPError( |
| 1523 | 422, 'Malformed multipart/formdata, no data found for the field at: [%d:%d]' |
| 1524 | % tuple(headers_slice)) |
| 1525 | sec_name, data_slice = data |
| 1526 | assert sec_name == 'data' |
| 1527 | field = cls() |
| 1528 | has_read = field.read(src, headers_slice, data_slice, max_read=max_read) |
| 1529 | max_read -= has_read |
| 1530 | yield field |
| 1531 | headers = next(iter_markup, None) |
| 1532 | data = next(iter_markup, None) |
| 1533 | |
| 1534 | |
| 1535 | class BaseRequest(object): |