diff --git a/sdk/storage/azure-storage-blobs/src/blob_client.cpp b/sdk/storage/azure-storage-blobs/src/blob_client.cpp index e710b6def..920fa6912 100644 --- a/sdk/storage/azure-storage-blobs/src/blob_client.cpp +++ b/sdk/storage/azure-storage-blobs/src/blob_client.cpp @@ -27,8 +27,8 @@ namespace Azure { namespace Storage { namespace Blobs { { auto parsedConnectionString = Details::ParseConnectionString(connectionString); auto blobUri = std::move(parsedConnectionString.BlobServiceUri); - blobUri.AppendPath(containerName); - blobUri.AppendPath(blobName); + blobUri.AppendPath(Details::UrlEncodePath(containerName)); + blobUri.AppendPath(Details::UrlEncodePath(blobName)); if (parsedConnectionString.KeyCredential) { diff --git a/sdk/storage/azure-storage-blobs/src/blob_service_client.cpp b/sdk/storage/azure-storage-blobs/src/blob_service_client.cpp index 7fda3ab95..5971d3d19 100644 --- a/sdk/storage/azure-storage-blobs/src/blob_service_client.cpp +++ b/sdk/storage/azure-storage-blobs/src/blob_service_client.cpp @@ -112,7 +112,7 @@ namespace Azure { namespace Storage { namespace Blobs { const std::string& containerName) const { auto containerUri = m_serviceUrl; - containerUri.AppendPath(containerName); + containerUri.AppendPath(Details::UrlEncodePath(containerName)); return BlobContainerClient(std::move(containerUri), m_pipeline); } diff --git a/sdk/storage/azure-storage-blobs/test/blob_container_client_test.cpp b/sdk/storage/azure-storage-blobs/test/blob_container_client_test.cpp index d0885d230..82e8b9755 100644 --- a/sdk/storage/azure-storage-blobs/test/blob_container_client_test.cpp +++ b/sdk/storage/azure-storage-blobs/test/blob_container_client_test.cpp @@ -1052,7 +1052,7 @@ namespace Azure { namespace Storage { namespace Test { { const std::string non_ascii_word = "\xE6\xB5\x8B\xE8\xAF\x95"; const std::string encoded_non_ascii_word = "%E6%B5%8B%E8%AF%95"; - std::string baseBlobName = "a b c / !@#$%^&*() def" + non_ascii_word; + std::string baseBlobName = "a b c / !@#$%^&*(?/<>,.;:'\"[]{}|`~\\) def" + non_ascii_word; { std::string blobName = baseBlobName + RandomString(); @@ -1081,6 +1081,48 @@ namespace Azure { namespace Storage { namespace Test { blobUrl, m_blobContainerClient->GetUri() + "/" + Storage::Details::UrlEncodePath(blobName)); } + + { + std::string blobName = baseBlobName + RandomString(); + auto blobClient = Blobs::AppendBlobClient::CreateFromConnectionString( + StandardStorageConnectionString(), m_containerName, blobName); + EXPECT_NO_THROW(blobClient.Create()); + auto blobUrl = blobClient.GetUri(); + EXPECT_EQ( + blobUrl, + m_blobContainerClient->GetUri() + "/" + Storage::Details::UrlEncodePath(blobName)); + } + { + std::string blobName = baseBlobName + RandomString(); + auto blobClient = Blobs::PageBlobClient::CreateFromConnectionString( + StandardStorageConnectionString(), m_containerName, blobName); + EXPECT_NO_THROW(blobClient.Create(1024)); + auto blobUrl = blobClient.GetUri(); + EXPECT_EQ( + blobUrl, + m_blobContainerClient->GetUri() + "/" + Storage::Details::UrlEncodePath(blobName)); + } + { + std::string blobName = baseBlobName + RandomString(); + auto blobClient = Blobs::BlockBlobClient::CreateFromConnectionString( + StandardStorageConnectionString(), m_containerName, blobName); + EXPECT_NO_THROW(blobClient.UploadFrom(nullptr, 0)); + auto blobUrl = blobClient.GetUri(); + EXPECT_EQ( + blobUrl, + m_blobContainerClient->GetUri() + "/" + Storage::Details::UrlEncodePath(blobName)); + } + } + + TEST_F(BlobContainerClientTest, QuestionMarkBlobName) + { + std::string blobName = "?"; + auto blobClient = m_blobContainerClient->GetAppendBlobClient(blobName); + EXPECT_NO_THROW(blobClient.Create()); + auto blobUrl = blobClient.GetUri(); + EXPECT_EQ( + blobUrl, + m_blobContainerClient->GetUri() + "/" + Storage::Details::UrlEncodePath(blobName)); } }}} // namespace Azure::Storage::Test