This is an automated email from the ASF dual-hosted git repository.

oscerd pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/main by this push:
     new 27b4f0c7c8e5 CAMEL-16809: camel-aws2-s3 - support ACL grant headers on 
putObject and multipart upload (#25565)
27b4f0c7c8e5 is described below

commit 27b4f0c7c8e51a109388e3bfbe925cdabe486f2b
Author: Andrea Cosentino <[email protected]>
AuthorDate: Mon Aug 24 07:56:26 2026 +0200

    CAMEL-16809: camel-aws2-s3 - support ACL grant headers on putObject and 
multipart upload (#25565)
    
    Adds the CamelAwsS3GrantFullControl, CamelAwsS3GrantRead, 
CamelAwsS3GrantReadACP and
    CamelAwsS3GrantWriteACP producer headers, wired to the grantFullControl / 
grantRead /
    grantReadACP / grantWriteACP options of PutObjectRequest and 
CreateMultipartUploadRequest.
    This complements the existing canned-ACL support (CamelAwsS3CannedAcl / 
CamelAwsS3Acl)
    so a route can set explicit grantee-based ACLs when uploading objects.
    
    Signed-off-by: Andrea Cosentino <[email protected]>
    Co-authored-by: Claude Opus 4.8 <[email protected]>
---
 .../apache/camel/catalog/components/aws2-s3.json   |  66 ++++++------
 .../apache/camel/component/aws2/s3/aws2-s3.json    |  66 ++++++------
 .../camel/component/aws2/s3/AWS2S3Constants.java   |  20 ++++
 .../camel/component/aws2/s3/AWS2S3Producer.java    |  40 +++++++
 .../aws2/s3/AWS2S3ProducerAclGrantTest.java        | 118 +++++++++++++++++++++
 .../endpoint/dsl/AWS2S3EndpointBuilderFactory.java |  53 +++++++++
 6 files changed, 301 insertions(+), 62 deletions(-)

diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-s3.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-s3.json
index 214925e76b61..a89aec93b28d 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-s3.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/aws2-s3.json
@@ -109,37 +109,41 @@
     "CamelAwsS3VersionId": { "index": 16, "kind": "header", "displayName": "", 
"group": "common", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "(producer) The optional version ID of the newly uploaded 
object. (consumer) The version ID of the associated Amazon S3 object if 
available. Version IDs are only assigned to objects when an object is uploaded 
to an Amazon S3 bucket that has obj [...]
     "CamelAwsS3CannedAcl": { "index": 17, "kind": "header", "displayName": "", 
"group": "producer", "label": "producer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "The canned acl that will be applied to the 
object. see software.amazon.awssdk.services.s3.model.ObjectCannedACL for 
allowed values.", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#CANNED_ACL" },
     "CamelAwsS3Acl": { "index": 18, "kind": "header", "displayName": "", 
"group": "producer", "label": "producer", "required": false, "javaType": 
"software.amazon.awssdk.services.s3.model.BucketCannedACL", "enum": [ 
"private", "public-read", "public-read-write", "authenticated-read", "null" ], 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "A well constructed Amazon S3 Access Control List 
object.", "constantName": "org.apache.camel.compone [...]
-    "CamelAwsS3Operation": { "index": 19, "kind": "header", "displayName": "", 
"group": "common", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The operation to perform. Permitted values are 
copyObject, deleteObject, listBuckets, deleteBucket, listObjects", 
"constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#S3_OPERATION" },
-    "CamelAwsS3ServerSideEncryption": { "index": 20, "kind": "header", 
"displayName": "", "group": "common", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Sets the server-side encryption 
algorithm when encrypting the object using AWS-managed keys. For example use 
AES256.", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#SERVER_SIDE_ENCRYPTION" },
-    "CamelAwsS3ExpirationTime": { "index": 21, "kind": "header", 
"displayName": "", "group": "consumer", "label": "consumer", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "If the object expiration is configured 
(see PUT Bucket lifecycle), the response includes this header.", 
"constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#EXPIRATION_TIME" },
-    "CamelAwsS3ReplicationStatus": { "index": 22, "kind": "header", 
"displayName": "", "group": "consumer", "label": "consumer", "required": false, 
"javaType": "software.amazon.awssdk.services.s3.model.ReplicationStatus", 
"enum": [ "COMPLETE", "PENDING", "FAILED", "REPLICA", "COMPLETED", "null" ], 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "Amazon S3 can return this if your request involves a 
bucket that is either a source or destinati [...]
-    "CamelAwsS3RangeStart": { "index": 23, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "The position of the first byte to get", 
"constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#RANGE_START" },
-    "CamelAwsS3RangeEnd": { "index": 24, "kind": "header", "displayName": "", 
"group": "producer", "label": "producer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "The position of the last byte to get", 
"constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#RANGE_END" 
},
-    "CamelAwsS3DowloadLinkExpirationTime": { "index": 25, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "Long", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The expiration time of the download 
link in milliseconds", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#DOWNLOAD_LINK_EXPIRATION_TIME"
 },
-    "CamelAwsS3DownloadLinkBrowserCompatible": { "index": 26, "kind": 
"header", "displayName": "", "group": "producer", "label": "producer", 
"required": false, "javaType": "boolean", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": 
"Whether the download link is browser compatible", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#DOWNLOAD_LINK_BROWSER_COMPATIBLE"
 },
-    "CamelAwsS3DownloadLinkHttpRequestHeaders": { "index": 27, "kind": 
"header", "displayName": "", "group": "producer", "label": "producer", 
"required": false, "javaType": "Map<String, List<String>>", "deprecated": 
false, "deprecationNote": "", "autowired": false, "secret": false, 
"description": "The headers that are needed by the service (not needed when 
BrowserCompatible is true)", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#DOWNLOAD_LINK_HTTP_REQUEST_HEADERS"
 },
-    "CamelAwsS3DownloadLinkSignedPayload": { "index": 28, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The request payload that is needed by 
the service (not needed when BrowserCompatible is true)", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#DOWNLOAD_LINK_SIGNED_PAYLOAD"
 },
-    "CamelAwsS3Metadata": { "index": 29, "kind": "header", "displayName": "", 
"group": "common", "label": "", "required": false, "javaType": "Map<String, 
String>", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "A map of metadata to be stored or stored with 
the object in S3. More details about metadata 
https:\/\/docs.aws.amazon.com\/AmazonS3\/latest\/userguide\/UsingMetadata.htmlhere.",
 "constantName": "org.apache.camel.component.aws2.s3.A [...]
-    "CamelMessageTimestamp": { "index": 30, "kind": "header", "displayName": 
"", "group": "consumer", "label": "consumer", "required": false, "javaType": 
"long", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "The timestamp of the message", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#MESSAGE_TIMESTAMP" },
-    "CamelAwsS3Prefix": { "index": 31, "kind": "header", "displayName": "", 
"group": "common", "label": "", "required": false, "javaType": "", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The prefix which is used in the 
com.amazonaws.services.s3.model.ListObjectsRequest to only list objects we are 
interested in", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#PREFIX" },
-    "CamelAwsS3Delimiter": { "index": 32, "kind": "header", "displayName": "", 
"group": "common", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The delimiter which is used in the 
com.amazonaws.services.s3.model.ListObjectsRequest to only list objects we are 
interested in", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#DELIMITER" },
-    "CamelAwsS3IfMatchCondition": { "index": 33, "kind": "header", 
"displayName": "", "group": "common", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Return\/copy the object only if its 
entity tag (ETag) is the same as the one specified in this header.", 
"constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#IF_MATCH_CONDITION" },
-    "CamelAwsS3IfModifiedSinceCondition": { "index": 34, "kind": "header", 
"displayName": "", "group": "common", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Return\/copy the object only if it has 
been modified since the specified time; otherwise, return a 304 Not Modified 
error.", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#IF_MODIFIED_SINCE_CONDITION"
 },
-    "CamelAwsS3IfNoneMatchCondition": { "index": 35, "kind": "header", 
"displayName": "", "group": "common", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Return\/copy the object only if its 
entity tag (ETag) is different from the one specified in this header.", 
"constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#IF_NONE_MATCH_CONDITION" },
-    "CamelAwsS3IfUnmodifiedSinceCondition": { "index": 36, "kind": "header", 
"displayName": "", "group": "common", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Return\/copy the object only if it has 
not been modified since the specified time.", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#IF_UNMODIFIED_SINCE_CONDITION"
 },
-    "CamelAwsS3OverrideBucketName": { "index": 37, "kind": "header", 
"displayName": "", "group": "common", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The bucket Name to override (can be 
dynamic using the simple language in the producer) which this object will be 
stored or which will be used for the current operation or in which this object 
is contained.", "constantName": "org.apach [...]
-    "CamelAwsS3KeysToDelete": { "index": 38, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"List<String>", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "A list of keys to delete when using 
deleteObjects operation", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#KEYS_TO_DELETE" },
-    "CamelAwsS3RestoreDays": { "index": 39, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"Integer", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "The number of days for which the restore 
request will remain active when using restoreObject operation", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#RESTORE_DAYS" },
-    "CamelAwsS3RestoreTier": { "index": 40, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "The tier at which the restore will be 
processed when using restoreObject operation (e.g., Standard, Bulk, 
Expedited)", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#RESTORE_TIER" },
-    "CamelAwsS3ObjectTags": { "index": 41, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"Map<String, String>", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The object tags to set when using 
putObjectTagging operation", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#OBJECT_TAGS" },
-    "CamelAwsS3BucketTags": { "index": 42, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"Map<String, String>", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The bucket tags to set when using 
putBucketTagging operation", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#BUCKET_TAGS" },
-    "CamelAwsS3BucketPolicy": { "index": 43, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "The bucket policy as JSON string when using 
putBucketPolicy operation", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#BUCKET_POLICY" },
-    "CamelAwsS3VersioningStatus": { "index": 44, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The versioning status (Enabled or 
Suspended) when using putBucketVersioning operation", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#VERSIONING_STATUS" },
-    "CamelAwsS3MfaDelete": { "index": 45, "kind": "header", "displayName": "", 
"group": "producer", "label": "producer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Whether to enable MFA delete when using 
putBucketVersioning operation", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#MFA_DELETE" },
-    "CamelAwsS3UploadLinkExpirationTime": { "index": 46, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "Long", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The expiration time of the upload link 
in milliseconds", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#UPLOAD_LINK_EXPIRATION_TIME"
 },
-    "CamelAwsS3UploadLinkBrowserCompatible": { "index": 47, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Whether the upload link is browser 
compatible", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#UPLOAD_LINK_BROWSER_COMPATIBLE"
 },
-    "CamelAwsS3UploadLinkHttpRequestHeaders": { "index": 48, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "Map<String, List<String>>", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": "The 
headers that are needed by the service for upload (not needed when 
BrowserCompatible is true)", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#UPLOAD_LINK_HTTP_REQUEST_HE 
[...]
-    "CamelAwsS3UploadLinkSignedPayload": { "index": 49, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The request payload that is needed by 
the service for upload (not needed when BrowserCompatible is true)", 
"constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#UPLOAD_LINK_SIGNED_PAYLOAD" 
}
+    "CamelAwsS3GrantFullControl": { "index": 19, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Gives the grantee READ, READ_ACP, and 
WRITE_ACP permissions on the object. The value is a grantee expression such as 
id=, emailAddress= or uri=.", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#GRANT_FULL_ [...]
+    "CamelAwsS3GrantRead": { "index": 20, "kind": "header", "displayName": "", 
"group": "producer", "label": "producer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Allows the grantee to read the object data and 
its metadata. The value is a grantee expression such as id=, emailAddress= or 
uri=.", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#GRANT_READ" },
+    "CamelAwsS3GrantReadACP": { "index": 21, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Allows the grantee to read the object ACL. The 
value is a grantee expression such as id=, emailAddress= or uri=.", 
"constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#GRANT_READ_ACP" },
+    "CamelAwsS3GrantWriteACP": { "index": 22, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Allows the grantee to write the ACL for the 
object. The value is a grantee expression such as id=, emailAddress= or uri=.", 
"constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#GRANT_WRITE_ACP" },
+    "CamelAwsS3Operation": { "index": 23, "kind": "header", "displayName": "", 
"group": "common", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The operation to perform. Permitted values are 
copyObject, deleteObject, listBuckets, deleteBucket, listObjects", 
"constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#S3_OPERATION" },
+    "CamelAwsS3ServerSideEncryption": { "index": 24, "kind": "header", 
"displayName": "", "group": "common", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Sets the server-side encryption 
algorithm when encrypting the object using AWS-managed keys. For example use 
AES256.", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#SERVER_SIDE_ENCRYPTION" },
+    "CamelAwsS3ExpirationTime": { "index": 25, "kind": "header", 
"displayName": "", "group": "consumer", "label": "consumer", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "If the object expiration is configured 
(see PUT Bucket lifecycle), the response includes this header.", 
"constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#EXPIRATION_TIME" },
+    "CamelAwsS3ReplicationStatus": { "index": 26, "kind": "header", 
"displayName": "", "group": "consumer", "label": "consumer", "required": false, 
"javaType": "software.amazon.awssdk.services.s3.model.ReplicationStatus", 
"enum": [ "COMPLETE", "PENDING", "FAILED", "REPLICA", "COMPLETED", "null" ], 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "Amazon S3 can return this if your request involves a 
bucket that is either a source or destinati [...]
+    "CamelAwsS3RangeStart": { "index": 27, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "The position of the first byte to get", 
"constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#RANGE_START" },
+    "CamelAwsS3RangeEnd": { "index": 28, "kind": "header", "displayName": "", 
"group": "producer", "label": "producer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "The position of the last byte to get", 
"constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#RANGE_END" 
},
+    "CamelAwsS3DowloadLinkExpirationTime": { "index": 29, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "Long", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The expiration time of the download 
link in milliseconds", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#DOWNLOAD_LINK_EXPIRATION_TIME"
 },
+    "CamelAwsS3DownloadLinkBrowserCompatible": { "index": 30, "kind": 
"header", "displayName": "", "group": "producer", "label": "producer", 
"required": false, "javaType": "boolean", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": 
"Whether the download link is browser compatible", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#DOWNLOAD_LINK_BROWSER_COMPATIBLE"
 },
+    "CamelAwsS3DownloadLinkHttpRequestHeaders": { "index": 31, "kind": 
"header", "displayName": "", "group": "producer", "label": "producer", 
"required": false, "javaType": "Map<String, List<String>>", "deprecated": 
false, "deprecationNote": "", "autowired": false, "secret": false, 
"description": "The headers that are needed by the service (not needed when 
BrowserCompatible is true)", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#DOWNLOAD_LINK_HTTP_REQUEST_HEADERS"
 },
+    "CamelAwsS3DownloadLinkSignedPayload": { "index": 32, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The request payload that is needed by 
the service (not needed when BrowserCompatible is true)", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#DOWNLOAD_LINK_SIGNED_PAYLOAD"
 },
+    "CamelAwsS3Metadata": { "index": 33, "kind": "header", "displayName": "", 
"group": "common", "label": "", "required": false, "javaType": "Map<String, 
String>", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "A map of metadata to be stored or stored with 
the object in S3. More details about metadata 
https:\/\/docs.aws.amazon.com\/AmazonS3\/latest\/userguide\/UsingMetadata.htmlhere.",
 "constantName": "org.apache.camel.component.aws2.s3.A [...]
+    "CamelMessageTimestamp": { "index": 34, "kind": "header", "displayName": 
"", "group": "consumer", "label": "consumer", "required": false, "javaType": 
"long", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "The timestamp of the message", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#MESSAGE_TIMESTAMP" },
+    "CamelAwsS3Prefix": { "index": 35, "kind": "header", "displayName": "", 
"group": "common", "label": "", "required": false, "javaType": "", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The prefix which is used in the 
com.amazonaws.services.s3.model.ListObjectsRequest to only list objects we are 
interested in", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#PREFIX" },
+    "CamelAwsS3Delimiter": { "index": 36, "kind": "header", "displayName": "", 
"group": "common", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The delimiter which is used in the 
com.amazonaws.services.s3.model.ListObjectsRequest to only list objects we are 
interested in", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#DELIMITER" },
+    "CamelAwsS3IfMatchCondition": { "index": 37, "kind": "header", 
"displayName": "", "group": "common", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Return\/copy the object only if its 
entity tag (ETag) is the same as the one specified in this header.", 
"constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#IF_MATCH_CONDITION" },
+    "CamelAwsS3IfModifiedSinceCondition": { "index": 38, "kind": "header", 
"displayName": "", "group": "common", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Return\/copy the object only if it has 
been modified since the specified time; otherwise, return a 304 Not Modified 
error.", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#IF_MODIFIED_SINCE_CONDITION"
 },
+    "CamelAwsS3IfNoneMatchCondition": { "index": 39, "kind": "header", 
"displayName": "", "group": "common", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Return\/copy the object only if its 
entity tag (ETag) is different from the one specified in this header.", 
"constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#IF_NONE_MATCH_CONDITION" },
+    "CamelAwsS3IfUnmodifiedSinceCondition": { "index": 40, "kind": "header", 
"displayName": "", "group": "common", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Return\/copy the object only if it has 
not been modified since the specified time.", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#IF_UNMODIFIED_SINCE_CONDITION"
 },
+    "CamelAwsS3OverrideBucketName": { "index": 41, "kind": "header", 
"displayName": "", "group": "common", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The bucket Name to override (can be 
dynamic using the simple language in the producer) which this object will be 
stored or which will be used for the current operation or in which this object 
is contained.", "constantName": "org.apach [...]
+    "CamelAwsS3KeysToDelete": { "index": 42, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"List<String>", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "A list of keys to delete when using 
deleteObjects operation", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#KEYS_TO_DELETE" },
+    "CamelAwsS3RestoreDays": { "index": 43, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"Integer", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "The number of days for which the restore 
request will remain active when using restoreObject operation", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#RESTORE_DAYS" },
+    "CamelAwsS3RestoreTier": { "index": 44, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "The tier at which the restore will be 
processed when using restoreObject operation (e.g., Standard, Bulk, 
Expedited)", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#RESTORE_TIER" },
+    "CamelAwsS3ObjectTags": { "index": 45, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"Map<String, String>", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The object tags to set when using 
putObjectTagging operation", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#OBJECT_TAGS" },
+    "CamelAwsS3BucketTags": { "index": 46, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"Map<String, String>", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The bucket tags to set when using 
putBucketTagging operation", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#BUCKET_TAGS" },
+    "CamelAwsS3BucketPolicy": { "index": 47, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "The bucket policy as JSON string when using 
putBucketPolicy operation", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#BUCKET_POLICY" },
+    "CamelAwsS3VersioningStatus": { "index": 48, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The versioning status (Enabled or 
Suspended) when using putBucketVersioning operation", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#VERSIONING_STATUS" },
+    "CamelAwsS3MfaDelete": { "index": 49, "kind": "header", "displayName": "", 
"group": "producer", "label": "producer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Whether to enable MFA delete when using 
putBucketVersioning operation", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#MFA_DELETE" },
+    "CamelAwsS3UploadLinkExpirationTime": { "index": 50, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "Long", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The expiration time of the upload link 
in milliseconds", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#UPLOAD_LINK_EXPIRATION_TIME"
 },
+    "CamelAwsS3UploadLinkBrowserCompatible": { "index": 51, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Whether the upload link is browser 
compatible", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#UPLOAD_LINK_BROWSER_COMPATIBLE"
 },
+    "CamelAwsS3UploadLinkHttpRequestHeaders": { "index": 52, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "Map<String, List<String>>", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": "The 
headers that are needed by the service for upload (not needed when 
BrowserCompatible is true)", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#UPLOAD_LINK_HTTP_REQUEST_HE 
[...]
+    "CamelAwsS3UploadLinkSignedPayload": { "index": 53, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The request payload that is needed by 
the service for upload (not needed when BrowserCompatible is true)", 
"constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#UPLOAD_LINK_SIGNED_PAYLOAD" 
}
   },
   "properties": {
     "bucketNameOrArn": { "index": 0, "kind": "path", "displayName": "Bucket 
Name Or Arn", "group": "common", "label": "", "required": true, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": 
"Bucket name or ARN" },
diff --git 
a/components/camel-aws/camel-aws2-s3/src/generated/resources/META-INF/org/apache/camel/component/aws2/s3/aws2-s3.json
 
b/components/camel-aws/camel-aws2-s3/src/generated/resources/META-INF/org/apache/camel/component/aws2/s3/aws2-s3.json
index 214925e76b61..a89aec93b28d 100644
--- 
a/components/camel-aws/camel-aws2-s3/src/generated/resources/META-INF/org/apache/camel/component/aws2/s3/aws2-s3.json
+++ 
b/components/camel-aws/camel-aws2-s3/src/generated/resources/META-INF/org/apache/camel/component/aws2/s3/aws2-s3.json
@@ -109,37 +109,41 @@
     "CamelAwsS3VersionId": { "index": 16, "kind": "header", "displayName": "", 
"group": "common", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "(producer) The optional version ID of the newly uploaded 
object. (consumer) The version ID of the associated Amazon S3 object if 
available. Version IDs are only assigned to objects when an object is uploaded 
to an Amazon S3 bucket that has obj [...]
     "CamelAwsS3CannedAcl": { "index": 17, "kind": "header", "displayName": "", 
"group": "producer", "label": "producer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "The canned acl that will be applied to the 
object. see software.amazon.awssdk.services.s3.model.ObjectCannedACL for 
allowed values.", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#CANNED_ACL" },
     "CamelAwsS3Acl": { "index": 18, "kind": "header", "displayName": "", 
"group": "producer", "label": "producer", "required": false, "javaType": 
"software.amazon.awssdk.services.s3.model.BucketCannedACL", "enum": [ 
"private", "public-read", "public-read-write", "authenticated-read", "null" ], 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "A well constructed Amazon S3 Access Control List 
object.", "constantName": "org.apache.camel.compone [...]
-    "CamelAwsS3Operation": { "index": 19, "kind": "header", "displayName": "", 
"group": "common", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The operation to perform. Permitted values are 
copyObject, deleteObject, listBuckets, deleteBucket, listObjects", 
"constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#S3_OPERATION" },
-    "CamelAwsS3ServerSideEncryption": { "index": 20, "kind": "header", 
"displayName": "", "group": "common", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Sets the server-side encryption 
algorithm when encrypting the object using AWS-managed keys. For example use 
AES256.", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#SERVER_SIDE_ENCRYPTION" },
-    "CamelAwsS3ExpirationTime": { "index": 21, "kind": "header", 
"displayName": "", "group": "consumer", "label": "consumer", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "If the object expiration is configured 
(see PUT Bucket lifecycle), the response includes this header.", 
"constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#EXPIRATION_TIME" },
-    "CamelAwsS3ReplicationStatus": { "index": 22, "kind": "header", 
"displayName": "", "group": "consumer", "label": "consumer", "required": false, 
"javaType": "software.amazon.awssdk.services.s3.model.ReplicationStatus", 
"enum": [ "COMPLETE", "PENDING", "FAILED", "REPLICA", "COMPLETED", "null" ], 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "Amazon S3 can return this if your request involves a 
bucket that is either a source or destinati [...]
-    "CamelAwsS3RangeStart": { "index": 23, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "The position of the first byte to get", 
"constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#RANGE_START" },
-    "CamelAwsS3RangeEnd": { "index": 24, "kind": "header", "displayName": "", 
"group": "producer", "label": "producer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "The position of the last byte to get", 
"constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#RANGE_END" 
},
-    "CamelAwsS3DowloadLinkExpirationTime": { "index": 25, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "Long", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The expiration time of the download 
link in milliseconds", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#DOWNLOAD_LINK_EXPIRATION_TIME"
 },
-    "CamelAwsS3DownloadLinkBrowserCompatible": { "index": 26, "kind": 
"header", "displayName": "", "group": "producer", "label": "producer", 
"required": false, "javaType": "boolean", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": 
"Whether the download link is browser compatible", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#DOWNLOAD_LINK_BROWSER_COMPATIBLE"
 },
-    "CamelAwsS3DownloadLinkHttpRequestHeaders": { "index": 27, "kind": 
"header", "displayName": "", "group": "producer", "label": "producer", 
"required": false, "javaType": "Map<String, List<String>>", "deprecated": 
false, "deprecationNote": "", "autowired": false, "secret": false, 
"description": "The headers that are needed by the service (not needed when 
BrowserCompatible is true)", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#DOWNLOAD_LINK_HTTP_REQUEST_HEADERS"
 },
-    "CamelAwsS3DownloadLinkSignedPayload": { "index": 28, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The request payload that is needed by 
the service (not needed when BrowserCompatible is true)", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#DOWNLOAD_LINK_SIGNED_PAYLOAD"
 },
-    "CamelAwsS3Metadata": { "index": 29, "kind": "header", "displayName": "", 
"group": "common", "label": "", "required": false, "javaType": "Map<String, 
String>", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "A map of metadata to be stored or stored with 
the object in S3. More details about metadata 
https:\/\/docs.aws.amazon.com\/AmazonS3\/latest\/userguide\/UsingMetadata.htmlhere.",
 "constantName": "org.apache.camel.component.aws2.s3.A [...]
-    "CamelMessageTimestamp": { "index": 30, "kind": "header", "displayName": 
"", "group": "consumer", "label": "consumer", "required": false, "javaType": 
"long", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "The timestamp of the message", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#MESSAGE_TIMESTAMP" },
-    "CamelAwsS3Prefix": { "index": 31, "kind": "header", "displayName": "", 
"group": "common", "label": "", "required": false, "javaType": "", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The prefix which is used in the 
com.amazonaws.services.s3.model.ListObjectsRequest to only list objects we are 
interested in", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#PREFIX" },
-    "CamelAwsS3Delimiter": { "index": 32, "kind": "header", "displayName": "", 
"group": "common", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The delimiter which is used in the 
com.amazonaws.services.s3.model.ListObjectsRequest to only list objects we are 
interested in", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#DELIMITER" },
-    "CamelAwsS3IfMatchCondition": { "index": 33, "kind": "header", 
"displayName": "", "group": "common", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Return\/copy the object only if its 
entity tag (ETag) is the same as the one specified in this header.", 
"constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#IF_MATCH_CONDITION" },
-    "CamelAwsS3IfModifiedSinceCondition": { "index": 34, "kind": "header", 
"displayName": "", "group": "common", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Return\/copy the object only if it has 
been modified since the specified time; otherwise, return a 304 Not Modified 
error.", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#IF_MODIFIED_SINCE_CONDITION"
 },
-    "CamelAwsS3IfNoneMatchCondition": { "index": 35, "kind": "header", 
"displayName": "", "group": "common", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Return\/copy the object only if its 
entity tag (ETag) is different from the one specified in this header.", 
"constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#IF_NONE_MATCH_CONDITION" },
-    "CamelAwsS3IfUnmodifiedSinceCondition": { "index": 36, "kind": "header", 
"displayName": "", "group": "common", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Return\/copy the object only if it has 
not been modified since the specified time.", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#IF_UNMODIFIED_SINCE_CONDITION"
 },
-    "CamelAwsS3OverrideBucketName": { "index": 37, "kind": "header", 
"displayName": "", "group": "common", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The bucket Name to override (can be 
dynamic using the simple language in the producer) which this object will be 
stored or which will be used for the current operation or in which this object 
is contained.", "constantName": "org.apach [...]
-    "CamelAwsS3KeysToDelete": { "index": 38, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"List<String>", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "A list of keys to delete when using 
deleteObjects operation", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#KEYS_TO_DELETE" },
-    "CamelAwsS3RestoreDays": { "index": 39, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"Integer", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "The number of days for which the restore 
request will remain active when using restoreObject operation", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#RESTORE_DAYS" },
-    "CamelAwsS3RestoreTier": { "index": 40, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "The tier at which the restore will be 
processed when using restoreObject operation (e.g., Standard, Bulk, 
Expedited)", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#RESTORE_TIER" },
-    "CamelAwsS3ObjectTags": { "index": 41, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"Map<String, String>", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The object tags to set when using 
putObjectTagging operation", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#OBJECT_TAGS" },
-    "CamelAwsS3BucketTags": { "index": 42, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"Map<String, String>", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The bucket tags to set when using 
putBucketTagging operation", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#BUCKET_TAGS" },
-    "CamelAwsS3BucketPolicy": { "index": 43, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "The bucket policy as JSON string when using 
putBucketPolicy operation", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#BUCKET_POLICY" },
-    "CamelAwsS3VersioningStatus": { "index": 44, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The versioning status (Enabled or 
Suspended) when using putBucketVersioning operation", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#VERSIONING_STATUS" },
-    "CamelAwsS3MfaDelete": { "index": 45, "kind": "header", "displayName": "", 
"group": "producer", "label": "producer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Whether to enable MFA delete when using 
putBucketVersioning operation", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#MFA_DELETE" },
-    "CamelAwsS3UploadLinkExpirationTime": { "index": 46, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "Long", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The expiration time of the upload link 
in milliseconds", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#UPLOAD_LINK_EXPIRATION_TIME"
 },
-    "CamelAwsS3UploadLinkBrowserCompatible": { "index": 47, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Whether the upload link is browser 
compatible", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#UPLOAD_LINK_BROWSER_COMPATIBLE"
 },
-    "CamelAwsS3UploadLinkHttpRequestHeaders": { "index": 48, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "Map<String, List<String>>", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": "The 
headers that are needed by the service for upload (not needed when 
BrowserCompatible is true)", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#UPLOAD_LINK_HTTP_REQUEST_HE 
[...]
-    "CamelAwsS3UploadLinkSignedPayload": { "index": 49, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The request payload that is needed by 
the service for upload (not needed when BrowserCompatible is true)", 
"constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#UPLOAD_LINK_SIGNED_PAYLOAD" 
}
+    "CamelAwsS3GrantFullControl": { "index": 19, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Gives the grantee READ, READ_ACP, and 
WRITE_ACP permissions on the object. The value is a grantee expression such as 
id=, emailAddress= or uri=.", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#GRANT_FULL_ [...]
+    "CamelAwsS3GrantRead": { "index": 20, "kind": "header", "displayName": "", 
"group": "producer", "label": "producer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Allows the grantee to read the object data and 
its metadata. The value is a grantee expression such as id=, emailAddress= or 
uri=.", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#GRANT_READ" },
+    "CamelAwsS3GrantReadACP": { "index": 21, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Allows the grantee to read the object ACL. The 
value is a grantee expression such as id=, emailAddress= or uri=.", 
"constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#GRANT_READ_ACP" },
+    "CamelAwsS3GrantWriteACP": { "index": 22, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Allows the grantee to write the ACL for the 
object. The value is a grantee expression such as id=, emailAddress= or uri=.", 
"constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#GRANT_WRITE_ACP" },
+    "CamelAwsS3Operation": { "index": 23, "kind": "header", "displayName": "", 
"group": "common", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The operation to perform. Permitted values are 
copyObject, deleteObject, listBuckets, deleteBucket, listObjects", 
"constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#S3_OPERATION" },
+    "CamelAwsS3ServerSideEncryption": { "index": 24, "kind": "header", 
"displayName": "", "group": "common", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Sets the server-side encryption 
algorithm when encrypting the object using AWS-managed keys. For example use 
AES256.", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#SERVER_SIDE_ENCRYPTION" },
+    "CamelAwsS3ExpirationTime": { "index": 25, "kind": "header", 
"displayName": "", "group": "consumer", "label": "consumer", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "If the object expiration is configured 
(see PUT Bucket lifecycle), the response includes this header.", 
"constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#EXPIRATION_TIME" },
+    "CamelAwsS3ReplicationStatus": { "index": 26, "kind": "header", 
"displayName": "", "group": "consumer", "label": "consumer", "required": false, 
"javaType": "software.amazon.awssdk.services.s3.model.ReplicationStatus", 
"enum": [ "COMPLETE", "PENDING", "FAILED", "REPLICA", "COMPLETED", "null" ], 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "Amazon S3 can return this if your request involves a 
bucket that is either a source or destinati [...]
+    "CamelAwsS3RangeStart": { "index": 27, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "The position of the first byte to get", 
"constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#RANGE_START" },
+    "CamelAwsS3RangeEnd": { "index": 28, "kind": "header", "displayName": "", 
"group": "producer", "label": "producer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "The position of the last byte to get", 
"constantName": "org.apache.camel.component.aws2.s3.AWS2S3Constants#RANGE_END" 
},
+    "CamelAwsS3DowloadLinkExpirationTime": { "index": 29, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "Long", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The expiration time of the download 
link in milliseconds", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#DOWNLOAD_LINK_EXPIRATION_TIME"
 },
+    "CamelAwsS3DownloadLinkBrowserCompatible": { "index": 30, "kind": 
"header", "displayName": "", "group": "producer", "label": "producer", 
"required": false, "javaType": "boolean", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": 
"Whether the download link is browser compatible", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#DOWNLOAD_LINK_BROWSER_COMPATIBLE"
 },
+    "CamelAwsS3DownloadLinkHttpRequestHeaders": { "index": 31, "kind": 
"header", "displayName": "", "group": "producer", "label": "producer", 
"required": false, "javaType": "Map<String, List<String>>", "deprecated": 
false, "deprecationNote": "", "autowired": false, "secret": false, 
"description": "The headers that are needed by the service (not needed when 
BrowserCompatible is true)", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#DOWNLOAD_LINK_HTTP_REQUEST_HEADERS"
 },
+    "CamelAwsS3DownloadLinkSignedPayload": { "index": 32, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The request payload that is needed by 
the service (not needed when BrowserCompatible is true)", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#DOWNLOAD_LINK_SIGNED_PAYLOAD"
 },
+    "CamelAwsS3Metadata": { "index": 33, "kind": "header", "displayName": "", 
"group": "common", "label": "", "required": false, "javaType": "Map<String, 
String>", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "A map of metadata to be stored or stored with 
the object in S3. More details about metadata 
https:\/\/docs.aws.amazon.com\/AmazonS3\/latest\/userguide\/UsingMetadata.htmlhere.",
 "constantName": "org.apache.camel.component.aws2.s3.A [...]
+    "CamelMessageTimestamp": { "index": 34, "kind": "header", "displayName": 
"", "group": "consumer", "label": "consumer", "required": false, "javaType": 
"long", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "The timestamp of the message", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#MESSAGE_TIMESTAMP" },
+    "CamelAwsS3Prefix": { "index": 35, "kind": "header", "displayName": "", 
"group": "common", "label": "", "required": false, "javaType": "", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The prefix which is used in the 
com.amazonaws.services.s3.model.ListObjectsRequest to only list objects we are 
interested in", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#PREFIX" },
+    "CamelAwsS3Delimiter": { "index": 36, "kind": "header", "displayName": "", 
"group": "common", "label": "", "required": false, "javaType": "String", 
"deprecated": false, "deprecationNote": "", "autowired": false, "secret": 
false, "description": "The delimiter which is used in the 
com.amazonaws.services.s3.model.ListObjectsRequest to only list objects we are 
interested in", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#DELIMITER" },
+    "CamelAwsS3IfMatchCondition": { "index": 37, "kind": "header", 
"displayName": "", "group": "common", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Return\/copy the object only if its 
entity tag (ETag) is the same as the one specified in this header.", 
"constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#IF_MATCH_CONDITION" },
+    "CamelAwsS3IfModifiedSinceCondition": { "index": 38, "kind": "header", 
"displayName": "", "group": "common", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Return\/copy the object only if it has 
been modified since the specified time; otherwise, return a 304 Not Modified 
error.", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#IF_MODIFIED_SINCE_CONDITION"
 },
+    "CamelAwsS3IfNoneMatchCondition": { "index": 39, "kind": "header", 
"displayName": "", "group": "common", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Return\/copy the object only if its 
entity tag (ETag) is different from the one specified in this header.", 
"constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#IF_NONE_MATCH_CONDITION" },
+    "CamelAwsS3IfUnmodifiedSinceCondition": { "index": 40, "kind": "header", 
"displayName": "", "group": "common", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Return\/copy the object only if it has 
not been modified since the specified time.", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#IF_UNMODIFIED_SINCE_CONDITION"
 },
+    "CamelAwsS3OverrideBucketName": { "index": 41, "kind": "header", 
"displayName": "", "group": "common", "label": "", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The bucket Name to override (can be 
dynamic using the simple language in the producer) which this object will be 
stored or which will be used for the current operation or in which this object 
is contained.", "constantName": "org.apach [...]
+    "CamelAwsS3KeysToDelete": { "index": 42, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"List<String>", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "A list of keys to delete when using 
deleteObjects operation", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#KEYS_TO_DELETE" },
+    "CamelAwsS3RestoreDays": { "index": 43, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"Integer", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "The number of days for which the restore 
request will remain active when using restoreObject operation", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#RESTORE_DAYS" },
+    "CamelAwsS3RestoreTier": { "index": 44, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "The tier at which the restore will be 
processed when using restoreObject operation (e.g., Standard, Bulk, 
Expedited)", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#RESTORE_TIER" },
+    "CamelAwsS3ObjectTags": { "index": 45, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"Map<String, String>", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The object tags to set when using 
putObjectTagging operation", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#OBJECT_TAGS" },
+    "CamelAwsS3BucketTags": { "index": 46, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"Map<String, String>", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The bucket tags to set when using 
putBucketTagging operation", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#BUCKET_TAGS" },
+    "CamelAwsS3BucketPolicy": { "index": 47, "kind": "header", "displayName": 
"", "group": "producer", "label": "producer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "The bucket policy as JSON string when using 
putBucketPolicy operation", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#BUCKET_POLICY" },
+    "CamelAwsS3VersioningStatus": { "index": 48, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The versioning status (Enabled or 
Suspended) when using putBucketVersioning operation", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#VERSIONING_STATUS" },
+    "CamelAwsS3MfaDelete": { "index": 49, "kind": "header", "displayName": "", 
"group": "producer", "label": "producer", "required": false, "javaType": 
"String", "deprecated": false, "deprecationNote": "", "autowired": false, 
"secret": false, "description": "Whether to enable MFA delete when using 
putBucketVersioning operation", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#MFA_DELETE" },
+    "CamelAwsS3UploadLinkExpirationTime": { "index": 50, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "Long", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The expiration time of the upload link 
in milliseconds", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#UPLOAD_LINK_EXPIRATION_TIME"
 },
+    "CamelAwsS3UploadLinkBrowserCompatible": { "index": 51, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "boolean", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "Whether the upload link is browser 
compatible", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#UPLOAD_LINK_BROWSER_COMPATIBLE"
 },
+    "CamelAwsS3UploadLinkHttpRequestHeaders": { "index": 52, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "Map<String, List<String>>", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": "The 
headers that are needed by the service for upload (not needed when 
BrowserCompatible is true)", "constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#UPLOAD_LINK_HTTP_REQUEST_HE 
[...]
+    "CamelAwsS3UploadLinkSignedPayload": { "index": 53, "kind": "header", 
"displayName": "", "group": "producer", "label": "producer", "required": false, 
"javaType": "String", "deprecated": false, "deprecationNote": "", "autowired": 
false, "secret": false, "description": "The request payload that is needed by 
the service for upload (not needed when BrowserCompatible is true)", 
"constantName": 
"org.apache.camel.component.aws2.s3.AWS2S3Constants#UPLOAD_LINK_SIGNED_PAYLOAD" 
}
   },
   "properties": {
     "bucketNameOrArn": { "index": 0, "kind": "path", "displayName": "Bucket 
Name Or Arn", "group": "common", "label": "", "required": true, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, 
"deprecationNote": "", "autowired": false, "secret": false, "description": 
"Bucket name or ARN" },
diff --git 
a/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Constants.java
 
b/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Constants.java
index 9d80234ed82d..ee9690a0b62a 100644
--- 
a/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Constants.java
+++ 
b/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Constants.java
@@ -112,6 +112,26 @@ public interface AWS2S3Constants {
     @Metadata(label = "producer", description = "A well constructed Amazon S3 
Access Control List object.",
               javaType = 
"software.amazon.awssdk.services.s3.model.BucketCannedACL")
     String ACL = "CamelAwsS3Acl";
+    @Metadata(label = "producer", description = """
+            Gives the grantee READ, READ_ACP, and WRITE_ACP permissions on the 
object. The value is a grantee
+            expression such as `id=<canonical-user-id>`, 
`emailAddress=<email>` or `uri=<group-uri>`.""",
+              javaType = "String")
+    String GRANT_FULL_CONTROL = "CamelAwsS3GrantFullControl";
+    @Metadata(label = "producer", description = """
+            Allows the grantee to read the object data and its metadata. The 
value is a grantee expression such as
+            `id=<canonical-user-id>`, `emailAddress=<email>` or 
`uri=<group-uri>`.""",
+              javaType = "String")
+    String GRANT_READ = "CamelAwsS3GrantRead";
+    @Metadata(label = "producer", description = """
+            Allows the grantee to read the object ACL. The value is a grantee 
expression such as
+            `id=<canonical-user-id>`, `emailAddress=<email>` or 
`uri=<group-uri>`.""",
+              javaType = "String")
+    String GRANT_READ_ACP = "CamelAwsS3GrantReadACP";
+    @Metadata(label = "producer", description = """
+            Allows the grantee to write the ACL for the object. The value is a 
grantee expression such as
+            `id=<canonical-user-id>`, `emailAddress=<email>` or 
`uri=<group-uri>`.""",
+              javaType = "String")
+    String GRANT_WRITE_ACP = "CamelAwsS3GrantWriteACP";
     @Metadata(description = "The operation to perform. Permitted values are 
copyObject, deleteObject, listBuckets, deleteBucket, listObjects",
               javaType = "String")
     String S3_OPERATION = "CamelAwsS3Operation";
diff --git 
a/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Producer.java
 
b/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Producer.java
index 4b9bd26c7b5e..da44011edbe5 100644
--- 
a/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Producer.java
+++ 
b/components/camel-aws/camel-aws2-s3/src/main/java/org/apache/camel/component/aws2/s3/AWS2S3Producer.java
@@ -241,6 +241,26 @@ public class AWS2S3Producer extends DefaultProducer {
             createMultipartUploadRequest.acl(objectAcl);
         }
 
+        String grantFullControl = 
exchange.getIn().getHeader(AWS2S3Constants.GRANT_FULL_CONTROL, String.class);
+        if (ObjectHelper.isNotEmpty(grantFullControl)) {
+            createMultipartUploadRequest.grantFullControl(grantFullControl);
+        }
+
+        String grantRead = 
exchange.getIn().getHeader(AWS2S3Constants.GRANT_READ, String.class);
+        if (ObjectHelper.isNotEmpty(grantRead)) {
+            createMultipartUploadRequest.grantRead(grantRead);
+        }
+
+        String grantReadACP = 
exchange.getIn().getHeader(AWS2S3Constants.GRANT_READ_ACP, String.class);
+        if (ObjectHelper.isNotEmpty(grantReadACP)) {
+            createMultipartUploadRequest.grantReadACP(grantReadACP);
+        }
+
+        String grantWriteACP = 
exchange.getIn().getHeader(AWS2S3Constants.GRANT_WRITE_ACP, String.class);
+        if (ObjectHelper.isNotEmpty(grantWriteACP)) {
+            createMultipartUploadRequest.grantWriteACP(grantWriteACP);
+        }
+
         BucketCannedACL acl = exchange.getIn().getHeader(AWS2S3Constants.ACL, 
BucketCannedACL.class);
         if (ObjectHelper.isNotEmpty(acl)) {
             // note: if cannedacl and acl are both specified the last one will
@@ -396,6 +416,26 @@ public class AWS2S3Producer extends DefaultProducer {
             putObjectRequest.acl(objectAcl);
         }
 
+        String grantFullControl = 
exchange.getIn().getHeader(AWS2S3Constants.GRANT_FULL_CONTROL, String.class);
+        if (ObjectHelper.isNotEmpty(grantFullControl)) {
+            putObjectRequest.grantFullControl(grantFullControl);
+        }
+
+        String grantRead = 
exchange.getIn().getHeader(AWS2S3Constants.GRANT_READ, String.class);
+        if (ObjectHelper.isNotEmpty(grantRead)) {
+            putObjectRequest.grantRead(grantRead);
+        }
+
+        String grantReadACP = 
exchange.getIn().getHeader(AWS2S3Constants.GRANT_READ_ACP, String.class);
+        if (ObjectHelper.isNotEmpty(grantReadACP)) {
+            putObjectRequest.grantReadACP(grantReadACP);
+        }
+
+        String grantWriteACP = 
exchange.getIn().getHeader(AWS2S3Constants.GRANT_WRITE_ACP, String.class);
+        if (ObjectHelper.isNotEmpty(grantWriteACP)) {
+            putObjectRequest.grantWriteACP(grantWriteACP);
+        }
+
         String contentType = 
exchange.getIn().getHeader(AWS2S3Constants.CONTENT_TYPE, String.class);
         if (ObjectHelper.isNotEmpty(contentType)) {
             putObjectRequest.contentType(contentType);
diff --git 
a/components/camel-aws/camel-aws2-s3/src/test/java/org/apache/camel/component/aws2/s3/AWS2S3ProducerAclGrantTest.java
 
b/components/camel-aws/camel-aws2-s3/src/test/java/org/apache/camel/component/aws2/s3/AWS2S3ProducerAclGrantTest.java
new file mode 100644
index 000000000000..8843b0093225
--- /dev/null
+++ 
b/components/camel-aws/camel-aws2-s3/src/test/java/org/apache/camel/component/aws2/s3/AWS2S3ProducerAclGrantTest.java
@@ -0,0 +1,118 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.aws2.s3;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.support.DefaultExchange;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import software.amazon.awssdk.core.sync.RequestBody;
+import software.amazon.awssdk.http.SdkHttpResponse;
+import software.amazon.awssdk.services.s3.S3Client;
+import software.amazon.awssdk.services.s3.model.PutObjectRequest;
+import software.amazon.awssdk.services.s3.model.PutObjectResponse;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+/**
+ * Verifies that the {@code CamelAwsS3Grant*} headers are applied as explicit 
ACL grants on the {@code PutObject}
+ * request (CAMEL-16809).
+ */
+class AWS2S3ProducerAclGrantTest {
+
+    @Mock
+    private AWS2S3Endpoint endpoint;
+
+    @Mock
+    private AWS2S3Configuration configuration;
+
+    @Mock
+    private S3Client s3Client;
+
+    private AWS2S3Producer producer;
+    private DefaultCamelContext camelContext;
+
+    @BeforeEach
+    void setUp() {
+        MockitoAnnotations.openMocks(this);
+        camelContext = new DefaultCamelContext();
+        when(endpoint.getConfiguration()).thenReturn(configuration);
+        when(endpoint.getCamelContext()).thenReturn(camelContext);
+        when(endpoint.getS3Client()).thenReturn(s3Client);
+        when(configuration.getBucketName()).thenReturn("test-bucket");
+        producer = new AWS2S3Producer(endpoint);
+    }
+
+    private void mockPutObject() {
+        when(s3Client.putObject(any(PutObjectRequest.class), 
any(RequestBody.class)))
+                .thenReturn((PutObjectResponse) PutObjectResponse.builder()
+                        
.sdkHttpResponse(SdkHttpResponse.builder().statusCode(200).build())
+                        .build());
+    }
+
+    private PutObjectRequest capturePutObjectRequest() {
+        ArgumentCaptor<PutObjectRequest> captor = 
ArgumentCaptor.forClass(PutObjectRequest.class);
+        verify(s3Client).putObject(captor.capture(), any(RequestBody.class));
+        return captor.getValue();
+    }
+
+    @Test
+    void putObjectShouldApplyAclGrantHeaders() throws Exception {
+        mockPutObject();
+
+        Exchange exchange = new DefaultExchange(camelContext);
+        exchange.getIn().setHeader(AWS2S3Constants.KEY, "my-key");
+        exchange.getIn().setHeader(AWS2S3Constants.GRANT_FULL_CONTROL, 
"id=canonical-full");
+        exchange.getIn().setHeader(AWS2S3Constants.GRANT_READ, 
"id=canonical-read");
+        exchange.getIn().setHeader(AWS2S3Constants.GRANT_READ_ACP, 
"[email protected]");
+        exchange.getIn().setHeader(AWS2S3Constants.GRANT_WRITE_ACP,
+                "uri=http://acs.amazonaws.com/groups/global/AllUsers";);
+        exchange.getIn().setBody("hello grant");
+
+        producer.process(exchange);
+
+        PutObjectRequest request = capturePutObjectRequest();
+        assertThat(request.grantFullControl()).isEqualTo("id=canonical-full");
+        assertThat(request.grantRead()).isEqualTo("id=canonical-read");
+        
assertThat(request.grantReadACP()).isEqualTo("[email protected]");
+        
assertThat(request.grantWriteACP()).isEqualTo("uri=http://acs.amazonaws.com/groups/global/AllUsers";);
+    }
+
+    @Test
+    void putObjectWithoutGrantHeadersLeavesGrantsUnset() throws Exception {
+        mockPutObject();
+
+        Exchange exchange = new DefaultExchange(camelContext);
+        exchange.getIn().setHeader(AWS2S3Constants.KEY, "my-key");
+        exchange.getIn().setBody("hello");
+
+        producer.process(exchange);
+
+        PutObjectRequest request = capturePutObjectRequest();
+        assertThat(request.grantFullControl()).isNull();
+        assertThat(request.grantRead()).isNull();
+        assertThat(request.grantReadACP()).isNull();
+        assertThat(request.grantWriteACP()).isNull();
+    }
+}
diff --git 
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/AWS2S3EndpointBuilderFactory.java
 
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/AWS2S3EndpointBuilderFactory.java
index dee1c1366d97..4b877c350eb5 100644
--- 
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/AWS2S3EndpointBuilderFactory.java
+++ 
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/AWS2S3EndpointBuilderFactory.java
@@ -3982,6 +3982,59 @@ public interface AWS2S3EndpointBuilderFactory {
         public String awsS3Acl() {
             return "CamelAwsS3Acl";
         }
+        /**
+         * Gives the grantee READ, READ_ACP, and WRITE_ACP permissions on the
+         * object. The value is a grantee expression such as id=, emailAddress=
+         * or uri=.
+         * 
+         * The option is a: {@code String} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code AwsS3GrantFullControl}.
+         */
+        public String awsS3GrantFullControl() {
+            return "CamelAwsS3GrantFullControl";
+        }
+        /**
+         * Allows the grantee to read the object data and its metadata. The
+         * value is a grantee expression such as id=, emailAddress= or uri=.
+         * 
+         * The option is a: {@code String} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code AwsS3GrantRead}.
+         */
+        public String awsS3GrantRead() {
+            return "CamelAwsS3GrantRead";
+        }
+        /**
+         * Allows the grantee to read the object ACL. The value is a grantee
+         * expression such as id=, emailAddress= or uri=.
+         * 
+         * The option is a: {@code String} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code AwsS3GrantReadACP}.
+         */
+        public String awsS3GrantReadACP() {
+            return "CamelAwsS3GrantReadACP";
+        }
+        /**
+         * Allows the grantee to write the ACL for the object. The value is a
+         * grantee expression such as id=, emailAddress= or uri=.
+         * 
+         * The option is a: {@code String} type.
+         * 
+         * Group: producer
+         * 
+         * @return the name of the header {@code AwsS3GrantWriteACP}.
+         */
+        public String awsS3GrantWriteACP() {
+            return "CamelAwsS3GrantWriteACP";
+        }
         /**
          * The operation to perform. Permitted values are copyObject,
          * deleteObject, listBuckets, deleteBucket, listObjects.

Reply via email to