aboutsummaryrefslogtreecommitdiff
path: root/backend
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
parentf7a41e17693dd5301413f46efecdfe4f5b94cb6f (diff)
perf(security): cache assets checksum
Diffstat (limited to 'backend')
-rw-r--r--backend/data.go21
-rw-r--r--backend/router.go6
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))
})
})