{"record":{"id":"98919524a3b9c0eb","repo":"BigPizzaV3/CodexPlusPlus","slug":"error-989195","errorCode":null,"errorMessage":"下载内容为空","messagePattern":"下载内容为空","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/codex-plus-core/src/dream_skin_market.rs","lineNumber":279,"sourceCode":"        .error_for_status()\n        .with_context(|| format!(\"服务器返回错误状态：{url}\"))?;\n    if response\n        .content_length()\n        .is_some_and(|size| size > limit as u64)\n    {\n        bail!(\"下载内容超过 {} 字节限制\", limit);\n    }\n    let mut stream = response.bytes_stream();\n    let mut bytes = Vec::new();\n    while let Some(chunk) = stream.next().await {\n        let chunk = chunk.context(\"读取下载内容失败\")?;\n        if bytes.len().saturating_add(chunk.len()) > limit {\n            bail!(\"下载内容超过 {} 字节限制\", limit);\n        }\n        bytes.extend_from_slice(&chunk);\n    }\n    if bytes.is_empty() {\n        bail!(\"下载内容为空\");\n    }\n    Ok(bytes)\n}\n\nfn cache_manifest(state_dir: &Path, manifest: &DreamSkinMarketManifest) -> anyhow::Result<()> {\n    let bytes = serde_json::to_vec_pretty(manifest)?;\n    crate::settings::atomic_write(&state_dir.join(MARKET_CACHE_FILE), &bytes)\n}\n\nfn read_cached_manifest(state_dir: &Path) -> anyhow::Result<DreamSkinMarketManifest> {\n    let path = state_dir.join(MARKET_CACHE_FILE);\n    let metadata = std::fs::metadata(&path)\n        .with_context(|| format!(\"主题市场缓存不存在：{}\", path.display()))?;\n    if metadata.len() > MARKET_INDEX_LIMIT as u64 {\n        bail!(\"主题市场缓存超过大小限制\");\n    }\n    let mut manifest: DreamSkinMarketManifest =\n        serde_json::from_slice(&std::fs::read(&path)?).context(\"主题市场缓存不是有效 JSON\")?;","sourceCodeStart":261,"sourceCodeEnd":297,"githubUrl":"https://github.com/BigPizzaV3/CodexPlusPlus/blob/f2074595a281bc057525c748175c8eb9805b0673/crates/codex-plus-core/src/dream_skin_market.rs#L261-L297","documentation":"Validation guard at the end of download_limited: the download completed with zero bytes. An empty body means the server returned no data for the requested asset (deleted, empty, or truncated response), so the caller cannot proceed.","triggerScenarios":"Thrown at crates/codex-plus-core/src/dream_skin_market.rs:279 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Retry the download later","Verify the asset exists on the market server","Check for server-side issues or a bad asset path"],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"f2074595a281bc057525c748175c8eb9805b0673","analyzedAt":"2026-08-23T12:52:24.489Z","contentChangedAt":"2026-08-23T12:52:24.489Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}