Files
fn_registry/functions/infra/file_serve.go
T

29 lines
923 B
Go

package infra
import (
"fmt"
"net/http"
"strings"
)
// FileServe retorna un http.Handler que sirve archivos estaticos desde dir.
// Stripea pathPrefix del request URL antes de buscar el archivo, y setea el
// header Cache-Control con max-age=maxAge segundos.
//
// El handler rechaza cualquier path que contenga ".." para mitigar path traversal,
// aunque http.FileServer ya hace su propia normalizacion.
func FileServe(dir string, pathPrefix string, maxAge int) http.Handler {
fs := http.FileServer(http.Dir(dir))
cacheControl := fmt.Sprintf("public, max-age=%d", maxAge)
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// Rechazar path traversal explicito
if strings.Contains(r.URL.Path, "..") {
http.Error(w, "path traversal not allowed", http.StatusBadRequest)
return
}
w.Header().Set("Cache-Control", cacheControl)
http.StripPrefix(pathPrefix, fs).ServeHTTP(w, r)
})
}