public async Task StoreBlobContentMD5TestAsync() { BlobRequestOptions optionsWithNoMD5 = new BlobRequestOptions() { StoreBlobContentMD5 = false, }; BlobRequestOptions optionsWithMD5 = new BlobRequestOptions() { StoreBlobContentMD5 = true, }; CloudBlobContainer container = GetRandomContainerReference(); try { await container.CreateAsync(); ICloudBlob blob = container.GetBlockBlobReference("blob1"); using (Stream stream = new NonSeekableMemoryStream()) { await blob.UploadFromStreamAsync(stream.AsInputStream(), null, optionsWithMD5, null); } await blob.FetchAttributesAsync(); Assert.IsNotNull(blob.Properties.ContentMD5); blob = container.GetBlockBlobReference("blob2"); using (Stream stream = new NonSeekableMemoryStream()) { await blob.UploadFromStreamAsync(stream.AsInputStream(), null, optionsWithNoMD5, null); } await blob.FetchAttributesAsync(); Assert.IsNull(blob.Properties.ContentMD5); blob = container.GetBlockBlobReference("blob3"); using (Stream stream = new NonSeekableMemoryStream()) { await blob.UploadFromStreamAsync(stream.AsInputStream()); } await blob.FetchAttributesAsync(); Assert.IsNotNull(blob.Properties.ContentMD5); blob = container.GetPageBlobReference("blob4"); using (Stream stream = new MemoryStream()) { await blob.UploadFromStreamAsync(stream.AsInputStream(), null, optionsWithMD5, null); } await blob.FetchAttributesAsync(); Assert.IsNotNull(blob.Properties.ContentMD5); blob = container.GetPageBlobReference("blob5"); using (Stream stream = new MemoryStream()) { await blob.UploadFromStreamAsync(stream.AsInputStream(), null, optionsWithNoMD5, null); } await blob.FetchAttributesAsync(); Assert.IsNull(blob.Properties.ContentMD5); blob = container.GetPageBlobReference("blob6"); using (Stream stream = new MemoryStream()) { await blob.UploadFromStreamAsync(stream.AsInputStream()); } await blob.FetchAttributesAsync(); Assert.IsNull(blob.Properties.ContentMD5); } finally { container.DeleteIfExistsAsync().AsTask().Wait(); } }
private async Task CloudBlockBlobUploadFromStreamAsync(bool seekableSourceStream, int startOffset) { byte[] buffer = GetRandomBuffer(1 * 1024 * 1024); CryptographicHash hasher = HashAlgorithmProvider.OpenAlgorithm("MD5").CreateHash(); hasher.Append(buffer.AsBuffer(startOffset, buffer.Length - startOffset)); string md5 = CryptographicBuffer.EncodeToBase64String(hasher.GetValueAndReset()); CloudBlobContainer container = GetRandomContainerReference(); try { await container.CreateAsync(); CloudBlockBlob blob = container.GetBlockBlobReference("blob1"); using (MemoryStream originalBlob = new MemoryStream()) { originalBlob.Write(buffer, startOffset, buffer.Length - startOffset); Stream sourceStream; if (seekableSourceStream) { MemoryStream stream = new MemoryStream(buffer); stream.Seek(startOffset, SeekOrigin.Begin); sourceStream = stream; } else { NonSeekableMemoryStream stream = new NonSeekableMemoryStream(buffer); stream.ForceSeek(startOffset, SeekOrigin.Begin); sourceStream = stream; } using (sourceStream) { BlobRequestOptions options = new BlobRequestOptions() { StoreBlobContentMD5 = true, }; await blob.UploadFromStreamAsync(sourceStream.AsInputStream(), null, options, null); } await blob.FetchAttributesAsync(); Assert.AreEqual(md5, blob.Properties.ContentMD5); using (MemoryStream downloadedBlob = new MemoryStream()) { await blob.DownloadToStreamAsync(downloadedBlob.AsOutputStream()); TestHelper.AssertStreamsAreEqual(originalBlob, downloadedBlob); } } } finally { container.DeleteIfExistsAsync().AsTask().Wait(); } }
public async Task DisableContentMD5ValidationTestAsync() { byte[] buffer = new byte[1024]; Random random = new Random(); random.NextBytes(buffer); BlobRequestOptions optionsWithNoMD5 = new BlobRequestOptions() { DisableContentMD5Validation = true, StoreBlobContentMD5 = true, }; BlobRequestOptions optionsWithMD5 = new BlobRequestOptions() { DisableContentMD5Validation = false, StoreBlobContentMD5 = true, }; CloudBlobContainer container = GetRandomContainerReference(); try { await container.CreateAsync(); CloudBlockBlob blockBlob = container.GetBlockBlobReference("blob1"); using (Stream stream = new NonSeekableMemoryStream(buffer)) { await blockBlob.UploadFromStreamAsync(stream.AsInputStream(), null, optionsWithMD5, null); } using (Stream stream = new MemoryStream()) { await blockBlob.DownloadToStreamAsync(stream.AsOutputStream(), null, optionsWithMD5, null); await blockBlob.DownloadToStreamAsync(stream.AsOutputStream(), null, optionsWithNoMD5, null); using (IRandomAccessStreamWithContentType blobStream = await blockBlob.OpenReadAsync(null, optionsWithMD5, null)) { Stream blobStreamForRead = blobStream.AsStreamForRead(); int read; do { read = await blobStreamForRead.ReadAsync(buffer, 0, buffer.Length); } while (read > 0); } using (IRandomAccessStreamWithContentType blobStream = await blockBlob.OpenReadAsync(null, optionsWithNoMD5, null)) { Stream blobStreamForRead = blobStream.AsStreamForRead(); int read; do { read = await blobStreamForRead.ReadAsync(buffer, 0, buffer.Length); } while (read > 0); } blockBlob.Properties.ContentMD5 = "MDAwMDAwMDA="; await blockBlob.SetPropertiesAsync(); OperationContext opContext = new OperationContext(); await TestHelper.ExpectedExceptionAsync( async () => await blockBlob.DownloadToStreamAsync(stream.AsOutputStream(), null, optionsWithMD5, opContext), opContext, "Downloading a blob with invalid MD5 should fail", HttpStatusCode.OK); await blockBlob.DownloadToStreamAsync(stream.AsOutputStream(), null, optionsWithNoMD5, null); using (IRandomAccessStreamWithContentType blobStream = await blockBlob.OpenReadAsync(null, optionsWithMD5, null)) { Stream blobStreamForRead = blobStream.AsStreamForRead(); TestHelper.ExpectedException<IOException>( () => { int read; do { read = blobStreamForRead.Read(buffer, 0, buffer.Length); } while (read > 0); }, "Downloading a blob with invalid MD5 should fail"); } using (IRandomAccessStreamWithContentType blobStream = await blockBlob.OpenReadAsync(null, optionsWithNoMD5, null)) { Stream blobStreamForRead = blobStream.AsStreamForRead(); int read; do { read = await blobStreamForRead.ReadAsync(buffer, 0, buffer.Length); } while (read > 0); } } CloudPageBlob pageBlob = container.GetPageBlobReference("blob2"); using (Stream stream = new MemoryStream(buffer)) { await pageBlob.UploadFromStreamAsync(stream.AsInputStream(), null, optionsWithMD5, null); } using (Stream stream = new MemoryStream()) { await pageBlob.DownloadToStreamAsync(stream.AsOutputStream(), null, optionsWithMD5, null); await pageBlob.DownloadToStreamAsync(stream.AsOutputStream(), null, optionsWithNoMD5, null); using (IRandomAccessStreamWithContentType blobStream = await pageBlob.OpenReadAsync(null, optionsWithMD5, null)) { Stream blobStreamForRead = blobStream.AsStreamForRead(); int read; do { read = await blobStreamForRead.ReadAsync(buffer, 0, buffer.Length); } while (read > 0); } using (IRandomAccessStreamWithContentType blobStream = await pageBlob.OpenReadAsync(null, optionsWithNoMD5, null)) { Stream blobStreamForRead = blobStream.AsStreamForRead(); int read; do { read = await blobStreamForRead.ReadAsync(buffer, 0, buffer.Length); } while (read > 0); } pageBlob.Properties.ContentMD5 = "MDAwMDAwMDA="; await pageBlob.SetPropertiesAsync(); OperationContext opContext = new OperationContext(); await TestHelper.ExpectedExceptionAsync( async () => await pageBlob.DownloadToStreamAsync(stream.AsOutputStream(), null, optionsWithMD5, opContext), opContext, "Downloading a blob with invalid MD5 should fail", HttpStatusCode.OK); await pageBlob.DownloadToStreamAsync(stream.AsOutputStream(), null, optionsWithNoMD5, null); using (IRandomAccessStreamWithContentType blobStream = await pageBlob.OpenReadAsync(null, optionsWithMD5, null)) { Stream blobStreamForRead = blobStream.AsStreamForRead(); TestHelper.ExpectedException<IOException>( () => { int read; do { read = blobStreamForRead.Read(buffer, 0, buffer.Length); } while (read > 0); }, "Downloading a blob with invalid MD5 should fail"); } using (IRandomAccessStreamWithContentType blobStream = await pageBlob.OpenReadAsync(null, optionsWithNoMD5, null)) { Stream blobStreamForRead = blobStream.AsStreamForRead(); int read; do { read = await blobStreamForRead.ReadAsync(buffer, 0, buffer.Length); } while (read > 0); } } } finally { container.DeleteIfExistsAsync().AsTask().Wait(); } }
public void DisableContentMD5ValidationTestAPM() { BlobRequestOptions optionsWithNoMD5 = new BlobRequestOptions() { DisableContentMD5Validation = true, StoreBlobContentMD5 = true, }; BlobRequestOptions optionsWithMD5 = new BlobRequestOptions() { DisableContentMD5Validation = false, StoreBlobContentMD5 = true, }; CloudBlobContainer container = GetRandomContainerReference(); try { container.Create(); using (AutoResetEvent waitHandle = new AutoResetEvent(false)) { IAsyncResult result; ICloudBlob blob = container.GetBlockBlobReference("blob1"); using (Stream stream = new NonSeekableMemoryStream()) { blob.UploadFromStream(stream, null, optionsWithMD5); } using (Stream stream = new MemoryStream()) { result = blob.BeginDownloadToStream(stream, null, optionsWithMD5, null, ar => waitHandle.Set(), null); waitHandle.WaitOne(); blob.EndDownloadToStream(result); result = blob.BeginDownloadToStream(stream, null, optionsWithNoMD5, null, ar => waitHandle.Set(), null); waitHandle.WaitOne(); blob.EndDownloadToStream(result); blob.Properties.ContentMD5 = "MDAwMDAwMDA="; blob.SetProperties(); result = blob.BeginDownloadToStream(stream, null, optionsWithMD5, null, ar => waitHandle.Set(), null); waitHandle.WaitOne(); TestHelper.ExpectedException( () => blob.EndDownloadToStream(result), "Downloading a blob with invalid MD5 should fail", HttpStatusCode.OK); result = blob.BeginDownloadToStream(stream, null, optionsWithNoMD5, null, ar => waitHandle.Set(), null); waitHandle.WaitOne(); blob.EndDownloadToStream(result); } blob = container.GetPageBlobReference("blob2"); using (Stream stream = new MemoryStream()) { blob.UploadFromStream(stream, null, optionsWithMD5); } using (Stream stream = new MemoryStream()) { result = blob.BeginDownloadToStream(stream, null, optionsWithMD5, null, ar => waitHandle.Set(), null); waitHandle.WaitOne(); blob.EndDownloadToStream(result); result = blob.BeginDownloadToStream(stream, null, optionsWithNoMD5, null, ar => waitHandle.Set(), null); waitHandle.WaitOne(); blob.EndDownloadToStream(result); blob.Properties.ContentMD5 = "MDAwMDAwMDA="; blob.SetProperties(); result = blob.BeginDownloadToStream(stream, null, optionsWithMD5, null, ar => waitHandle.Set(), null); waitHandle.WaitOne(); TestHelper.ExpectedException( () => blob.EndDownloadToStream(result), "Downloading a blob with invalid MD5 should fail", HttpStatusCode.OK); result = blob.BeginDownloadToStream(stream, null, optionsWithNoMD5, null, ar => waitHandle.Set(), null); waitHandle.WaitOne(); blob.EndDownloadToStream(result); } } } finally { container.DeleteIfExists(); } }
public void StoreBlobContentMD5Test() { BlobRequestOptions optionsWithNoMD5 = new BlobRequestOptions() { StoreBlobContentMD5 = false, }; BlobRequestOptions optionsWithMD5 = new BlobRequestOptions() { StoreBlobContentMD5 = true, }; CloudBlobContainer container = GetRandomContainerReference(); try { container.Create(); ICloudBlob blob = container.GetBlockBlobReference("blob1"); using (Stream stream = new NonSeekableMemoryStream()) { blob.UploadFromStream(stream, null, optionsWithMD5); } blob.FetchAttributes(); Assert.IsNotNull(blob.Properties.ContentMD5); blob = container.GetBlockBlobReference("blob2"); using (Stream stream = new NonSeekableMemoryStream()) { blob.UploadFromStream(stream, null, optionsWithNoMD5); } blob.FetchAttributes(); Assert.IsNull(blob.Properties.ContentMD5); blob = container.GetBlockBlobReference("blob3"); using (Stream stream = new NonSeekableMemoryStream()) { blob.UploadFromStream(stream); } blob.FetchAttributes(); Assert.IsNotNull(blob.Properties.ContentMD5); blob = container.GetPageBlobReference("blob4"); using (Stream stream = new MemoryStream()) { blob.UploadFromStream(stream, null, optionsWithMD5); } blob.FetchAttributes(); Assert.IsNotNull(blob.Properties.ContentMD5); blob = container.GetPageBlobReference("blob5"); using (Stream stream = new MemoryStream()) { blob.UploadFromStream(stream, null, optionsWithNoMD5); } blob.FetchAttributes(); Assert.IsNull(blob.Properties.ContentMD5); blob = container.GetPageBlobReference("blob6"); using (Stream stream = new MemoryStream()) { blob.UploadFromStream(stream); } blob.FetchAttributes(); Assert.IsNull(blob.Properties.ContentMD5); } finally { container.DeleteIfExists(); } }
private void CloudBlockBlobUploadFromStream(CloudBlobContainer container, int size, long? copyLength, AccessCondition accessCondition, bool seekableSourceStream, bool allowSinglePut, int startOffset, bool isAsync, bool testMd5) { byte[] buffer = GetRandomBuffer(size); MD5 hasher = MD5.Create(); string md5 = string.Empty; if (testMd5) { md5 = Convert.ToBase64String(hasher.ComputeHash(buffer, startOffset, copyLength.HasValue ? (int)copyLength : buffer.Length - startOffset)); } CloudBlockBlob blob = container.GetBlockBlobReference("blob1"); blob.ServiceClient.SingleBlobUploadThresholdInBytes = allowSinglePut ? buffer.Length : buffer.Length / 2; blob.StreamWriteSizeInBytes = 1 * 1024 * 1024; using (MemoryStream originalBlobStream = new MemoryStream()) { originalBlobStream.Write(buffer, startOffset, buffer.Length - startOffset); Stream sourceStream; if (seekableSourceStream) { MemoryStream stream = new MemoryStream(buffer); stream.Seek(startOffset, SeekOrigin.Begin); sourceStream = stream; } else { NonSeekableMemoryStream stream = new NonSeekableMemoryStream(buffer); stream.ForceSeek(startOffset, SeekOrigin.Begin); sourceStream = stream; } using (sourceStream) { BlobRequestOptions options = new BlobRequestOptions() { StoreBlobContentMD5 = true, }; if (isAsync) { using (ManualResetEvent waitHandle = new ManualResetEvent(false)) { if (copyLength.HasValue) { ICancellableAsyncResult result = blob.BeginUploadFromStream( sourceStream, copyLength.Value, accessCondition, options, null, ar => waitHandle.Set(), null); waitHandle.WaitOne(); blob.EndUploadFromStream(result); } else { ICancellableAsyncResult result = blob.BeginUploadFromStream( sourceStream, accessCondition, options, null, ar => waitHandle.Set(), null); waitHandle.WaitOne(); blob.EndUploadFromStream(result); } } } else { if (copyLength.HasValue) { blob.UploadFromStream(sourceStream, copyLength.Value, accessCondition, options); } else { blob.UploadFromStream(sourceStream, accessCondition, options); } } } blob.FetchAttributes(); if (testMd5) { Assert.AreEqual(md5, blob.Properties.ContentMD5); } using (MemoryStream downloadedBlobStream = new MemoryStream()) { if (isAsync) { using (ManualResetEvent waitHandle = new ManualResetEvent(false)) { ICancellableAsyncResult result = blob.BeginDownloadToStream( downloadedBlobStream, ar => waitHandle.Set(), null); waitHandle.WaitOne(); blob.EndDownloadToStream(result); } } else { blob.DownloadToStream(downloadedBlobStream); } Assert.AreEqual(copyLength ?? originalBlobStream.Length, downloadedBlobStream.Length); TestHelper.AssertStreamsAreEqualAtIndex( originalBlobStream, downloadedBlobStream, 0, 0, copyLength.HasValue ? (int)copyLength : (int)originalBlobStream.Length); } } blob.Delete(); }
public void StoreBlobContentMD5TestAPM() { BlobRequestOptions optionsWithNoMD5 = new BlobRequestOptions() { StoreBlobContentMD5 = false, }; BlobRequestOptions optionsWithMD5 = new BlobRequestOptions() { StoreBlobContentMD5 = true, }; CloudBlobContainer container = GetRandomContainerReference(); try { container.Create(); using (AutoResetEvent waitHandle = new AutoResetEvent(false)) { IAsyncResult result; ICloudBlob blob = container.GetBlockBlobReference("blob1"); using (Stream stream = new NonSeekableMemoryStream()) { result = blob.BeginUploadFromStream(stream, null, optionsWithMD5, null, ar => waitHandle.Set(), null); waitHandle.WaitOne(); blob.EndUploadFromStream(result); } blob.FetchAttributes(); Assert.IsNotNull(blob.Properties.ContentMD5); blob = container.GetBlockBlobReference("blob2"); using (Stream stream = new NonSeekableMemoryStream()) { result = blob.BeginUploadFromStream(stream, null, optionsWithNoMD5, null, ar => waitHandle.Set(), null); waitHandle.WaitOne(); blob.EndUploadFromStream(result); } blob.FetchAttributes(); Assert.IsNull(blob.Properties.ContentMD5); blob = container.GetBlockBlobReference("blob3"); using (Stream stream = new NonSeekableMemoryStream()) { result = blob.BeginUploadFromStream(stream, ar => waitHandle.Set(), null); waitHandle.WaitOne(); blob.EndUploadFromStream(result); } blob.FetchAttributes(); Assert.IsNotNull(blob.Properties.ContentMD5); blob = container.GetPageBlobReference("blob4"); using (Stream stream = new MemoryStream()) { result = blob.BeginUploadFromStream(stream, null, optionsWithMD5, null, ar => waitHandle.Set(), null); waitHandle.WaitOne(); blob.EndUploadFromStream(result); } blob.FetchAttributes(); Assert.IsNotNull(blob.Properties.ContentMD5); blob = container.GetPageBlobReference("blob5"); using (Stream stream = new MemoryStream()) { result = blob.BeginUploadFromStream(stream, null, optionsWithNoMD5, null, ar => waitHandle.Set(), null); waitHandle.WaitOne(); blob.EndUploadFromStream(result); } blob.FetchAttributes(); Assert.IsNull(blob.Properties.ContentMD5); blob = container.GetPageBlobReference("blob6"); using (Stream stream = new MemoryStream()) { result = blob.BeginUploadFromStream(stream, ar => waitHandle.Set(), null); waitHandle.WaitOne(); blob.EndUploadFromStream(result); } blob.FetchAttributes(); Assert.IsNull(blob.Properties.ContentMD5); } } finally { container.DeleteIfExists(); } }
private async Task CloudBlockBlobUploadFromStreamAsync(CloudBlobContainer container, int size, long? copyLength, AccessCondition accessCondition, OperationContext operationContext, bool seekableSourceStream, bool allowSinglePut, int startOffset) { byte[] buffer = GetRandomBuffer(size); CloudBlockBlob blob = container.GetBlockBlobReference("blob1"); blob.ServiceClient.DefaultRequestOptions.SingleBlobUploadThresholdInBytes = allowSinglePut ? buffer.Length : buffer.Length / 2; blob.StreamWriteSizeInBytes = 1 * 1024 * 1024; using (MemoryStream originalBlobStream = new MemoryStream()) { originalBlobStream.Write(buffer, startOffset, buffer.Length - startOffset); Stream sourceStream; if (seekableSourceStream) { MemoryStream stream = new MemoryStream(buffer); stream.Seek(startOffset, SeekOrigin.Begin); sourceStream = stream; } else { NonSeekableMemoryStream stream = new NonSeekableMemoryStream(buffer); stream.ForceSeek(startOffset, SeekOrigin.Begin); sourceStream = stream; } using (sourceStream) { if (copyLength.HasValue) { await blob.UploadFromStreamAsync(sourceStream, copyLength.Value, accessCondition, null, operationContext); } else { await blob.UploadFromStreamAsync(sourceStream, accessCondition, null, operationContext); } } using (MemoryStream downloadedBlobStream = new MemoryStream()) { await blob.DownloadToStreamAsync(downloadedBlobStream); Assert.AreEqual(copyLength ?? originalBlobStream.Length, downloadedBlobStream.Length); TestHelper.AssertStreamsAreEqualAtIndex( originalBlobStream, downloadedBlobStream, 0, 0, copyLength.HasValue ? (int)copyLength : (int)originalBlobStream.Length); } } }
public void CloudBlobEncryptionOpenWriteStreamAPMWithAccessCondition() { CloudBlobContainer container = GetRandomContainerReference(); try { int size = (int)(1 * Constants.MB); container.Create(); byte[] buffer = GetRandomBuffer(size); CloudBlockBlob blob = container.GetBlockBlobReference("blockblob"); blob.StreamWriteSizeInBytes = (int)(4 * Constants.MB); blob.UploadText("Sample initial text"); // Create the Key to be used for wrapping. SymmetricKey aesKey = new SymmetricKey("symencryptionkey"); // Create the resolver to be used for unwrapping. DictionaryKeyResolver resolver = new DictionaryKeyResolver(); resolver.Add(aesKey); // Create the encryption policy to be used for upload. BlobEncryptionPolicy uploadPolicy = new BlobEncryptionPolicy(aesKey, null); // Set the encryption policy on the request options. BlobRequestOptions uploadOptions = new BlobRequestOptions() { EncryptionPolicy = uploadPolicy, RequireEncryption = true }; AccessCondition accessCondition = AccessCondition.GenerateIfMatchCondition(blob.Properties.ETag); using (MemoryStream stream = new NonSeekableMemoryStream(buffer)) { using (AutoResetEvent waitHandle = new AutoResetEvent(false)) { blob.EndUploadFromStream(blob.BeginUploadFromStream( stream, size, accessCondition, uploadOptions, null, ar => waitHandle.Set(), null)); } } // Download the encrypted blob. // Create the decryption policy to be used for download. There is no need to specify the // key when the policy is only going to be used for downloads. Resolver is sufficient. BlobEncryptionPolicy downloadPolicy = new BlobEncryptionPolicy(null, resolver); // Set the decryption policy on the request options. BlobRequestOptions downloadOptions = new BlobRequestOptions() { EncryptionPolicy = downloadPolicy, RequireEncryption = true }; // Download and decrypt the encrypted contents from the blob. MemoryStream outputStream = new MemoryStream(); blob.DownloadToStream(outputStream, null, downloadOptions, null); // Ensure that the user stream is open. outputStream.Seek(0, SeekOrigin.Begin); // Compare that the decrypted contents match the input data. byte[] outputArray = outputStream.ToArray(); TestHelper.AssertBuffersAreEqualUptoIndex(outputArray, buffer, size - 1); } finally { container.DeleteIfExists(); } }
private async Task CloudAppendBlobUploadFromStreamAsync(CloudBlobContainer container, int size, long? copyLength, AccessCondition accessCondition, bool seekableSourceStream, int startOffset) { byte[] buffer = GetRandomBuffer(size); CloudAppendBlob blob = container.GetAppendBlobReference("blob1"); blob.StreamWriteSizeInBytes = 1 * 1024 * 1024; using (MemoryStream originalBlobStream = new MemoryStream()) { originalBlobStream.Write(buffer, startOffset, buffer.Length - startOffset); Stream sourceStream; if (seekableSourceStream) { MemoryStream stream = new MemoryStream(buffer); stream.Seek(startOffset, SeekOrigin.Begin); sourceStream = stream; } else { NonSeekableMemoryStream stream = new NonSeekableMemoryStream(buffer); stream.ForceSeek(startOffset, SeekOrigin.Begin); sourceStream = stream; } using (sourceStream) { if (copyLength.HasValue) { await blob.UploadFromStreamAsync(sourceStream.AsInputStream(), copyLength.Value, accessCondition, null, null); } else { await blob.UploadFromStreamAsync(sourceStream.AsInputStream(), accessCondition, null, null); } } using (MemoryStream downloadedBlobStream = new MemoryStream()) { await blob.DownloadToStreamAsync(downloadedBlobStream.AsOutputStream()); Assert.AreEqual(copyLength ?? originalBlobStream.Length, downloadedBlobStream.Length); TestHelper.AssertStreamsAreEqualAtIndex( originalBlobStream, downloadedBlobStream, 0, 0, copyLength.HasValue ? (int)copyLength : (int)originalBlobStream.Length); } } }
public void DisableContentMD5ValidationTest() { byte[] buffer = new byte[1024]; Random random = new Random(); random.NextBytes(buffer); BlobRequestOptions optionsWithNoMD5 = new BlobRequestOptions() { DisableContentMD5Validation = true, StoreBlobContentMD5 = true, }; BlobRequestOptions optionsWithMD5 = new BlobRequestOptions() { DisableContentMD5Validation = false, StoreBlobContentMD5 = true, }; CloudBlobContainer container = GetRandomContainerReference(); try { container.Create(); CloudBlockBlob blockBlob = container.GetBlockBlobReference("blob1"); using (Stream stream = new NonSeekableMemoryStream(buffer)) { blockBlob.UploadFromStream(stream, null, optionsWithMD5); } using (Stream stream = new MemoryStream()) { blockBlob.DownloadToStream(stream, null, optionsWithMD5); blockBlob.DownloadToStream(stream, null, optionsWithNoMD5); using (Stream blobStream = blockBlob.OpenRead(null, optionsWithMD5)) { int read; do { read = blobStream.Read(buffer, 0, buffer.Length); }while (read > 0); } using (Stream blobStream = blockBlob.OpenRead(null, optionsWithNoMD5)) { int read; do { read = blobStream.Read(buffer, 0, buffer.Length); }while (read > 0); } blockBlob.Properties.ContentMD5 = "MDAwMDAwMDA="; blockBlob.SetProperties(); TestHelper.ExpectedException( () => blockBlob.DownloadToStream(stream, null, optionsWithMD5), "Downloading a blob with invalid MD5 should fail", HttpStatusCode.OK); blockBlob.DownloadToStream(stream, null, optionsWithNoMD5); using (Stream blobStream = blockBlob.OpenRead(null, optionsWithMD5)) { TestHelper.ExpectedException <IOException>( () => { int read; do { read = blobStream.Read(buffer, 0, buffer.Length); }while (read > 0); }, "Downloading a blob with invalid MD5 should fail"); } using (Stream blobStream = blockBlob.OpenRead(null, optionsWithNoMD5)) { int read; do { read = blobStream.Read(buffer, 0, buffer.Length); }while (read > 0); } } CloudPageBlob pageBlob = container.GetPageBlobReference("blob2"); using (Stream stream = new MemoryStream(buffer)) { pageBlob.UploadFromStream(stream, null, optionsWithMD5); } using (Stream stream = new MemoryStream()) { pageBlob.DownloadToStream(stream, null, optionsWithMD5); pageBlob.DownloadToStream(stream, null, optionsWithNoMD5); using (Stream blobStream = pageBlob.OpenRead(null, optionsWithMD5)) { int read; do { read = blobStream.Read(buffer, 0, buffer.Length); }while (read > 0); } using (Stream blobStream = pageBlob.OpenRead(null, optionsWithNoMD5)) { int read; do { read = blobStream.Read(buffer, 0, buffer.Length); }while (read > 0); } pageBlob.Properties.ContentMD5 = "MDAwMDAwMDA="; pageBlob.SetProperties(); TestHelper.ExpectedException( () => pageBlob.DownloadToStream(stream, null, optionsWithMD5), "Downloading a blob with invalid MD5 should fail", HttpStatusCode.OK); pageBlob.DownloadToStream(stream, null, optionsWithNoMD5); using (Stream blobStream = pageBlob.OpenRead(null, optionsWithMD5)) { TestHelper.ExpectedException <IOException>( () => { int read; do { read = blobStream.Read(buffer, 0, buffer.Length); }while (read > 0); }, "Downloading a blob with invalid MD5 should fail"); } using (Stream blobStream = pageBlob.OpenRead(null, optionsWithNoMD5)) { int read; do { read = blobStream.Read(buffer, 0, buffer.Length); }while (read > 0); } } } finally { container.DeleteIfExists(); } }
public async Task DisableContentMD5ValidationTestAsync() { byte[] buffer = new byte[1024]; Random random = new Random(); random.NextBytes(buffer); BlobRequestOptions optionsWithNoMD5 = new BlobRequestOptions() { DisableContentMD5Validation = true, StoreBlobContentMD5 = true, }; BlobRequestOptions optionsWithMD5 = new BlobRequestOptions() { DisableContentMD5Validation = false, StoreBlobContentMD5 = true, }; CloudBlobContainer container = GetRandomContainerReference(); try { await container.CreateAsync(); CloudBlockBlob blockBlob = container.GetBlockBlobReference("blob1"); using (Stream stream = new NonSeekableMemoryStream(buffer)) { await blockBlob.UploadFromStreamAsync(stream, null, optionsWithMD5, null); } using (Stream stream = new MemoryStream()) { await blockBlob.DownloadToStreamAsync(stream, null, optionsWithMD5, null); await blockBlob.DownloadToStreamAsync(stream, null, optionsWithNoMD5, null); using (var blobStream = await blockBlob.OpenReadAsync(null, optionsWithMD5, null)) { Stream blobStreamForRead = blobStream; int read; do { read = await blobStreamForRead.ReadAsync(buffer, 0, buffer.Length); }while (read > 0); } using (var blobStream = await blockBlob.OpenReadAsync(null, optionsWithNoMD5, null)) { Stream blobStreamForRead = blobStream; int read; do { read = await blobStreamForRead.ReadAsync(buffer, 0, buffer.Length); }while (read > 0); } blockBlob.Properties.ContentMD5 = "MDAwMDAwMDA="; await blockBlob.SetPropertiesAsync(); OperationContext opContext = new OperationContext(); await TestHelper.ExpectedExceptionAsync( async() => await blockBlob.DownloadToStreamAsync(stream, null, optionsWithMD5, opContext), opContext, "Downloading a blob with invalid MD5 should fail", HttpStatusCode.OK); await blockBlob.DownloadToStreamAsync(stream, null, optionsWithNoMD5, null); using (var blobStream = await blockBlob.OpenReadAsync(null, optionsWithMD5, null)) { Stream blobStreamForRead = blobStream; TestHelper.ExpectedException <IOException>( () => { int read; do { read = blobStreamForRead.Read(buffer, 0, buffer.Length); }while (read > 0); }, "Downloading a blob with invalid MD5 should fail"); } using (var blobStream = await blockBlob.OpenReadAsync(null, optionsWithNoMD5, null)) { Stream blobStreamForRead = blobStream; int read; do { read = await blobStreamForRead.ReadAsync(buffer, 0, buffer.Length); }while (read > 0); } } CloudPageBlob pageBlob = container.GetPageBlobReference("blob2"); using (Stream stream = new MemoryStream(buffer)) { await pageBlob.UploadFromStreamAsync(stream, null, optionsWithMD5, null); } using (Stream stream = new MemoryStream()) { await pageBlob.DownloadToStreamAsync(stream, null, optionsWithMD5, null); await pageBlob.DownloadToStreamAsync(stream, null, optionsWithNoMD5, null); using (var blobStream = await pageBlob.OpenReadAsync(null, optionsWithMD5, null)) { Stream blobStreamForRead = blobStream; int read; do { read = await blobStreamForRead.ReadAsync(buffer, 0, buffer.Length); }while (read > 0); } using (var blobStream = await pageBlob.OpenReadAsync(null, optionsWithNoMD5, null)) { Stream blobStreamForRead = blobStream; int read; do { read = await blobStreamForRead.ReadAsync(buffer, 0, buffer.Length); }while (read > 0); } pageBlob.Properties.ContentMD5 = "MDAwMDAwMDA="; await pageBlob.SetPropertiesAsync(); OperationContext opContext = new OperationContext(); await TestHelper.ExpectedExceptionAsync( async() => await pageBlob.DownloadToStreamAsync(stream, null, optionsWithMD5, opContext), opContext, "Downloading a blob with invalid MD5 should fail", HttpStatusCode.OK); await pageBlob.DownloadToStreamAsync(stream, null, optionsWithNoMD5, null); using (var blobStream = await pageBlob.OpenReadAsync(null, optionsWithMD5, null)) { Stream blobStreamForRead = blobStream; TestHelper.ExpectedException <IOException>( () => { int read; do { read = blobStreamForRead.Read(buffer, 0, buffer.Length); }while (read > 0); }, "Downloading a blob with invalid MD5 should fail"); } using (var blobStream = await pageBlob.OpenReadAsync(null, optionsWithNoMD5, null)) { Stream blobStreamForRead = blobStream; int read; do { read = await blobStreamForRead.ReadAsync(buffer, 0, buffer.Length); }while (read > 0); } } } finally { container.DeleteIfExistsAsync().Wait(); } }
public async Task StoreBlobContentMD5TestAsync() { BlobRequestOptions optionsWithNoMD5 = new BlobRequestOptions() { StoreBlobContentMD5 = false, }; BlobRequestOptions optionsWithMD5 = new BlobRequestOptions() { StoreBlobContentMD5 = true, }; CloudBlobContainer container = GetRandomContainerReference(); try { await container.CreateAsync(); CloudBlockBlob blob1 = container.GetBlockBlobReference("blob1"); using (Stream stream = new NonSeekableMemoryStream()) { await blob1.UploadFromStreamAsync(stream, null, optionsWithMD5, null); } await blob1.FetchAttributesAsync(); Assert.IsNotNull(blob1.Properties.ContentMD5); blob1 = container.GetBlockBlobReference("blob2"); using (Stream stream = new NonSeekableMemoryStream()) { await blob1.UploadFromStreamAsync(stream, null, optionsWithNoMD5, null); } await blob1.FetchAttributesAsync(); Assert.IsNull(blob1.Properties.ContentMD5); blob1 = container.GetBlockBlobReference("blob3"); using (Stream stream = new NonSeekableMemoryStream()) { await blob1.UploadFromStreamAsync(stream); } await blob1.FetchAttributesAsync(); Assert.IsNotNull(blob1.Properties.ContentMD5); CloudPageBlob blob2 = container.GetPageBlobReference("blob4"); blob2 = container.GetPageBlobReference("blob4"); using (Stream stream = new MemoryStream()) { await blob2.UploadFromStreamAsync(stream, null, optionsWithMD5, null); } await blob2.FetchAttributesAsync(); Assert.IsNotNull(blob2.Properties.ContentMD5); blob2 = container.GetPageBlobReference("blob5"); using (Stream stream = new MemoryStream()) { await blob2.UploadFromStreamAsync(stream, null, optionsWithNoMD5, null); } await blob2.FetchAttributesAsync(); Assert.IsNull(blob2.Properties.ContentMD5); blob2 = container.GetPageBlobReference("blob6"); using (Stream stream = new MemoryStream()) { await blob2.UploadFromStreamAsync(stream); } await blob2.FetchAttributesAsync(); Assert.IsNull(blob2.Properties.ContentMD5); } finally { container.DeleteIfExistsAsync().Wait(); } }
public void DisableContentMD5ValidationTest() { byte[] buffer = new byte[1024]; Random random = new Random(); random.NextBytes(buffer); BlobRequestOptions optionsWithNoMD5 = new BlobRequestOptions() { DisableContentMD5Validation = true, StoreBlobContentMD5 = true, }; BlobRequestOptions optionsWithMD5 = new BlobRequestOptions() { DisableContentMD5Validation = false, StoreBlobContentMD5 = true, }; CloudBlobContainer container = GetRandomContainerReference(); try { container.Create(); CloudBlockBlob blockBlob = container.GetBlockBlobReference("blob1"); using (Stream stream = new NonSeekableMemoryStream(buffer)) { blockBlob.UploadFromStream(stream, null, optionsWithMD5); } using (Stream stream = new MemoryStream()) { blockBlob.DownloadToStream(stream, null, optionsWithMD5); blockBlob.DownloadToStream(stream, null, optionsWithNoMD5); using (Stream blobStream = blockBlob.OpenRead(null, optionsWithMD5)) { int read; do { read = blobStream.Read(buffer, 0, buffer.Length); } while (read > 0); } using (Stream blobStream = blockBlob.OpenRead(null, optionsWithNoMD5)) { int read; do { read = blobStream.Read(buffer, 0, buffer.Length); } while (read > 0); } blockBlob.Properties.ContentMD5 = "MDAwMDAwMDA="; blockBlob.SetProperties(); TestHelper.ExpectedException( () => blockBlob.DownloadToStream(stream, null, optionsWithMD5), "Downloading a blob with invalid MD5 should fail", HttpStatusCode.OK); blockBlob.DownloadToStream(stream, null, optionsWithNoMD5); using (Stream blobStream = blockBlob.OpenRead(null, optionsWithMD5)) { TestHelper.ExpectedException<IOException>( () => { int read; do { read = blobStream.Read(buffer, 0, buffer.Length); } while (read > 0); }, "Downloading a blob with invalid MD5 should fail"); } using (Stream blobStream = blockBlob.OpenRead(null, optionsWithNoMD5)) { int read; do { read = blobStream.Read(buffer, 0, buffer.Length); } while (read > 0); } } CloudPageBlob pageBlob = container.GetPageBlobReference("blob2"); using (Stream stream = new MemoryStream(buffer)) { pageBlob.UploadFromStream(stream, null, optionsWithMD5); } using (Stream stream = new MemoryStream()) { pageBlob.DownloadToStream(stream, null, optionsWithMD5); pageBlob.DownloadToStream(stream, null, optionsWithNoMD5); using (Stream blobStream = pageBlob.OpenRead(null, optionsWithMD5)) { int read; do { read = blobStream.Read(buffer, 0, buffer.Length); } while (read > 0); } using (Stream blobStream = pageBlob.OpenRead(null, optionsWithNoMD5)) { int read; do { read = blobStream.Read(buffer, 0, buffer.Length); } while (read > 0); } pageBlob.Properties.ContentMD5 = "MDAwMDAwMDA="; pageBlob.SetProperties(); TestHelper.ExpectedException( () => pageBlob.DownloadToStream(stream, null, optionsWithMD5), "Downloading a blob with invalid MD5 should fail", HttpStatusCode.OK); pageBlob.DownloadToStream(stream, null, optionsWithNoMD5); using (Stream blobStream = pageBlob.OpenRead(null, optionsWithMD5)) { TestHelper.ExpectedException<IOException>( () => { int read; do { read = blobStream.Read(buffer, 0, buffer.Length); } while (read > 0); }, "Downloading a blob with invalid MD5 should fail"); } using (Stream blobStream = pageBlob.OpenRead(null, optionsWithNoMD5)) { int read; do { read = blobStream.Read(buffer, 0, buffer.Length); } while (read > 0); } } } finally { container.DeleteIfExists(); } }
private async Task CloudBlockBlobUploadFromStreamAsync(CloudBlobContainer container, int size, long? copyLength, AccessCondition accessCondition, OperationContext operationContext, bool seekableSourceStream, bool allowSinglePut, int startOffset, bool testMd5) { byte[] buffer = GetRandomBuffer(size); string md5 = string.Empty; if (testMd5) { #if ASPNET_K MD5 hasher = MD5.Create(); md5 = Convert.ToBase64String(hasher.ComputeHash(buffer, startOffset, copyLength.HasValue ? (int)copyLength : buffer.Length - startOffset)); #else CryptographicHash hasher = HashAlgorithmProvider.OpenAlgorithm("MD5").CreateHash(); hasher.Append(buffer.AsBuffer(startOffset, copyLength.HasValue ? (int)copyLength : buffer.Length - startOffset)); md5 = CryptographicBuffer.EncodeToBase64String(hasher.GetValueAndReset()); #endif } CloudBlockBlob blob = container.GetBlockBlobReference("blob1"); blob.ServiceClient.DefaultRequestOptions.SingleBlobUploadThresholdInBytes = allowSinglePut ? buffer.Length : buffer.Length / 2; blob.StreamWriteSizeInBytes = 1 * 1024 * 1024; using (MemoryStream originalBlobStream = new MemoryStream()) { originalBlobStream.Write(buffer, startOffset, buffer.Length - startOffset); Stream sourceStream; if (seekableSourceStream) { MemoryStream stream = new MemoryStream(buffer); stream.Seek(startOffset, SeekOrigin.Begin); sourceStream = stream; } else { NonSeekableMemoryStream stream = new NonSeekableMemoryStream(buffer); stream.ForceSeek(startOffset, SeekOrigin.Begin); sourceStream = stream; } using (sourceStream) { BlobRequestOptions options = new BlobRequestOptions() { StoreBlobContentMD5 = true, }; if (copyLength.HasValue) { await blob.UploadFromStreamAsync(sourceStream.AsInputStream(), copyLength.Value, accessCondition, options, operationContext); } else { await blob.UploadFromStreamAsync(sourceStream.AsInputStream(), accessCondition, options, operationContext); } } if (testMd5) { await blob.FetchAttributesAsync(); Assert.AreEqual(md5, blob.Properties.ContentMD5); } using (MemoryOutputStream downloadedBlobStream = new MemoryOutputStream()) { await blob.DownloadToStreamAsync(downloadedBlobStream); Assert.AreEqual(copyLength ?? originalBlobStream.Length, downloadedBlobStream.UnderlyingStream.Length); TestHelper.AssertStreamsAreEqualAtIndex( originalBlobStream, downloadedBlobStream.UnderlyingStream, 0, 0, copyLength.HasValue ? (int)copyLength : (int)originalBlobStream.Length); } } }
private void CloudBlockBlobUploadFromStream(bool seekableSourceStream, int startOffset, bool async) { byte[] buffer = GetRandomBuffer(1 * 1024 * 1024); MD5 hasher = MD5.Create(); string md5 = Convert.ToBase64String(hasher.ComputeHash(buffer, startOffset, buffer.Length - startOffset)); CloudBlobContainer container = GetRandomContainerReference(); try { container.Create(); CloudBlockBlob blob = container.GetBlockBlobReference("blob1"); using (MemoryStream originalBlob = new MemoryStream()) { originalBlob.Write(buffer, startOffset, buffer.Length - startOffset); Stream sourceStream; if (seekableSourceStream) { MemoryStream stream = new MemoryStream(buffer); stream.Seek(startOffset, SeekOrigin.Begin); sourceStream = stream; } else { NonSeekableMemoryStream stream = new NonSeekableMemoryStream(buffer); stream.ForceSeek(startOffset, SeekOrigin.Begin); sourceStream = stream; } using (sourceStream) { BlobRequestOptions options = new BlobRequestOptions() { StoreBlobContentMD5 = true, }; if (async) { using (ManualResetEvent waitHandle = new ManualResetEvent(false)) { ICancellableAsyncResult result = blob.BeginUploadFromStream(sourceStream, null, options, null, ar => waitHandle.Set(), null); waitHandle.WaitOne(); blob.EndUploadFromStream(result); } } else { blob.UploadFromStream(sourceStream, null, options); } } blob.FetchAttributes(); Assert.AreEqual(md5, blob.Properties.ContentMD5); using (MemoryStream downloadedBlob = new MemoryStream()) { if (async) { using (ManualResetEvent waitHandle = new ManualResetEvent(false)) { ICancellableAsyncResult result = blob.BeginDownloadToStream(downloadedBlob, ar => waitHandle.Set(), null); waitHandle.WaitOne(); blob.EndDownloadToStream(result); } } else { blob.DownloadToStream(downloadedBlob); } TestHelper.AssertStreamsAreEqual(originalBlob, downloadedBlob); } } } finally { container.DeleteIfExists(); } }