This commit is contained in:
Mateusz Gruszczyński committed 2026-10-08 22:22:46 +02:00
1 parent 76cb4acef0
commit 68678e98be
84 files changed
+1519 -325

No files matched your search

+32 -13
View File
@@ -308,33 +308,52 @@ struct ByteRange {
end: u64,
}
fn parse_range(value: &str, length: u64) -> Option<ByteRange> {
let value = value.strip_prefix("bytes=")?.trim();
if value.contains(',') || value.is_empty() || length == 0 {
return None;
const MAX_BYTE_RANGES: usize = 16;
fn parse_range_item(value: &str, length: u64) -> Result<Option<ByteRange>, ()> {
if length == 0 {
return Ok(None);
}
let (start, end) = value.split_once('-')?;
let (start, end) = value.split_once('-').ok_or(())?;
if start.is_empty() {
let suffix: u64 = end.parse().ok()?;
let suffix: u64 = end.parse().map_err(|_| ())?;
if suffix == 0 {
return None;
return Ok(None);
}
let size = suffix.min(length);
return Some(ByteRange {
return Ok(Some(ByteRange {
start: length - size,
end: length - 1,
});
}));
}
let start: u64 = start.parse().ok()?;
let start: u64 = start.parse().map_err(|_| ())?;
if start >= length {
return None;
return Ok(None);
}
let end = if end.is_empty() {
length - 1
} else {
end.parse::<u64>().ok()?.min(length - 1)
end.parse::<u64>().map_err(|_| ())?.min(length - 1)
};
(end >= start).then_some(ByteRange { start, end })
Ok((end >= start).then_some(ByteRange { start, end }))
}
fn parse_ranges(value: &str, length: u64) -> Option<Vec<ByteRange>> {
let value = value.strip_prefix("bytes=")?.trim();
if value.is_empty() {
return None;
}
let mut ranges = Vec::new();
for (index, item) in value.split(',').enumerate() {
if index >= MAX_BYTE_RANGES {
return None;
}
match parse_range_item(item.trim(), length).ok()? {
Some(range) => ranges.push(range),
None => continue,
}
}
(!ranges.is_empty()).then_some(ranges)
}
fn if_range_allows(headers: &HeaderMap, etag: Option<&str>, modified: Option<SystemTime>) -> bool {