labstack/echo

Weirdness with wrapped handler and embed FS (static files)

petersanchez opened this issue · 1 comments

Issue Description

I generally use /static/* for our static file hosting (when we host them via echo) and I usually have embedded FS for these files. This works fine usually but today something weird happened.

I changed the path to, for example, /x/static/* with everything else being the exact same and the static handler raises a 404 for the files. If I remove the /x it works just fine again.

The logs show the path is correct, the only difference is the leading /x .

Checklist

  • Dependencies installed
  • No typos
  • Searched existing issues and docs

Expected behaviour

Static files are served regardless of static url path

Actual behaviour

Doesn't actually serve regardless of path

Steps to reproduce

Create an embed FS containing static files and a http FileServer to handle them. Wrap them in echo and watch them work (or not)

Working code to debug

// embed.go

var (
        //go:embed static
        StaticFS embed.FS
)

// main.go (static files served correctly)

package main

func main() {
    e := echo.New()
    staticHandler := http.FileServer(http.FS(gohome.StaticFS))
    d := fmt.Sprintf("/static/*", config.StaticURL)
    e.GET(d, echo.WrapHandler(staticHandler))
    e.Start("127.0.0.1:8000")
}
2023-12-27T18:07:10-06:00 method=GET, uri=/static/css/chota.min.css?8546540, status=200 remote_ip=127.0.0.1
app="gohome 8546540"
2023-12-27T18:07:10-06:00 method=GET, uri=/static/css/style.css?8546540, status=200 remote_ip=127.0.0.1 app="gohome 8546540"

// ALT main.go (only 404's on static files)

package main

func main() {
    e := echo.New()
    staticHandler := http.FileServer(http.FS(gohome.StaticFS))
    d := fmt.Sprintf("/yz/static/*", config.StaticURL)
    e.GET(d, echo.WrapHandler(staticHandler))
    e.Start("127.0.0.1:8000")
}
2023-12-27T18:07:38-06:00 method=GET, uri=/yz/static/css/chota.min.css?8546540, status=404 remote_ip=127.0.0.1 app="gohome 8546540"
2023-12-27T18:07:38-06:00 method=GET, uri=/yz/static/css/style.css?8546540, status=404 remote_ip=127.0.0.1 app="gohome 8546540"

Version/commit

$ grep echo go.sum
github.com/labstack/echo/v4 v4.11.3 h1:Upyu3olaqSHkCjs1EJJwQ3WId8b8b1hxbogyommKktM=

May be user error on my side but I can't find where that error is.

OK this was my error/misunderstanding. I didn't realize that http.FileServer depends on request PATH to match file system path. The solution was to use http.StripPrefix.