diff --git a/sdk/storage/azblob/assets.json b/sdk/storage/azblob/assets.json index 9eecceaec276..f9d16daba57b 100644 --- a/sdk/storage/azblob/assets.json +++ b/sdk/storage/azblob/assets.json @@ -2,5 +2,5 @@ "AssetsRepo": "Azure/azure-sdk-assets", "AssetsRepoPrefixPath": "go", "TagPrefix": "go/storage/azblob", - "Tag": "go/storage/azblob_816342f61e" + "Tag": "go/storage/azblob_7a25fb98e8" } diff --git a/sdk/storage/azblob/container/client_test.go b/sdk/storage/azblob/container/client_test.go index 32bbb8c8f920..aae6fb5d976f 100644 --- a/sdk/storage/azblob/container/client_test.go +++ b/sdk/storage/azblob/container/client_test.go @@ -788,6 +788,63 @@ func (s *ContainerRecordedTestsSuite) TestContainerListBlobsDelimiterPrefixVersi } } +func (s *ContainerRecordedTestsSuite) TestContainerListFlatBlobsInvalidBlobName() { + _require := require.New(s.T()) + testName := s.T().Name() + svcClient, err := testcommon.GetServiceClient(s.T(), testcommon.TestAccountDefault, nil) + _require.NoError(err) + + containerName := testcommon.GenerateContainerName(testName) + containerClient := testcommon.CreateNewContainer(context.Background(), _require, containerName, svcClient) + defer testcommon.DeleteContainer(context.Background(), _require, containerClient) + + blobName := "dir1/dir2/file\uFFFF.blob" + _ = testcommon.CreateNewBlockBlob(context.Background(), _require, blobName, containerClient) + + pager := containerClient.NewListBlobsFlatPager(nil) + for pager.More() { + resp, err := pager.NextPage(context.Background()) + _require.NoError(err) + + _require.Equal(len(resp.Segment.BlobItems), 1) + _require.Equal(*resp.Segment.BlobItems[0].Name, blobName) + } +} + +func (s *ContainerRecordedTestsSuite) TestContainerListHierarchyBlobsInvalidBlobName() { + _require := require.New(s.T()) + testName := s.T().Name() + svcClient, err := testcommon.GetServiceClient(s.T(), testcommon.TestAccountDefault, nil) + _require.NoError(err) + + containerName := testcommon.GenerateContainerName(testName) + containerClient := testcommon.CreateNewContainer(context.Background(), _require, containerName, svcClient) + defer testcommon.DeleteContainer(context.Background(), _require, containerClient) + + blobName := "dir1/dir2/file\uFFFF.blob" + _ = testcommon.CreateNewBlockBlob(context.Background(), _require, blobName, containerClient) + + pager := containerClient.NewListBlobsHierarchyPager(".b", nil) + for pager.More() { + resp, err := pager.NextPage(context.Background()) + _require.NoError(err) + + _require.Equal(len(resp.Segment.BlobItems), 0) + _require.Equal(len(resp.Segment.BlobPrefixes), 1) + _require.Equal(*resp.Segment.BlobPrefixes[0].Name, "dir1/dir2/file\uFFFF.b") + } + + // empty delimiter + pager1 := containerClient.NewListBlobsHierarchyPager("", nil) + for pager1.More() { + resp, err := pager1.NextPage(context.Background()) + _require.NoError(err) + + _require.Equal(len(resp.Segment.BlobItems), 1) + _require.Equal(*resp.Segment.BlobItems[0].Name, blobName) + } +} + func (s *ContainerRecordedTestsSuite) TestContainerListBlobsWithSnapshots() { _require := require.New(s.T()) testName := s.T().Name() diff --git a/sdk/storage/azblob/internal/generated/models.go b/sdk/storage/azblob/internal/generated/models.go index eee488ddf1b4..aaef9f53ba67 100644 --- a/sdk/storage/azblob/internal/generated/models.go +++ b/sdk/storage/azblob/internal/generated/models.go @@ -7,9 +7,9 @@ package generated import ( - "encoding/base64" "encoding/xml" "github.com/Azure/azure-sdk-for-go/sdk/azcore/to" + "net/url" ) type TransactionalContentSetter interface { @@ -94,7 +94,9 @@ func (b *BlobPrefix) UnmarshalXML(dec *xml.Decoder, start xml.StartElement) erro } if aux.BlobName != nil { if aux.BlobName.Encoded != nil && *aux.BlobName.Encoded { - name, err := base64.StdEncoding.DecodeString(*aux.BlobName.Content) + name, err := url.QueryUnescape(*aux.BlobName.Content) + + // name, err := base64.StdEncoding.DecodeString(*aux.BlobName.Content) if err != nil { return err } @@ -124,7 +126,9 @@ func (b *BlobItem) UnmarshalXML(dec *xml.Decoder, start xml.StartElement) error b.OrMetadata = (map[string]*string)(aux.OrMetadata) if aux.BlobName != nil { if aux.BlobName.Encoded != nil && *aux.BlobName.Encoded { - name, err := base64.StdEncoding.DecodeString(*aux.BlobName.Content) + name, err := url.QueryUnescape(*aux.BlobName.Content) + + // name, err := base64.StdEncoding.DecodeString(*aux.BlobName.Content) if err != nil { return err }