diff options
| author | William Hergès <william@herges.fr> | 2025-10-05 15:04:12 +0200 |
|---|---|---|
| committer | William Hergès <william@herges.fr> | 2025-10-05 15:04:12 +0200 |
| commit | 5d6198f168dd1a8598048718d149d1171df09c1a (patch) | |
| tree | 5ed6891cf0599cfd6826c57948125a9927c30a73 /backend | |
| parent | f7a41e17693dd5301413f46efecdfe4f5b94cb6f (diff) | |
perf(security): cache assets checksum
Diffstat (limited to 'backend')
| -rw-r--r-- | backend/data.go | 21 | ||||
| -rw-r--r-- | backend/router.go | 6 |
2 files changed, 18 insertions, 9 deletions
diff --git a/backend/data.go b/backend/data.go index a1b2dba..d98c8b0 100644 --- a/backend/data.go +++ b/backend/data.go @@ -134,34 +134,41 @@ type assetData struct { Checksum string } +var assets = map[string]*assetData{} + func getAsset(ctx context.Context, path string) *assetData { - var asset assetData + asset, ok := assets[path] + if ok && !ctx.Value(debugKey).(bool) { + return asset + } + asset = &assetData{} var b []byte - var err error if regexIsHttp.MatchString(path) { asset.Src = path resp, err := http.Get(path) if err != nil { slog.Warn("get remote asset", "error", err) - return &asset + return asset } defer resp.Body.Close() b, err = io.ReadAll(resp.Body) if err != nil { slog.Warn("read remote asset", "error", err) - return &asset + return asset } } else { asset.Src = fmt.Sprintf("/assets/%s", path) - aFS := ctx.Value(assetsFS).(fs.FS) + aFS := ctx.Value(assetsFSKey).(fs.FS) + var err error b, err = fs.ReadFile(aFS, path) if err != nil { slog.Warn("read asset", "error", err) - return &asset + return asset } } sum := sha256.Sum256(b) checksum := base64.StdEncoding.EncodeToString(sum[:]) asset.Checksum = fmt.Sprintf("sha256-%s", checksum) - return &asset + assets[path] = asset + return asset } diff --git a/backend/router.go b/backend/router.go index 1231fdf..fb43845 100644 --- a/backend/router.go +++ b/backend/router.go @@ -20,7 +20,8 @@ const ( Version = "0.2.0" configKey = "config" isUpdateKey = "is_update" - assetsFS = "assets_fs" + assetsFSKey = "assets_fs" + debugKey = "debug" ) //go:embed templates @@ -78,7 +79,8 @@ func NewRouter(debug bool, cfg *Config, assets fs.FS) *chi.Mux { r.Use(func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { ctx := context.WithValue(r.Context(), configKey, cfg) - ctx = context.WithValue(ctx, assetsFS, assets) + ctx = context.WithValue(ctx, assetsFSKey, assets) + ctx = context.WithValue(ctx, debugKey, debug) next.ServeHTTP(w, r.WithContext(ctx)) }) }) |
