Object prefix list filtering

This commit is contained in:
2026-02-21 21:35:15 +01:00
parent 6fe5a8a629
commit b19c24d9b7
2 changed files with 13 additions and 9 deletions

View File

@@ -160,8 +160,7 @@ func (h *Handler) handleGetBuckets(w http.ResponseWriter, r *http.Request) {
http.Error(w, err.Error(), http.StatusInternalServerError) http.Error(w, err.Error(), http.StatusInternalServerError)
return return
} }
w.Header().Set("Content-Type", "application/x-yaml") w.Header().Set("Content-Type", "application/xml")
w.Header().Set("Content-Length", "0")
w.WriteHeader(http.StatusOK) w.WriteHeader(http.StatusOK)
for _, bucket := range buckets { for _, bucket := range buckets {
w.Write([]byte(bucket)) w.Write([]byte(bucket))
@@ -172,18 +171,19 @@ func (h *Handler) handleGetBucket(w http.ResponseWriter, r *http.Request) {
bucket := chi.URLParam(r, "bucket") bucket := chi.URLParam(r, "bucket")
if r.URL.Query().Get("list-type") == "2" { if r.URL.Query().Get("list-type") == "2" {
h.handleListObjectsV2(w, r, bucket) prefix := r.URL.Query().Get("prefix")
return if prefix == "" {
} prefix = ""
}
if r.URL.Query().Has("location") { h.handleListObjectsV2(w, r, bucket, prefix)
return return
} }
http.Error(w, "NotImplemented", http.StatusNotImplemented)
} }
func (h *Handler) handleListObjectsV2(w http.ResponseWriter, r *http.Request, bucket string) { func (h *Handler) handleListObjectsV2(w http.ResponseWriter, r *http.Request, bucket, prefix string) {
objects, err := h.svc.ListObjects(bucket, "") objects, err := h.svc.ListObjects(bucket, prefix)
if err != nil { if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError) http.Error(w, err.Error(), http.StatusInternalServerError)
return return

View File

@@ -6,6 +6,7 @@ import (
"fmt" "fmt"
"fs/models" "fs/models"
"regexp" "regexp"
"strings"
"time" "time"
"go.etcd.io/bbolt" "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) return fmt.Errorf("bucket %s not found", bucket)
} }
err := _bucket.ForEach(func(k, v []byte) error { err := _bucket.ForEach(func(k, v []byte) error {
if prefix != "" && !strings.HasPrefix(string(k), prefix) {
return nil
}
object := models.ObjectManifest{} object := models.ObjectManifest{}
err := json.Unmarshal(v, &object) err := json.Unmarshal(v, &object)
if err != nil { if err != nil {