From f6f944dac35061c1a639f42a29af47ee17f3121c Mon Sep 17 00:00:00 2001 From: Gaius Date: Mon, 5 Feb 2024 15:08:11 +0800 Subject: [PATCH] fix: caculate range length of range header (#252) Signed-off-by: Gaius --- src/proxy/mod.rs | 7 ++++++- src/storage/content.rs | 9 +++++---- src/task/piece.rs | 26 ++++++++++++++------------ src/utils/http.rs | 2 +- 4 files changed, 26 insertions(+), 18 deletions(-) diff --git a/src/proxy/mod.rs b/src/proxy/mod.rs index a7a8f30c..ae8860a4 100644 --- a/src/proxy/mod.rs +++ b/src/proxy/mod.rs @@ -486,10 +486,15 @@ fn make_response_headers( format!( "bytes {}-{}/{}", range.start, - range.start + range.length, + range.start + range.length - 1, 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) diff --git a/src/storage/content.rs b/src/storage/content.rs index a1f9ab25..da8b0ded 100644 --- a/src/storage/content.rs +++ b/src/storage/content.rs @@ -134,12 +134,13 @@ impl Content { range: Option, ) -> Result { if let Some(range) = range { - let offset = max(offset, range.start); - let length = min(offset + length - 1, range.start + range.length - 1) - offset + 1; + let target_offset = max(offset, range.start); + 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?; - f.seek(SeekFrom::Start(offset)).await?; - return Ok(f.take(length)); + f.seek(SeekFrom::Start(target_offset)).await?; + return Ok(f.take(target_length)); } let mut f = File::open(self.dir.join(task_id)).await?; diff --git a/src/task/piece.rs b/src/task/piece.rs index f3ca9116..6debc5bb 100644 --- a/src/task/piece.rs +++ b/src/task/piece.rs @@ -127,18 +127,20 @@ impl Piece { break; } - pieces.push(metadata::Piece { - number: number as u32, - offset, - length: piece_length, - digest: "".to_string(), - parent_id: None, - uploading_count: 0, - uploaded_count: 0, - updated_at: Utc::now().naive_utc(), - created_at: Utc::now().naive_utc(), - finished_at: None, - }); + if offset + piece_length > range.start { + pieces.push(metadata::Piece { + number: number as u32, + offset, + length: piece_length, + digest: "".to_string(), + parent_id: None, + uploading_count: 0, + uploaded_count: 0, + updated_at: Utc::now().naive_utc(), + created_at: Utc::now().naive_utc(), + finished_at: None, + }); + } offset = (number + 1) * piece_length; number += 1; diff --git a/src/utils/http.rs b/src/utils/http.rs index 43b57209..5c6317a8 100644 --- a/src/utils/http.rs +++ b/src/utils/http.rs @@ -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 length = valid_range.end() - start; + let length = valid_range.end() - start + 1; Ok(Range { start, length }) }