статические файлы не обслуживаются правильно при использовании подстановочных знаков
Используя GOA, я определил службу для обслуживания статических файлов с использованием подстановочного знака (как описано в документации):
var _ = Service("static", func() {
Files("/static/*filepath", "./static/")
})
Но когда я запускаю службу, конечная точка всегда извлекает весь контент, который она находит в каталоге ./static/, похоже, она вообще не принимает во внимание раздел подстановочных знаков.
Например, если у меня есть ./static/uploads/file1.jpg, и я запрашиваю localhost/static/uploads/file1.jpg или localhost / static / something, тогда служба получает следующее:
<pre>
<a href="uploads/">uploads/</a>
</pre>
Углубляясь в код, я считаю, что проблема в сгенерированном файле /gen/http/static/server/server.go:
// 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)
}
Насколько я понимаю, сгенерированный код обслуживает то, что мы передали в качестве базового пути, несмотря ни на что, он не принимает во внимание, настроили ли мы подстановочный знак вообще (он использует его только для соответствия запросу, но не для настройки файла что мы будем обслуживать).
Я считаю, что это работало нормально в версии 2, я обнаружил эту проблему в процессе перехода на версию 3.
Как я уже сказал, это похоже на ошибку в GOA, но, возможно, я что-то здесь упускаю. Я создал проблему в репо, чтобы получить дополнительную информацию (№ 2321)
1 ответ
Согласно ответу в проблеме Github (#2321), похоже, что в документации была ошибка, и мы должны использовать фигурные скобки в шаблоне:
Спасибо за отчет, в документации есть опечатка, вместо этого путь в дизайне должен быть /static/{*filepath} (с фигурными скобками, окружающими подстановочный знак).