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

ivandika pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git


The following commit(s) were added to refs/heads/master by this push:
     new 42aa8eec7a9 HDDS-13393. Test Presigned HeadObject and HeadBucket 
support (#8826)
42aa8eec7a9 is described below

commit 42aa8eec7a97495316f2d0d4f14880c8e5e3a1ad
Author: Hsu Han Wen <[email protected]>
AuthorDate: Sat Jul 19 13:44:27 2025 +0800

    HDDS-13393. Test Presigned HeadObject and HeadBucket support (#8826)
---
 .../ozone/s3/awssdk/v1/AbstractS3SDKV1Tests.java   |  56 +++++++++++
 .../ozone/s3/awssdk/v2/AbstractS3SDKV2Tests.java   | 109 +++++++++++++++++++++
 2 files changed, 165 insertions(+)

diff --git 
a/hadoop-ozone/integration-test-s3/src/test/java/org/apache/hadoop/ozone/s3/awssdk/v1/AbstractS3SDKV1Tests.java
 
b/hadoop-ozone/integration-test-s3/src/test/java/org/apache/hadoop/ozone/s3/awssdk/v1/AbstractS3SDKV1Tests.java
index 47b64eaf769..d3528eaaf7d 100644
--- 
a/hadoop-ozone/integration-test-s3/src/test/java/org/apache/hadoop/ozone/s3/awssdk/v1/AbstractS3SDKV1Tests.java
+++ 
b/hadoop-ozone/integration-test-s3/src/test/java/org/apache/hadoop/ozone/s3/awssdk/v1/AbstractS3SDKV1Tests.java
@@ -1032,6 +1032,62 @@ public void testPresignedUrlGet() throws IOException {
     }
   }
 
+  @Test
+  public void testPresignedUrlHead() throws IOException {
+    final String bucketName = getBucketName();
+    final String keyName = getKeyName();
+    final String content = "bar";
+    s3Client.createBucket(bucketName);
+
+    InputStream is = new 
ByteArrayInputStream(content.getBytes(StandardCharsets.UTF_8));
+    s3Client.putObject(bucketName, keyName, is, new ObjectMetadata());
+
+    // Set the presigned URL to expire after one hour.
+    Date expiration = Date.from(Instant.now().plusMillis(1000 * 60 * 60));
+
+    // Test HeadObject presigned URL
+    GeneratePresignedUrlRequest generatePresignedUrlRequest =
+        new GeneratePresignedUrlRequest(bucketName, keyName)
+            .withMethod(HttpMethod.HEAD)
+            .withExpiration(expiration);
+    URL url = s3Client.generatePresignedUrl(generatePresignedUrlRequest);
+
+    URL presignedUrl = new URL(url.toExternalForm());
+    HttpURLConnection connection = null;
+    try {
+      connection = (HttpURLConnection) presignedUrl.openConnection();
+      connection.setRequestMethod("HEAD");
+
+      int responseCode = connection.getResponseCode();
+      assertEquals(200, responseCode, "HeadObject presigned URL should return 
200 OK");
+    } finally {
+      if (connection != null) {
+        connection.disconnect();
+      }
+    }
+
+    // Test HeadBucket presigned URL
+    GeneratePresignedUrlRequest generateBucketPresignedUrlRequest =
+        new GeneratePresignedUrlRequest(bucketName, null)
+            .withMethod(HttpMethod.HEAD)
+            .withExpiration(expiration);
+    URL bucketUrl = 
s3Client.generatePresignedUrl(generateBucketPresignedUrlRequest);
+
+    URL presignedBucketUrl = new URL(bucketUrl.toExternalForm());
+    HttpURLConnection bucketConnection = null;
+    try {
+      bucketConnection = (HttpURLConnection) 
presignedBucketUrl.openConnection();
+      bucketConnection.setRequestMethod("HEAD");
+
+      int bucketResponseCode = bucketConnection.getResponseCode();
+      assertEquals(200, bucketResponseCode, "HeadBucket presigned URL should 
return 200 OK");
+    } finally {
+      if (bucketConnection != null) {
+        bucketConnection.disconnect();
+      }
+    }
+  }
+
   /**
    * Tests the functionality to create a snapshot of an Ozone bucket and then 
read files
    * from the snapshot directory using the S3 SDK.
diff --git 
a/hadoop-ozone/integration-test-s3/src/test/java/org/apache/hadoop/ozone/s3/awssdk/v2/AbstractS3SDKV2Tests.java
 
b/hadoop-ozone/integration-test-s3/src/test/java/org/apache/hadoop/ozone/s3/awssdk/v2/AbstractS3SDKV2Tests.java
index d46c469c55c..c4d6ce761a2 100644
--- 
a/hadoop-ozone/integration-test-s3/src/test/java/org/apache/hadoop/ozone/s3/awssdk/v2/AbstractS3SDKV2Tests.java
+++ 
b/hadoop-ozone/integration-test-s3/src/test/java/org/apache/hadoop/ozone/s3/awssdk/v2/AbstractS3SDKV2Tests.java
@@ -128,7 +128,11 @@
 import software.amazon.awssdk.services.s3.model.UploadPartResponse;
 import software.amazon.awssdk.services.s3.presigner.S3Presigner;
 import 
software.amazon.awssdk.services.s3.presigner.model.GetObjectPresignRequest;
+import 
software.amazon.awssdk.services.s3.presigner.model.HeadBucketPresignRequest;
+import 
software.amazon.awssdk.services.s3.presigner.model.HeadObjectPresignRequest;
 import 
software.amazon.awssdk.services.s3.presigner.model.PresignedGetObjectRequest;
+import 
software.amazon.awssdk.services.s3.presigner.model.PresignedHeadBucketRequest;
+import 
software.amazon.awssdk.services.s3.presigner.model.PresignedHeadObjectRequest;
 import software.amazon.awssdk.transfer.s3.S3TransferManager;
 import software.amazon.awssdk.transfer.s3.model.DownloadFileRequest;
 import software.amazon.awssdk.transfer.s3.model.FileDownload;
@@ -507,6 +511,111 @@ public void testPresignedUrlGet() throws Exception {
     }
   }
 
+  @Test
+  public void testPresignedUrlHead() throws Exception {
+    final String bucketName = getBucketName();
+    final String keyName = getKeyName();
+    final String content = "bar";
+    s3Client.createBucket(b -> b.bucket(bucketName));
+
+    s3Client.putObject(b -> b
+            .bucket(bucketName)
+            .key(keyName),
+        RequestBody.fromString(content));
+
+    try (S3Presigner presigner = S3Presigner.builder()
+        // TODO: Find a way to retrieve the path style configuration from 
S3Client instead
+        
.serviceConfiguration(S3Configuration.builder().pathStyleAccessEnabled(true).build())
+        
.endpointOverride(s3Client.serviceClientConfiguration().endpointOverride().get())
+        .region(s3Client.serviceClientConfiguration().region())
+        
.credentialsProvider(s3Client.serviceClientConfiguration().credentialsProvider()).build())
 {
+
+      HeadObjectRequest objectRequest = HeadObjectRequest.builder()
+          .bucket(bucketName)
+          .key(keyName)
+          .build();
+
+      HeadObjectPresignRequest presignRequest = 
HeadObjectPresignRequest.builder()
+          .signatureDuration(Duration.ofMinutes(10))
+          .headObjectRequest(objectRequest)
+          .build();
+
+      PresignedHeadObjectRequest presignedRequest = 
presigner.presignHeadObject(presignRequest);
+
+      URL presignedUrl = presignedRequest.url();
+      HttpURLConnection connection = null;
+      try {
+        connection = (HttpURLConnection) presignedUrl.openConnection();
+        connection.setRequestMethod("HEAD");
+
+        int responseCode = connection.getResponseCode();
+        assertEquals(200, responseCode, "HeadObject presigned URL should 
return 200 OK");
+
+        // Use the AWS SDK for Java SdkHttpClient class to test the HEAD 
request
+        SdkHttpRequest request = SdkHttpRequest.builder()
+            .method(SdkHttpMethod.HEAD)
+            .uri(presignedUrl.toURI())
+            .build();
+
+        HttpExecuteRequest executeRequest = HttpExecuteRequest.builder()
+            .request(request)
+            .build();
+
+        try (SdkHttpClient sdkHttpClient = ApacheHttpClient.create()) {
+          HttpExecuteResponse response = 
sdkHttpClient.prepareRequest(executeRequest).call();
+          assertEquals(200, response.httpResponse().statusCode(),
+              "HeadObject presigned URL should return 200 OK via 
SdkHttpClient");
+        }
+      } finally {
+        if (connection != null) {
+          connection.disconnect();
+        }
+      }
+
+      // Test HeadBucket presigned URL
+      HeadBucketRequest bucketRequest = HeadBucketRequest.builder()
+          .bucket(bucketName)
+          .build();
+
+      HeadBucketPresignRequest headBucketPresignRequest = 
HeadBucketPresignRequest.builder()
+          .signatureDuration(Duration.ofMinutes(10))
+          .headBucketRequest(bucketRequest)
+          .build();
+
+      PresignedHeadBucketRequest presignedBucketRequest = 
presigner.presignHeadBucket(headBucketPresignRequest);
+
+      URL presignedBucketUrl = presignedBucketRequest.url();
+      HttpURLConnection bucketConnection = null;
+      try {
+        bucketConnection = (HttpURLConnection) 
presignedBucketUrl.openConnection();
+        bucketConnection.setRequestMethod("HEAD");
+
+        int bucketResponseCode = bucketConnection.getResponseCode();
+        assertEquals(200, bucketResponseCode, "HeadBucket presigned URL should 
return 200 OK");
+
+        // Use the AWS SDK for Java SdkHttpClient class to test the HEAD 
request for bucket
+        SdkHttpRequest bucketSdkRequest = SdkHttpRequest.builder()
+            .method(SdkHttpMethod.HEAD)
+            .uri(presignedBucketUrl.toURI())
+            .build();
+
+        HttpExecuteRequest bucketExecuteRequest = HttpExecuteRequest.builder()
+            .request(bucketSdkRequest)
+            .build();
+
+        try (SdkHttpClient sdkHttpClient = ApacheHttpClient.create()) {
+          HttpExecuteResponse response = 
sdkHttpClient.prepareRequest(bucketExecuteRequest).call();
+          assertEquals(200, response.httpResponse().statusCode(),
+              "HeadBucket presigned URL should return 200 OK via 
SdkHttpClient");
+        }
+      } finally {
+        if (bucketConnection != null) {
+          bucketConnection.disconnect();
+        }
+      }
+    }
+  }
+
   /**
    * Tests the functionality to create a snapshot of an Ozone bucket and then 
read files
    * from the snapshot directory using the S3 SDK.


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to