sigoden/dufs · error · anyhow::Error
Invalid X-Update-Range Header
Error message
Invalid X-Update-Range Header
What it means
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.
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
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at src/server.rs:1905 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of sigoden/dufs@fe7fd564f8 (2026-09-09).
Data as JSON: /api/errors/ba0dcf8fafa34196.
Report an issue: GitHub.
Appendix: source
Thrown at src/server.rs:1905
match mime {
Some(m) => format!("{m}{charset}"),
None => format!("text/plain{charset}"),
}
} else {
match mime {
Some(m) => m.to_string(),
None => "application/octet-stream".into(),
}
};
Ok(content_type)
}
fn parse_upload_offset(headers: &HeaderMap<HeaderValue>, size: u64) -> Result<Option<u64>> {
let value = match headers.get("x-update-range") {
Some(v) => v,
None => return Ok(None),
};
let err = || anyhow!("Invalid X-Update-Range Header");
let value = value.to_str().map_err(|_| err())?;
if value == "append" {
return Ok(Some(size));
}
// use the first range
let ranges = parse_range(value, size).ok_or_else(err)?;
let (start, _) = ranges.first().ok_or_else(err)?;
Ok(Some(*start))
}
async fn sha256_file(path: &Path) -> Result<String> {
let mut file = fs::File::open(path).await?;
let mut hasher = Sha256::new();
let mut buffer = [0u8; 8192];
loop {
let bytes_read = file.read(&mut buffer).await?;
if bytes_read == 0 {View on GitHub (pinned to fe7fd564f8)