bucketwarden-server 0.1.0

BucketWarden storage server runtime.
Documentation
mod common;

use bucketwarden_s3::S3HttpRequest;
use common::*;

#[test]
fn addressing_depth_supports_path_and_virtual_host_buckets() {
    let mut runtime = runtime();

    let path_bucket = runtime
        .handle_s3_http(
            S3HttpRequest::new("alice", "PUT", "/archive-path")
                .with_header("host", "s3.bucketwarden.test"),
        )
        .expect("path bucket");
    assert_eq!(path_bucket.status, 200);

    let path_put = runtime
        .handle_s3_http(
            S3HttpRequest::new("alice", "PUT", "/archive-path/path.txt")
                .with_header("host", "s3.bucketwarden.test")
                .with_body(b"path".to_vec()),
        )
        .expect("path put");
    assert_eq!(path_put.status, 200);

    let virtual_bucket = runtime
        .handle_s3_http(
            S3HttpRequest::new("alice", "PUT", "/")
                .with_header("host", "archive-vhost.s3.bucketwarden.test"),
        )
        .expect("virtual bucket");
    assert_eq!(virtual_bucket.status, 200);

    let virtual_put = runtime
        .handle_s3_http(
            S3HttpRequest::new("alice", "PUT", "/records/vhost.txt")
                .with_header("host", "archive-vhost.s3.bucketwarden.test")
                .with_body(b"virtual".to_vec()),
        )
        .expect("virtual put");
    assert_eq!(virtual_put.status, 200);

    let virtual_get = runtime
        .handle_s3_http(
            S3HttpRequest::new("alice", "GET", "/records/vhost.txt")
                .with_header("host", "archive-vhost.s3.bucketwarden.test"),
        )
        .expect("virtual get");
    assert_eq!(virtual_get.body, b"virtual");
}

#[test]
fn addressing_depth_enforces_dns_bucket_name_validation() {
    let mut runtime = runtime();
    for (host, expected_status) in [
        ("valid-bucket.s3.bucketwarden.test", 200),
        ("-bad.s3.bucketwarden.test", 400),
        ("bad-.s3.bucketwarden.test", 400),
        ("BadUpper.s3.bucketwarden.test", 400),
    ] {
        let response = runtime
            .handle_s3_http(S3HttpRequest::new("alice", "PUT", "/").with_header("host", host))
            .expect("bucket create");
        assert_eq!(response.status, expected_status, "{host}");
    }

    let invalid = runtime
        .handle_s3_http(
            S3HttpRequest::new("alice", "PUT", "/bad_bucket")
                .with_header("host", "s3.bucketwarden.test"),
        )
        .expect("invalid path bucket");
    assert_error_response(&invalid, 400, "InvalidBucketName", false);
}