Streams n random bytes generated with given seed, at given chunk size per packet.
(numbytes)
| 703 | |
| 704 | @app.route('/range/<int:numbytes>') |
| 705 | def range_request(numbytes): |
| 706 | """Streams n random bytes generated with given seed, at given chunk size per packet.""" |
| 707 | |
| 708 | if numbytes <= 0 or numbytes > (100 * 1024): |
| 709 | response = Response(headers={ |
| 710 | 'ETag' : 'range%d' % numbytes, |
| 711 | 'Accept-Ranges' : 'bytes' |
| 712 | }) |
| 713 | response.status_code = 404 |
| 714 | response.data = 'number of bytes must be in the range (0, 102400]' |
| 715 | return response |
| 716 | |
| 717 | params = CaseInsensitiveDict(request.args.items()) |
| 718 | if 'chunk_size' in params: |
| 719 | chunk_size = max(1, int(params['chunk_size'])) |
| 720 | else: |
| 721 | chunk_size = 10 * 1024 |
| 722 | |
| 723 | duration = float(params.get('duration', 0)) |
| 724 | pause_per_byte = duration / numbytes |
| 725 | |
| 726 | request_headers = get_headers() |
| 727 | first_byte_pos, last_byte_pos = get_request_range(request_headers, numbytes) |
| 728 | range_length = (last_byte_pos+1) - first_byte_pos |
| 729 | |
| 730 | if first_byte_pos > last_byte_pos or first_byte_pos not in xrange(0, numbytes) or last_byte_pos not in xrange(0, numbytes): |
| 731 | response = Response(headers={ |
| 732 | 'ETag' : 'range%d' % numbytes, |
| 733 | 'Accept-Ranges' : 'bytes', |
| 734 | 'Content-Range' : 'bytes */%d' % numbytes, |
| 735 | 'Content-Length': '0', |
| 736 | }) |
| 737 | response.status_code = 416 |
| 738 | return response |
| 739 | |
| 740 | def generate_bytes(): |
| 741 | chunks = bytearray() |
| 742 | |
| 743 | for i in xrange(first_byte_pos, last_byte_pos + 1): |
| 744 | |
| 745 | # We don't want the resource to change across requests, so we need |
| 746 | # to use a predictable data generation function |
| 747 | chunks.append(ord('a') + (i % 26)) |
| 748 | if len(chunks) == chunk_size: |
| 749 | yield(bytes(chunks)) |
| 750 | time.sleep(pause_per_byte * chunk_size) |
| 751 | chunks = bytearray() |
| 752 | |
| 753 | if chunks: |
| 754 | time.sleep(pause_per_byte * len(chunks)) |
| 755 | yield(bytes(chunks)) |
| 756 | |
| 757 | content_range = 'bytes %d-%d/%d' % (first_byte_pos, last_byte_pos, numbytes) |
| 758 | response_headers = { |
| 759 | 'Content-Type': 'application/octet-stream', |
| 760 | 'ETag' : 'range%d' % numbytes, |
| 761 | 'Accept-Ranges' : 'bytes', |
| 762 | 'Content-Length': str(range_length), |
nothing calls this directly
no test coverage detected
searching dependent graphs…