1use color_eyre::eyre::{eyre, Result};
2use reqwest::header::{HeaderMap, HeaderName, HeaderValue};
3use sha2::{Digest, Sha256};
4use std::{
5 fs::File,
6 io::{self, BufReader, Read},
7 str::FromStr,
8};
9
10pub fn sha256_file(file_path: &str) -> io::Result<String> {
11 let file = File::open(file_path)?;
12 let mut reader = BufReader::new(file);
13 let mut hasher = Sha256::new();
14 let mut buffer = [0u8; 8192];
15 loop {
16 let bytes_read = reader.read(&mut buffer)?;
17 if bytes_read == 0 {
18 break;
19 }
20 hasher.update(&buffer[..bytes_read]);
21 }
22 Ok(format!("{:x}", hasher.finalize()))
23}
24
25pub fn build_headers(headers: &[String]) -> Result<HeaderMap> {
26 let mut header_map = HeaderMap::with_capacity(headers.len());
27 for header in headers {
28 let parts: Vec<&str> = header.splitn(2, ':').map(|t| t.trim()).collect();
29 if parts.len() != 2 {
30 return Err(eyre!("Header格式应为 'Key: Value'"));
31 }
32 let key = parts[0];
33 let value = parts[1];
34 header_map.insert(HeaderName::from_str(key)?, HeaderValue::from_str(value)?);
35 }
36 Ok(header_map)
37}