aboutsummaryrefslogtreecommitdiff
path: root/backend/data.go
diff options
context:
space:
mode:
authorWilliam Hergès <william@herges.fr>2025-10-05 15:04:12 +0200
committerWilliam Hergès <william@herges.fr>2025-10-05 15:04:12 +0200
commit5d6198f168dd1a8598048718d149d1171df09c1a (patch)
tree5ed6891cf0599cfd6826c57948125a9927c30a73 /backend/data.go
parentf7a41e17693dd5301413f46efecdfe4f5b94cb6f (diff)
perf(security): cache assets checksum
Diffstat (limited to 'backend/data.go')
-rw-r--r--backend/data.go21
1 files changed, 14 insertions, 7 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
}