diff --git a/src/main/java/org/gaul/s3proxy/S3ProxyHandler.java b/src/main/java/org/gaul/s3proxy/S3ProxyHandler.java index 0a0aff0..c76dee1 100644 --- a/src/main/java/org/gaul/s3proxy/S3ProxyHandler.java +++ b/src/main/java/org/gaul/s3proxy/S3ProxyHandler.java @@ -143,6 +143,7 @@ public class S3ProxyHandler { "location", "marker", "max-keys", + "part-number-marker", "partNumber", "prefix", "response-cache-control", @@ -1888,7 +1889,13 @@ public class S3ProxyHandler { private void handleListParts(HttpServletRequest request, HttpServletResponse response, BlobStore blobStore, String containerName, String blobName, String uploadId) - throws IOException { + throws IOException, S3Exception { + // support only the no-op zero case + String partNumberMarker = request.getParameter("part-number-marker"); + if (partNumberMarker != null && !partNumberMarker.equals("0")) { + throw new S3Exception(S3ErrorCode.NOT_IMPLEMENTED); + } + // TODO: how to reconstruct original mpu? MultipartUpload mpu = MultipartUpload.create(containerName, blobName, uploadId, createFakeBlobMetadata(blobStore), diff --git a/src/test/java/org/gaul/s3proxy/S3AwsSdkTest.java b/src/test/java/org/gaul/s3proxy/S3AwsSdkTest.java index d59f89f..b74e730 100644 --- a/src/test/java/org/gaul/s3proxy/S3AwsSdkTest.java +++ b/src/test/java/org/gaul/s3proxy/S3AwsSdkTest.java @@ -56,6 +56,7 @@ import com.amazonaws.services.s3.model.GroupGrantee; import com.amazonaws.services.s3.model.InitiateMultipartUploadRequest; import com.amazonaws.services.s3.model.InitiateMultipartUploadResult; import com.amazonaws.services.s3.model.ListObjectsRequest; +import com.amazonaws.services.s3.model.ListPartsRequest; import com.amazonaws.services.s3.model.ObjectListing; import com.amazonaws.services.s3.model.ObjectMetadata; import com.amazonaws.services.s3.model.Permission; @@ -500,6 +501,24 @@ public final class S3AwsSdkTest { .isEqualTo(expiresTime); } + @Test + public void testPartNumberMarker() throws Exception { + String blobName = "foo"; + InitiateMultipartUploadResult result = client.initiateMultipartUpload( + new InitiateMultipartUploadRequest(containerName, blobName)); + ListPartsRequest request = new ListPartsRequest(containerName, + blobName, result.getUploadId()); + + client.listParts(request.withPartNumberMarker(0)); + + try { + client.listParts(request.withPartNumberMarker(1)); + Fail.failBecauseExceptionWasNotThrown(AmazonS3Exception.class); + } catch (AmazonS3Exception e) { + assertThat(e.getErrorCode()).isEqualTo("NotImplemented"); + } + } + private static final class NullX509TrustManager implements X509TrustManager { @Override