tide icon indicating copy to clipboard operation
tide copied to clipboard

serve_dir doesn't seem to work and even panics in some cases

Open darklajid opened this issue 1 year ago • 2 comments

A tiny sample project. I have

/src/main.rs
/static/index.html
/static/favicon.jpg

where main.rs is roughly this:

#[async_std::main]
async fn main() -> Result<(), std::io::Error> {
    tracing_subscriber::fmt()
        .with_max_level(tracing::Level::TRACE)
        .init();

    let mut app = tide::new();
    app.with(tide_tracing::TraceMiddleware::new());
    app.at("/*")
        .serve_dir("/home/me/foo/static/")?;
    app.at("/api").nest({
        let mut api = tide::new();
        api.at("/hello").get(|_| async { Ok("Hello, world") });
        api.at("/goodbye").get(|_| async { Ok("Goodbye, world") });
        api
    });
    app.listen("127.0.0.1:8080").await?;
    Ok(())
}

I tried serve_dir both with the absolute path (above) or (preferably) with a relative one. In both cases it doesn't work as expected (I expect / to serve /static/index.html and /favicon.jpg to resolve the same way).

I would instead get something like this:

2023-05-01T04:52:48.658475Z  INFO tide::log::middleware: <-- Request received    
2023-05-01T04:52:48.658572Z  INFO Request{http.method=GET http.target=/}: tide_tracing: received
2023-05-01T04:52:48.658649Z  WARN Request{http.method=GET http.target=/}:Response{http.status_code=404 http.duration=41.377µs}:Client error: tide_tracing: sent
2023-05-01T04:52:48.658699Z  WARN tide::log::middleware: Client error --> Response sent  

Whatever I try, tide just returns a 404 - which doesn't make sense to me at all. Worse though: While experimenting and trying to figure out what's going on, I stumbled upon this: Requesting /static/index.html causes a panic and a 500 handling the request, which is arguably worse than the confusing 404:

2023-05-01T04:53:02.376075Z  INFO tide::log::middleware: <-- Request received    
2023-05-01T04:53:02.376098Z  INFO Request{http.method=GET http.target=/static/index.html}: tide_tracing: received
thread 'async-std/runtime' panicked at 'called `Option::unwrap()` on a `None` value', /home/bam/.cargo/registry/src/github.com-1ecc6299db9ec823/tide-0.16.0/src/fs/serve_dir.rs:28:52

darklajid avatar May 01 '23 06:05 darklajid

I'm having the same issue. At first I was getting 404 errors, but after changing the serve directory from ./static/ to ./src/static/, now I'm getting the same panics as @darklajid.

After pulling down my own copy of tide and looking through the code, I think it may have to do with the usage of strip_prefix within the ServeDir's call function. It's an "unstable" feature atm and so I think it's returning None during "stable" usage.

A quick work-around for those that are having this issue:

  • Fork the repo
  • Replace your dependency to be tide = { git = "https://github.com/[your repo name]/tide" }

AustinHellerRepo avatar Jun 21 '23 06:06 AustinHellerRepo

strip_prefix for me seems to be trying to strip the wildcard (*) from the path as well. It was possible for me to circumvent this issue by doing app.at("/").serve_dir("my_dir") instead of app.at("/*").serve_dir("my_dir"). I think the examples in the default branch are not correct for tide 0.16.0?

Aierie avatar Aug 15 '23 15:08 Aierie