From de333e8b3cc422463163de1d3cb93655ec925c21 Mon Sep 17 00:00:00 2001 From: Andrew Gaul Date: Wed, 3 Feb 2016 22:03:48 -0800 Subject: [PATCH] Check Content-Length in local blobstore putBlob --- .../internal/FilesystemStorageStrategyImpl.java | 7 ++++++- .../FilesystemStorageStrategyImplTest.java | 16 ++++++++++++++++ .../blobstore/TransientStorageStrategy.java | 6 ++++++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/apis/filesystem/src/main/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImpl.java b/apis/filesystem/src/main/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImpl.java index 3782b99b49..fc4a8aaef0 100644 --- a/apis/filesystem/src/main/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImpl.java +++ b/apis/filesystem/src/main/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImpl.java @@ -462,7 +462,12 @@ public class FilesystemStorageStrategyImpl implements LocalStorageStrategy { try { Files.createParentDirs(tmpFile); his = new HashingInputStream(Hashing.md5(), payload.openStream()); - Files.asByteSink(tmpFile).writeFrom(his); + long actualSize = Files.asByteSink(tmpFile).writeFrom(his); + Long expectedSize = blob.getMetadata().getContentMetadata().getContentLength(); + if (expectedSize != null && actualSize != expectedSize) { + throw new IOException("Content-Length mismatch, actual: " + actualSize + + " expected: " + expectedSize); + } HashCode actualHashCode = his.hash(); HashCode expectedHashCode = payload.getContentMetadata().getContentMD5AsHashCode(); if (expectedHashCode != null && !actualHashCode.equals(expectedHashCode)) { diff --git a/apis/filesystem/src/test/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImplTest.java b/apis/filesystem/src/test/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImplTest.java index 19ca7d95ec..3fdd855909 100644 --- a/apis/filesystem/src/test/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImplTest.java +++ b/apis/filesystem/src/test/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImplTest.java @@ -34,6 +34,7 @@ import java.util.concurrent.TimeUnit; import javax.inject.Provider; +import org.assertj.core.api.Fail; import org.jclouds.blobstore.domain.Blob; import org.jclouds.blobstore.domain.BlobBuilder; import org.jclouds.blobstore.domain.ContainerAccess; @@ -667,6 +668,21 @@ public class FilesystemStorageStrategyImplTest { assertFalse(blob.getMetadata().getUserMetadata().containsKey("key1")); } + @Test + public void testPutIncorrectContentLength() throws Exception { + Blob blob = new BlobBuilderImpl() + .name("key") + .payload(randomByteSource().slice(0, 1024)) + .contentLength(512) + .build(); + try { + storageStrategy.putBlob(CONTAINER_NAME, blob); + Fail.failBecauseExceptionWasNotThrown(IOException.class); + } catch (IOException ioe) { + // expected + } + } + // ---------------------------------------------------------- Private methods /** diff --git a/blobstore/src/main/java/org/jclouds/blobstore/TransientStorageStrategy.java b/blobstore/src/main/java/org/jclouds/blobstore/TransientStorageStrategy.java index 7746f5fb65..bd662f3275 100644 --- a/blobstore/src/main/java/org/jclouds/blobstore/TransientStorageStrategy.java +++ b/blobstore/src/main/java/org/jclouds/blobstore/TransientStorageStrategy.java @@ -165,6 +165,12 @@ public class TransientStorageStrategy implements LocalStorageStrategy { HashingInputStream input = new HashingInputStream(Hashing.md5(), blob.getPayload().openStream()); try { payload = ByteStreams.toByteArray(input); + long actualSize = payload.length; + Long expectedSize = blob.getMetadata().getContentMetadata().getContentLength(); + if (expectedSize != null && actualSize != expectedSize) { + throw new IOException("Content-Length mismatch, actual: " + actualSize + + " expected: " + expectedSize); + } actualHashCode = input.hash(); HashCode expectedHashCode = blob.getPayload().getContentMetadata().getContentMD5AsHashCode(); if (expectedHashCode != null && !actualHashCode.equals(expectedHashCode)) {