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]