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 🫢


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 πŸ’€

  • AbortMultipartUpload
    • Net::Amazon::S3 (API): ❌ Β· returns: ❌ Β· errors: ❌
    • Net::Amazon::S3::Client: object->abort_multipart_upload Β· returns: http response Β· errors: confess
  • CompleteMultipartUpload
    • Net::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 story
    • Net::Amazon::S3 (API): s3->add_bucket Β· with region: βœ… Β· returns: Bucket instance Β· errors: set S3 err
    • Net::Amazon::S3::Client: client->create_bucket Β· with region: βœ… Β· returns: Bucket instance Β· errors: confess
  • CreateMultipartUpload
    • Net::Amazon::S3 (API): ❌ Β· returns: ❌ Β· errors: ❌
    • Net::Amazon::S3::Client: object->initiate_multipart_upload Β· returns: http response Β· errors: confess
  • DeleteBucket
    • Net::Amazon::S3 (API): s3->delete_bucket Β· returns: boolean Β· errors: set S3 err
    • Net::Amazon::S3::Client: bucket->delete Β· returns: boolean Β· errors: confess
  • DeleteBucketTagging
    • Net::Amazon::S3 (API): bucket->delete_tags Β· returns: boolean Β· errors: set S3 err
    • Net::Amazon::S3::Client: bucket->delete_tags Β· returns: boolean Β· errors: confess
  • DeleteObject
    • Net::Amazon::S3 (API): bucket->delete_key Β· returns: boolean Β· errors: set S3 err
    • Net::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 err
    • Net::Amazon::S3::Client: bucket->delete_multi_object Β· auto chunks: βœ… Β· returns: HTTP::Response object Β· errors: confess
  • DeleteObjectTagging
    • Net::Amazon::S3 (API): bucket->delete_tags Β· returns: boolean Β· errors: set S3 err
    • Net::Amazon::S3::Client: bucket->object->delete_tags Β· returns: boolean Β· errors: confess
  • GetBucketAcl
    • Net::Amazon::S3 (API): bucket->get_acl Β· returns: response body (XML) (undef on 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 err
    • Net::Amazon::S3::Client: bucket->get_location_constraint Β· returns: location (Str) Β· errors: confess
  • GetObject β€” the one you'll call a million times fr fr
    • Net::Amazon::S3 (API): bucket->get_key Β· into file: βœ…, bucket->get_key_filename Β· into callback: ❌ Β· returns: struct with value (undef on 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
  • GetObjectAcl
    • Net::Amazon::S3 (API): bucket->get_acl Β· returns: response body (XML) (undef on Not Found) Β· errors: set network error (none on Not Found)
    • Net::Amazon::S3::Client: ❌ Β· returns: ❌ Β· errors: ❌
  • ListBuckets
    • Net::Amazon::S3 (API): s3->buckets Β· returns: Bucket instances in struct Β· errors: set S3 err
    • Net::Amazon::S3::Client: client->buckets Β· returns: Bucket instances (list) Β· errors: confess
  • ListObjects
    • Net::Amazon::S3 (API): s3->list_bucket Β· common prefixes: βœ… Β· list all: βœ…, s3->list_bucket_all Β· returns: struct with list Β· errors: set S3 err
    • Net::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: ❌
  • PutBucketAcl
    • Net::Amazon::S3 (API): bucket->set_acl Β· with canned acl: βœ…, as acl Β· with explicit acl: βœ…, as acl Β· with xml acl: βœ…, as acl_xml Β· returns: boolean Β· errors: set S3 err
    • Net::Amazon::S3::Client: bucket->set_acl Β· with canned acl: βœ…, as acl Β· with explicit acl: βœ…, as acl Β· with xml acl: βœ…, as acl_xml Β· returns: boolean Β· errors: confess
  • PutBucketTagging
    • Net::Amazon::S3 (API): bucket->add_tags Β· with canned acl: βœ…, as acl Β· with explicit acl: βœ…, as acl Β· with xml acl: βœ…, as acl_xml Β· returns: boolean Β· errors: set S3 err
    • Net::Amazon::S3::Client: bucket->add_tags Β· with canned acl: βœ…, as acl Β· with explicit acl: βœ…, as acl Β· with xml acl: βœ…, as acl_xml Β· returns: boolean Β· errors: confess
  • PutObject
    • Net::Amazon::S3 (API): bucket->add_key Β· returns: boolean Β· errors: set S3 err
    • Net::Amazon::S3::Client: bucket->object->put Β· returns: empty string Β· errors: confess
  • PutObjectAcl
    • Net::Amazon::S3 (API): bucket->set_acl Β· with canned acl: βœ…, as acl Β· with explicit acl: βœ…, as acl Β· with xml acl: βœ…, as acl_xml Β· returns: boolean Β· errors: set S3 err
    • Net::Amazon::S3::Client: object->set_acl Β· with canned acl: βœ…, as acl Β· with explicit acl: βœ…, as acl Β· with xml acl: βœ…, as acl_xml Β· returns: boolean Β· errors: confess
  • PutObjectTagging
    • Net::Amazon::S3 (API): bucket->add_tags Β· with canned acl: βœ…, as acl Β· with explicit acl: βœ…, as acl Β· with xml acl: βœ…, as acl_xml Β· returns: boolean Β· errors: set S3 err
    • Net::Amazon::S3::Client: bucket->object->add_tags Β· with canned acl: βœ…, as acl Β· with explicit acl: βœ…, as acl Β· with xml acl: βœ…, as acl_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 response
  • errors | ❌ | confess

next up, the UploadPart situation 🫢

  • UploadPart | ❌ | bucket->object->put_part
  • - from value | ❌ | βœ…
  • - from file | ❌ | ❌
  • - from file chunk | ❌ | ❌
  • returns | ❌ | http response
  • errors | ❌ | 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 ✨


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