Skip to content

Commit d970a80

Browse files
mi-carenmanuelpelloni
authored andcommitted
fix: clamp range end to file size instead of returning 416
RFC 7233 Section 2.1 states that if the last-byte-pos is greater than or equal to the current length of the representation, the byte range should be interpreted as the remainder of the representation, not rejected as unsatisfiable. `bytes=0-999` on a 500-byte file now returns `bytes 0-499/500` (206) instead of 416.
1 parent d2f7a62 commit d970a80

2 files changed

Lines changed: 20 additions & 4 deletions

File tree

src/headers/tests.rs

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -428,15 +428,29 @@ mod file_range {
428428
}
429429

430430
#[test]
431-
fn range_end_at_size() {
431+
fn range_end_at_size_is_clamped() {
432432
let range = HttpRange::Range(OrderedRange::new(0..=10).unwrap());
433+
let result = file_range(size(10), Some(range)).unwrap();
434+
assert_eq!(result.range(), &(0..=9));
435+
}
436+
437+
#[test]
438+
fn range_beyond_size_is_clamped() {
439+
let range = HttpRange::Range(OrderedRange::new(0..=50).unwrap());
440+
let result = file_range(size(10), Some(range)).unwrap();
441+
assert_eq!(result.range(), &(0..=9));
442+
}
443+
444+
#[test]
445+
fn range_start_at_size_is_unsatisfiable() {
446+
let range = HttpRange::Range(OrderedRange::new(10..=20).unwrap());
433447
let result = file_range(size(10), Some(range));
434448
assert!(result.is_err());
435449
}
436450

437451
#[test]
438-
fn range_beyond_size() {
439-
let range = HttpRange::Range(OrderedRange::new(0..=50).unwrap());
452+
fn range_start_beyond_size_is_unsatisfiable() {
453+
let range = HttpRange::Range(OrderedRange::new(50..=100).unwrap());
440454
let result = file_range(size(10), Some(range));
441455
assert!(result.is_err());
442456
}

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.end() < size => range.start()..=range.end(),
58+
HttpRange::Range(range) if range.start() < size => {
59+
range.start()..=range.end().min(size - 1)
60+
}
5961
HttpRange::Suffix(suffix) if suffix > 0 && suffix <= size => size - suffix..=size - 1,
6062
_ => {
6163
let content_range = HttpContentRange::Unsatisfiable(Unsatisfiable::new(size));

0 commit comments

Comments
 (0)