The S3 surface
Which S3 operations are implemented and how, and the rule for every other one: refused with NotImplemented, never routed somewhere it happens to fit.
Requests are dispatched by operation name. An operation the server does not
implement is answered NotImplemented; an unknown or misplaced parameter is
refused before any operation runs. Each of the 116 operations of the AWS S3 model is
signed, sent and answered in the server's tests.
Buckets
| operation | notes |
|---|---|
CreateBucket · HeadBucket · DeleteBucket · ListBuckets | a bucket holding only versions is not empty |
GetBucketLocation | the server's region |
GetBucketVersioning · PutBucketVersioning | never versioned → Enabled ↔ Suspended, never back; MFA delete refused |
GetBucketLifecycleConfiguration · PutBucketLifecycleConfiguration · DeleteBucketLifecycle | see Events, lifecycle and media |
GetBucketNotificationConfiguration · PutBucketNotificationConfiguration | queue configurations only |
Objects
| operation | notes |
|---|---|
PutObject | up to 5 GiB; payload hash and declared checksums verified before the write is acknowledged |
GetObject · HeadObject | ranges, partNumber, versionId, x-amz-version-id answered |
CopyObject | up to 5 GiB, COPY or REPLACE metadata, copy-source conditions, checksum recomputed and checked |
DeleteObject · DeleteObjects | with versionId, removes that version for good |
ListObjectsV2 · ListObjects | byte order, delimiter roll-up, authenticated continuation tokens, encoding-type=url |
ListObjectVersions | keys in byte order, each key newest first with IsLatest, key and version-id markers |
GetObjectTagging | always the empty set: nothing writes tags |
Multipart
| operation | notes |
|---|---|
CreateMultipartUpload · UploadPart · UploadPartCopy | UploadPartCopy from a range or all of a source |
ListParts · ListMultipartUploads | key and upload-id markers, delimiter roll-up |
CompleteMultipartUpload | multipart ETag, full-object or composite checksum; reads across parts with Range and partNumber |
AbortMultipartUpload | an upload open longer than TESSARIDB_S3_UPLOAD_MAX_AGE_SECS (a week) is aborted by the reaper |
Versioning in practice
An enabled bucket keeps every version and a delete adds a marker; a suspended one
replaces only the null version. GetObject with a versionId naming no version
answers NoSuchVersion; a delete marker named by id answers 405, and a current one
404 with x-amz-delete-marker. Removing a delete marker by id brings the object back.
Objects from an earlier build become null versions at start.
What is not here yet
Object Lock, bucket policies set through the S3 API, tagging writes, website
configuration and lifecycle transitions are among the operations answered
NotImplemented today. A client that needs one of them gets that refusal, not a
quiet success.