mirror of
https://github.com/kennethreitz/httpbin.git
synced 2026-06-05 14:50:17 +00:00
Renamed endpoint /range-request -> /range
This commit is contained in:
+2
-2
@@ -40,7 +40,7 @@ Endpoint Description
|
||||
`/stream/:n`_ Streams *n* – 100 lines.
|
||||
`/delay/:n`_ Delays responding for *n* – 10 seconds.
|
||||
`/drip`_ Drips data over a duration after an optional initial delay, then (optionally) returns with the given status code.
|
||||
`/range-request/:n`_ Streams *n* bytes, and allows specifying a *Range* header to select a subset of the data. Accepts a *chunk\_size* and request *duration* parameter.
|
||||
`/range/:n`_ Streams *n* bytes, and allows specifying a *Range* header to select a subset of the data. Accepts a *chunk\_size* and request *duration* parameter.
|
||||
`/html`_ Renders an HTML Page.
|
||||
`/robots.txt`_ Returns some robots.txt rules.
|
||||
`/deny`_ Denied by robots.txt file.
|
||||
@@ -75,7 +75,7 @@ Endpoint Description
|
||||
.. _/stream/:n: http://httpbin.org/stream/20
|
||||
.. _/delay/:n: http://httpbin.org/delay/3
|
||||
.. _/drip: http://httpbin.org/drip?numbytes=5&duration=5&code=200
|
||||
.. _/range-request/:n: http://httpbin.org/range-request/1024
|
||||
.. _/range/:n: http://httpbin.org/range/1024
|
||||
.. _/html: http://httpbin.org/html
|
||||
.. _/robots.txt: http://httpbin.org/robots.txt
|
||||
.. _/deny: http://httpbin.org/deny
|
||||
|
||||
+4
-4
@@ -541,13 +541,13 @@ def stream_random_bytes(n):
|
||||
|
||||
return Response(generate_bytes(), headers=headers)
|
||||
|
||||
@app.route('/range-request/<int:numbytes>')
|
||||
@app.route('/range/<int:numbytes>')
|
||||
def range_request(numbytes):
|
||||
"""Streams n random bytes generated with given seed, at given chunk size per packet."""
|
||||
|
||||
if numbytes <= 0 or numbytes > (100 * 1024):
|
||||
response = Response(headers={
|
||||
'ETag' : 'range-request%d' % numbytes,
|
||||
'ETag' : 'range%d' % numbytes,
|
||||
'Accept-Ranges' : 'bytes'
|
||||
})
|
||||
response.status_code = 404
|
||||
@@ -582,7 +582,7 @@ def range_request(numbytes):
|
||||
|
||||
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):
|
||||
response = Response(headers={
|
||||
'ETag' : 'range-request%d' % numbytes,
|
||||
'ETag' : 'range%d' % numbytes,
|
||||
'Accept-Ranges' : 'bytes',
|
||||
'Content-Range' : 'bytes */%d' % numbytes
|
||||
})
|
||||
@@ -610,7 +610,7 @@ def range_request(numbytes):
|
||||
response_headers = {
|
||||
'Transfer-Encoding': 'chunked',
|
||||
'Content-Type': 'application/octet-stream',
|
||||
'ETag' : 'range-request%d' % numbytes,
|
||||
'ETag' : 'range%d' % numbytes,
|
||||
'Accept-Ranges' : 'bytes',
|
||||
'Content-Range' : content_range }
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
<li><a href="/stream/20"><code>/stream/:n</code></a> Streams <em>n</em>–100 lines.</li>
|
||||
<li><a href="/delay/3"><code>/delay/:n</code></a> Delays responding for <em>n</em>–10 seconds.</li>
|
||||
<li><a href="/drip?numbytes=5&duration=5&code=200"><code>/drip?numbytes=n&duration=s&delay=s&code=code</code></a> Drips data over a duration after an optional initial delay, then (optionally) returns with the given status code.</li>
|
||||
<li><a href="/range-request/1024"><code>/range-request/1024?duration=s&chunk_size=code</code></a> Streams <em>n</em> bytes, and allows specifying a <em>Range</em> header to select a subset of the data. Accepts a <em>chunk_size</em> and request <em>duration</em> parameter.</li>
|
||||
<li><a href="/range/1024"><code>/range/1024?duration=s&chunk_size=code</code></a> Streams <em>n</em> bytes, and allows specifying a <em>Range</em> header to select a subset of the data. Accepts a <em>chunk_size</em> and request <em>duration</em> parameter.</li>
|
||||
<li><a href="/html" data-bare-link="true"><code>/html</code></a> Renders an HTML Page.</li>
|
||||
<li><a href="/robots.txt" data-bare-link="true"><code>/robots.txt</code></a> Returns some robots.txt rules.</li>
|
||||
<li><a href="/deny" data-bare-link="true"><code>/deny</code></a> Denied by robots.txt file.</li>
|
||||
|
||||
+16
-16
@@ -336,84 +336,84 @@ class HttpbinTestCase(unittest.TestCase):
|
||||
)
|
||||
|
||||
def test_request_range(self):
|
||||
response1 = self.app.get('/range-request/1234')
|
||||
response1 = self.app.get('/range/1234')
|
||||
self.assertEqual(response1.status_code, 200)
|
||||
self.assertEqual(response1.headers.get('ETag'), 'range-request1234')
|
||||
self.assertEqual(response1.headers.get('ETag'), 'range1234')
|
||||
self.assertEqual(response1.headers.get('Content-range'), 'bytes 0-1233/1234')
|
||||
self.assertEqual(response1.headers.get('Accept-ranges'), 'bytes')
|
||||
self.assertEqual(len(response1.get_data()), 1234)
|
||||
|
||||
response2 = self.app.get('/range-request/1234')
|
||||
response2 = self.app.get('/range/1234')
|
||||
self.assertEqual(response2.status_code, 200)
|
||||
self.assertEqual(response2.headers.get('ETag'), 'range-request1234')
|
||||
self.assertEqual(response2.headers.get('ETag'), 'range1234')
|
||||
self.assertEqual(response1.get_data(), response2.get_data())
|
||||
|
||||
def test_request_range_with_parameters(self):
|
||||
response = self.app.get(
|
||||
'/range-request/100?duration=1.5&chunk_size=5',
|
||||
'/range/100?duration=1.5&chunk_size=5',
|
||||
headers={ 'Range': 'bytes=10-24' }
|
||||
)
|
||||
|
||||
self.assertEqual(response.status_code, 206)
|
||||
self.assertEqual(response.headers.get('ETag'), 'range-request100')
|
||||
self.assertEqual(response.headers.get('ETag'), 'range100')
|
||||
self.assertEqual(response.headers.get('Content-range'), 'bytes 10-24/100')
|
||||
self.assertEqual(response.headers.get('Accept-ranges'), 'bytes')
|
||||
self.assertEqual(response.get_data(), 'klmnopqrstuvwxy')
|
||||
|
||||
def test_request_range_first_15_bytes(self):
|
||||
response = self.app.get(
|
||||
'/range-request/1000',
|
||||
'/range/1000',
|
||||
headers={ 'Range': 'bytes=0-15' }
|
||||
)
|
||||
|
||||
self.assertEqual(response.status_code, 206)
|
||||
self.assertEqual(response.headers.get('ETag'), 'range-request1000')
|
||||
self.assertEqual(response.headers.get('ETag'), 'range1000')
|
||||
self.assertEqual(response.get_data(), 'abcdefghijklmnop')
|
||||
self.assertEqual(response.headers.get('Content-range'), 'bytes 0-15/1000')
|
||||
|
||||
def test_request_range_open_ended_last_6_bytes(self):
|
||||
response = self.app.get(
|
||||
'/range-request/26',
|
||||
'/range/26',
|
||||
headers={ 'Range': 'bytes=20-' }
|
||||
)
|
||||
|
||||
self.assertEqual(response.status_code, 206)
|
||||
self.assertEqual(response.headers.get('ETag'), 'range-request26')
|
||||
self.assertEqual(response.headers.get('ETag'), 'range26')
|
||||
self.assertEqual(response.get_data(), 'uvwxyz')
|
||||
self.assertEqual(response.headers.get('Content-range'), 'bytes 20-25/26')
|
||||
|
||||
def test_request_range_suffix(self):
|
||||
response = self.app.get(
|
||||
'/range-request/26',
|
||||
'/range/26',
|
||||
headers={ 'Range': 'bytes=-5' }
|
||||
)
|
||||
|
||||
self.assertEqual(response.status_code, 206)
|
||||
self.assertEqual(response.headers.get('ETag'), 'range-request26')
|
||||
self.assertEqual(response.headers.get('ETag'), 'range26')
|
||||
self.assertEqual(response.get_data(), 'vwxyz')
|
||||
self.assertEqual(response.headers.get('Content-range'), 'bytes 21-25/26')
|
||||
|
||||
def test_request_out_of_bounds(self):
|
||||
response = self.app.get(
|
||||
'/range-request/26',
|
||||
'/range/26',
|
||||
headers={ 'Range': 'bytes=10-5',
|
||||
}
|
||||
)
|
||||
|
||||
self.assertEqual(response.status_code, 416)
|
||||
self.assertEqual(response.headers.get('ETag'), 'range-request26')
|
||||
self.assertEqual(response.headers.get('ETag'), 'range26')
|
||||
self.assertEqual(len(response.get_data()), 0)
|
||||
self.assertEqual(response.headers.get('Content-range'), 'bytes */26')
|
||||
|
||||
response = self.app.get(
|
||||
'/range-request/26',
|
||||
'/range/26',
|
||||
headers={ 'Range': 'bytes=32-40',
|
||||
}
|
||||
)
|
||||
|
||||
self.assertEqual(response.status_code, 416)
|
||||
response = self.app.get(
|
||||
'/range-request/26',
|
||||
'/range/26',
|
||||
headers={ 'Range': 'bytes=0-40',
|
||||
}
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user