{"record":{"id":"ba0dcf8fafa34196","repo":"sigoden/dufs","slug":"invalid-x-update-range-header","errorCode":null,"errorMessage":"Invalid X-Update-Range Header","messagePattern":"Invalid X-Update-Range Header","errorType":"validation","errorClass":"anyhow::Error","httpStatus":400,"severity":"error","filePath":"src/server.rs","lineNumber":1905,"sourceCode":"        match mime {\n            Some(m) => format!(\"{m}{charset}\"),\n            None => format!(\"text/plain{charset}\"),\n        }\n    } else {\n        match mime {\n            Some(m) => m.to_string(),\n            None => \"application/octet-stream\".into(),\n        }\n    };\n    Ok(content_type)\n}\n\nfn parse_upload_offset(headers: &HeaderMap<HeaderValue>, size: u64) -> Result<Option<u64>> {\n    let value = match headers.get(\"x-update-range\") {\n        Some(v) => v,\n        None => return Ok(None),\n    };\n    let err = || anyhow!(\"Invalid X-Update-Range Header\");\n    let value = value.to_str().map_err(|_| err())?;\n    if value == \"append\" {\n        return Ok(Some(size));\n    }\n    // use the first range\n    let ranges = parse_range(value, size).ok_or_else(err)?;\n    let (start, _) = ranges.first().ok_or_else(err)?;\n    Ok(Some(*start))\n}\n\nasync fn sha256_file(path: &Path) -> Result<String> {\n    let mut file = fs::File::open(path).await?;\n    let mut hasher = Sha256::new();\n    let mut buffer = [0u8; 8192];\n\n    loop {\n        let bytes_read = file.read(&mut buffer).await?;\n        if bytes_read == 0 {","sourceCodeStart":1887,"sourceCodeEnd":1923,"githubUrl":"https://github.com/sigoden/dufs/blob/fe7fd564f80dfbac361c8e0589c3845638149d38/src/server.rs#L1887-L1923","documentation":"Sentinel validation error in parse_upload_offset: the `X-Update-Range` header, when present, must either be the literal `append` or a valid HTTP range that parses against the current file size. It fires when the header value is not valid UTF-8, or when parse_range rejects it (malformed range or start beyond the file size), so the upload offset cannot be determined.","triggerScenarios":"Thrown at src/server.rs:1905 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Send `X-Update-Range: append` to resume at the end of the file","Send a valid single range like `X-Update-Range: bytes=123-` (start must be within the current file size)","Omit the header entirely to upload from scratch"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"fe7fd564f80dfbac361c8e0589c3845638149d38","analyzedAt":"2026-09-09T13:01:22.843Z","contentChangedAt":"2026-09-09T13:01:22.843Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}