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

  1. Send `X-Update-Range: append` to resume at the end of the file
  2. Send a valid single range like `X-Update-Range: bytes=123-` (start must be within the current file size)
  3. 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)