fix: caculate range length of range header (#252)

Signed-off-by: Gaius <gaius.qi@gmail.com>
This commit is contained in:
Gaius 2024-02-05 15:08:11 +08:00 committed by GitHub
parent b422d8ea03
commit f6f944dac3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 26 additions and 18 deletions

View File

@ -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)

View File

@ -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?;

View File

@ -127,18 +127,20 @@ impl Piece {
break; break;
} }
pieces.push(metadata::Piece { if offset + piece_length > range.start {
number: number as u32, pieces.push(metadata::Piece {
offset, number: number as u32,
length: piece_length, offset,
digest: "".to_string(), length: piece_length,
parent_id: None, digest: "".to_string(),
uploading_count: 0, parent_id: None,
uploaded_count: 0, uploading_count: 0,
updated_at: Utc::now().naive_utc(), uploaded_count: 0,
created_at: Utc::now().naive_utc(), updated_at: Utc::now().naive_utc(),
finished_at: None, created_at: Utc::now().naive_utc(),
}); finished_at: None,
});
}
offset = (number + 1) * piece_length; offset = (number + 1) * piece_length;
number += 1; number += 1;

View File

@ -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 })
} }