Skip to main content

Crate multistore_path_mapping

Crate multistore_path_mapping 

Source
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:

  • PathMapping defines 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_request rewrites 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/).

  • MappedRegistry wraps any BucketRegistry and 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§

MappedPath
Result of mapping a request path.
MappedRegistry
Wraps a BucketRegistry to add path-based routing.
PathMapping
Defines how URL path segments map to internal bucket names.