use reqwest::header::HeaderMap;
use crate::{InnerErrorCode, MeowError, TransferTask};
pub trait BreakpointDownload: Send + Sync {
fn head_url(&self, task: &TransferTask) -> String {
task.url().to_string()
}
fn merge_head_headers(&self, _task: &TransferTask, _base: &mut HeaderMap) {}
fn merge_range_get_headers(
&self,
task: &TransferTask,
range_value: &str,
base: &mut HeaderMap,
) {
let _ = self;
crate::http_breakpoint::insert_header(base, "Range", range_value);
let accept = task
.breakpoint_download_http()
.map(|c| c.range_accept.as_str())
.unwrap_or(crate::http_breakpoint::DEFAULT_RANGE_ACCEPT);
crate::http_breakpoint::insert_header(base, "Accept", accept);
}
fn total_size_from_head(&self, headers: &HeaderMap) -> Result<u64, MeowError> {
headers
.get(reqwest::header::CONTENT_LENGTH)
.and_then(|v| v.to_str().ok())
.and_then(|s| s.parse::<u64>().ok())
.filter(|&n| n > 0)
.ok_or_else(|| {
MeowError::from_code_str(
InnerErrorCode::MissingOrInvalidContentLengthFromHead,
"missing or invalid content-length from HEAD",
)
})
}
}