From b19c24d9b7aa34109b395817f8369deb54c70846 Mon Sep 17 00:00:00 2001 From: Andrej Mickov Date: Sat, 21 Feb 2026 21:35:15 +0100 Subject: [PATCH] Object prefix list filtering --- api/api.go | 18 +++++++++--------- metadata/metadata.go | 4 ++++ 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/api/api.go b/api/api.go index 47b63a3..de4c548 100644 --- a/api/api.go +++ b/api/api.go @@ -160,8 +160,7 @@ func (h *Handler) handleGetBuckets(w http.ResponseWriter, r *http.Request) { http.Error(w, err.Error(), http.StatusInternalServerError) return } - w.Header().Set("Content-Type", "application/x-yaml") - w.Header().Set("Content-Length", "0") + w.Header().Set("Content-Type", "application/xml") w.WriteHeader(http.StatusOK) for _, bucket := range buckets { w.Write([]byte(bucket)) @@ -172,18 +171,19 @@ func (h *Handler) handleGetBucket(w http.ResponseWriter, r *http.Request) { bucket := chi.URLParam(r, "bucket") if r.URL.Query().Get("list-type") == "2" { - h.handleListObjectsV2(w, r, bucket) - return - } - - if r.URL.Query().Has("location") { + prefix := r.URL.Query().Get("prefix") + if prefix == "" { + prefix = "" + } + h.handleListObjectsV2(w, r, bucket, prefix) return } + http.Error(w, "NotImplemented", http.StatusNotImplemented) } -func (h *Handler) handleListObjectsV2(w http.ResponseWriter, r *http.Request, bucket string) { - objects, err := h.svc.ListObjects(bucket, "") +func (h *Handler) handleListObjectsV2(w http.ResponseWriter, r *http.Request, bucket, prefix string) { + objects, err := h.svc.ListObjects(bucket, prefix) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return diff --git a/metadata/metadata.go b/metadata/metadata.go index a4c9163..7857962 100644 --- a/metadata/metadata.go +++ b/metadata/metadata.go @@ -6,6 +6,7 @@ import ( "fmt" "fs/models" "regexp" + "strings" "time" "go.etcd.io/bbolt" @@ -209,6 +210,9 @@ func (h *MetadataHandler) ListObjects(bucket, prefix string) ([]*models.ObjectMa return fmt.Errorf("bucket %s not found", bucket) } err := _bucket.ForEach(func(k, v []byte) error { + if prefix != "" && !strings.HasPrefix(string(k), prefix) { + return nil + } object := models.ObjectManifest{} err := json.Unmarshal(v, &object) if err != nil {