v0.29.2
This commit is contained in:
1 parent
76cb4acef0
commit
68678e98be
84 files changed
+1519
-325
No files matched your search
@@ -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 {
|
||||
|
||||
Reference in new issue
Block a user