import
java
.
io
.
Serializable
;
import
java
.
util
.
Date
;
import
java
.
util
.
HashMap
;
import
java
.
util
.
Map
;
import
com
.
amazonaws
.
AmazonWebServiceRequest
;
import
com
.
amazonaws
.
HttpMethod
;
import
com
.
amazonaws
.
services
.
s3
.
AmazonS3
;
* Contains options to generate a pre-signed URL for an Amazon S3 resource.
* Pre-signed URLs allow clients to form a URL for an Amazon S3 resource and
* sign it with the current Amazon Web Services security credentials.
* A pre-signed URL may be passed around for other users to access
* the resource without providing them
* access to an account's Amazon Web Services security credentials.
* @see AmazonS3#generatePresignedUrl(GeneratePresignedUrlRequest)
public
class
GeneratePresignedUrlRequest
extends
AmazonWebServiceRequest
implements
SSECustomerKeyProvider
,
Serializable
{
/** The HTTP method (GET, PUT, DELETE, HEAD) to be used in this request and when the pre-signed URL is used */
private
HttpMethod
method
;
* The name of the bucket involved in this request
* When using this API with an access point, you must direct requests
* to the access point hostname. The access point hostname takes the form
* <i>AccessPointName</i>-<i>AccountId</i>.s3-accesspoint.<i>Region</i>.amazonaws.com.
* When using this operation using an access point through the Amazon Web Services SDKs, you provide
* the access point ARN in place of the bucket name. For more information about access point
* ARNs, see <a href=\"https://docs.aws.amazon.com/AmazonS3/latest/dev/using-access-points.html\">
* Using access points</a> in the <i>Amazon Simple Storage Service Developer Guide</i>.
private
String
bucketName
;
/** The key of the object involved in this request */
* The version ID of the object, only present if versioning has been
* enabled for the bucket.
private
String
versionId
;
/** The optional Content-Type header that will be sent when the presigned URL is accessed */
private
String
contentType
;
/** The optional Content-MD5 header that will be sent when the presigned URL is accessed */
private
String
contentMd5
;
* An optional expiration date at which point the generated pre-signed URL
* will no longer be accepted by Amazon S3. If not specified, a default
* value will be supplied.
private
Date
expiration
;
* True if the request content is set to zero byte instead of null. This is
* necessary to make pre-signed URL generation work for multi-part upload
* initiation using SigV4. Ref: TT0050059365
private
boolean
zeroByteContent
;
* An optional map of additional parameters to include in the pre-signed
* URL. Adding additional request parameters enables more advanced
* pre-signed URLs, such as accessing Amazon S3's torrent resource for an
* object, or for specifying a version ID when accessing an object.
private
Map
<
String
,
String
>
requestParameters
=
new
HashMap
<
String
,
String
>();
* Optional field that overrides headers on the response.
private
ResponseHeaderOverrides
responseHeaders
;
* Optional customer-provided server-side encryption key to use as part of
* the generated pre-signed URL.
private
SSECustomerKey
sseCustomerKey
;
* Used to specify the server side encryption algorithm. Null means
* no server side encryption is in use.
private
String
sseAlgorithm
;
* Used to specify the KMS CMS Key ID when KMS server side encryption is in
private
String
kmsCmkId
;
* Returns the KMS customer key id used for server side encryption; or null
public
String
getKmsCmkId
() {
* Sets the KMS customer key id used for server side encryption.
* Note S3 does not require HTTP header
* “x-amz-server-side-encryption-aws-kms-key-id” to be always present (a
* default key ID will be used if this header is not present).
* It is also possible to set the header to “alias/aws/s3” to refer to the
public
void
setKmsCmkId
(
String
kmsCmkId
) {
this
.
kmsCmkId
=
kmsCmkId
;
* Fluent API for {@link #setKmsCmkId(String)}
public
GeneratePresignedUrlRequest
withKmsCmkId
(
String
kmsCmkId
) {
setKmsCmkId
(
kmsCmkId
);
* Returns the SSE algorithm used for SSE (with server side key); or null if
* SSE (with server side key) is not in use.
public
String
getSSEAlgorithm
() {
* Sets the SSE algorithm for server side encryption.
* @param currently supported values: "AES256" or "aws:kms".
public
void
setSSEAlgorithm
(
String
sseAlgorithm
) {
this
.
sseAlgorithm
=
sseAlgorithm
;
* Fluent API for {@link #setSSEAlgorithm(String)}
public
GeneratePresignedUrlRequest
withSSEAlgorithm
(
String
sseAlgorithm
) {
setSSEAlgorithm
(
sseAlgorithm
);
* Sets the SSE algorithm for server side encryption.
* @param currently supported values: "AES256" or "aws:kms".
public
void
setSSEAlgorithm
(
SSEAlgorithm
sseAlgorithm
) {
this
.
sseAlgorithm
=
sseAlgorithm
.
getAlgorithm
();
* Fluent API for {@link #setSSEAlgorithm(SSEAlgorithm)}
public
GeneratePresignedUrlRequest
withSSEAlgorithm
(
SSEAlgorithm
sseAlgorithm
) {
setSSEAlgorithm
(
sseAlgorithm
);
* Creates a new request for generating a pre-signed URL that can be used as
* part of an HTTP GET request to access the Amazon S3 object stored under
* the specified key in the specified bucket.
* The name of the bucket containing the desired Amazon S3
* The key under which the desired Amazon S3 object is stored.
public
GeneratePresignedUrlRequest
(
String
bucketName
,
String
key
) {
this
(
bucketName
,
key
,
HttpMethod
.
GET
);
* Creates a new request for generating a pre-signed URL that can be used as
* part of an HTTP request to access the specified Amazon S3 resource.
* When specifying an HTTP method, you <b>must</b> send the pre-signed URL
* with the same HTTP method in order to successfully use the pre-signed
* The name of the Amazon S3 bucket involved in the operation.
* The key of the Amazon S3 object involved in the operation.
* The HTTP method (GET, PUT, DELETE, HEAD) to be used in the
* request when the pre-signed URL is used.
public
GeneratePresignedUrlRequest
(
String
bucketName
,
String
key
,
HttpMethod
method
) {
this
.
bucketName
=
bucketName
;
* The HTTP method (GET, PUT, DELETE, HEAD) to be used in this request. The
* same HTTP method <b>must</b> be used in the request when the pre-signed
* @return The HTTP method (GET, PUT, DELETE, HEAD) to be used in this
* request and when the pre-signed URL is used.
public
HttpMethod
getMethod
() {
* Sets the HTTP method (GET, PUT, DELETE, HEAD) to be used in this request.
* The same HTTP method <b>must</b> be used in the request when the
* pre-signed URL is used.
* The HTTP method (GET, PUT, DELETE, HEAD) to be used in this
public
void
setMethod
(
HttpMethod
method
) {
* Sets the HTTP method (GET, PUT, DELETE, HEAD) to be used in this request,
* and returns this request object to enable additional method calls to be
* The same HTTP method <b>must</b> be used in the request when the
* pre-signed URL is used.
* The HTTP method (GET, PUT, DELETE, HEAD) to be used in this
* @return The updated request object, so that additional method calls can
public
GeneratePresignedUrlRequest
withMethod
(
HttpMethod
method
) {
* Returns the name of the bucket involved in this request.
* @return the name of the bucket involved in this request.
public
String
getBucketName
() {
* Sets the name of the bucket involved in this request.
* the name of the bucket involved in this request.
public
void
setBucketName
(
String
bucketName
) {
this
.
bucketName
=
bucketName
;
* Sets the name of the bucket involved in this request, and returns this
* request object to enable additional method calls to be chained together.
* the name of the bucket involved in this request.
* @return The updated request object, so that additional method calls can
public
GeneratePresignedUrlRequest
withBucketName
(
String
bucketName
) {
setBucketName
(
bucketName
);
* Returns the key of the object involved in this request.
* @return The key of the object involved in this request.
public
String
getKey
() {
* Sets the key of the object involved in this request.
* the key of the object involved in this request.
public
void
setKey
(
String
key
) {
* Sets the key of the object involved in this request, and returns this
* request object to enable additional method calls to be chained together.
* the key of the object involved in this request.
* @return The updated request object, so that additional method calls can
public
GeneratePresignedUrlRequest
withKey
(
String
key
) {
* Returns the version ID of the object, only present if versioning has
* been enabled for the bucket.
* @return The version ID of the object, only present if versioning has
* been enabled for the bucket.
public
String
getVersionId
() {
* Sets the version ID of the object, only present if versioning has
* been enabled for the bucket.
* The version ID of the object, only present if versioning
* has been enabled for the bucket.
public
void
setVersionId
(
String
versionId
) {
this
.
versionId
=
versionId
;
* Sets the version ID of the object, only present if versioning has
* been enabled for the bucket. Returns the {@link GeneratePresignedUrlRequest}
* object for method chanining.
* The version ID of the object, only present if versioning
* has been enabled for the bucket.
* @return This object for method chaining.
public
GeneratePresignedUrlRequest
withVersionId
(
String
versionId
) {
setVersionId
(
versionId
);
* The expiration date at which point the new pre-signed URL will no longer
* be accepted by Amazon S3. If not specified, a default value will be
* @return The expiration date at which point the new pre-signed URL will no
* longer be accepted by Amazon S3.
public
Date
getExpiration
() {
* Sets the expiration date at which point the new pre-signed URL will no
* longer be accepted by Amazon S3. If not specified, a default value will
* The expiration date at which point the new pre-signed URL will
* no longer be accepted by Amazon S3.
public
void
setExpiration
(
Date
expiration
) {
this
.
expiration
=
expiration
;
* Sets the expiration date at which point the new pre-signed URL will no
* longer be accepted by Amazon S3, and returns this request object to
* enable additional method calls to be chained together.
* If not specified, a default value will be supplied.
* The expiration date at which point the new pre-signed URL will
* no longer be accepted by Amazon S3.
* @return The updated request object, so that additional method calls can
public
GeneratePresignedUrlRequest
withExpiration
(
Date
expiration
) {
setExpiration
(
expiration
);
* Adds an additional request parameter to be included in the pre-signed
* URL. Adding additional request parameters enables more advanced
* pre-signed URLs, such as accessing Amazon S3's torrent resource for an
* object, or for specifying a version ID when accessing an object.
* The name of the request parameter, as it appears in the URL's
* query string (e.g. versionId).
* The (optional) value of the request parameter being added.
public
void
addRequestParameter
(
String
key
,
String
value
) {
requestParameters
.
put
(
key
,
value
);
* Returns the complete map of additional request parameters to be included
* @return The complete map of additional request parameters to be included
public
Map
<
String
,
String
>
getRequestParameters
() {
return
requestParameters
;
* Returns the headers to be overridden in the service response.
* @return the headers to be overridden in the service response.
public
ResponseHeaderOverrides
getResponseHeaders
() {
* Sets the headers to be overridden in the service response.
* The headers to be overridden in the service response.
public
void
setResponseHeaders
(
ResponseHeaderOverrides
responseHeaders
) {
this
.
responseHeaders
=
responseHeaders
;
* Sets the headers to be overridden in the service response and returns
* this object, for method chaining.
* The headers to be overridden in the service response.
* @return This {@link GeneratePresignedUrlRequest} for method chaining.
public
GeneratePresignedUrlRequest
withResponseHeaders
(
ResponseHeaderOverrides
responseHeaders
) {
setResponseHeaders
(
responseHeaders
);
* Gets the expected content-type of the request. The content-type is included in
* @return The expected content-type
public
String
getContentType
() {
* Sets the expected content-type of the request. The content-type is included in
* The expected content-type
public
void
setContentType
(
String
contentType
) {
this
.
contentType
=
contentType
;
* Sets the expected content-type of the request and returns
* this object, for method chaining.
* The expected content-type
* @return This {@link GeneratePresignedUrlRequest} for method chaining.
public
GeneratePresignedUrlRequest
withContentType
(
String
contentType
) {
setContentType
(
contentType
);
* Gets the expected content-md5 header of the request. This header value
* will be included when calculating the signature, and future requests must
* include the same content-md5 header value to access the presigned URL.
* @return The expected content-md5 header value.
public
String
getContentMd5
() {
* Sets the expected content-md5 header of the request. This header value
* will be included when calculating the signature, and future requests must
* include the same content-md5 header value to access the presigned URL.
* The expected content-md5 header value.
public
void
setContentMd5
(
String
contentMd5
) {
this
.
contentMd5
=
contentMd5
;
* Sets the expected content-md5 header of the request and returns this
* object, for method chaining.
* The expected content-md5 header value.
* @return This {@link GeneratePresignedUrlRequest} for method chaining.
public
GeneratePresignedUrlRequest
withContentMd5
(
String
contentMd5
) {
this
.
contentMd5
=
contentMd5
;
public
SSECustomerKey
getSSECustomerKey
() {
* Sets the customer-provided server-side encryption key to use as part of
* the generated pre-signed URL.
* The customer-provided server-side encryption key to use as
* part of the generated pre-signed URL.
public
void
setSSECustomerKey
(
SSECustomerKey
sseCustomerKey
) {
this
.
sseCustomerKey
=
sseCustomerKey
;
* Sets the customer-provided server-side encryption key to use as part of
* the generated pre-signed URL, and returns the updated request object so
* that additional method calls can be chained together.
* The customer-provided server-side encryption key to use as
* part of the generated pre-signed URL.
* @return This updated request object so that additional method calls can
public
GeneratePresignedUrlRequest
withSSECustomerKey
(
SSECustomerKey
sseKey
) {
setSSECustomerKey
(
sseKey
);
* Sets the use of SSE-C (Server Side Encryption with Customer Key) using
* the given encryption algorithm.
* The server-side encryption algorithm to use with this
* customer-provided server-side encryption key; or null if SSE-C
* is disabled. "AES256" is currently the only
* supported SSE-C encryption algorithm.
public
void
setSSECustomerKeyAlgorithm
(
SSEAlgorithm
sseAlgorithm
) {
if
(
sseAlgorithm
==
null
)
this
.
sseCustomerKey
=
null
;
else
if
(
sseAlgorithm
.
getAlgorithm
().
equals
(
SSEAlgorithm
.
AES256
.
getAlgorithm
())) {
SSECustomerKey
.
generateSSECustomerKeyForPresignUrl
(
sseAlgorithm
.
getAlgorithm
());
throw
new
IllegalArgumentException
(
"Currently the only supported Server Side Encryption algorithm is "
+
SSEAlgorithm
.
AES256
);
* Fluent method for {@link #setSSECustomerKeyAlgorithm(SSEAlgorithm)}.
public
GeneratePresignedUrlRequest
withSSECustomerKeyAlgorithm
(
SSEAlgorithm
algorithm
) {
setSSECustomerKeyAlgorithm
(
algorithm
);
* Returns true if zero byte content is to be used for generating pre-signed
public
boolean
isZeroByteContent
() {
* Sets if zero byte content is to be used for generating pre-signed URL.
public
void
setZeroByteContent
(
boolean
zeroByteContent
) {
this
.
zeroByteContent
=
zeroByteContent
;
* Fluent method for {@link #setZeroByteContent(boolean)}.
public
GeneratePresignedUrlRequest
withZeroByteContent
(
boolean
zeroByteContent
) {
setZeroByteContent
(
zeroByteContent
);
* Rejects any illegal input (as attributes of this request) by the user.
* @throws IllegalArgumentException if there is illegal input from the user.
public
void
rejectIllegalArguments
() {
if
(
bucketName
==
null
) {
throw
new
IllegalArgumentException
(
"The bucket name parameter must be specified when generating a pre-signed URL"
);
if
(
this
.
method
==
null
) {
throw
new
IllegalArgumentException
(
"The HTTP method request parameter must be specified when generating a pre-signed URL"
);
if
(
this
.
sseCustomerKey
!=
null
) {
if
(
this
.
sseAlgorithm
!=
null
) {
throw
new
IllegalArgumentException
(
"Either SSE or SSE-C can be specified but not both"
);
if
(
this
.
kmsCmkId
!=
null
) {
throw
new
IllegalArgumentException
(
"KMS CMK is not applicable for SSE-C"
);
}
else
if
(
this
.
kmsCmkId
!=
null
) {
if
(!
SSEAlgorithm
.
DSSE
.
getAlgorithm
().
equals
(
sseAlgorithm
) &&
!
SSEAlgorithm
.
KMS
.
getAlgorithm
().
equals
(
sseAlgorithm
)) {
throw
new
IllegalArgumentException
(
"For KMS server side encryption, the SSE algorithm must be set to "
+
SSEAlgorithm
.
KMS
+
" or "
+
SSEAlgorithm
.
DSSE
);
* S3 does not require HTTP header
* “x-amz-server-side-encryption-aws-kms-key-id” to be always present (a
* default key ID will be used if this header is not present).
* It is also possible to set the header to “alias/aws/s3” to refer
* to the default KMS CMK ID.