Mercurial > p > roundup > code
diff test/test_liveserver.py @ 6655:a193653d6fa4
Test more range error cases.
check content-range and content-length where applicable
cases:
invalid if-range etag should return whole file with a 200 exit code
invalid range with invalid etag return whole file 200 exit code
invalid range with valid etag return whole file 200 exit code
invalid range with no etag return 416 unable to satify and check valid
content-range.
| author | John Rouillard <rouilj@ieee.org> |
|---|---|
| date | Mon, 02 May 2022 15:29:12 -0400 |
| parents | da6c9050a79e |
| children | 9a1f5e496e6c |
line wrap: on
line diff
--- a/test/test_liveserver.py Mon May 02 14:46:29 2022 -0400 +++ b/test/test_liveserver.py Mon May 02 15:29:12 2022 -0400 @@ -175,22 +175,67 @@ Also If-Range only supports strong etags not dates or weak etags. """ - # check with Accept-Language header + + # get whole file uncompressed. Extract content length and etag + # for future use + f = requests.get(self.url_base() + "/@@file/style.css", + headers = {"Accept-Encoding": "identity"}) + # store etag for condition range testing + etag = f.headers['etag'] + expected_length = f.headers['content-length'] + + # get first 11 bytes unconditionally (0 index really??) hdrs = {"Range": "bytes=0-10"} f = requests.get(self.url_base() + "/@@file/style.css", headers=hdrs) self.assertEqual(f.status_code, 206) self.assertEqual(f.content, b"/* main pag") + # compression disabled for length < 100, so we can use 11 here + self.assertEqual(f.headers['content-length'], '11') + self.assertEqual(f.headers['content-range'], + "bytes 0-10/%s"%expected_length) - etag = f.headers['etag'] + # conditional request 11 bytes since etag matches 206 code hdrs['If-Range'] = etag f = requests.get(self.url_base() + "/@@file/style.css", headers=hdrs) self.assertEqual(f.status_code, 206) self.assertEqual(f.content, b"/* main pag") + # compression disabled for length < 100, so we can use 11 here + self.assertEqual(f.headers['content-length'], '11') + self.assertEqual(f.headers['content-range'], + "bytes 0-10/%s"%expected_length) - etag = f.headers['etag'] + # conditional request returns all bytes as etag isn't correct 200 code + hdrs['If-Range'] = etag[2:] # bad tag + f = requests.get(self.url_base() + "/@@file/style.css", headers=hdrs) + self.assertEqual(f.status_code, 200) + # not checking content length since it could be compressed + self.assertNotIn('content-range', f.headers, 'content-range should not be present') + + # range is too large, but etag is bad also, return whole file 200 code + hdrs['Range'] = "0-99999" # too large hdrs['If-Range'] = etag[2:] # bad tag f = requests.get(self.url_base() + "/@@file/style.css", headers=hdrs) self.assertEqual(f.status_code, 200) + # not checking content length since it could be compressed + self.assertNotIn('content-range', f.headers, 'content-range should not be present') + + # range is too large, but etag is specified so return whole file + # 200 code + hdrs['Range'] = "bytes=0-99999" # too large + hdrs['If-Range'] = etag # any tag works + f = requests.get(self.url_base() + "/@@file/style.css", headers=hdrs) + self.assertEqual(f.status_code, 200) + # not checking content length since it could be compressed + self.assertNotIn('content-range', f.headers, 'content-range should not be present') + + # range too large, not if-range so error code 416 + hdrs['Range'] = "bytes=0-99999" # too large + del(hdrs['If-Range']) + print(hdrs) + f = requests.get(self.url_base() + "/@@file/style.css", headers=hdrs) + self.assertEqual(f.status_code, 416) + self.assertEqual(f.headers['content-range'], + "bytes */%s"%expected_length) def test_rest_invalid_method_collection(self): # use basic auth for rest endpoint
