Expand description
Hierarchical path mapping for the multistore S3 proxy gateway.
S3 uses a flat namespace: each bucket is an independent container resolved
to a single backend. Some applications need a hierarchical URL scheme
where multiple path segments determine which backend to use. For example,
a data catalog might expose /{account}/{product}/{key} but store each
account/product pair in its own backend bucket.
This crate bridges those two worlds:
-
PathMappingdefines how many leading URL segments form the logical “bucket”, what separator joins them into an internal name, and how many segments appear as the display name in S3 XML responses. -
PathMapping::rewrite_requestrewrites an incoming(path, query)pair so the gateway sees a single-segment bucket. It handles both path-based routing (/{a}/{b}/{key}→/{a:b}/{key}) and query-based prefix routing (/{a}?prefix=b/sub/→/{a:b}?prefix=sub/). -
MappedRegistrywraps anyBucketRegistryand automatically applies display-name and list-rewrite rules so XML responses show the original hierarchical names to clients.
§Example
use multistore_path_mapping::PathMapping;
let mapping = PathMapping {
bucket_segments: 2,
bucket_separator: ":".into(),
display_bucket_segments: 1,
};
// Path-based: two segments become one internal bucket
let mapped = mapping.parse("/acme/data/report.csv").unwrap();
assert_eq!(mapped.bucket, "acme:data");
assert_eq!(mapped.key, Some("report.csv".to_string()));
assert_eq!(mapped.display_bucket, "acme");
// Full request rewrite (path + query)
let (path, query) = mapping.rewrite_request(
"/acme/data/report.csv",
None,
);
assert_eq!(path, "/acme:data/report.csv");
assert_eq!(query, None);
// Prefix-based list rewrite
let (path, query) = mapping.rewrite_request(
"/acme",
Some("list-type=2&prefix=data/subdir/"),
);
assert_eq!(path, "/acme:data");
assert_eq!(query, Some("list-type=2&prefix=subdir/".to_string()));Structs§
- Mapped
Path - Result of mapping a request path.
- Mapped
Registry - Wraps a
BucketRegistryto add path-based routing. - Path
Mapping - Defines how URL path segments map to internal bucket names.