From 170527c3e54bdf88b1d4a6eeb8c496929e1c0ba4 Mon Sep 17 00:00:00 2001 From: Rachel Tucker Date: Mon, 18 Jul 2016 11:08:38 -0600 Subject: [PATCH 1/2] Test for null or empty metadata values --- .../ds3client/Ds3Client_Test.java | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/ds3-sdk/src/test/java/com/spectralogic/ds3client/Ds3Client_Test.java b/ds3-sdk/src/test/java/com/spectralogic/ds3client/Ds3Client_Test.java index 0786a59bf..e2efc4f11 100644 --- a/ds3-sdk/src/test/java/com/spectralogic/ds3client/Ds3Client_Test.java +++ b/ds3-sdk/src/test/java/com/spectralogic/ds3client/Ds3Client_Test.java @@ -388,6 +388,39 @@ public void createObjectWithMetadata() throws IOException, SignatureException, U .putObject(por); } + @Test + public void createObjectWithNullAndEmptyMetadata() throws IOException, SignatureException, URISyntaxException { + final String jobIdString = "a4a586a1-cb80-4441-84e2-48974e982d51"; + final Map queryParams = new HashMap<>(); + queryParams.put("job", jobIdString); + queryParams.put("offset", Long.toString(0)); + + final Path resourcePath = ResourceUtils.loadFileResource("LoremIpsumTwice.txt"); + final byte[] fileBytes = Files.readAllBytes(resourcePath); + final String output = new String(fileBytes, Charset.forName("UTF-8")); + final FileChannel channel = FileChannel.open(resourcePath, StandardOpenOption.READ); + + final PutObjectRequest por = new PutObjectRequest( + "bucketName", + "objectName", + channel, + UUID.fromString(jobIdString), + 0, + fileBytes.length); + + final Multimap expectedRequestHeaders = TreeMultimap.create(); + expectedRequestHeaders.put("Naming-Convention", "s3"); //default from AbstractRequest + + por.withMetaData("test1", null); + por.withMetaData("test2", ""); + + MockNetwork + .expecting(HttpVerb.PUT, "/bucketName/objectName", queryParams, expectedRequestHeaders, output) + .returning(200, "") + .asClient() + .putObject(por); + } + @Test public void headObjectWithMetadata() throws IOException, SignatureException { From 3bf8a9b9038f05b7491b2e2fb60ad7a3acf45f57 Mon Sep 17 00:00:00 2001 From: Rachel Tucker Date: Mon, 18 Jul 2016 11:18:15 -0600 Subject: [PATCH 2/2] Filter for null or empty metadata values in put object request --- .../ds3client/commands/PutObjectRequest.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/ds3-sdk/src/main/java/com/spectralogic/ds3client/commands/PutObjectRequest.java b/ds3-sdk/src/main/java/com/spectralogic/ds3client/commands/PutObjectRequest.java index 5c613ad1a..4bdfca1a2 100644 --- a/ds3-sdk/src/main/java/com/spectralogic/ds3client/commands/PutObjectRequest.java +++ b/ds3-sdk/src/main/java/com/spectralogic/ds3client/commands/PutObjectRequest.java @@ -20,12 +20,17 @@ import java.io.InputStream; import java.nio.channels.SeekableByteChannel; import com.spectralogic.ds3client.utils.SeekableByteChannelInputStream; +import static com.spectralogic.ds3client.utils.Guard.isStringNullOrEmpty; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.spectralogic.ds3client.commands.interfaces.AbstractRequest; import java.util.UUID; import com.google.common.net.UrlEscapers; import com.spectralogic.ds3client.models.ChecksumType; public class PutObjectRequest extends AbstractRequest { + final static private Logger LOG = LoggerFactory.getLogger(PutObjectRequest.class); + // Variables public final static String AMZ_META_HEADER = "x-amz-meta-"; @@ -157,6 +162,10 @@ public ChecksumType.Type getChecksumType() { public PutObjectRequest withMetaData(final String key, final String value) { + if (isStringNullOrEmpty(value)) { + LOG.warn("Key has not been added to metadata because value was null or empty: " + key); + return this; + } final String modifiedKey; if (!key.toLowerCase().startsWith(AMZ_META_HEADER)){ modifiedKey = AMZ_META_HEADER + key;