From ccbab3232b5246298815d9ad247632163c68319c Mon Sep 17 00:00:00 2001 From: yxrxy <1532529704@qq.com> Date: Thu, 11 Dec 2025 09:38:52 +0800 Subject: [PATCH] fix: ListObjectsV2 correctly handles repeated folder names in prefixes (#1104) Co-authored-by: loverustfs --- crates/ecstore/src/store_api.rs | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/crates/ecstore/src/store_api.rs b/crates/ecstore/src/store_api.rs index 90c8fd961..7c3ce8573 100644 --- a/crates/ecstore/src/store_api.rs +++ b/crates/ecstore/src/store_api.rs @@ -827,7 +827,12 @@ impl ObjectInfo { for entry in entries.entries() { if entry.is_object() { if let Some(delimiter) = &delimiter { - if let Some(idx) = entry.name.trim_start_matches(prefix).find(delimiter) { + let remaining = if entry.name.starts_with(prefix) { + &entry.name[prefix.len()..] + } else { + entry.name.as_str() + }; + if let Some(idx) = remaining.find(delimiter.as_str()) { let idx = prefix.len() + idx + delimiter.len(); if let Some(curr_prefix) = entry.name.get(0..idx) { if curr_prefix == prev_prefix { @@ -878,7 +883,14 @@ impl ObjectInfo { if entry.is_dir() { if let Some(delimiter) = &delimiter { - if let Some(idx) = entry.name.trim_start_matches(prefix).find(delimiter) { + if let Some(idx) = { + let remaining = if entry.name.starts_with(prefix) { + &entry.name[prefix.len()..] + } else { + entry.name.as_str() + }; + remaining.find(delimiter.as_str()) + } { let idx = prefix.len() + idx + delimiter.len(); if let Some(curr_prefix) = entry.name.get(0..idx) { if curr_prefix == prev_prefix { @@ -914,7 +926,12 @@ impl ObjectInfo { for entry in entries.entries() { if entry.is_object() { if let Some(delimiter) = &delimiter { - if let Some(idx) = entry.name.trim_start_matches(prefix).find(delimiter) { + let remaining = if entry.name.starts_with(prefix) { + &entry.name[prefix.len()..] + } else { + entry.name.as_str() + }; + if let Some(idx) = remaining.find(delimiter.as_str()) { let idx = prefix.len() + idx + delimiter.len(); if let Some(curr_prefix) = entry.name.get(0..idx) { if curr_prefix == prev_prefix { @@ -951,7 +968,14 @@ impl ObjectInfo { if entry.is_dir() { if let Some(delimiter) = &delimiter { - if let Some(idx) = entry.name.trim_start_matches(prefix).find(delimiter) { + if let Some(idx) = { + let remaining = if entry.name.starts_with(prefix) { + &entry.name[prefix.len()..] + } else { + entry.name.as_str() + }; + remaining.find(delimiter.as_str()) + } { let idx = prefix.len() + idx + delimiter.len(); if let Some(curr_prefix) = entry.name.get(0..idx) { if curr_prefix == prev_prefix {