Bugfix: cache failed
All checks were successful
release-tag / release-image (push) Successful in 1m30s
All checks were successful
release-tag / release-image (push) Successful in 1m30s
This commit is contained in:
@@ -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)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user