diff --git a/api/src/main/java/io/minio/PutObjectArgs.java b/api/src/main/java/io/minio/PutObjectArgs.java index 94850f942..bdc2f5869 100644 --- a/api/src/main/java/io/minio/PutObjectArgs.java +++ b/api/src/main/java/io/minio/PutObjectArgs.java @@ -86,7 +86,7 @@ private Builder setStream( } public Builder contentType(String contentType) { - validateNotEmptyString(contentType, "content type"); + validateContentType(contentType); operations.add(args -> args.contentType = contentType); return this; } diff --git a/api/src/main/java/io/minio/PutObjectBaseArgs.java b/api/src/main/java/io/minio/PutObjectBaseArgs.java index 96d384c1b..aaec5e1bb 100644 --- a/api/src/main/java/io/minio/PutObjectBaseArgs.java +++ b/api/src/main/java/io/minio/PutObjectBaseArgs.java @@ -18,6 +18,7 @@ import java.io.IOException; import java.util.Objects; +import okhttp3.MediaType; /** Base argument class for {@link PutObjectArgs} and {@link UploadObjectArgs}. */ public abstract class PutObjectBaseArgs extends ObjectWriteArgs { @@ -60,6 +61,14 @@ public boolean preloadData() { @SuppressWarnings("unchecked") // Its safe to type cast to B as B is inherited by this class public abstract static class Builder, A extends PutObjectBaseArgs> extends ObjectWriteArgs.Builder { + protected void validateContentType(String contentType) { + validateNotEmptyString(contentType, "content type"); + if (MediaType.parse(contentType) == null) { + throw new IllegalArgumentException( + "invalid content type '" + contentType + "' as per RFC 2045"); + } + } + private void validateSizes(long objectSize, long partSize) { if (partSize > 0) { if (partSize < MIN_MULTIPART_SIZE) { diff --git a/api/src/main/java/io/minio/S3Base.java b/api/src/main/java/io/minio/S3Base.java index 5580d5745..944474af9 100644 --- a/api/src/main/java/io/minio/S3Base.java +++ b/api/src/main/java/io/minio/S3Base.java @@ -92,6 +92,7 @@ import okhttp3.Callback; import okhttp3.Headers; import okhttp3.HttpUrl; +import okhttp3.MediaType; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; @@ -518,6 +519,11 @@ protected Request createRequest( RequestBody requestBody = null; if (body != null) { String contentType = (headers != null) ? headers.get("Content-Type") : null; + if (contentType != null && MediaType.parse(contentType) == null) { + throw new IllegalArgumentException( + "invalid content type '" + contentType + "' as per RFC 2045"); + } + if (body instanceof PartSource) { requestBody = new HttpRequestBody((PartSource) body, contentType); } else { diff --git a/api/src/main/java/io/minio/UploadObjectArgs.java b/api/src/main/java/io/minio/UploadObjectArgs.java index 6a6eef760..68775b184 100644 --- a/api/src/main/java/io/minio/UploadObjectArgs.java +++ b/api/src/main/java/io/minio/UploadObjectArgs.java @@ -84,7 +84,7 @@ public Builder filename(String filename) throws IOException { } public Builder contentType(String contentType) { - validateNotEmptyString(contentType, "content type"); + validateContentType(contentType); operations.add(args -> args.contentType = contentType); return this; }