Bugfix: cache failed
All checks were successful
release-tag / release-image (push) Successful in 1m30s

This commit is contained in:
2025-09-30 00:09:57 +02:00
parent 291cfa33a9
commit 40ded4d4db

View File

@@ -639,36 +639,28 @@ func registerPublicDownloads(mux *http.ServeMux, store filesvc.MeshStore, blobs
base = "/" + base base = "/" + base
} }
mux.HandleFunc(base+"/", func(w http.ResponseWriter, r *http.Request) { mux.HandleFunc(base+"/", func(w http.ResponseWriter, r *http.Request) {
idStr := strings.TrimPrefix(r.URL.Path, base+"/") id := strings.TrimSpace(strings.TrimPrefix(r.URL.Path, base+"/"))
if idStr == "" { if id == "" {
http.NotFound(w, r)
return
}
id := idStr
if strings.TrimSpace(id) == "" {
http.NotFound(w, r) http.NotFound(w, r)
return return
} }
// 1) Metadaten prüfen (nicht vorhanden oder gelöscht → 404) // 1) Metadaten prüfen
it, err := store.Get(r.Context(), filesvc.ID(id)) it, err := store.Get(r.Context(), filesvc.ID(id))
if err != nil || it.Deleted { if err != nil || it.Deleted {
http.NotFound(w, r) http.NotFound(w, r)
return return
} }
// 2) lokal versuchen // 2) Lokal versuchen
if rc, meta, err := blobs.Open(r.Context(), id); err == nil { if rc, meta, err := blobs.Open(context.Background(), id); err == nil {
defer rc.Close() defer rc.Close()
serveBlob(w, r, rc, meta, it.Name) // Download-Name aus Store! serveBlob(w, r, rc, meta, it.Name)
return return
} else { // ########## HIER EVENTUELL PROBLEM!!! ########### }
// Lokal nicht vorhanden → nur aus Mesh ziehen, wenn Owner aktiv ist
it, err := store.Get(r.Context(), filesvc.ID(id)) // (Optional) Owner-Online-Check — wenn du auch bei offline Ownern liefern willst, block auskommentieren
if err != nil || it.Deleted { {
http.NotFound(w, r)
return
}
peers := meshNode.PeerList() peers := meshNode.PeerList()
ttl := 2 * time.Minute ttl := 2 * time.Minute
if !isOwnerActive(it.Owner, peers, ttl) { if !isOwnerActive(it.Owner, peers, ttl) {
@@ -677,26 +669,37 @@ func registerPublicDownloads(mux *http.ServeMux, store filesvc.MeshStore, blobs
} }
} }
// 3) aus Mesh holen (signiert) und cachen // 3) Aus Mesh holen — EIGENER Timeout-Kontext, NICHT r.Context()
rrc, _, _, _, err := meshNode.FetchBlobAny(r.Context(), id) ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute)
defer cancel()
rrc, remoteName, _, _, err := meshNode.FetchBlobAny(ctx, id)
if err != nil { if err != nil {
http.NotFound(w, r) http.NotFound(w, r)
return return
} }
defer rrc.Close() defer rrc.Close()
if _, err := blobs.Save(r.Context(), id, it.Name, rrc); err != nil {
http.Error(w, "cache failed", http.StatusInternalServerError) // Dateiname bevorzugt vom Remote, sonst Metadaten-Name
filename := strings.TrimSpace(remoteName)
if filename == "" {
filename = it.Name
}
// 4) Lokal cachen — KEIN Request-Kontext, damit Save nicht abbricht
if _, err := blobs.Save(context.Background(), id, filename, rrc); err != nil {
log.Printf("[public] cache save failed id=%s name=%q: %v", id, filename, err)
http.Error(w, "cache failed: "+err.Error(), http.StatusInternalServerError)
return return
} }
// 4) erneut lokal öffnen und streamen // 5) Erneut lokal öffnen und streamen
lrc, meta, err := blobs.Open(r.Context(), id) lrc, meta, err := blobs.Open(context.Background(), id)
if err != nil { if err != nil {
http.Error(w, "open failed", http.StatusInternalServerError) http.Error(w, "open failed: "+err.Error(), http.StatusInternalServerError)
return return
} }
defer lrc.Close() defer lrc.Close()
serveBlob(w, r, lrc, meta, it.Name) serveBlob(w, r, lrc, meta, filename)
}) })
} }