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 f95d7de9bb94..2c9e82af7852 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 @@ -267,6 +267,7 @@ public void testCreateBucketAlreadyOwnedByYou() { () -> s3Client.createBucket(bucketName)); assertEquals(409, ase.getStatusCode()); assertEquals(S3ErrorTable.BUCKET_ALREADY_OWNED_BY_YOU.getCode(), ase.getErrorCode()); + assertEquals("application/xml", ase.getHttpHeaders().get("Content-Type")); } @Test 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 ec80b9c4de03..56d5e5f53339 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 @@ -252,6 +252,8 @@ public void testCreateBucketAlreadyOwnedByYou() { assertEquals(409, exception.statusCode()); assertEquals(S3ErrorTable.BUCKET_ALREADY_OWNED_BY_YOU.getCode(), exception.awsErrorDetails().errorCode()); + assertEquals("application/xml", exception.awsErrorDetails() + .sdkHttpResponse().firstMatchingHeader("Content-Type").orElse(null)); } @Test diff --git a/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/exception/OS3ExceptionMapper.java b/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/exception/OS3ExceptionMapper.java index 5f110144c118..16a529d3f5d6 100644 --- a/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/exception/OS3ExceptionMapper.java +++ b/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/exception/OS3ExceptionMapper.java @@ -18,6 +18,7 @@ package org.apache.hadoop.ozone.s3.exception; import javax.inject.Inject; +import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.ext.ExceptionMapper; import javax.ws.rs.ext.Provider; @@ -45,6 +46,7 @@ public Response toResponse(OS3Exception exception) { } exception.setRequestId(requestIdentifier.getRequestId()); return Response.status(exception.getHttpCode()) + .type(MediaType.APPLICATION_XML_TYPE) .entity(exception.toXml()).build(); } } diff --git a/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/util/S3Utils.java b/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/util/S3Utils.java index 3379d2d244d4..b72c4adb2d24 100644 --- a/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/util/S3Utils.java +++ b/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/util/S3Utils.java @@ -39,6 +39,7 @@ import java.util.stream.Collectors; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.HttpHeaders; +import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import org.apache.commons.codec.binary.Hex; import org.apache.commons.codec.digest.DigestUtils; @@ -141,6 +142,7 @@ public static ReplicationConfig toReplicationConfig(String s3StorageType, String public static WebApplicationException wrapOS3Exception(OS3Exception ex) { return new WebApplicationException(ex.getErrorMessage(), ex, Response.status(ex.getHttpCode()) + .type(MediaType.APPLICATION_XML_TYPE) .entity(ex.toXml()) .build()); } diff --git a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/exception/TestOS3Exceptions.java b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/exception/TestOS3Exceptions.java index 2644150bd343..239eb0791392 100644 --- a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/exception/TestOS3Exceptions.java +++ b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/exception/TestOS3Exceptions.java @@ -18,15 +18,30 @@ package org.apache.hadoop.ozone.s3.exception; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.when; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import org.apache.hadoop.ozone.s3.RequestIdentifier; import org.apache.hadoop.ozone.web.utils.OzoneUtils; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; /** - * This class tests OS3Exception class. + * This class tests OS3Exception and OS3ExceptionMapper. */ +@ExtendWith(MockitoExtension.class) public class TestOS3Exceptions { + @Mock + private RequestIdentifier requestIdentifier; + + @InjectMocks + private OS3ExceptionMapper exceptionMapper; + @Test public void testOS3Exceptions() { OS3Exception ex = S3ErrorTable.newError(S3ErrorTable.ACCESS_DENIED, "bucket"); @@ -44,4 +59,15 @@ public void testOS3Exceptions() { ex.getRequestId()); assertEquals(expected, val); } + + @Test + public void testResponseContentType() { + when(requestIdentifier.getRequestId()).thenReturn("request-id"); + OS3Exception exception = S3ErrorTable.newError( + S3ErrorTable.ACCESS_DENIED, "bucket"); + + Response response = exceptionMapper.toResponse(exception); + + assertEquals(MediaType.APPLICATION_XML_TYPE, response.getMediaType()); + } } diff --git a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/util/TestS3Utils.java b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/util/TestS3Utils.java index 2dbf3c65ba6e..f178c507ac99 100644 --- a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/util/TestS3Utils.java +++ b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/util/TestS3Utils.java @@ -29,6 +29,7 @@ import java.util.Base64; import java.util.List; import java.util.stream.Stream; +import javax.ws.rs.core.MediaType; import org.apache.commons.codec.binary.Hex; import org.apache.commons.lang3.StringUtils; import org.apache.hadoop.hdds.client.ECReplicationConfig; @@ -154,6 +155,14 @@ public void testGenerateCanonicalUserId() { assertEquals(S3Owner.DEFAULT_S3OWNER_ID, S3Utils.generateCanonicalUserId("ozone")); } + @Test + public void testWrapOS3ExceptionContentType() { + OS3Exception exception = S3ErrorTable.newError( + S3ErrorTable.ACCESS_DENIED, "bucket"); + assertEquals(MediaType.APPLICATION_XML_TYPE, + S3Utils.wrapOS3Exception(exception).getResponse().getMediaType()); + } + static Stream wrongContentMD5Provider() throws Exception { String serverMD5 = Hex.encodeHexString( MessageDigest.getInstance("MD5").digest("bar".getBytes(StandardCharsets.UTF_8)));