Yield (start, end) ranges parsed from a HTTP Range header. Skip unsatisfiable ranges. The end index is non-inclusive.
(header, maxlen=0)
| 2984 | |
| 2985 | |
| 2986 | def parse_range_header(header, maxlen=0): |
| 2987 | """ Yield (start, end) ranges parsed from a HTTP Range header. Skip |
| 2988 | unsatisfiable ranges. The end index is non-inclusive.""" |
| 2989 | if not header or header[:6] != 'bytes=': return |
| 2990 | ranges = [r.split('-', 1) for r in header[6:].split(',') if '-' in r] |
| 2991 | for start, end in ranges: |
| 2992 | try: |
| 2993 | if not start: # bytes=-100 -> last 100 bytes |
| 2994 | start, end = max(0, maxlen - int(end)), maxlen |
| 2995 | elif not end: # bytes=100- -> all but the first 99 bytes |
| 2996 | start, end = int(start), maxlen |
| 2997 | else: # bytes=100-200 -> bytes 100-200 (inclusive) |
| 2998 | start, end = int(start), min(int(end) + 1, maxlen) |
| 2999 | if 0 <= start < end <= maxlen: |
| 3000 | yield start, end |
| 3001 | except ValueError: |
| 3002 | pass |
| 3003 | |
| 3004 | |
| 3005 | #: Header tokenizer used by _parse_http_header() |