From b92c61c95c4c5a36d5d028570664891fc3ffb827 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 4 Mar 2026 11:33:03 -0800 Subject: [PATCH] s3api: check attributes query before versionId in action resolver Move the GetObjectAttributes action check before the versionId check in resolveFromQueryParameters. This fixes GET /bucket/key?attributes&versionId=xyz being incorrectly classified as s3:GetObjectVersion instead of s3:GetObjectAttributes. Co-Authored-By: Claude Opus 4.6 --- weed/s3api/s3_action_resolver.go | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/weed/s3api/s3_action_resolver.go b/weed/s3api/s3_action_resolver.go index d1fe97bd1..1a9edfca8 100644 --- a/weed/s3api/s3_action_resolver.go +++ b/weed/s3api/s3_action_resolver.go @@ -159,6 +159,13 @@ func resolveFromQueryParameters(query url.Values, method string, hasObject bool) } } + // GetObjectAttributes (object-level only) + // Must be checked before versionId, because GET /bucket/key?attributes&versionId=xyz + // is a GetObjectAttributes request, not a GetObjectVersion request + if hasObject && query.Has("attributes") && method == http.MethodGet { + return s3_constants.S3_ACTION_GET_OBJECT_ATTRIBUTES + } + // Versioning operations - distinguish between versionId (specific version) and versions (list versions) // versionId: Used to access/delete a specific version of an object (e.g., GET /bucket/key?versionId=xyz) if query.Has("versionId") { @@ -196,11 +203,6 @@ func resolveFromQueryParameters(query url.Values, method string, hasObject bool) return s3_constants.S3_ACTION_GET_BUCKET_LOCATION } - // GetObjectAttributes (object-level only) - if hasObject && query.Has("attributes") && method == http.MethodGet { - return s3_constants.S3_ACTION_GET_OBJECT_ATTRIBUTES - } - // Object retention and legal hold operations (object-level only) if hasObject { if query.Has("retention") {