| 1138 | maxread -= len(part) |
| 1139 | |
| 1140 | def _iter_chunked(self, read, bufsize): |
| 1141 | err = HTTPError(400, 'Error while parsing chunked transfer body.') |
| 1142 | rn, sem, bs = tob('\r\n'), tob(';'), tob('') |
| 1143 | while True: |
| 1144 | header = read(1) |
| 1145 | while header[-2:] != rn: |
| 1146 | c = read(1) |
| 1147 | header += c |
| 1148 | if not c: raise err |
| 1149 | if len(header) > bufsize: raise err |
| 1150 | size, _, _ = header.partition(sem) |
| 1151 | try: |
| 1152 | maxread = int(tonat(size.strip()), 16) |
| 1153 | except ValueError: |
| 1154 | raise err |
| 1155 | if maxread == 0: break |
| 1156 | buff = bs |
| 1157 | while maxread > 0: |
| 1158 | if not buff: |
| 1159 | buff = read(min(maxread, bufsize)) |
| 1160 | part, buff = buff[:maxread], buff[maxread:] |
| 1161 | if not part: raise err |
| 1162 | yield part |
| 1163 | maxread -= len(part) |
| 1164 | if read(2) != rn: |
| 1165 | raise err |
| 1166 | |
| 1167 | @DictProperty('environ', 'bottle.request.body', read_only=True) |
| 1168 | def _body(self): |