Skip to main content

S3 API compatibility

TAG implements the commonly used S3 REST API operations, acting as a caching proxy between S3 clients and Tigris object storage. Compatibility is validated against 214 tests from the ceph/s3-tests suite.

Path-Style Addressing Only

TAG supports path-style addressing only (http://host:port/bucket/key). Virtual-hosted style (http://bucket.host:port/key) is not supported. Configure your S3 client accordingly.

Supported operations

Service

OperationMethodPathNotes
ListBucketsGET/

Bucket

All bucket operations support both /{bucket} and /{bucket}/ path forms for compatibility with clients that send trailing slashes.

OperationMethodPath / QueryNotes
CreateBucketPUT/{bucket}
DeleteBucketDELETE/{bucket}
HeadBucketHEAD/{bucket}
ListObjects V1GET/{bucket}
ListObjects V2GET/{bucket}?list-type=2
ListMultipartUploadsGET/{bucket}?uploads
GetBucketLocationGET/{bucket}?locationReturns configured region
GetBucketVersioningGET / PUT/{bucket}?versioningForwarded to Tigris
GetBucketACLGET / PUT/{bucket}?aclForwarded to Tigris
GetBucketPolicyGET / PUT / DELETE/{bucket}?policyForwarded to Tigris
GetBucketCORSGET / PUT / DELETE/{bucket}?corsForwarded to Tigris
GetBucketTaggingGET / PUT / DELETE/{bucket}?taggingForwarded to Tigris
GetBucketLifecycleGET / PUT / DELETE/{bucket}?lifecycleForwarded to Tigris
DeleteObjectsPOST/{bucket}?deleteBulk delete with XML body; invalidates cache entries

Object

OperationMethodPath / QueryNotes
GetObjectGET/{bucket}/{key}Cache-first; supports Range and conditional headers
HeadObjectHEAD/{bucket}/{key}Served from cached metadata when available
PutObjectPUT/{bucket}/{key}Invalidates cache before forwarding
DeleteObjectDELETE/{bucket}/{key}Invalidates cache before forwarding
CopyObjectPUT/{bucket}/{key}Detected via X-Amz-Copy-Source header; invalidates destination cache
GetObjectTaggingGET/{bucket}/{key}?tagging
PutObjectTaggingPUT/{bucket}/{key}?tagging
DeleteObjectTaggingDELETE/{bucket}/{key}?tagging
GetObjectACLGET/{bucket}/{key}?acl
PutObjectACLPUT/{bucket}/{key}?acl

Multipart upload

OperationMethodPath / QueryNotes
InitiateMultipartUploadPOST/{bucket}/{key}?uploads
UploadPartPUT/{bucket}/{key}?uploadId=&partNumber=
UploadPartCopyPUT/{bucket}/{key}?uploadId=&partNumber=Detected via X-Amz-Copy-Source header
CompleteMultipartUploadPOST/{bucket}/{key}?uploadId=Idempotent — successful completions cached
AbortMultipartUploadDELETE/{bucket}/{key}?uploadId=
ListPartsGET/{bucket}/{key}?uploadId=

AWS chunked transfer encoding

TAG supports AWS chunked transfer encoding (streaming SigV4), used by warp and many AWS SDKs for large uploads.

In transparent proxy mode (default), chunked uploads are forwarded as-is since the original signatures remain valid.

In signing mode, TAG decodes the chunked body on-the-fly — stripping chunk framing and per-chunk signatures — and forwards the raw payload as UNSIGNED-PAYLOAD. This is a streaming operation with no buffering of the full object.

Caching behavior

For details on X-Cache response headers, request coalescing, range request optimization, write-through invalidation, and client cache-control headers, see Cache Control and Revalidation.

Authentication

All requests must be signed with AWS Signature Version 4 (SigV4). Presigned URL authentication (X-Amz-Algorithm query parameter) is also supported. See Security and Access Control for the full authentication flow.

Not supported

The following S3 features are not implemented by TAG. These requests are forwarded to Tigris as-is, where Tigris itself may or may not support them:

  • Object versioning (version-specific GET/DELETE)
  • Server-side encryption (SSE-C, SSE-S3, SSE-KMS)
  • Object Lock / WORM retention
  • POST object (browser-based HTML form uploads)
  • Public Access Block configuration
  • Bucket ownership controls
  • Multi-range requests (single Range header only)
  • Virtual-hosted style addressing
  • Website hosting configuration
  • Replication configuration
  • Inventory, analytics, and metrics configuration
  • Storage class transitions (Glacier, Intelligent Tiering)

S3 compatibility test coverage

TAG's compatibility is validated using a curated subset of tests from ceph/s3-tests:

CategoryTestsCoverage
Header validation48Content-Type, MD5, Content-Length, dates, authorization
Core list operations55Prefix, delimiter, max-keys, marker, continuation
Object operations34Read, write, metadata, ETags, ranges, conditionals
Bucket operations33Create, delete, list, naming rules
Multipart uploads20Initiate, upload, complete, abort, copy parts
Copy operations9Same-bucket, cross-bucket, metadata handling
Tagging15Object and bucket tag CRUD
Total214