Skip to content

Commit cf5a19f

Browse files
committed
fix: correct matches_requested_range for suffix ranges
With suffix clamping, a non-zero suffix is always satisfiable regardless of file size. The only unsatisfiable suffix is `Suffix(0)`. Previously `Suffix(0)` against `Unsatisfiable` incorrectly returned `false` because `0 > size` is never true.
1 parent 0afa329 commit cf5a19f

3 files changed

Lines changed: 16 additions & 7 deletions

File tree

src/headers/content_range.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,9 @@ impl HttpContentRange {
4444
HttpRange::Range(OrderedRange { end: n, .. }),
4545
HttpContentRange::Unsatisfiable(Unsatisfiable { size }),
4646
) => n >= *size,
47-
(
48-
HttpRange::Suffix(suffix),
49-
HttpContentRange::Unsatisfiable(Unsatisfiable { size }),
50-
) => suffix > *size,
47+
(HttpRange::Suffix(suffix), HttpContentRange::Unsatisfiable(Unsatisfiable { .. })) => {
48+
suffix == 0
49+
}
5150
}
5251
}
5352
}

src/headers/tests.rs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,12 +146,20 @@ mod content_range {
146146
}
147147

148148
#[test]
149-
fn unsuccessful_range_suffix_range_content_bound() {
150-
let range = HttpRange::Suffix(50);
149+
fn unsuccessful_range_suffix_zero_content_unsatisfiable() {
150+
let range = HttpRange::Suffix(0);
151151
let content_range = HttpContentRange::Unsatisfiable(Unsatisfiable::new(20));
152152

153153
assert!(content_range.matches_requested_range(range));
154154
}
155+
156+
#[test]
157+
fn suffix_exceeding_size_is_not_unsatisfiable() {
158+
let range = HttpRange::Suffix(50);
159+
let content_range = HttpContentRange::Unsatisfiable(Unsatisfiable::new(20));
160+
161+
assert!(!content_range.matches_requested_range(range));
162+
}
155163
}
156164
}
157165

src/lib.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,9 @@ pub fn file_range(
5555

5656
let range = match http_range {
5757
HttpRange::StartingPoint(start) if start < size => start..=size - 1,
58-
HttpRange::Range(range) if range.start() < size => range.start()..=range.end().min(size - 1),
58+
HttpRange::Range(range) if range.start() < size => {
59+
range.start()..=range.end().min(size - 1)
60+
}
5961
HttpRange::Suffix(suffix) if suffix > 0 => size.saturating_sub(suffix)..=size - 1,
6062
_ => {
6163
let content_range = HttpContentRange::Unsatisfiable(Unsatisfiable::new(size));

0 commit comments

Comments
 (0)