Skip to content

Commit ceeddfd

Browse files
committed
fix: update matches_requested_range to handle clamped ranges
After clamping range ends and suffixes to file size, the response range can be shorter than what was originally requested. Relax the equality checks to accept clamped responses: - `Range`: accept response end <= requested end - `Suffix`: accept response length <= requested suffix Add tests for suffix edge cases: response not ending at file boundary, and response length exceeding the requested suffix.
1 parent cf6a7d1 commit ceeddfd

File tree

2 files changed

+35
-2
lines changed

2 files changed

+35
-2
lines changed

src/headers/content_range.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,10 @@ impl HttpContentRange {
3030
(
3131
HttpRange::Range(OrderedRange { start, end }),
3232
HttpContentRange::Bound(Bound { range, .. }),
33-
) => start == range.start() && end == range.end(),
33+
) => start == range.start() && end >= range.end(),
3434
(HttpRange::Suffix(suffix), HttpContentRange::Bound(Bound { range, size })) => {
35-
let length_matches = (range.end() - range.start()).checked_add(1) == Some(suffix);
35+
let length = (range.end() - range.start()).checked_add(1);
36+
let length_matches = length.is_some_and(|len| len <= suffix);
3637
let ends_at_boundary = size.is_none_or(|size| range.end() + 1 == size);
3738
length_matches && ends_at_boundary
3839
}

src/headers/tests.rs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,38 @@ mod content_range {
160160

161161
assert!(!content_range.matches_requested_range(range));
162162
}
163+
164+
#[test]
165+
fn range_with_clamped_end_matches() {
166+
let range = HttpRange::Range(OrderedRange::new(0..=999).unwrap());
167+
let content_range = HttpContentRange::Bound(Bound::new(0..=49, Some(50)).unwrap());
168+
169+
assert!(content_range.matches_requested_range(range));
170+
}
171+
172+
#[test]
173+
fn suffix_clamped_to_file_size_matches() {
174+
let range = HttpRange::Suffix(999);
175+
let content_range = HttpContentRange::Bound(Bound::new(0..=49, Some(50)).unwrap());
176+
177+
assert!(content_range.matches_requested_range(range));
178+
}
179+
180+
#[test]
181+
fn suffix_not_at_boundary_does_not_match() {
182+
let range = HttpRange::Suffix(5);
183+
let content_range = HttpContentRange::Bound(Bound::new(0..=4, Some(20)).unwrap());
184+
185+
assert!(!content_range.matches_requested_range(range));
186+
}
187+
188+
#[test]
189+
fn suffix_length_mismatch_does_not_match() {
190+
let range = HttpRange::Suffix(3);
191+
let content_range = HttpContentRange::Bound(Bound::new(10..=19, Some(20)).unwrap());
192+
193+
assert!(!content_range.matches_requested_range(range));
194+
}
163195
}
164196
}
165197

0 commit comments

Comments
 (0)