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

Roundup Issue Tracker: http://roundup-tracker.org/