diff --git a/src/NuGet.Services.Storage/AzureStorage.cs b/src/NuGet.Services.Storage/AzureStorage.cs index 9995178948..666fef14ce 100644 --- a/src/NuGet.Services.Storage/AzureStorage.cs +++ b/src/NuGet.Services.Storage/AzureStorage.cs @@ -21,11 +21,13 @@ public class AzureStorage : Storage private readonly ILogger _logger; private readonly BlobContainerClient _directory; private readonly string _path; + private readonly string _delimiter; public AzureStorage( BlobServiceClient account, string containerName, string path, + string delimiter, Uri baseAddress, bool initializeContainer, bool enablePublicAccess, @@ -38,6 +40,7 @@ public AzureStorage( logger) { _path = path; + _delimiter = delimiter; } private AzureStorage( @@ -171,8 +174,14 @@ public override IEnumerable List(bool getMetadata) blobTraits |= BlobTraits.Metadata; } - foreach (BlobHierarchyItem blob in _directory.GetBlobsByHierarchy(traits: blobTraits, prefix: _path)) + foreach (BlobHierarchyItem blob in _directory.GetBlobsByHierarchy(traits: blobTraits, delimiter: _delimiter, prefix: _path)) { + // if prefix then the blob is a directory and we should skip it + if (blob.IsPrefix) + { + continue; + } + yield return GetStorageListItem(_directory.GetBlockBlobClient(blob.Blob.Name)); } } @@ -187,8 +196,13 @@ public override async Task> ListAsync(bool getMetad var blobList = new List(); - await foreach (BlobHierarchyItem blob in _directory.GetBlobsByHierarchyAsync(traits: blobTraits, prefix: _path)) + await foreach (BlobHierarchyItem blob in _directory.GetBlobsByHierarchyAsync(traits: blobTraits, delimiter: _delimiter, prefix: _path, cancellationToken: cancellationToken)) { + // if prefix then the blob is a directory and we should skip it + if (blob.IsPrefix) + { + continue; + } blobList.Add(await GetStorageListItemAsync(_directory.GetBlockBlobClient(blob.Blob.Name))); } @@ -364,7 +378,7 @@ protected override async Task OnLoad(Uri resourceUri, Cancellati originalStream.Position = 0; var propertiesResponse = await blob.GetPropertiesAsync(); var properties = propertiesResponse.Value; - + MemoryStream content; if (properties.ContentEncoding == "gzip") diff --git a/src/NuGet.Services.Storage/AzureStorageFactory.cs b/src/NuGet.Services.Storage/AzureStorageFactory.cs index 78e227c068..360c8ca5f5 100644 --- a/src/NuGet.Services.Storage/AzureStorageFactory.cs +++ b/src/NuGet.Services.Storage/AzureStorageFactory.cs @@ -1,4 +1,4 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; @@ -16,6 +16,7 @@ public class AzureStorageFactory : StorageFactory private Uri _differentBaseAddress = null; private readonly ILogger _azureStorageLogger; private readonly bool _initializeContainer; + private readonly string _delimiter; public static string PrepareConnectionString(string connectionString) { @@ -32,7 +33,8 @@ public AzureStorageFactory( ILogger azureStorageLogger, string path = null, Uri baseAddress = null, - bool initializeContainer = true) + bool initializeContainer = true, + string delimiter = null) { _account = account; _containerName = containerName; @@ -40,6 +42,7 @@ public AzureStorageFactory( _path = null; _azureStorageLogger = azureStorageLogger; _initializeContainer = initializeContainer; + _delimiter = delimiter; if (path != null) { @@ -94,6 +97,7 @@ public override Storage Create(string name = null) _account, _containerName, path, + _delimiter, newBase, _initializeContainer, _enablePublicAccess,