4040import software .amazon .awssdk .services .s3 .model .CreateMultipartUploadRequest ;
4141import software .amazon .awssdk .services .s3 .model .DeleteObjectRequest ;
4242import software .amazon .awssdk .services .s3 .model .GetObjectRequest ;
43+ import software .amazon .awssdk .services .s3 .model .HeadBucketRequest ;
44+ import software .amazon .awssdk .services .s3 .model .HeadObjectRequest ;
4345import software .amazon .awssdk .services .s3 .model .PutObjectRequest ;
4446import software .amazon .awssdk .services .s3 .model .UploadPartRequest ;
4547import software .amazon .awssdk .services .s3 .presigner .model .AbortMultipartUploadPresignRequest ;
4648import software .amazon .awssdk .services .s3 .presigner .model .CompleteMultipartUploadPresignRequest ;
4749import software .amazon .awssdk .services .s3 .presigner .model .CreateMultipartUploadPresignRequest ;
4850import software .amazon .awssdk .services .s3 .presigner .model .DeleteObjectPresignRequest ;
4951import software .amazon .awssdk .services .s3 .presigner .model .GetObjectPresignRequest ;
52+ import software .amazon .awssdk .services .s3 .presigner .model .HeadBucketPresignRequest ;
53+ import software .amazon .awssdk .services .s3 .presigner .model .HeadObjectPresignRequest ;
5054import software .amazon .awssdk .services .s3 .presigner .model .PresignedAbortMultipartUploadRequest ;
5155import software .amazon .awssdk .services .s3 .presigner .model .PresignedCompleteMultipartUploadRequest ;
5256import software .amazon .awssdk .services .s3 .presigner .model .PresignedCreateMultipartUploadRequest ;
5357import software .amazon .awssdk .services .s3 .presigner .model .PresignedDeleteObjectRequest ;
5458import software .amazon .awssdk .services .s3 .presigner .model .PresignedGetObjectRequest ;
59+ import software .amazon .awssdk .services .s3 .presigner .model .PresignedHeadBucketRequest ;
60+ import software .amazon .awssdk .services .s3 .presigner .model .PresignedHeadObjectRequest ;
5561import software .amazon .awssdk .services .s3 .presigner .model .PresignedPutObjectRequest ;
5662import software .amazon .awssdk .services .s3 .presigner .model .PresignedUploadPartRequest ;
5763import software .amazon .awssdk .services .s3 .presigner .model .PutObjectPresignRequest ;
@@ -328,7 +334,7 @@ static Builder builder() {
328334 * <p />
329335 * This is a shorter method of invoking {@link #presignGetObject(GetObjectPresignRequest)} without needing
330336 * to call {@code GetObjectPresignRequest.builder()} or {@code .build()}.
331- *
337+ *
332338 * @see #presignGetObject(GetObjectPresignRequest)
333339 */
334340 default PresignedGetObjectRequest presignGetObject (Consumer <GetObjectPresignRequest .Builder > request ) {
@@ -337,6 +343,128 @@ default PresignedGetObjectRequest presignGetObject(Consumer<GetObjectPresignRequ
337343 return presignGetObject (builder .build ());
338344 }
339345
346+ /**
347+ * Presign a {@link HeadObjectRequest} so that it can be executed at a later time without requiring additional
348+ * signing or authentication.
349+ * <p/>
350+ *
351+ * <b>Example Usage</b>
352+ * <p/>
353+ *
354+ * <pre>
355+ * {@code
356+ * S3Presigner presigner = ...;
357+ *
358+ * // Create a HeadObjectRequest to be pre-signed
359+ * HeadObjectRequest headObjectRequest =
360+ * HeadObjectRequest.builder()
361+ * .bucket("my-bucket")
362+ * .key("my-key")
363+ * .build();
364+ *
365+ * // Create a HeadObjectPresignRequest to specify the signature duration
366+ * HeadObjectPresignRequest headObjectPresignRequest =
367+ * HeadObjectPresignRequest.builder()
368+ * .signatureDuration(Duration.ofMinutes(10))
369+ * .headObjectRequest(headObjectRequest)
370+ * .build();
371+ *
372+ * // Generate the presigned request
373+ * PresignedHeadObjectRequest presignedHeadObjectRequest =
374+ * presigner.presignHeadObject(headObjectPresignRequest);
375+ *
376+ * // The presigned URL can be used with an HTTP client to retrieve object metadata
377+ * SdkHttpClient httpClient = ApacheHttpClient.builder().build();
378+ * HttpExecuteRequest request = HttpExecuteRequest.builder()
379+ * .request(presignedHeadObjectRequest.httpRequest())
380+ * .build();
381+ * HttpExecuteResponse response = httpClient.prepareRequest(request).call();
382+ *
383+ * // Extract metadata from response headers
384+ * String contentLength = response.httpResponse().firstMatchingHeader("Content-Length").orElse("0");
385+ * }
386+ * </pre>
387+ */
388+ default PresignedHeadObjectRequest presignHeadObject (HeadObjectPresignRequest request ) {
389+ throw new UnsupportedOperationException ();
390+ }
391+
392+ /**
393+ * Presign a {@link HeadObjectRequest} so that it can be executed at a later time without requiring additional
394+ * signing or authentication.
395+ * <p />
396+ * This is a shorter method of invoking {@link #presignHeadObject(HeadObjectPresignRequest)} without needing
397+ * to call {@code HeadObjectPresignRequest.builder()} or {@code .build()}.
398+ *
399+ * @see #presignHeadObject(HeadObjectPresignRequest)
400+ */
401+ default PresignedHeadObjectRequest presignHeadObject (Consumer <HeadObjectPresignRequest .Builder > request ) {
402+ HeadObjectPresignRequest .Builder builder = HeadObjectPresignRequest .builder ();
403+ request .accept (builder );
404+ return presignHeadObject (builder .build ());
405+ }
406+
407+ /**
408+ * Presign a {@link HeadBucketRequest} so that it can be executed at a later time without requiring additional
409+ * signing or authentication.
410+ * <p/>
411+ *
412+ * <b>Example Usage</b>
413+ * <p/>
414+ *
415+ * <pre>
416+ * {@code
417+ * S3Presigner presigner = ...;
418+ *
419+ * // Create a HeadBucketRequest to be pre-signed
420+ * HeadBucketRequest headBucketRequest =
421+ * HeadBucketRequest.builder()
422+ * .bucket("my-bucket")
423+ * .build();
424+ *
425+ * // Create a HeadBucketPresignRequest to specify the signature duration
426+ * HeadBucketPresignRequest headBucketPresignRequest =
427+ * HeadBucketPresignRequest.builder()
428+ * .signatureDuration(Duration.ofMinutes(10))
429+ * .headBucketRequest(headBucketRequest)
430+ * .build();
431+ *
432+ * // Generate the presigned request
433+ * PresignedHeadBucketRequest presignedHeadBucketRequest =
434+ * presigner.presignHeadBucket(headBucketPresignRequest);
435+ *
436+ * // The presigned URL can be used with an HTTP client to check bucket existence and access
437+ * SdkHttpClient httpClient = ApacheHttpClient.builder().build();
438+ * HttpExecuteRequest request = HttpExecuteRequest.builder()
439+ * .request(presignedHeadBucketRequest.httpRequest())
440+ * .build();
441+ * HttpExecuteResponse response = httpClient.prepareRequest(request).call();
442+ *
443+ * // Check if bucket exists and is accessible
444+ * boolean bucketExists = response.httpResponse().isSuccessful();
445+ * String region = response.httpResponse().firstMatchingHeader("x-amz-bucket-region").orElse("");
446+ * }
447+ * </pre>
448+ */
449+ default PresignedHeadBucketRequest presignHeadBucket (HeadBucketPresignRequest request ) {
450+ throw new UnsupportedOperationException ();
451+ }
452+
453+ /**
454+ * Presign a {@link HeadBucketRequest} so that it can be executed at a later time without requiring additional
455+ * signing or authentication.
456+ * <p>
457+ * This is a shorter method of invoking {@link #presignHeadBucket(HeadBucketPresignRequest)} without needing
458+ * to call {@code HeadBucketPresignRequest.builder()} or {@code .build()}.
459+ *
460+ * @see #presignHeadBucket(HeadBucketPresignRequest)
461+ */
462+ default PresignedHeadBucketRequest presignHeadBucket (Consumer <HeadBucketPresignRequest .Builder > request ) {
463+ HeadBucketPresignRequest .Builder builder = HeadBucketPresignRequest .builder ();
464+ request .accept (builder );
465+ return presignHeadBucket (builder .build ());
466+ }
467+
340468 /**
341469 * Presign a {@link PutObjectRequest} so that it can be executed at a later time without requiring additional
342470 * signing or authentication.
0 commit comments