Net::A...eatures(3pm)
π Net::Amazon::S3::Features β the manual, but make it make sense π
okay bestie, so this is the manual page for Net::Amazon::S3::Features (it's a 3pm page, so it's Perl module docs, iykyk). Let's get into it. β¨
πΈ NAME πΈ
Net::Amazon::S3::Features β literally just: Features available in Net::Amazon::S3 π
Like. That's the whole vibe. It's the feature map. The lore. The "what does this thing actually support" doc.
β VERSION β
version 0.992 β yes, we're on that version, no cap π
π AUTHOR π
Branislav ZahradnΓk <barney@cpan.org> β the main character who wrote this π«Ά
π COPYRIGHT AND LICENSE π
This software is copyright (c) 2025 by:
- Amazon Digital Services
- Leon Brocard
- Brad Fitzpatrick
- Pedro Figueiredo
- Rusty Conover
- Branislav ZahradnΓk
And the license situation, fr fr:
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.
so like. it's free. you can share it, you can remix it, same terms as Perl 5 itself. slay. π
π¦ API COMPARISON π¦
Okay so here's the tea: Net::Amazon::S3 supports two APIs, and they do not have the same feature support. Not even close. So this is your cheat sheet for which one does what. πΊοΈ
And a note that's giving very "this is current as of now":
This document describes current behaviour.
like, this is the current state of things. not the past, not the future. present tense only. π
β¨ Error reporting β¨
So when errors happen β and bestie, they will happen β this is the default error reporting method situation. Three flavors, pick your fighter:
π set S3 err
Operation returns expression evaluated as false and err with errstr are populated from response content.
(so: falsy return, and err + errstr get filled in from whatever the response content said.)
See Net::Amazon::S3::Error::Handler::Status, Net::Amazon::S3::Error::Handler::Legacy.
π set network error
Populates S3 err with the network_error constant, and S3 errstr with the http status line (eg: 404 Not Found) β and then it throws.
See Net::Amazon::S3::Error::Handler::Legacy.
π confess
Operation throws using confess.
(yeah, it just. confesses. no chill.)
See Net::Amazon::S3::Error::Handler::Confess.
π₯ Feature support π₯
For the full details, go look at the corresponding api-operation / client-operation test file. π That's where the real receipts live.
And also here's the list of Amazon S3 Operations if you wanna see the whole menu of what AWS itself offers:
https://docs.aws.amazon.com/AmazonS3/latest/API/API_Operations_Amazon_Simple_Storage_Service.html
okay that's part one bestie, don't go anywhere β π more is coming. π«Ά
okay so we're still in the middle of this giant comparison table and it just keeps going, bestie. π quick legend so you're not lost: blue = Net::Amazon::S3 (the API one) and purple = Net::Amazon::S3::Client. every op shows the call, then any sub-flags, then what it returns and what it does on errors. a big fat β means that side literally does not have it. not me being devastated on its behalf π
AbortMultipartUploadNet::Amazon::S3(API): β Β· returns: β Β· errors: βNet::Amazon::S3::Client:object->abort_multipart_uploadΒ· returns:http responseΒ· errors:confess
CompleteMultipartUploadNet::Amazon::S3(API): β Β· returns: β Β· errors: βNet::Amazon::S3::Client:object->complete_multipart_uploadΒ· returns:http responseΒ· errors:confess
CreateBucketπͺ£ the main character of every S3 storyNet::Amazon::S3(API):s3->add_bucketΒ· with region: β Β· returns:Bucket instanceΒ· errors:set S3 errNet::Amazon::S3::Client:client->create_bucketΒ· with region: β Β· returns:Bucket instanceΒ· errors:confess
CreateMultipartUploadNet::Amazon::S3(API): β Β· returns: β Β· errors: βNet::Amazon::S3::Client:object->initiate_multipart_uploadΒ· returns:http responseΒ· errors:confess
DeleteBucketNet::Amazon::S3(API):s3->delete_bucketΒ· returns:booleanΒ· errors:set S3 errNet::Amazon::S3::Client:bucket->deleteΒ· returns:booleanΒ· errors:confess
DeleteBucketTaggingNet::Amazon::S3(API):bucket->delete_tagsΒ· returns:booleanΒ· errors:set S3 errNet::Amazon::S3::Client:bucket->delete_tagsΒ· returns:booleanΒ· errors:confess
DeleteObjectNet::Amazon::S3(API):bucket->delete_keyΒ· returns:booleanΒ· errors:set S3 errNet::Amazon::S3::Client:bucket->object->deleteΒ· returns:booleanΒ· errors:confess
DeleteObjectsβ the multi-delete one, chunks itself, obsessed with efficiency β¨Net::Amazon::S3(API):bucket->delete_multi_objectΒ· auto chunks: β Β· returns:booleanΒ· errors:set S3 errNet::Amazon::S3::Client:bucket->delete_multi_objectΒ· auto chunks: β Β· returns:HTTP::Response objectΒ· errors:confess
DeleteObjectTaggingNet::Amazon::S3(API):bucket->delete_tagsΒ· returns:booleanΒ· errors:set S3 errNet::Amazon::S3::Client:bucket->object->delete_tagsΒ· returns:booleanΒ· errors:confess
GetBucketAclNet::Amazon::S3(API):bucket->get_aclΒ· returns:response body (XML)(undefon Not Found) Β· errors:set network error(none on Not Found)Net::Amazon::S3::Client:bucket->aclΒ· returns:response body (XML)Β· errors:confess
GetBucketLocationπNet::Amazon::S3(API):bucket->get_location_constraintΒ· returns:location (Str)Β· errors:set S3 errNet::Amazon::S3::Client:bucket->get_location_constraintΒ· returns:location (Str)Β· errors:confess
GetObjectβ the one you'll call a million times fr frNet::Amazon::S3(API):bucket->get_keyΒ· into file: β ,bucket->get_key_filenameΒ· into callback: β Β· returns:struct with value(undefon Not Found) Β· errors:set network error(none on Not Found)Net::Amazon::S3::Client:bucket->object->getΒ· into file: β ,bucket->object->get_filenameΒ· into callback: β ,bucket->object->get_callbackΒ· returns:valueΒ· errors:confess
GetObjectAclNet::Amazon::S3(API):bucket->get_aclΒ· returns:response body (XML)(undefon Not Found) Β· errors:set network error(none on Not Found)Net::Amazon::S3::Client: β Β· returns: β Β· errors: β
ListBucketsNet::Amazon::S3(API):s3->bucketsΒ· returns:Bucket instances in structΒ· errors:set S3 errNet::Amazon::S3::Client:client->bucketsΒ· returns:Bucket instances (list)Β· errors:confess
ListObjectsNet::Amazon::S3(API):s3->list_bucketΒ· common prefixes: β Β· list all: β ,s3->list_bucket_allΒ· returns:struct with listΒ· errors:set S3 errNet::Amazon::S3::Client:bucket->listΒ· common prefixes: β Β· list all: β Β· returns:iterator (Object list)Β· errors:confess during iteration
lowkey the "confess during iteration" thing matters, bestie β the error can show up while you're looping, not just when you call it. π
ListObjectsV2- API: β Β· Client: β
ListParts- API: β Β· Client: β
PutBucketAclNet::Amazon::S3(API):bucket->set_aclΒ· with canned acl: β , asaclΒ· with explicit acl: β , asaclΒ· with xml acl: β , asacl_xmlΒ· returns:booleanΒ· errors:set S3 errNet::Amazon::S3::Client:bucket->set_aclΒ· with canned acl: β , asaclΒ· with explicit acl: β , asaclΒ· with xml acl: β , asacl_xmlΒ· returns:booleanΒ· errors:confess
PutBucketTaggingNet::Amazon::S3(API):bucket->add_tagsΒ· with canned acl: β , asaclΒ· with explicit acl: β , asaclΒ· with xml acl: β , asacl_xmlΒ· returns:booleanΒ· errors:set S3 errNet::Amazon::S3::Client:bucket->add_tagsΒ· with canned acl: β , asaclΒ· with explicit acl: β , asaclΒ· with xml acl: β , asacl_xmlΒ· returns:booleanΒ· errors:confess
PutObjectNet::Amazon::S3(API):bucket->add_keyΒ· returns:booleanΒ· errors:set S3 errNet::Amazon::S3::Client:bucket->object->putΒ· returns:empty stringΒ· errors:confess
PutObjectAclNet::Amazon::S3(API):bucket->set_aclΒ· with canned acl: β , asaclΒ· with explicit acl: β , asaclΒ· with xml acl: β , asacl_xmlΒ· returns:booleanΒ· errors:set S3 errNet::Amazon::S3::Client:object->set_aclΒ· with canned acl: β , asaclΒ· with explicit acl: β , asaclΒ· with xml acl: β , asacl_xmlΒ· returns:booleanΒ· errors:confess
PutObjectTaggingNet::Amazon::S3(API):bucket->add_tagsΒ· with canned acl: β , asaclΒ· with explicit acl: β , asaclΒ· with xml acl: β , asacl_xmlΒ· returns:booleanΒ· errors:set S3 errNet::Amazon::S3::Client:bucket->object->add_tagsΒ· with canned acl: β , asaclΒ· with explicit acl: β , asaclΒ· with xml acl: β , asacl_xmlΒ· returns:booleanΒ· errors:confess
RestoreObjectπ§Net::Amazon::S3(API): βNet::Amazon::S3::Client:bucket->object->restore
and yeah the table just keeps going, so hold that thought π«Ά there's still more below, don't go anywhere π
okay so the comparison table literally would not stop talking, and these next rows are the rest of it β same three-column situation, read it left to right, no cap π
returns| β | http responseerrors| β | confess
next up, the UploadPart situation π«Ά
UploadPart| β |bucket->object->put_part- from value| β | β- from file| β | β- from file chunk| β | βreturns| β | http responseerrors| β | confess
object-copy, where the left side finally wakes up and the right side takes a nap π
object-copy|bucket->copy_key| βreturns| boolean | βerrors| set S3 err | β
and last one, object-head β yes bestie, that middle cell is genuinely empty, it's not me being mysterious π
object-head| | βreturns| boolean | βerrors| set S3 err | β
π TODO plan (asorted, without time-plan) π
this part is the wishlist, the vision board, the "we'll get to it" energy β¨
- unify features
- Both APIs should support same set of operations
- support all AWS S3 operations and x-amz-* headers
- add async API (AnyEvent / IO::Async)
so that's the whole page, babes π it went out under perl v5.40.1, dated 2025-12-07, on the Net::A...eatures(3pm) page β that's the footer saying its goodbyes, and I'm saying mine too π¦ periodt πΈ
π¦ where this page comes from
- ubuntu resolute: libnet-amazon-s3-perl 0.992-1 Β· other
- ubuntu stonking: libnet-amazon-s3-perl 0.992-1 Β· other
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms