This commit is contained in:
@@ -336,16 +336,42 @@ func apiFiles(mux *http.ServeMux, store filesvc.MeshStore, blobs blobfs.Store, m
|
||||
http.NotFound(w, r)
|
||||
return
|
||||
}
|
||||
rc, meta, err := blobs.Open(r.Context(), id)
|
||||
|
||||
// 1) lokal
|
||||
if rc, meta, err := blobs.Open(r.Context(), id); err == nil {
|
||||
defer rc.Close()
|
||||
w.Header().Set("Content-Type", meta.ContentType)
|
||||
w.Header().Set("Content-Length", strconv.FormatInt(meta.Size, 10))
|
||||
w.Header().Set("Content-Disposition", fmt.Sprintf(`attachment; filename="%s"`, meta.Name))
|
||||
_, _ = io.Copy(w, rc)
|
||||
return
|
||||
}
|
||||
|
||||
// 2) remote holen
|
||||
rrc, name, _, _, err := meshNode.FetchBlobAny(r.Context(), id)
|
||||
if err != nil {
|
||||
http.NotFound(w, r)
|
||||
return
|
||||
}
|
||||
defer rc.Close()
|
||||
defer rrc.Close()
|
||||
|
||||
// 3) lokal cachen
|
||||
if _, err := blobs.Save(r.Context(), id, name, rrc); err != nil {
|
||||
http.Error(w, "cache failed: "+err.Error(), http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
// 4) erneut lokal öffnen und streamen
|
||||
lrc, meta, err := blobs.Open(r.Context(), id)
|
||||
if err != nil {
|
||||
http.Error(w, "open failed", http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
defer lrc.Close()
|
||||
w.Header().Set("Content-Type", meta.ContentType)
|
||||
w.Header().Set("Content-Length", strconv.FormatInt(meta.Size, 10))
|
||||
w.Header().Set("Content-Disposition", fmt.Sprintf(`attachment; filename="%s"`, meta.Name))
|
||||
_, _ = io.Copy(w, rc)
|
||||
_, _ = io.Copy(w, lrc)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -387,7 +413,9 @@ func main() {
|
||||
|
||||
// Mesh starten
|
||||
mcfg := mesh.FromEnv()
|
||||
mnode, err := mesh.New(mcfg, mesh.Callbacks{
|
||||
blobs := blobfs.New(getenvDefault("DATA_DIR", "./data"))
|
||||
|
||||
mnode, err := mesh.New(cfg.Mesh, mesh.Callbacks{
|
||||
GetSnapshot: func(ctx context.Context) (mesh.Snapshot, error) {
|
||||
s, err := st.Snapshot(ctx)
|
||||
if err != nil {
|
||||
@@ -398,6 +426,13 @@ func main() {
|
||||
ApplyRemote: func(ctx context.Context, s mesh.Snapshot) error {
|
||||
return st.ApplyRemote(ctx, fromMeshSnapshot(s))
|
||||
},
|
||||
BlobOpen: func(ctx context.Context, id int64) (io.ReadCloser, string, string, int64, error) {
|
||||
rc, meta, err := blobs.Open(ctx, id)
|
||||
if err != nil {
|
||||
return nil, "", "", 0, err
|
||||
}
|
||||
return rc, meta.Name, meta.ContentType, meta.Size, nil
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
log.Fatalf("mesh init: %v", err)
|
||||
@@ -414,7 +449,7 @@ func main() {
|
||||
root := http.NewServeMux()
|
||||
|
||||
// API (Bearer-Auth)
|
||||
blobs := blobfs.New(getenvDefault("DATA_DIR", "./data"))
|
||||
//blobs := blobfs.New(getenvDefault("DATA_DIR", "./data"))
|
||||
apiMux := http.NewServeMux()
|
||||
fileRoutes(apiMux, st)
|
||||
apiFiles(apiMux, st, blobs, mnode)
|
||||
|
||||
Reference in New Issue
Block a user