affaan-m/ECC · error · anyhow::Error

Missing HTTP path

Error message

Missing HTTP path

What it means

This error is thrown while parsing a raw HTTP request from its textual representation. The parser splits the request into parts and expects at least a method and a path on the request line; when the iterator is exhausted before the path token, it reports 'Missing HTTP path'. It guards against malformed or truncated request input.

Solutions

  1. Verify the raw request includes a full request line: METHOD /path HTTP/1.1 followed by headers and CRLF.
  2. Check that the input buffer was not truncated before parsing (read the full request before splitting).
  3. Reject empty input early with a clearer client-facing message instead of letting the parser fail.
  4. Validate the request-line token count before calling next() twice.

Example fix

// before
let raw = "GET";
parse_request(raw)?; // panics into Missing HTTP path
// after
let raw = "GET /health HTTP/1.1\r\nHost: localhost\r\n\r\n";
if raw.split_whitespace().count() < 2 {
    anyhow::bail!("request line must include method and path");
}
parse_request(raw)?;
Defensive patterns

Strategy: validation

Validate before calling

fn has_request_line(raw: &str) -> bool {
    let mut parts = raw.split_whitespace();
    parts.next().map(|_| parts.next().is_some()).unwrap_or(false)
}
// call: if !has_request_line(raw) { bail!("malformed request line") }

Prevention

When it happens

Trigger: Parsing an HTTP request string whose request line contains only a method (e.g. 'GET' with no path or trailing CRLF), or passing an empty/truncated request to the parser.

Common situations: Feeding hand-crafted curl-like strings to an internal HTTP parser, truncated logs replayed as requests, or clients sending a bare method without a path (common in raw socket tests).

Understand the failure class

Background: "Invalid ... format", "must be in format X", "does not look like a ..." — invalid argument format errors across CLI tools and libraries — this error's family across 17 libraries.

Related errors


AI-assisted analysis of affaan-m/ECC@8321021c54 (2026-09-16). Data as JSON: /api/errors/2a7137b15c01f1d1. Report an issue: GitHub.

Appendix: source

Thrown at ecc2/src/main.rs:4223

            anyhow::bail!("HTTP request headers too large");
        }
    };

    let header_text = String::from_utf8(buffer[..header_end].to_vec())
        .context("HTTP request headers were not valid UTF-8")?;
    let mut lines = header_text.split("\r\n");
    let request_line = lines
        .next()
        .filter(|line| !line.trim().is_empty())
        .ok_or_else(|| anyhow::anyhow!("Missing HTTP request line"))?;
    let mut request_parts = request_line.split_whitespace();
    let method = request_parts
        .next()
        .ok_or_else(|| anyhow::anyhow!("Missing HTTP method"))?
        .to_string();
    let path = request_parts
        .next()
        .ok_or_else(|| anyhow::anyhow!("Missing HTTP path"))?
        .to_string();

    let mut headers = BTreeMap::new();
    for line in lines {
        if line.is_empty() {
            break;
        }
        if let Some((key, value)) = line.split_once(':') {
            headers.insert(key.trim().to_ascii_lowercase(), value.trim().to_string());
        }
    }

    let content_length = headers
        .get("content-length")
        .and_then(|value| value.parse::<usize>().ok())
        .unwrap_or(0);
    let mut body = buffer[header_end..].to_vec();
    while body.len() < content_length {

View on GitHub (pinned to 8321021c54)