fix: caculate range length of range header (#252)
Signed-off-by: Gaius <gaius.qi@gmail.com>
This commit is contained in:
parent
b422d8ea03
commit
f6f944dac3
|
|
@ -486,10 +486,15 @@ fn make_response_headers(
|
||||||
format!(
|
format!(
|
||||||
"bytes {}-{}/{}",
|
"bytes {}-{}/{}",
|
||||||
range.start,
|
range.start,
|
||||||
range.start + range.length,
|
range.start + range.length - 1,
|
||||||
download_task_started_response.content_length
|
download_task_started_response.content_length
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
download_task_started_response.response_header.insert(
|
||||||
|
reqwest::header::CONTENT_LENGTH.to_string(),
|
||||||
|
range.length.to_string(),
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
hashmap_to_hyper_header_map(&download_task_started_response.response_header)
|
hashmap_to_hyper_header_map(&download_task_started_response.response_header)
|
||||||
|
|
|
||||||
|
|
@ -134,12 +134,13 @@ impl Content {
|
||||||
range: Option<Range>,
|
range: Option<Range>,
|
||||||
) -> Result<impl AsyncRead> {
|
) -> Result<impl AsyncRead> {
|
||||||
if let Some(range) = range {
|
if let Some(range) = range {
|
||||||
let offset = max(offset, range.start);
|
let target_offset = max(offset, range.start);
|
||||||
let length = min(offset + length - 1, range.start + range.length - 1) - offset + 1;
|
let target_length =
|
||||||
|
min(offset + length - 1, range.start + range.length - 1) - target_offset + 1;
|
||||||
|
|
||||||
let mut f = File::open(self.dir.join(task_id)).await?;
|
let mut f = File::open(self.dir.join(task_id)).await?;
|
||||||
f.seek(SeekFrom::Start(offset)).await?;
|
f.seek(SeekFrom::Start(target_offset)).await?;
|
||||||
return Ok(f.take(length));
|
return Ok(f.take(target_length));
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut f = File::open(self.dir.join(task_id)).await?;
|
let mut f = File::open(self.dir.join(task_id)).await?;
|
||||||
|
|
|
||||||
|
|
@ -127,6 +127,7 @@ impl Piece {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if offset + piece_length > range.start {
|
||||||
pieces.push(metadata::Piece {
|
pieces.push(metadata::Piece {
|
||||||
number: number as u32,
|
number: number as u32,
|
||||||
offset,
|
offset,
|
||||||
|
|
@ -139,6 +140,7 @@ impl Piece {
|
||||||
created_at: Utc::now().naive_utc(),
|
created_at: Utc::now().naive_utc(),
|
||||||
finished_at: None,
|
finished_at: None,
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
offset = (number + 1) * piece_length;
|
offset = (number + 1) * piece_length;
|
||||||
number += 1;
|
number += 1;
|
||||||
|
|
|
||||||
|
|
@ -125,6 +125,6 @@ pub fn parse_range_header(range_header_value: &str, content_length: u64) -> Resu
|
||||||
))?;
|
))?;
|
||||||
|
|
||||||
let start = valid_range.start().to_owned();
|
let start = valid_range.start().to_owned();
|
||||||
let length = valid_range.end() - start;
|
let length = valid_range.end() - start + 1;
|
||||||
Ok(Range { start, length })
|
Ok(Range { start, length })
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue