MCPcopy
hub / github.com/postmanlabs/httpbin / range_request

Function range_request

httpbin/core.py:705–773  ·  view source on GitHub ↗

Streams n random bytes generated with given seed, at given chunk size per packet.

(numbytes)

Source from the content-addressed store, hash-verified

703
704@app.route('/range/<int:numbytes>')
705def 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),

Callers

nothing calls this directly

Calls 4

CaseInsensitiveDictClass · 0.85
get_headersFunction · 0.85
get_request_rangeFunction · 0.85
generate_bytesFunction · 0.85

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…