Repository: jclouds Updated Branches: refs/heads/master e50bd79f0 -> de333e8b3
Check Content-Length in local blobstore putBlob Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/de333e8b Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/de333e8b Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/de333e8b Branch: refs/heads/master Commit: de333e8b3cc422463163de1d3cb93655ec925c21 Parents: e50bd79 Author: Andrew Gaul <[email protected]> Authored: Wed Feb 3 22:03:48 2016 -0800 Committer: Andrew Gaul <[email protected]> Committed: Wed Feb 3 22:03:48 2016 -0800 ---------------------------------------------------------------------- .../internal/FilesystemStorageStrategyImpl.java | 7 ++++++- .../internal/FilesystemStorageStrategyImplTest.java | 16 ++++++++++++++++ .../jclouds/blobstore/TransientStorageStrategy.java | 6 ++++++ 3 files changed, 28 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/jclouds/blob/de333e8b/apis/filesystem/src/main/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImpl.java ---------------------------------------------------------------------- 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 3782b99..fc4a8aa 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)) { http://git-wip-us.apache.org/repos/asf/jclouds/blob/de333e8b/apis/filesystem/src/test/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImplTest.java ---------------------------------------------------------------------- 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 19ca7d9..3fdd855 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 /** http://git-wip-us.apache.org/repos/asf/jclouds/blob/de333e8b/blobstore/src/main/java/org/jclouds/blobstore/TransientStorageStrategy.java ---------------------------------------------------------------------- diff --git a/blobstore/src/main/java/org/jclouds/blobstore/TransientStorageStrategy.java b/blobstore/src/main/java/org/jclouds/blobstore/TransientStorageStrategy.java index 7746f5f..bd662f3 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)) {
