mini-static 0.20.0

A secure, async static file server with streaming, traversal protection, and connection limits.
Documentation
use super::*;

// `select_precompressed_sidecar` only ever appends a static extension literal
// (".br"/".gz") to the `path` it's given — it never re-joins against `root` or
// re-parses a request-path string, so it structurally cannot become a second
// traversal surface the way re-running `resolve()` on modified input could. This
// test locks that in by construction: the sidecar it finds must live in exactly
// the same directory as the resolved file, for every encoding preference branch.
#[tokio::test]
async fn sidecar_never_leaves_the_resolved_files_directory() {
    let root = tempfile::TempDir::new().unwrap();
    let sub = root.path().join("assets");
    fs::create_dir(&sub).unwrap();
    let resolved = sub.join("app.js");
    fs::write(&resolved, b"plain").unwrap();
    fs::write(sub.join("app.js.br"), b"brotli-bytes").unwrap();
    fs::write(sub.join("app.js.gz"), b"gzip-bytes").unwrap();

    let (_, _, encoding) = select_precompressed_sidecar(&resolved, Some("br, gzip"))
        .await
        .expect("both sidecars present, br should be preferred");
    assert_eq!(
        encoding, "br",
        "br must be preferred over gzip when both are accepted"
    );

    let (_, _, encoding) = select_precompressed_sidecar(&resolved, Some("gzip"))
        .await
        .expect("gzip sidecar present");
    assert_eq!(encoding, "gzip");

    assert!(
        select_precompressed_sidecar(&resolved, None)
            .await
            .is_none(),
        "no Accept-Encoding header should never select a sidecar"
    );
}

#[test]
fn accepts_encoding_matches_only_listed_directives() {
    assert!(!accepts_encoding(None, "br"));
    assert!(!accepts_encoding(Some("identity"), "br"));
    assert!(!accepts_encoding(Some("identity"), "gzip"));
    assert!(accepts_encoding(Some("gzip, br"), "br"));
    assert!(accepts_encoding(Some("gzip"), "gzip"));
    assert!(!accepts_encoding(Some("gzip"), "br"));
}