Skip to content

Commit

Permalink
Fixed storage bug where blob, file, and directory names were not url … (
Browse files Browse the repository at this point in the history
  • Loading branch information
seanmcc-msft authored May 5, 2020
1 parent a2c3698 commit b598d12
Show file tree
Hide file tree
Showing 5 changed files with 78 additions and 3 deletions.
4 changes: 2 additions & 2 deletions sdk/storage/Azure.Storage.Blobs/src/BlobUriBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -285,9 +285,9 @@ private RequestUriBuilder BuildUri()
if (!string.IsNullOrWhiteSpace(BlobContainerName))
{
path.Append("/").Append(BlobContainerName);
if (!String.IsNullOrWhiteSpace(BlobName))
if (!string.IsNullOrWhiteSpace(BlobName))
{
path.Append("/").Append(BlobName);
path.Append("/").Append(Uri.EscapeDataString(BlobName));
}
}

Expand Down
24 changes: 24 additions & 0 deletions sdk/storage/Azure.Storage.Blobs/tests/BlobBaseClientTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,30 @@ public void Ctor_ConnectionString()
Assert.AreEqual("accountName", builder2.AccountName);
}

[Test]
// Test framework doesn't allow recorded tests with connection string because the word 'Sanitized' is not base-64 encoded,
// so we can't pass connection string validation"
[LiveOnly]
public async Task Ctor_ConnectionStringEscapeBlobName()
{
// Arrange
await using DisposingContainer test = await GetTestContainerAsync();
string blobName = "!*'();[]:@&%=+$,/?#äÄöÖüÜß";

BlockBlobClient initalBlob = InstrumentClient(test.Container.GetBlockBlobClient(blobName));
var data = GetRandomBuffer(Constants.KB);

using var stream = new MemoryStream(data);
Response<BlobContentInfo> uploadResponse = await initalBlob.UploadAsync(stream);

// Act
BlobBaseClient blob = new BlobBaseClient(TestConfigDefault.ConnectionString, test.Container.Name, blobName, GetOptions());
Response<BlobProperties> propertiesResponse = await blob.GetPropertiesAsync();

// Assert
Assert.AreEqual(uploadResponse.Value.ETag, propertiesResponse.Value.ETag);
}

[Test]
public void Ctor_Uri()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -279,7 +279,7 @@ private RequestUriBuilder BuildUri()
path.Append("/").Append(ShareName);
if (!string.IsNullOrWhiteSpace(DirectoryOrFilePath))
{
path.Append("/").Append(DirectoryOrFilePath);
path.Append("/").Append(Uri.EscapeDataString(DirectoryOrFilePath));
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,30 @@ public void Ctor_ConnectionString()
//Assert.AreEqual("accountName", builder.AccountName);
}

[Test]
//Test framework doesn't allow recorded tests with connection string because the word 'Sanitized' is not base-64 encoded,
// so we can't pass connection string validation"
[LiveOnly]
public async Task Ctor_ConnectionStringEscapePath()
{
// Arrange
await using DisposingShare test = await GetTestShareAsync();
string directoryName = "!#@&=;äÄöÖüÜß";
ShareDirectoryClient initalDirectory = InstrumentClient(test.Share.GetDirectoryClient(directoryName));
Response<ShareDirectoryInfo> createResponse = await initalDirectory.CreateAsync();

// Act
ShareDirectoryClient directory = new ShareDirectoryClient(
TestConfigDefault.ConnectionString,
test.Share.Name,
directoryName,
GetOptions());
Response<ShareDirectoryProperties> propertiesResponse = await directory.GetPropertiesAsync();

// Assert
Assert.AreEqual(createResponse.Value.ETag, propertiesResponse.Value.ETag);
}

[Test]
public void DirectoryPathsParsing()
{
Expand Down
27 changes: 27 additions & 0 deletions sdk/storage/Azure.Storage.Files.Shares/tests/FileClientTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,33 @@ public void Ctor_ConnectionString()
//Assert.AreEqual("accountName", builder.AccountName);
}

[Test]
// "Test framework doesn't allow recorded tests with connection string because the word 'Sanitized' is not base-64 encoded,
// so we can't pass connection string validation"
[LiveOnly]
public async Task Ctor_ConnectionStringEscapePath()
{
// Arrange
await using DisposingShare test = await GetTestShareAsync();
string directoryName = "!#@&=;äÄ";
string fileName = "#$=;!öÖ";
ShareDirectoryClient directory = InstrumentClient(test.Share.GetDirectoryClient(directoryName));
await directory.CreateAsync();
ShareFileClient initalFile = InstrumentClient(directory.GetFileClient(fileName));
Response<ShareFileInfo> createResponse = await initalFile.CreateAsync(Constants.KB);

// Act
ShareFileClient file = new ShareFileClient(
TestConfigDefault.ConnectionString,
test.Share.Name,
$"{directoryName}/{fileName}",
GetOptions());
Response<ShareFileProperties> propertiesResponse = await file.GetPropertiesAsync();

// Assert
Assert.AreEqual(createResponse.Value.ETag, propertiesResponse.Value.ETag);
}

[Test]
public void FilePathsParsing()
{
Expand Down

0 comments on commit b598d12

Please sign in to comment.