server/index-rows/src/wheel.rs
//! A wheel's core metadata (PEP 658/714), read out of the zip (moved here from server-lib's
//! `IntakeChain::core_metadata`, lane HOL-PERF-2): the scan worker reads it at intake and
//! answers it as an [`crate::IndexRow::Wheel`]; the simple index serves it from the row.
/// **The `<name>-<version>.dist-info/METADATA` member of the wheel `file_name`**, with its
/// sha256: `Ok(None)` when the wheel has no such member. The read is one bounded member
/// (holger-zip-entry: size-capped at [`crate::MAX_WHEEL_METADATA`], CRC-checked,
/// traversal-closed).
pub fn core_metadata(file_name: &str, wheel: &[u8]) -> Result<Option<(Vec<u8>, String)>, String> {
crate::counted();
let base = file_name.rsplit('/').next().unwrap_or(file_name);
let Some(stem) = base.strip_suffix(".whl") else {
return Ok(None);
};
// `<name>-<version>(-<build>)?-<py>-<abi>-<plat>`: the dist-info is `<name>-<version>`.
let mut parts = stem.split('-');
let (Some(name), Some(version)) = (parts.next(), parts.next()) else {
return Ok(None);
};
let dist_info = format!("{name}-{version}.dist-info/METADATA");
match zip_entry::find_member_capped(wheel, crate::MAX_WHEEL_METADATA, |m| m == dist_info) {
Ok(Some((_, meta))) => {
use sha2::Digest as _;
let sha: String = sha2::Sha256::digest(&meta)
.iter()
.map(|b| format!("{b:02x}"))
.collect();
Ok(Some((meta, sha)))
}
Ok(None) => Ok(None),
Err(e) => Err(format!("{e:#}")),
}
}