diff --git a/actix-files/src/lib.rs b/actix-files/src/lib.rs index 43bda9585..5ea578c0d 100644 --- a/actix-files/src/lib.rs +++ b/actix-files/src/lib.rs @@ -470,6 +470,24 @@ mod tests { assert_eq!(response.status(), StatusCode::RANGE_NOT_SATISFIABLE); } + #[actix_rt::test] + async fn test_named_file_empty_range_headers() { + let srv = actix_test::start(|| App::new().service(Files::new("/", "."))); + + for range in ["", "bytes="] { + let response = srv + .get("/tests/test.binary") + .insert_header((header::RANGE, range)) + .send() + .await + .unwrap(); + + assert_eq!(response.status(), StatusCode::RANGE_NOT_SATISFIABLE); + let content_range = response.headers().get(header::CONTENT_RANGE).unwrap(); + assert_eq!(content_range.to_str().unwrap(), "bytes */100"); + } + } + #[actix_rt::test] async fn test_named_file_content_range_headers() { let srv = actix_test::start(|| App::new().service(Files::new("/", "."))); diff --git a/actix-files/src/named.rs b/actix-files/src/named.rs index 7ff66e74d..3588ae8bc 100644 --- a/actix-files/src/named.rs +++ b/actix-files/src/named.rs @@ -550,9 +550,12 @@ impl NamedFile { // check for range header if let Some(ranges) = req.headers().get(header::RANGE) { if let Ok(ranges_header) = ranges.to_str() { - if let Ok(ranges) = HttpRange::parse(ranges_header, length) { - length = ranges[0].length; - offset = ranges[0].start; + if let Some(range) = HttpRange::parse(ranges_header, length) + .ok() + .and_then(|ranges| ranges.first().copied()) + { + length = range.length; + offset = range.start; // When a Content-Encoding header is present in a 206 partial content response // for video content, it prevents browser video players from starting playback