From d189455c92418640736cd7f7123cc16522787df9 Mon Sep 17 00:00:00 2001 From: Denis Kirillov Date: Mon, 5 May 2025 18:03:12 +0300 Subject: [PATCH] [#XX] Fix s3 index page Signed-off-by: Denis Kirillov --- internal/handler/browse.go | 26 +++++++++++++++++++------- internal/handler/handler.go | 5 +++-- internal/logs/logs.go | 1 + tree/tree.go | 18 ++++++++++++------ 4 files changed, 35 insertions(+), 15 deletions(-) diff --git a/internal/handler/browse.go b/internal/handler/browse.go index d9e6625..1dc23a3 100644 --- a/internal/handler/browse.go +++ b/internal/handler/browse.go @@ -150,8 +150,11 @@ func urlencode(path string) string { var res strings.Builder prefixParts := strings.Split(path, "/") - for _, prefixPart := range prefixParts { - prefixPart = "/" + url.PathEscape(prefixPart) + for i, prefixPart := range prefixParts { + prefixPart = url.PathEscape(prefixPart) + if i != 0 { + prefixPart = "/" + prefixPart + } if prefixPart == "/." || prefixPart == "/.." { prefixPart = url.PathEscape(prefixPart) } @@ -168,11 +171,16 @@ type GetObjectsResponse struct { } func (h *Handler) getDirObjectsS3(ctx context.Context, bucketInfo *data.BucketInfo, prefix string) (*GetObjectsResponse, error) { - if prefix != "" && prefix[len(prefix)-1] == '/' { - prefix = prefix[:len(prefix)-1] + var treePrefix *string + if prefix != "" { + if prefix[len(prefix)-1] == '/' { + treePrefix = ptr(prefix[:len(prefix)-1]) + } else { + treePrefix = &prefix + } } - nodes, err := h.tree.GetSubTreeByPrefix(ctx, bucketInfo, prefix, true) + nodes, err := h.tree.GetSubTreeByPrefix(ctx, bucketInfo, treePrefix, true) if err != nil { return nil, err } @@ -193,14 +201,18 @@ func (h *Handler) getDirObjectsS3(ctx context.Context, bucketInfo *data.BucketIn if obj.IsDeleteMarker { continue } - obj.FilePath = prefix + "/" + obj.FileName - obj.GetURL = "/get/" + bucketInfo.Name + urlencode(obj.FilePath) + obj.FilePath = prefix + obj.FileName + obj.GetURL = "/get/" + bucketInfo.Name + "/" + urlencode(obj.FilePath) result.objects = append(result.objects, obj) } return result, nil } +func ptr(s string) *string { + return &s +} + func (h *Handler) getDirObjectsNative(ctx context.Context, bucketInfo *data.BucketInfo, prefix string) (*GetObjectsResponse, error) { basePath := prefix if basePath != "" && basePath[len(basePath)-1] != '/' { diff --git a/internal/handler/handler.go b/internal/handler/handler.go index 2efd71d..75254de 100644 --- a/internal/handler/handler.go +++ b/internal/handler/handler.go @@ -325,11 +325,12 @@ func (h *Handler) browseIndexMiddleware(fn ListFunc) MiddlewareFunc { ctx, span := tracing.StartSpanFromContext(prm.Context, "handler.browseIndex") defer span.End() - ctx = utils.SetReqLog(ctx, h.reqLogger(ctx).With( + h.reqLogger(ctx).Info(logs.BrowseIndex, zap.String("bucket", prm.BktInfo.Name), zap.String("container", prm.BktInfo.CID.EncodeToString()), zap.String("prefix", prm.Path), - )) + logs.TagField(logs.TagDatapath), + ) objects, err := fn(ctx, prm.BktInfo, prm.Path) if err != nil { diff --git a/internal/logs/logs.go b/internal/logs/logs.go index 86921dd..ee0806e 100644 --- a/internal/logs/logs.go +++ b/internal/logs/logs.go @@ -127,6 +127,7 @@ const ( EmptyAccessControlRequestMethodHeader = "empty Access-Control-Request-Method request header" CORSRuleWasNotMatched = "cors rule was not matched" CouldntCacheCors = "couldn't cache cors" + BrowseIndex = "browse index" ) // Log messages with the "external_storage" tag. diff --git a/tree/tree.go b/tree/tree.go index d99e24b..84529e8 100644 --- a/tree/tree.go +++ b/tree/tree.go @@ -323,17 +323,23 @@ func pathFromName(objectName string) []string { return strings.Split(objectName, separator) } -func (c *Tree) GetSubTreeByPrefix(ctx context.Context, bktInfo *data.BucketInfo, prefix string, latestOnly bool) ([]data.NodeInfo, error) { +func (c *Tree) GetSubTreeByPrefix(ctx context.Context, bktInfo *data.BucketInfo, prefix *string, latestOnly bool) ([]data.NodeInfo, error) { ctx, span := tracing.StartSpanFromContext(ctx, "tree.GetSubTreeByPrefix") defer span.End() - rootID, err := c.getPrefixNodeID(ctx, bktInfo, versionTree, strings.Split(prefix, separator)) - if err != nil { - if errors.Is(err, ErrNodeNotFound) { - return nil, nil + rootID := []uint64{0} + var err error + + if prefix != nil { + rootID, err = c.getPrefixNodeID(ctx, bktInfo, versionTree, strings.Split(*prefix, separator)) + if err != nil { + if errors.Is(err, ErrNodeNotFound) { + return nil, nil + } + return nil, err } - return nil, err } + subTree, err := c.service.GetSubTree(ctx, bktInfo, versionTree, rootID, 2, false) if err != nil { if errors.Is(err, ErrNodeNotFound) {