static files not served correctly when using wildcard

287 views Asked by At

Using GOA, I defined a service to serve static files using a wildcard (as described in the documentation):

var _ = Service("static", func() { 
    Files("/static/*filepath", "./static/")
})

But when I run the service, the endpoint always retrieves all the content it finds in the ./static/ directory, it seems it doesn't take into account the wildcard section at all.

For example, if I have ./static/uploads/file1.jpg and I request localhost/static/uploads/file1.jpg or localhost/static/anything , then the service retrieves the following:

<pre>
<a href="uploads/">uploads/</a>
</pre>

Digging into the code, I believe the problem is in the generated /gen/http/static/server/server.go file:

// Mount configures the mux to serve the static endpoints.
func Mount(mux goahttp.Muxer, h *Server) {
    MountCORSHandler(mux, h.CORS)
    MountStatic(mux, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        http.ServeFile(w, r, "./static/")
    }))
}

// MountStatic configures the mux to serve GET request made to
// "/static/*filepath".
func MountStatic(mux goahttp.Muxer, h http.Handler) {
    mux.Handle("GET", "/static/*filepath", handleStaticOrigin(h).ServeHTTP)
}

For what I see, the generated code is serving what we passed as base path no matter what, it doesn't take into account if we configured a wildcard at all (it only uses it to match the request, but not to customize the file that we'll serve).

I believe this was working ok in v2, I found this issue in the process of migrating to v3.

As I said, this seems like a bug in GOA, but maybe I'm missing something here. I created an issue in the repo to obtain more information (#2321)

1

There are 1 answers

0
Gerardo Roza On BEST ANSWER

As per the answer in the Github issue (#2321), it seems there was an error in the docs, and we should use curly braces in the pattern:

Thank you for the report, there is a typo in the docs, the path in the design needs to be /static/{*filepath} instead (with curly braces surrounding the wildcard).