atmos/os_lib/web_engine/cache_path.rs
1//! キャッシュのファイル名を組み立てる(純粋モジュール)。
2//!
3//! ファイルシステムにもネットワークにも触れないので、
4//! QEMU 抜きで検証できる。
5//!
6//! # 気をつける点
7//!
8//! - `FileMetadata::filename` は **128 バイト**まで(`kernel/fs/mod.rs`)。
9//! 超えると切り詰められ、**別の URL が同じ名前になって中身が入れ替わる**。
10//! - ホスト名の `:`(`example.com:8080`)は SylFS のパスに使えない。
11//! - 同じホストでもパスが違えば必ず違う名前になること。
12
13extern crate alloc;
14use alloc::string::String;
15
16/// 名前の最大長。`FileMetadata::filename`(128 バイト)に収まる必要がある。
17pub const MAX_CACHE_PATH_LEN: usize = 128;
18
19/// `host` と `path` からキャッシュ上の絶対パスを作る。
20///
21/// パスは FNV-1a で 16 桁の 16 進へ畳む。
22/// ホスト名はそのまま入れる(人が読んで分かるように)が、
23/// `:` だけは使えないので `-` へ置き換える。
24pub fn cache_path_for(host: &str, path: &str) -> String {
25 let mut h: u64 = 0xcbf2_9ce4_8422_2325;
26 for b in path.bytes() {
27 h ^= b as u64;
28 h = h.wrapping_mul(0x0000_0100_0000_01b3);
29 }
30 let safe_host: String = host
31 .chars()
32 .map(|c| if c == ':' { '-' } else { c })
33 .collect();
34 alloc::format!("/cache/browser/{}/{:016x}", safe_host, h)
35}