diff --git a/src/main/java/org/gaul/s3proxy/S3ProxyHandler.java b/src/main/java/org/gaul/s3proxy/S3ProxyHandler.java index af2dc7d..4b52973 100644 --- a/src/main/java/org/gaul/s3proxy/S3ProxyHandler.java +++ b/src/main/java/org/gaul/s3proxy/S3ProxyHandler.java @@ -148,6 +148,15 @@ final class S3ProxyHandler extends AbstractHandler { "uploadId", "uploads" ); + /** All supported x-amz- headers, except for x-amz-meta- user metadata. */ + private static final Set SUPPORTED_X_AMZ_HEADERS = ImmutableSet.of( + "x-amz-acl", + "x-amz-copy-source", + "x-amz-copy-source-range", + "x-amz-date", + "x-amz-metadata-directive", + "x-amz-storage-class" // ignored + ); private static final Set CANNED_ACLS = ImmutableSet.of( "private", "public-read", @@ -383,6 +392,21 @@ final class S3ProxyHandler extends AbstractHandler { } } + // emit NotImplemented for unknown x-amz- headers + for (String headerName : Collections.list(request.getHeaderNames())) { + if (!headerName.startsWith("x-amz-")) { + continue; + } + if (headerName.startsWith("x-amz-meta-")) { + continue; + } + if (!SUPPORTED_X_AMZ_HEADERS.contains(headerName)) { + logger.error("Unknown header {} with URI {}", + headerName, request.getRequestURI()); + throw new S3Exception(S3ErrorCode.NOT_IMPLEMENTED); + } + } + String uploadId = request.getParameter("uploadId"); switch (method) { case "DELETE":