@@ -175,22 +175,67 @@ def test_byte_Ranges(self):
175175 Also If-Range only supports strong etags not dates or weak etags.
176176
177177 """
178- # check with Accept-Language header
178+
179+ # get whole file uncompressed. Extract content length and etag
180+ # for future use
181+ f = requests .get (self .url_base () + "/@@file/style.css" ,
182+ headers = {"Accept-Encoding" : "identity" })
183+ # store etag for condition range testing
184+ etag = f .headers ['etag' ]
185+ expected_length = f .headers ['content-length' ]
186+
187+ # get first 11 bytes unconditionally (0 index really??)
179188 hdrs = {"Range" : "bytes=0-10" }
180189 f = requests .get (self .url_base () + "/@@file/style.css" , headers = hdrs )
181190 self .assertEqual (f .status_code , 206 )
182191 self .assertEqual (f .content , b"/* main pag" )
192+ # compression disabled for length < 100, so we can use 11 here
193+ self .assertEqual (f .headers ['content-length' ], '11' )
194+ self .assertEqual (f .headers ['content-range' ],
195+ "bytes 0-10/%s" % expected_length )
183196
184- etag = f . headers [ ' etag' ]
197+ # conditional request 11 bytes since etag matches 206 code
185198 hdrs ['If-Range' ] = etag
186199 f = requests .get (self .url_base () + "/@@file/style.css" , headers = hdrs )
187200 self .assertEqual (f .status_code , 206 )
188201 self .assertEqual (f .content , b"/* main pag" )
202+ # compression disabled for length < 100, so we can use 11 here
203+ self .assertEqual (f .headers ['content-length' ], '11' )
204+ self .assertEqual (f .headers ['content-range' ],
205+ "bytes 0-10/%s" % expected_length )
189206
190- etag = f . headers [ ' etag' ]
207+ # conditional request returns all bytes as etag isn't correct 200 code
191208 hdrs ['If-Range' ] = etag [2 :] # bad tag
192209 f = requests .get (self .url_base () + "/@@file/style.css" , headers = hdrs )
193210 self .assertEqual (f .status_code , 200 )
211+ # not checking content length since it could be compressed
212+ self .assertNotIn ('content-range' , f .headers , 'content-range should not be present' )
213+
214+ # range is too large, but etag is bad also, return whole file 200 code
215+ hdrs ['Range' ] = "0-99999" # too large
216+ hdrs ['If-Range' ] = etag [2 :] # bad tag
217+ f = requests .get (self .url_base () + "/@@file/style.css" , headers = hdrs )
218+ self .assertEqual (f .status_code , 200 )
219+ # not checking content length since it could be compressed
220+ self .assertNotIn ('content-range' , f .headers , 'content-range should not be present' )
221+
222+ # range is too large, but etag is specified so return whole file
223+ # 200 code
224+ hdrs ['Range' ] = "bytes=0-99999" # too large
225+ hdrs ['If-Range' ] = etag # any tag works
226+ f = requests .get (self .url_base () + "/@@file/style.css" , headers = hdrs )
227+ self .assertEqual (f .status_code , 200 )
228+ # not checking content length since it could be compressed
229+ self .assertNotIn ('content-range' , f .headers , 'content-range should not be present' )
230+
231+ # range too large, not if-range so error code 416
232+ hdrs ['Range' ] = "bytes=0-99999" # too large
233+ del (hdrs ['If-Range' ])
234+ print (hdrs )
235+ f = requests .get (self .url_base () + "/@@file/style.css" , headers = hdrs )
236+ self .assertEqual (f .status_code , 416 )
237+ self .assertEqual (f .headers ['content-range' ],
238+ "bytes */%s" % expected_length )
194239
195240 def test_rest_invalid_method_collection (self ):
196241 # use basic auth for rest endpoint
0 commit comments