winterbaume-s3
S3 service implementation for winterbaume.
Coverage
| Metric | Value |
|---|---|
| Service | S3 |
| AWS model | s3 |
| Protocol | restXml |
| winterbaume coverage | 103/107 operations (96.3%) |
| stubs (routed, returns empty/default) | 4/107 operations (3.7%) |
| moto coverage | 73/107 operations (68.2%) |
| floci coverage | 51/107 operations (47.7%) |
| kumo coverage | 36/107 operations (33.6%) |
| Coverage report date | 2026-05-13 |
Server-mode usage
Start winterbaume-server and point the AWS CLI at it:
sh
cargo run -p winterbaume-server -- --host 127.0.0.1 --port 5555sh
export AWS_ENDPOINT_URL=http://localhost:5555
aws s3api list-bucketsExample
rust
use aws_sdk_s3::config::BehaviorVersion;
use winterbaume_core::MockAws;
use winterbaume_s3::S3Service;
#[tokio::main]
async fn main() {
let mock = MockAws::builder().with_service(S3Service::new()).build();
let config = aws_config::defaults(BehaviorVersion::latest())
.http_client(mock.http_client())
.credentials_provider(mock.credentials_provider())
.region(aws_sdk_s3::config::Region::new("us-east-1"))
.load()
.await;
let client = aws_sdk_s3::Client::new(&config);
client
.create_bucket()
.bucket("example-bucket")
.send()
.await
.expect("create_bucket should succeed");
let resp = client
.list_buckets()
.send()
.await
.expect("list_buckets should succeed");
println!(
"S3 buckets: {:?}",
resp.buckets()
.iter()
.map(|b| b.name().unwrap_or_default())
.collect::<Vec<_>>()
);
}Implemented APIs (103)
AbortMultipartUploadCompleteMultipartUploadCopyObjectCreateBucketCreateBucketMetadataConfigurationCreateBucketMetadataTableConfigurationCreateMultipartUploadDeleteBucketDeleteBucketAnalyticsConfigurationDeleteBucketCorsDeleteBucketEncryptionDeleteBucketIntelligentTieringConfigurationDeleteBucketInventoryConfigurationDeleteBucketLifecycleDeleteBucketMetadataConfigurationDeleteBucketMetadataTableConfigurationDeleteBucketMetricsConfigurationDeleteBucketOwnershipControlsDeleteBucketPolicyDeleteBucketReplicationDeleteBucketTaggingDeleteBucketWebsiteDeleteObjectDeleteObjectTaggingDeleteObjectsDeletePublicAccessBlockGetBucketAbacGetBucketAccelerateConfigurationGetBucketAclGetBucketAnalyticsConfigurationGetBucketCorsGetBucketEncryptionGetBucketIntelligentTieringConfigurationGetBucketInventoryConfigurationGetBucketLifecycleConfigurationGetBucketLocationGetBucketLoggingGetBucketMetadataConfigurationGetBucketMetadataTableConfigurationGetBucketMetricsConfigurationGetBucketNotificationConfigurationGetBucketOwnershipControlsGetBucketPolicyGetBucketReplicationGetBucketRequestPaymentGetBucketTaggingGetBucketVersioningGetBucketWebsiteGetObjectGetObjectAclGetObjectAttributesGetObjectLegalHoldGetObjectLockConfigurationGetObjectRetentionGetObjectTaggingGetPublicAccessBlockHeadBucketHeadObjectListBucketAnalyticsConfigurationsListBucketIntelligentTieringConfigurationsListBucketInventoryConfigurationsListBucketMetricsConfigurationsListBucketsListDirectoryBucketsListMultipartUploadsListObjectVersionsListObjectsListObjectsV2ListPartsPutBucketAbacPutBucketAccelerateConfigurationPutBucketAclPutBucketAnalyticsConfigurationPutBucketCorsPutBucketEncryptionPutBucketIntelligentTieringConfigurationPutBucketInventoryConfigurationPutBucketLifecycleConfigurationPutBucketLoggingPutBucketMetricsConfigurationPutBucketNotificationConfigurationPutBucketOwnershipControlsPutBucketPolicyPutBucketReplicationPutBucketRequestPaymentPutBucketTaggingPutBucketVersioningPutBucketWebsitePutObjectPutObjectAclPutObjectLegalHoldPutObjectLockConfigurationPutObjectRetentionPutObjectTaggingPutPublicAccessBlockRenameObjectSelectObjectContentUpdateBucketMetadataInventoryTableConfigurationUpdateBucketMetadataJournalTableConfigurationUpdateObjectEncryptionUploadPartUploadPartCopyWriteGetObjectResponse
Stubbed APIs (4) — routed but return an empty/default response
CreateSessionGetBucketPolicyStatusGetObjectTorrentRestoreObject
Path-style bucket URLs
winterbaume only supports path-style S3 URLs (http://host:port/bucket/key). Virtual-hosted-style URLs (http://bucket.host:port/key) are not supported when using a custom endpoint.
Most AWS SDKs and tools default to virtual-hosted-style for S3. When pointing them at winterbaume, you need to force path-style addressing. For example:
- AWS CLI:
aws s3api --endpoint-url http://localhost:5555 list-buckets(path-style is the default for custom endpoints) - aws-sdk-rust: use
force_path_style(true)on the S3 config builder - Terraform: set
s3_use_path_style = truein the provider block:
hcl
provider "aws" {
region = "us-east-1"
access_key = "test"
secret_key = "test"
s3_use_path_style = true
skip_credentials_validation = true
skip_metadata_api_check = true
skip_requesting_account_id = true
endpoints {
s3 = "http://localhost:5555"
sts = "http://localhost:5555"
}
}