diff --git a/src/client/list.rs b/src/client/list.rs index 6ad87db8..c2123183 100644 --- a/src/client/list.rs +++ b/src/client/list.rs @@ -117,8 +117,8 @@ impl ListClientExt for T { while let Some(result) = stream.next().await { let response = result?; - common_prefixes.extend(response.common_prefixes.into_iter()); - objects.extend(response.objects.into_iter()); + common_prefixes.extend(response.common_prefixes); + objects.extend(response.objects); } Ok(ListResult { diff --git a/src/prefix.rs b/src/prefix.rs index 9cdf3b05..b6e9137f 100644 --- a/src/prefix.rs +++ b/src/prefix.rs @@ -84,12 +84,19 @@ fn strip_prefix(prefix: &Path, path: Path) -> Path { /// Strip the constant prefix from a given ObjectMeta fn strip_meta(prefix: &Path, meta: ObjectMeta) -> ObjectMeta { + let ObjectMeta { + last_modified, + size, + location, + e_tag, + version, + } = meta; ObjectMeta { - last_modified: meta.last_modified, - size: meta.size, - location: strip_prefix(prefix, meta.location), - e_tag: meta.e_tag, - version: None, + last_modified, + size, + location: strip_prefix(prefix, location), + e_tag, + version, } } @@ -321,6 +328,32 @@ mod tests { store.get(&head.location).await.unwrap(); } + #[test] + fn strip_meta_preserves_version_and_etag() { + let prefix = Path::from("prefix"); + let meta = ObjectMeta { + location: Path::from("prefix/foo"), + last_modified: chrono::DateTime::from_timestamp(1_700_000_000, 0).unwrap(), + size: 42, + e_tag: Some("etag-value".to_string()), + version: Some("version-value".to_string()), + }; + + let ObjectMeta { + location, + last_modified, + size, + e_tag, + version, + } = strip_meta(&prefix, meta.clone()); + + assert_eq!(location, Path::from("foo")); + assert_eq!(last_modified, meta.last_modified); + assert_eq!(size, meta.size); + assert_eq!(e_tag, meta.e_tag); + assert_eq!(version, meta.version); + } + #[tokio::test] async fn prefix_multipart() { let store = PrefixStore::new(InMemory::new(), "prefix");