Skip to content

Commit ffa7468

Browse files
committed
fix range parsing
Signed-off-by: Denys Fedoryshchenko <denys.f@collabora.com>
1 parent c625032 commit ffa7468

1 file changed

Lines changed: 12 additions & 13 deletions

File tree

src/main.rs

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1043,7 +1043,12 @@ async fn ax_get_file(
10431043
let mut end = metadata.len();
10441044
// is Content-Range present?
10451045
if let Some(range) = rxheaders.get("Range") {
1046-
(start, end) = parse_range(range.to_str().unwrap());
1046+
match range.to_str().ok().and_then(parse_range) {
1047+
Some(parsed) => (start, end) = parsed,
1048+
None => {
1049+
return (StatusCode::RANGE_NOT_SATISFIABLE, "Malformed Range header").into_response();
1050+
}
1051+
}
10471052
}
10481053
// if start is set to non-zero, we need to seek
10491054
if start != 0 && (end == metadata.len() || end == 0) {
@@ -1128,18 +1133,12 @@ fn write_file_driver(
11281133

11291134
/// Parse range header
11301135
/// We support limited range only for now
1131-
fn parse_range(range: &str) -> (u64, u64) {
1132-
let parts: Vec<&str> = range.split("=").collect();
1133-
let range_parts: Vec<&str> = parts[1].split("-").collect();
1134-
let start = range_parts[0].parse::<u64>().unwrap();
1135-
if range_parts.len() == 1 {
1136-
return (start, 0);
1137-
}
1138-
let end = range_parts[1].parse::<u64>();
1139-
match end {
1140-
Ok(end) => (start, end),
1141-
Err(_) => (start, 0),
1142-
}
1136+
fn parse_range(range: &str) -> Option<(u64, u64)> {
1137+
let (_, range_spec) = range.split_once('=')?;
1138+
let (start_str, end_str) = range_spec.split_once('-')?;
1139+
let start = start_str.parse::<u64>().ok()?;
1140+
let end = end_str.parse::<u64>().unwrap_or(0);
1141+
Some((start, end))
11431142
}
11441143

11451144
/// Verify the Authorization header

0 commit comments

Comments
 (0)