From 0e0c22e672bc86f72c031a4e0ca3ff7881fe7bfe Mon Sep 17 00:00:00 2001 From: seanmcc-msft Date: Thu, 2 Jan 2020 13:51:03 -0800 Subject: [PATCH 1/2] Fixed storage bug where SAS content headers were not URL-encoded --- .../tests/BlobBaseClientTests.cs | 39 +++++ ...ertiesAsync_BlobSasWithContentHeaders.json | 154 ++++++++++++++++++ ...sAsync_BlobSasWithContentHeadersAsync.json | 154 ++++++++++++++++++ .../src/Shared/SasExtensions.cs | 10 +- 4 files changed, 352 insertions(+), 5 deletions(-) create mode 100644 sdk/storage/Azure.Storage.Blobs/tests/SessionRecords/BlobBaseClientTests/GetPropertiesAsync_BlobSasWithContentHeaders.json create mode 100644 sdk/storage/Azure.Storage.Blobs/tests/SessionRecords/BlobBaseClientTests/GetPropertiesAsync_BlobSasWithContentHeadersAsync.json diff --git a/sdk/storage/Azure.Storage.Blobs/tests/BlobBaseClientTests.cs b/sdk/storage/Azure.Storage.Blobs/tests/BlobBaseClientTests.cs index dab574d7d7986..add75f8ed4937 100644 --- a/sdk/storage/Azure.Storage.Blobs/tests/BlobBaseClientTests.cs +++ b/sdk/storage/Azure.Storage.Blobs/tests/BlobBaseClientTests.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Net; using System.Security.Cryptography; using System.Threading; using System.Threading.Tasks; @@ -1457,6 +1458,44 @@ public async Task GetPropertiesAsync_BlobSAS() } + [Test] + public async Task GetPropertiesAsync_BlobSasWithContentHeaders() + { + var containerName = GetNewContainerName(); + var blobName = GetNewBlobName(); + await using DisposingContainer test = await GetTestContainerAsync(containerName: containerName); + + // Arrange + BlobBaseClient blob = await GetNewBlobClient(test.Container, blobName); + + BlobSasBuilder blobSasBuilder = new BlobSasBuilder + { + BlobContainerName = containerName, + BlobName = blobName, + Protocol = SasProtocol.None, + StartsOn = Recording.UtcNow.AddHours(-1), + ExpiresOn = Recording.UtcNow.AddHours(1), + IPRange = new SasIPRange(IPAddress.None, IPAddress.None), + CacheControl = "|cache control?", + ContentDisposition = "|content disposition?", + ContentEncoding = "|content encoding?", + ContentLanguage = "|content language?", + ContentType = "|content type?" + }; + blobSasBuilder.SetPermissions( + BlobSasPermissions.All); + + BlobSasQueryParameters blobSasQueryParameters = blobSasBuilder.ToSasQueryParameters(GetNewSharedKeyCredentials()); + + BlockBlobClient sasBlob = InstrumentClient(new BlockBlobClient(new Uri($"{TestConfigDefault.BlobServiceEndpoint}/{containerName}/{blobName}?{blobSasQueryParameters}"), GetOptions())); + + // Act + Response response = await sasBlob.GetPropertiesAsync(); + + // Assert + Assert.IsNotNull(response.GetRawResponse().Headers.RequestId); + } + [Test] public async Task GetPropertiesAsync_BlobIdentitySAS() { diff --git a/sdk/storage/Azure.Storage.Blobs/tests/SessionRecords/BlobBaseClientTests/GetPropertiesAsync_BlobSasWithContentHeaders.json b/sdk/storage/Azure.Storage.Blobs/tests/SessionRecords/BlobBaseClientTests/GetPropertiesAsync_BlobSasWithContentHeaders.json new file mode 100644 index 0000000000000..9991a1e5d4e6a --- /dev/null +++ b/sdk/storage/Azure.Storage.Blobs/tests/SessionRecords/BlobBaseClientTests/GetPropertiesAsync_BlobSasWithContentHeaders.json @@ -0,0 +1,154 @@ +{ + "Entries": [ + { + "RequestUri": "http://seanstagetest.blob.core.windows.net/test-container-affc2cd9-cee4-869a-cb2b-9a80cb58e54d?restype=container", + "RequestMethod": "PUT", + "RequestHeaders": { + "Authorization": "Sanitized", + "traceparent": "00-cccaff2defc8c749969df249c580579a-973cb749f453f949-00", + "User-Agent": [ + "azsdk-net-Storage.Blobs/12.1.0-dev.20200102.1\u002B4b0e11299bbf0498cff51c0544be2ce2ca0954e5", + "(.NET Core 4.6.28207.04; Microsoft Windows 10.0.18363 )" + ], + "x-ms-blob-public-access": "container", + "x-ms-client-request-id": "a040aa48-17e8-da54-fa49-9e1a38b88c89", + "x-ms-date": "Thu, 02 Jan 2020 21:54:49 GMT", + "x-ms-return-client-request-id": "true", + "x-ms-version": "2019-02-02" + }, + "RequestBody": null, + "StatusCode": 201, + "ResponseHeaders": { + "Content-Length": "0", + "Date": "Thu, 02 Jan 2020 21:54:49 GMT", + "ETag": "\u00220x8D78FCE63AE32BC\u0022", + "Last-Modified": "Thu, 02 Jan 2020 21:54:49 GMT", + "Server": [ + "Windows-Azure-Blob/1.0", + "Microsoft-HTTPAPI/2.0" + ], + "x-ms-client-request-id": "a040aa48-17e8-da54-fa49-9e1a38b88c89", + "x-ms-request-id": "25745582-001e-0016-3fb7-c164ec000000", + "x-ms-version": "2019-02-02" + }, + "ResponseBody": [] + }, + { + "RequestUri": "http://seanstagetest.blob.core.windows.net/test-container-affc2cd9-cee4-869a-cb2b-9a80cb58e54d/test-blob-8adc09f5-fead-b331-11ca-96e2f9421fc7", + "RequestMethod": "PUT", + "RequestHeaders": { + "Authorization": "Sanitized", + "Content-Length": "1024", + "traceparent": "00-0b08e82f7db1164482ece472a5a99708-5b8c90e7806a244b-00", + "User-Agent": [ + "azsdk-net-Storage.Blobs/12.1.0-dev.20200102.1\u002B4b0e11299bbf0498cff51c0544be2ce2ca0954e5", + "(.NET Core 4.6.28207.04; Microsoft Windows 10.0.18363 )" + ], + "x-ms-blob-type": "BlockBlob", + "x-ms-client-request-id": "c0eb7143-0d26-92c0-0626-24a262020018", + "x-ms-date": "Thu, 02 Jan 2020 21:54:49 GMT", + "x-ms-return-client-request-id": "true", + "x-ms-version": "2019-02-02" + }, + "RequestBody": "C9NtUMr/d7a/XyVFBdVZnXYXmU8Bf977JrLrjKAvRKvab1CFBgK0STKK4InxDtUl7wGjIB89iIz0cikYE\u002BsVkBp6a5WE1JZ0Y1Addp9VChjcxZyeiySMnObEkJTZmzVGdE9vd6I/oRtrL7zPIBHsn2gRO05PdwT17c6uwEMCmsca1gJP5ZJ1nSSAM1xovXzV1/EsyGDn9/1KeYnUkODYaJT0tEoPnbnVm54pzkOojTBR2ehS1dJnM94EBGsJoQxDqMrHcwkyxTk3Vy3CvSm6ouxZgrf3hpLCjYFrCplNy/mR5SV44RknHxOvGn6lpXW1SmJ/sB9VSyE4BOaHxrug6YszMNgDQcDSMmKjSGsTHOcLtr83zhvaPJkDQNwzn1hYDzHzcnSdsgihrH28sQO2JOj\u002BfBD7aRpvWPQ\u002B/wHjn5MJSzk6IKpzbgO3lSKdHoqWTRz0NCNIXKUWgxmAX7IHvgzqsmbJfAM9iw0MRNT30jpqp7Hl72pvwe6TI5yR8w9Qr9cWsmskzNEYt6kVOxjRH7HfFbcBIs6hevB3NlhnrJj9vJT84R/ORdrfzDfBWobWwgPrsd1YT40IdDd6rZZ4sQoQGH\u002BD1D2RENDcIVWW4CBqoHRUe/q7pWwH9G3nU5hEZhstsEIHU\u002B3FWaAMey44cZMXEAwiJDUQVXISfODQqb03mLo5aTDeY02HjiJZrio\u002Bz4LZ0EOLIkLmHFvP9NcM9a/j1ONz/gdjOK2/m5UStqZI1Kxd99l5rHV3UkzVDm52eplzdtlGy9B7dZiVzIat1Ga0hyAqr/3WaSht\u002B6y6jik/SSD7n0DNAQnc4oFB4\u002BDuyn7mIIZNS8ucnAyw2c8jwOduVoJlsTQm54YXTcx7lYZIfjEt1G2j8f1VXwIzHCc5uCGa041diRhKvzkANv7\u002BIAeGaFqe9ut6y2WFEFIx8spe3pSq4cH46/UY4xQzorv/Vz/7rbPNmsI2IAgn2HnGGM1uolhpUz5FjX1lhhLXRiiqhbgTNkQXkUPSdMG50RN8UctHxABjlgQAtSA2ZxSwXtnffVLAs\u002BKIVxAUl959jLxp6TRHj4EoRu\u002BzEoEk4CkuIRXn2lPBu53ov2zvTv4lgylkzH7fac9XtzZiDKFhY3fm5nXIlbJoqC2XXtAUOPjwjo9XvxOrTrhGkCIcXq78h1v1CGeJXe53\u002ByRRSAr\u002BQn8\u002BcX4SCaNjO5e9gQWPTEp\u002BmtZ0Hi\u002BQZzGh4MTvWgatR02j3eww6n63ks3PzNvo56/Z0q00iiNPrQpNcSjfc\u002BGRDzm37G5dTrBXvIxiwJpVuPkVFYdYeL0pUzDh4nlW2B7sPryhMPtAfIT93c2X7exv97gvyl5ZOJZ8jpg\u002Be2s2AQ==", + "StatusCode": 201, + "ResponseHeaders": { + "Content-Length": "0", + "Content-MD5": "xtQ/QWLUqcBN0QuMbJ5ynw==", + "Date": "Thu, 02 Jan 2020 21:54:49 GMT", + "ETag": "\u00220x8D78FCE63C6083C\u0022", + "Last-Modified": "Thu, 02 Jan 2020 21:54:49 GMT", + "Server": [ + "Windows-Azure-Blob/1.0", + "Microsoft-HTTPAPI/2.0" + ], + "x-ms-client-request-id": "c0eb7143-0d26-92c0-0626-24a262020018", + "x-ms-content-crc64": "8JhwtDtTaF0=", + "x-ms-request-id": "25745584-001e-0016-40b7-c164ec000000", + "x-ms-request-server-encrypted": "true", + "x-ms-version": "2019-02-02" + }, + "ResponseBody": [] + }, + { + "RequestUri": "http://seanstagetest.blob.core.windows.net/test-container-affc2cd9-cee4-869a-cb2b-9a80cb58e54d/test-blob-8adc09f5-fead-b331-11ca-96e2f9421fc7?sv=2019-02-02\u0026st=2020-01-02T20%3A54%3A49Z\u0026se=2020-01-02T22%3A54%3A49Z\u0026sr=b\u0026sp=racwd\u0026rscc=|cache\u002Bcontrol%3F\u0026rscd=|content\u002Bdisposition%3F\u0026rsce=|content\u002Bencoding%3F\u0026rscl=|content\u002Blanguage%3F\u0026rsct=|content\u002Btype%3F\u0026sig=Sanitized", + "RequestMethod": "HEAD", + "RequestHeaders": { + "traceparent": "00-92fe1d5f7959bf40b92d7bc09cf19ab1-b274def6433f464b-00", + "User-Agent": [ + "azsdk-net-Storage.Blobs/12.1.0-dev.20200102.1\u002B4b0e11299bbf0498cff51c0544be2ce2ca0954e5", + "(.NET Core 4.6.28207.04; Microsoft Windows 10.0.18363 )" + ], + "x-ms-client-request-id": "0afa33fd-767f-d6da-ade3-7bb78fe59bd2", + "x-ms-return-client-request-id": "true", + "x-ms-version": "2019-02-02" + }, + "RequestBody": null, + "StatusCode": 200, + "ResponseHeaders": { + "Accept-Ranges": "bytes", + "Cache-Control": "|cache control?", + "Content-Disposition": "|content disposition?", + "Content-Encoding": "|content encoding?", + "Content-Language": "|content language?", + "Content-Length": "1024", + "Content-MD5": "xtQ/QWLUqcBN0QuMbJ5ynw==", + "Content-Type": "|content type?", + "Date": "Thu, 02 Jan 2020 21:54:49 GMT", + "ETag": "\u00220x8D78FCE63C6083C\u0022", + "Last-Modified": "Thu, 02 Jan 2020 21:54:49 GMT", + "Server": [ + "Windows-Azure-Blob/1.0", + "Microsoft-HTTPAPI/2.0" + ], + "Vary": "Origin", + "x-ms-access-tier": "Hot", + "x-ms-access-tier-inferred": "true", + "x-ms-blob-type": "BlockBlob", + "x-ms-client-request-id": "0afa33fd-767f-d6da-ade3-7bb78fe59bd2", + "x-ms-creation-time": "Thu, 02 Jan 2020 21:54:49 GMT", + "x-ms-lease-state": "available", + "x-ms-lease-status": "unlocked", + "x-ms-request-id": "25745585-001e-0016-41b7-c164ec000000", + "x-ms-server-encrypted": "true", + "x-ms-version": "2019-02-02" + }, + "ResponseBody": [] + }, + { + "RequestUri": "http://seanstagetest.blob.core.windows.net/test-container-affc2cd9-cee4-869a-cb2b-9a80cb58e54d?restype=container", + "RequestMethod": "DELETE", + "RequestHeaders": { + "Authorization": "Sanitized", + "traceparent": "00-4e1225b982f70744976e2869a0388668-fd65b447d1654c49-00", + "User-Agent": [ + "azsdk-net-Storage.Blobs/12.1.0-dev.20200102.1\u002B4b0e11299bbf0498cff51c0544be2ce2ca0954e5", + "(.NET Core 4.6.28207.04; Microsoft Windows 10.0.18363 )" + ], + "x-ms-client-request-id": "2fa4982b-f608-4f99-0112-7c94eedab34c", + "x-ms-date": "Thu, 02 Jan 2020 21:54:49 GMT", + "x-ms-return-client-request-id": "true", + "x-ms-version": "2019-02-02" + }, + "RequestBody": null, + "StatusCode": 202, + "ResponseHeaders": { + "Content-Length": "0", + "Date": "Thu, 02 Jan 2020 21:54:49 GMT", + "Server": [ + "Windows-Azure-Blob/1.0", + "Microsoft-HTTPAPI/2.0" + ], + "x-ms-client-request-id": "2fa4982b-f608-4f99-0112-7c94eedab34c", + "x-ms-request-id": "25745586-001e-0016-42b7-c164ec000000", + "x-ms-version": "2019-02-02" + }, + "ResponseBody": [] + } + ], + "Variables": { + "DateTimeOffsetNow": "2020-01-02T13:54:49.7124969-08:00", + "RandomSeed": "880505182", + "Storage_TestConfigDefault": "ProductionTenant\nseanstagetest\nU2FuaXRpemVk\nhttp://seanstagetest.blob.core.windows.net\nhttp://seanstagetest.file.core.windows.net\nhttp://seanstagetest.queue.core.windows.net\nhttp://seanstagetest.table.core.windows.net\n\n\n\n\nhttp://seanstagetest-secondary.blob.core.windows.net\nhttp://seanstagetest-secondary.file.core.windows.net\nhttp://seanstagetest-secondary.queue.core.windows.net\nhttp://seanstagetest-secondary.table.core.windows.net\n\nSanitized\n\n\nCloud\nBlobEndpoint=http://seanstagetest.blob.core.windows.net/;QueueEndpoint=http://seanstagetest.queue.core.windows.net/;FileEndpoint=http://seanstagetest.file.core.windows.net/;BlobSecondaryEndpoint=http://seanstagetest-secondary.blob.core.windows.net/;QueueSecondaryEndpoint=http://seanstagetest-secondary.queue.core.windows.net/;FileSecondaryEndpoint=http://seanstagetest-secondary.file.core.windows.net/;AccountName=seanstagetest;AccountKey=Sanitized" + } +} \ No newline at end of file diff --git a/sdk/storage/Azure.Storage.Blobs/tests/SessionRecords/BlobBaseClientTests/GetPropertiesAsync_BlobSasWithContentHeadersAsync.json b/sdk/storage/Azure.Storage.Blobs/tests/SessionRecords/BlobBaseClientTests/GetPropertiesAsync_BlobSasWithContentHeadersAsync.json new file mode 100644 index 0000000000000..b8206fb948b78 --- /dev/null +++ b/sdk/storage/Azure.Storage.Blobs/tests/SessionRecords/BlobBaseClientTests/GetPropertiesAsync_BlobSasWithContentHeadersAsync.json @@ -0,0 +1,154 @@ +{ + "Entries": [ + { + "RequestUri": "http://seanstagetest.blob.core.windows.net/test-container-0096c6bd-b332-5602-a86e-990a51131fc5?restype=container", + "RequestMethod": "PUT", + "RequestHeaders": { + "Authorization": "Sanitized", + "traceparent": "00-9481fcbf34dee748976d6b5770c9e9d6-a1ea8ea43747194a-00", + "User-Agent": [ + "azsdk-net-Storage.Blobs/12.1.0-dev.20200102.1\u002B4b0e11299bbf0498cff51c0544be2ce2ca0954e5", + "(.NET Core 4.6.28207.04; Microsoft Windows 10.0.18363 )" + ], + "x-ms-blob-public-access": "container", + "x-ms-client-request-id": "2de99e39-3ed6-6ec6-2ce6-dd8fef91014b", + "x-ms-date": "Thu, 02 Jan 2020 21:54:45 GMT", + "x-ms-return-client-request-id": "true", + "x-ms-version": "2019-02-02" + }, + "RequestBody": null, + "StatusCode": 201, + "ResponseHeaders": { + "Content-Length": "0", + "Date": "Thu, 02 Jan 2020 21:54:45 GMT", + "ETag": "\u00220x8D78FCE6156FADD\u0022", + "Last-Modified": "Thu, 02 Jan 2020 21:54:45 GMT", + "Server": [ + "Windows-Azure-Blob/1.0", + "Microsoft-HTTPAPI/2.0" + ], + "x-ms-client-request-id": "2de99e39-3ed6-6ec6-2ce6-dd8fef91014b", + "x-ms-request-id": "25745574-001e-0016-38b7-c164ec000000", + "x-ms-version": "2019-02-02" + }, + "ResponseBody": [] + }, + { + "RequestUri": "http://seanstagetest.blob.core.windows.net/test-container-0096c6bd-b332-5602-a86e-990a51131fc5/test-blob-9627e3b8-4f17-b099-23a3-c471545d601a", + "RequestMethod": "PUT", + "RequestHeaders": { + "Authorization": "Sanitized", + "Content-Length": "1024", + "traceparent": "00-b07bfb42bd0fb345accdd5200e4769a3-3e18618acc43914f-00", + "User-Agent": [ + "azsdk-net-Storage.Blobs/12.1.0-dev.20200102.1\u002B4b0e11299bbf0498cff51c0544be2ce2ca0954e5", + "(.NET Core 4.6.28207.04; Microsoft Windows 10.0.18363 )" + ], + "x-ms-blob-type": "BlockBlob", + "x-ms-client-request-id": "389957cf-3ed1-72f3-2147-639a816941b4", + "x-ms-date": "Thu, 02 Jan 2020 21:54:45 GMT", + "x-ms-return-client-request-id": "true", + "x-ms-version": "2019-02-02" + }, + "RequestBody": "Dn/0hvM7XFhk41zitM1gw261N7ZzMkPXBbK3goHwVKgzT73Qa68b/kGQyfLi47lfhhkgOVlL19w7HIFAg9rXdI\u002Bzr2UPj1i/mTl142lR9SH4WPxozxpP53jhlE4t2ntnuVVjLjRUT/bAYaAg1fRy6idfSCrdbqR0ZMftLfsKkb\u002B\u002BDioT7sbtowgFp216LhKEbqomzZJQiUqw78psZyL7ttDhYcfKX/xhcqQi18Y3\u002BTW1ab5Q48MsboTfYv77gDzmCvGdmc1Kug\u002BtxVvtLrGDefWUt/5kqtINtPNC6vz9ZfJnPM3UmWBoaq\u002Buox1oPkDTW\u002BkJZ8g\u002BgWAfkOXZB88TsGBohfLkr9\u002BVLExPtQe0pHWzb44T8/4pKbpstQl7jmPfm/K9/7hN7qwJdDt878tYautvJphAALxiPlw3d/nWGZ3pbxoU96S8ZYHiCX/DrTruFEseC2jKn5s2W8FcFnezM1qdkn\u002BxRHJGssAWXvY9npEiSWOttw40HtB/3pzjYE8KL9YkJRq6Pc/Y2Fmos0Ck\u002BbwvOswTBXxMaXSvMmbWYlJxDC8gGHl2ZwuT1N\u002B0jGqP2uTfsyaC9ila2LymCwppAnUGNqcRhOBDudLAfzCcl9wJH1iB964r7hYFxj\u002B90FwBKtJprlXDfVUDnPpTwXb4vUDfnOuy5wvG2kiQDL6hheh2v1RdM\u002BmGRqECfVq02CyfDAj/3TRwTkLHotMNMnGXYhYR3QEimopXWFZJsGqwEgIb8f\u002B1oai0BXESlpAWeRMwahpEovoqfXF\u002Bp4TdJ53YF5DQ8UFy4cBuXdiQDwT5Qd9CGUVPbG8I8XONNvoj1t3TOX//RYjRvYhZ1kUhmm1thGalmw5YiKshyADN5KvGSob6vNaF\u002BvtWcFu89pUq5lYGILKTfjvPe7HT3n2IA9ndkoy\u002BJ92X54prTiqym5IV9uGpx8T4MstLKkEksRx9zW2C3mMJa795bjgnKC8RHOAfvuec3zsU5F/Ac/ybcjVu7YC8MLwuC4siL1mL0QqcOQ1hBfM04e4xbfkDSfjC3fwCuTquVOwj8LJbea/iiBNVIznuOmxCOQySi8PCK8KTX1JciBjP7eUhPRVB2Gc/TuTmrSW\u002B1KKPwH8tHMgpYcTwyBpdhv/7hTVTzP1WAGClUj3e3H2c1IqvzMiYotEd\u002BNxRUBBM4sfk6ijvagelOb8eiMmKSoRGU/OPrbk3YuNkNtQhBa9QWHB1\u002BfFVrGmDCZMIehkIkq1XCv0cvTQOrYhFizQzhDMPzi9ZFVGT8aaJDKMmL\u002BjJXKMnyfqyM5s7Z0xoECE1T4Vf\u002BKvprn1cwxlWkrCQ6H6gey\u002BQDLo5XZqUHa0EKuCFVLwexjY84K0mywbhWw==", + "StatusCode": 201, + "ResponseHeaders": { + "Content-Length": "0", + "Content-MD5": "IWPl4Xzz\u002BhrHmOLFrIItqg==", + "Date": "Thu, 02 Jan 2020 21:54:45 GMT", + "ETag": "\u00220x8D78FCE616FE2F7\u0022", + "Last-Modified": "Thu, 02 Jan 2020 21:54:45 GMT", + "Server": [ + "Windows-Azure-Blob/1.0", + "Microsoft-HTTPAPI/2.0" + ], + "x-ms-client-request-id": "389957cf-3ed1-72f3-2147-639a816941b4", + "x-ms-content-crc64": "R8JhYEv0AVI=", + "x-ms-request-id": "25745577-001e-0016-39b7-c164ec000000", + "x-ms-request-server-encrypted": "true", + "x-ms-version": "2019-02-02" + }, + "ResponseBody": [] + }, + { + "RequestUri": "http://seanstagetest.blob.core.windows.net/test-container-0096c6bd-b332-5602-a86e-990a51131fc5/test-blob-9627e3b8-4f17-b099-23a3-c471545d601a?sv=2019-02-02\u0026st=2020-01-02T20%3A54%3A45Z\u0026se=2020-01-02T22%3A54%3A45Z\u0026sr=b\u0026sp=racwd\u0026rscc=|cache\u002Bcontrol%3F\u0026rscd=|content\u002Bdisposition%3F\u0026rsce=|content\u002Bencoding%3F\u0026rscl=|content\u002Blanguage%3F\u0026rsct=|content\u002Btype%3F\u0026sig=Sanitized", + "RequestMethod": "HEAD", + "RequestHeaders": { + "traceparent": "00-85648503381ef24daf1283ac47cefc66-3c6091f63a782943-00", + "User-Agent": [ + "azsdk-net-Storage.Blobs/12.1.0-dev.20200102.1\u002B4b0e11299bbf0498cff51c0544be2ce2ca0954e5", + "(.NET Core 4.6.28207.04; Microsoft Windows 10.0.18363 )" + ], + "x-ms-client-request-id": "73561c8b-a86c-628a-f638-5d8665fa703a", + "x-ms-return-client-request-id": "true", + "x-ms-version": "2019-02-02" + }, + "RequestBody": null, + "StatusCode": 200, + "ResponseHeaders": { + "Accept-Ranges": "bytes", + "Cache-Control": "|cache control?", + "Content-Disposition": "|content disposition?", + "Content-Encoding": "|content encoding?", + "Content-Language": "|content language?", + "Content-Length": "1024", + "Content-MD5": "IWPl4Xzz\u002BhrHmOLFrIItqg==", + "Content-Type": "|content type?", + "Date": "Thu, 02 Jan 2020 21:54:45 GMT", + "ETag": "\u00220x8D78FCE616FE2F7\u0022", + "Last-Modified": "Thu, 02 Jan 2020 21:54:45 GMT", + "Server": [ + "Windows-Azure-Blob/1.0", + "Microsoft-HTTPAPI/2.0" + ], + "Vary": "Origin", + "x-ms-access-tier": "Hot", + "x-ms-access-tier-inferred": "true", + "x-ms-blob-type": "BlockBlob", + "x-ms-client-request-id": "73561c8b-a86c-628a-f638-5d8665fa703a", + "x-ms-creation-time": "Thu, 02 Jan 2020 21:54:45 GMT", + "x-ms-lease-state": "available", + "x-ms-lease-status": "unlocked", + "x-ms-request-id": "2574557b-001e-0016-3bb7-c164ec000000", + "x-ms-server-encrypted": "true", + "x-ms-version": "2019-02-02" + }, + "ResponseBody": [] + }, + { + "RequestUri": "http://seanstagetest.blob.core.windows.net/test-container-0096c6bd-b332-5602-a86e-990a51131fc5?restype=container", + "RequestMethod": "DELETE", + "RequestHeaders": { + "Authorization": "Sanitized", + "traceparent": "00-727456db4599384e8c79fcf8bfe2eb12-1be4636357d5964c-00", + "User-Agent": [ + "azsdk-net-Storage.Blobs/12.1.0-dev.20200102.1\u002B4b0e11299bbf0498cff51c0544be2ce2ca0954e5", + "(.NET Core 4.6.28207.04; Microsoft Windows 10.0.18363 )" + ], + "x-ms-client-request-id": "650f38ad-cd13-af47-7697-b23ad0b0fc51", + "x-ms-date": "Thu, 02 Jan 2020 21:54:45 GMT", + "x-ms-return-client-request-id": "true", + "x-ms-version": "2019-02-02" + }, + "RequestBody": null, + "StatusCode": 202, + "ResponseHeaders": { + "Content-Length": "0", + "Date": "Thu, 02 Jan 2020 21:54:45 GMT", + "Server": [ + "Windows-Azure-Blob/1.0", + "Microsoft-HTTPAPI/2.0" + ], + "x-ms-client-request-id": "650f38ad-cd13-af47-7697-b23ad0b0fc51", + "x-ms-request-id": "2574557c-001e-0016-3cb7-c164ec000000", + "x-ms-version": "2019-02-02" + }, + "ResponseBody": [] + } + ], + "Variables": { + "DateTimeOffsetNow": "2020-01-02T13:54:45.7966891-08:00", + "RandomSeed": "2138850126", + "Storage_TestConfigDefault": "ProductionTenant\nseanstagetest\nU2FuaXRpemVk\nhttp://seanstagetest.blob.core.windows.net\nhttp://seanstagetest.file.core.windows.net\nhttp://seanstagetest.queue.core.windows.net\nhttp://seanstagetest.table.core.windows.net\n\n\n\n\nhttp://seanstagetest-secondary.blob.core.windows.net\nhttp://seanstagetest-secondary.file.core.windows.net\nhttp://seanstagetest-secondary.queue.core.windows.net\nhttp://seanstagetest-secondary.table.core.windows.net\n\nSanitized\n\n\nCloud\nBlobEndpoint=http://seanstagetest.blob.core.windows.net/;QueueEndpoint=http://seanstagetest.queue.core.windows.net/;FileEndpoint=http://seanstagetest.file.core.windows.net/;BlobSecondaryEndpoint=http://seanstagetest-secondary.blob.core.windows.net/;QueueSecondaryEndpoint=http://seanstagetest-secondary.queue.core.windows.net/;FileSecondaryEndpoint=http://seanstagetest-secondary.file.core.windows.net/;AccountName=seanstagetest;AccountKey=Sanitized" + } +} \ No newline at end of file diff --git a/sdk/storage/Azure.Storage.Common/src/Shared/SasExtensions.cs b/sdk/storage/Azure.Storage.Common/src/Shared/SasExtensions.cs index b684dcca43e09..0017fda87449b 100644 --- a/sdk/storage/Azure.Storage.Common/src/Shared/SasExtensions.cs +++ b/sdk/storage/Azure.Storage.Common/src/Shared/SasExtensions.cs @@ -260,27 +260,27 @@ internal static void AppendProperties(this SasQueryParameters parameters, String if (!string.IsNullOrWhiteSpace(parameters.CacheControl)) { - stringBuilder.AppendQueryParameter(Constants.Sas.Parameters.CacheControl, parameters.CacheControl); + stringBuilder.AppendQueryParameter(Constants.Sas.Parameters.CacheControl, WebUtility.UrlEncode(parameters.CacheControl)); } if (!string.IsNullOrWhiteSpace(parameters.ContentDisposition)) { - stringBuilder.AppendQueryParameter(Constants.Sas.Parameters.ContentDisposition, parameters.ContentDisposition); + stringBuilder.AppendQueryParameter(Constants.Sas.Parameters.ContentDisposition, WebUtility.UrlEncode(parameters.ContentDisposition)); } if (!string.IsNullOrWhiteSpace(parameters.ContentEncoding)) { - stringBuilder.AppendQueryParameter(Constants.Sas.Parameters.ContentEncoding, parameters.ContentEncoding); + stringBuilder.AppendQueryParameter(Constants.Sas.Parameters.ContentEncoding, WebUtility.UrlEncode(parameters.ContentEncoding)); } if (!string.IsNullOrWhiteSpace(parameters.ContentLanguage)) { - stringBuilder.AppendQueryParameter(Constants.Sas.Parameters.ContentLanguage, parameters.ContentLanguage); + stringBuilder.AppendQueryParameter(Constants.Sas.Parameters.ContentLanguage, WebUtility.UrlEncode(parameters.ContentLanguage)); } if (!string.IsNullOrWhiteSpace(parameters.ContentType)) { - stringBuilder.AppendQueryParameter(Constants.Sas.Parameters.ContentType, parameters.ContentType); + stringBuilder.AppendQueryParameter(Constants.Sas.Parameters.ContentType, WebUtility.UrlEncode(parameters.ContentType)); } if (!string.IsNullOrWhiteSpace(parameters.Signature)) From b19a2da9fe01ba048fd4b67a4ff58c1c3699cddd Mon Sep 17 00:00:00 2001 From: seanmcc-msft Date: Fri, 3 Jan 2020 10:30:23 -0800 Subject: [PATCH 2/2] PR comments --- .../tests/BlobBaseClientTests.cs | 31 +++++++-- ...ertiesAsync_BlobSasWithContentHeaders.json | 66 +++++++++---------- ...sAsync_BlobSasWithContentHeadersAsync.json | 66 +++++++++---------- 3 files changed, 91 insertions(+), 72 deletions(-) diff --git a/sdk/storage/Azure.Storage.Blobs/tests/BlobBaseClientTests.cs b/sdk/storage/Azure.Storage.Blobs/tests/BlobBaseClientTests.cs index add75f8ed4937..b7b580bc48140 100644 --- a/sdk/storage/Azure.Storage.Blobs/tests/BlobBaseClientTests.cs +++ b/sdk/storage/Azure.Storage.Blobs/tests/BlobBaseClientTests.cs @@ -1476,24 +1476,43 @@ public async Task GetPropertiesAsync_BlobSasWithContentHeaders() StartsOn = Recording.UtcNow.AddHours(-1), ExpiresOn = Recording.UtcNow.AddHours(1), IPRange = new SasIPRange(IPAddress.None, IPAddress.None), - CacheControl = "|cache control?", - ContentDisposition = "|content disposition?", - ContentEncoding = "|content encoding?", - ContentLanguage = "|content language?", - ContentType = "|content type?" + CacheControl = "\\cache control?", + ContentDisposition = "\\content disposition?", + ContentEncoding = "\\content encoding?", + ContentLanguage = "\\content language?", + ContentType = "\\content type?" }; blobSasBuilder.SetPermissions( BlobSasPermissions.All); BlobSasQueryParameters blobSasQueryParameters = blobSasBuilder.ToSasQueryParameters(GetNewSharedKeyCredentials()); - BlockBlobClient sasBlob = InstrumentClient(new BlockBlobClient(new Uri($"{TestConfigDefault.BlobServiceEndpoint}/{containerName}/{blobName}?{blobSasQueryParameters}"), GetOptions())); + // Act + string queryParametersString = blobSasQueryParameters.ToString(); + // Assert + Assert.IsTrue(queryParametersString.Contains("rscc=%5Ccache+control%3F")); + Assert.IsTrue(queryParametersString.Contains("rscd=%5Ccontent+disposition%3F")); + Assert.IsTrue(queryParametersString.Contains("rsce=%5Ccontent+encoding%3F")); + Assert.IsTrue(queryParametersString.Contains("rscl=%5Ccontent+language%3F")); + Assert.IsTrue(queryParametersString.Contains("rsct=%5Ccontent+type%3F")); + + BlobUriBuilder blobUriBuilder = new BlobUriBuilder(new Uri(TestConfigDefault.BlobServiceEndpoint)); + blobUriBuilder.BlobName = blobName; + blobUriBuilder.BlobContainerName = containerName; + blobUriBuilder.Sas = blobSasQueryParameters; + BlockBlobClient sasBlob = InstrumentClient(new BlockBlobClient(blobUriBuilder.ToUri(), GetOptions())); // Act Response response = await sasBlob.GetPropertiesAsync(); // Assert Assert.IsNotNull(response.GetRawResponse().Headers.RequestId); + + Assert.IsTrue(sasBlob.Uri.Query.Contains("rscc=%5Ccache+control%3F")); + Assert.IsTrue(sasBlob.Uri.Query.Contains("rscd=%5Ccontent+disposition%3F")); + Assert.IsTrue(sasBlob.Uri.Query.Contains("rsce=%5Ccontent+encoding%3F")); + Assert.IsTrue(sasBlob.Uri.Query.Contains("rscl=%5Ccontent+language%3F")); + Assert.IsTrue(sasBlob.Uri.Query.Contains("rsct=%5Ccontent+type%3F")); } [Test] diff --git a/sdk/storage/Azure.Storage.Blobs/tests/SessionRecords/BlobBaseClientTests/GetPropertiesAsync_BlobSasWithContentHeaders.json b/sdk/storage/Azure.Storage.Blobs/tests/SessionRecords/BlobBaseClientTests/GetPropertiesAsync_BlobSasWithContentHeaders.json index 9991a1e5d4e6a..7dcc0f79b1b6f 100644 --- a/sdk/storage/Azure.Storage.Blobs/tests/SessionRecords/BlobBaseClientTests/GetPropertiesAsync_BlobSasWithContentHeaders.json +++ b/sdk/storage/Azure.Storage.Blobs/tests/SessionRecords/BlobBaseClientTests/GetPropertiesAsync_BlobSasWithContentHeaders.json @@ -5,14 +5,14 @@ "RequestMethod": "PUT", "RequestHeaders": { "Authorization": "Sanitized", - "traceparent": "00-cccaff2defc8c749969df249c580579a-973cb749f453f949-00", + "traceparent": "00-d088e64ce66dac43abca56d2e1811f30-31f28b0b1e499c48-00", "User-Agent": [ - "azsdk-net-Storage.Blobs/12.1.0-dev.20200102.1\u002B4b0e11299bbf0498cff51c0544be2ce2ca0954e5", + "azsdk-net-Storage.Blobs/12.1.0-dev.20200103.1\u002B0e0c22e672bc86f72c031a4e0ca3ff7881fe7bfe", "(.NET Core 4.6.28207.04; Microsoft Windows 10.0.18363 )" ], "x-ms-blob-public-access": "container", "x-ms-client-request-id": "a040aa48-17e8-da54-fa49-9e1a38b88c89", - "x-ms-date": "Thu, 02 Jan 2020 21:54:49 GMT", + "x-ms-date": "Fri, 03 Jan 2020 18:29:28 GMT", "x-ms-return-client-request-id": "true", "x-ms-version": "2019-02-02" }, @@ -20,15 +20,15 @@ "StatusCode": 201, "ResponseHeaders": { "Content-Length": "0", - "Date": "Thu, 02 Jan 2020 21:54:49 GMT", - "ETag": "\u00220x8D78FCE63AE32BC\u0022", - "Last-Modified": "Thu, 02 Jan 2020 21:54:49 GMT", + "Date": "Fri, 03 Jan 2020 18:29:27 GMT", + "ETag": "\u00220x8D7907ADE3E8B94\u0022", + "Last-Modified": "Fri, 03 Jan 2020 18:29:28 GMT", "Server": [ "Windows-Azure-Blob/1.0", "Microsoft-HTTPAPI/2.0" ], "x-ms-client-request-id": "a040aa48-17e8-da54-fa49-9e1a38b88c89", - "x-ms-request-id": "25745582-001e-0016-3fb7-c164ec000000", + "x-ms-request-id": "7b269c76-401e-0038-6963-c236fb000000", "x-ms-version": "2019-02-02" }, "ResponseBody": [] @@ -39,14 +39,14 @@ "RequestHeaders": { "Authorization": "Sanitized", "Content-Length": "1024", - "traceparent": "00-0b08e82f7db1164482ece472a5a99708-5b8c90e7806a244b-00", + "traceparent": "00-fa96bbaf630ffd43aedf6530fcce696a-5c963e576412cd4f-00", "User-Agent": [ - "azsdk-net-Storage.Blobs/12.1.0-dev.20200102.1\u002B4b0e11299bbf0498cff51c0544be2ce2ca0954e5", + "azsdk-net-Storage.Blobs/12.1.0-dev.20200103.1\u002B0e0c22e672bc86f72c031a4e0ca3ff7881fe7bfe", "(.NET Core 4.6.28207.04; Microsoft Windows 10.0.18363 )" ], "x-ms-blob-type": "BlockBlob", "x-ms-client-request-id": "c0eb7143-0d26-92c0-0626-24a262020018", - "x-ms-date": "Thu, 02 Jan 2020 21:54:49 GMT", + "x-ms-date": "Fri, 03 Jan 2020 18:29:28 GMT", "x-ms-return-client-request-id": "true", "x-ms-version": "2019-02-02" }, @@ -55,28 +55,28 @@ "ResponseHeaders": { "Content-Length": "0", "Content-MD5": "xtQ/QWLUqcBN0QuMbJ5ynw==", - "Date": "Thu, 02 Jan 2020 21:54:49 GMT", - "ETag": "\u00220x8D78FCE63C6083C\u0022", - "Last-Modified": "Thu, 02 Jan 2020 21:54:49 GMT", + "Date": "Fri, 03 Jan 2020 18:29:28 GMT", + "ETag": "\u00220x8D7907ADE5680BB\u0022", + "Last-Modified": "Fri, 03 Jan 2020 18:29:28 GMT", "Server": [ "Windows-Azure-Blob/1.0", "Microsoft-HTTPAPI/2.0" ], "x-ms-client-request-id": "c0eb7143-0d26-92c0-0626-24a262020018", "x-ms-content-crc64": "8JhwtDtTaF0=", - "x-ms-request-id": "25745584-001e-0016-40b7-c164ec000000", + "x-ms-request-id": "7b269c79-401e-0038-6a63-c236fb000000", "x-ms-request-server-encrypted": "true", "x-ms-version": "2019-02-02" }, "ResponseBody": [] }, { - "RequestUri": "http://seanstagetest.blob.core.windows.net/test-container-affc2cd9-cee4-869a-cb2b-9a80cb58e54d/test-blob-8adc09f5-fead-b331-11ca-96e2f9421fc7?sv=2019-02-02\u0026st=2020-01-02T20%3A54%3A49Z\u0026se=2020-01-02T22%3A54%3A49Z\u0026sr=b\u0026sp=racwd\u0026rscc=|cache\u002Bcontrol%3F\u0026rscd=|content\u002Bdisposition%3F\u0026rsce=|content\u002Bencoding%3F\u0026rscl=|content\u002Blanguage%3F\u0026rsct=|content\u002Btype%3F\u0026sig=Sanitized", + "RequestUri": "http://seanstagetest.blob.core.windows.net/test-container-affc2cd9-cee4-869a-cb2b-9a80cb58e54d/test-blob-8adc09f5-fead-b331-11ca-96e2f9421fc7?sv=2019-02-02\u0026st=2020-01-03T17%3A29%3A28Z\u0026se=2020-01-03T19%3A29%3A28Z\u0026sr=b\u0026sp=racwd\u0026rscc=%5Ccache\u002Bcontrol%3F\u0026rscd=%5Ccontent\u002Bdisposition%3F\u0026rsce=%5Ccontent\u002Bencoding%3F\u0026rscl=%5Ccontent\u002Blanguage%3F\u0026rsct=%5Ccontent\u002Btype%3F\u0026sig=Sanitized", "RequestMethod": "HEAD", "RequestHeaders": { - "traceparent": "00-92fe1d5f7959bf40b92d7bc09cf19ab1-b274def6433f464b-00", + "traceparent": "00-5bc968519514c644bdd47d5142d4d2d4-fbe602e8170e064c-00", "User-Agent": [ - "azsdk-net-Storage.Blobs/12.1.0-dev.20200102.1\u002B4b0e11299bbf0498cff51c0544be2ce2ca0954e5", + "azsdk-net-Storage.Blobs/12.1.0-dev.20200103.1\u002B0e0c22e672bc86f72c031a4e0ca3ff7881fe7bfe", "(.NET Core 4.6.28207.04; Microsoft Windows 10.0.18363 )" ], "x-ms-client-request-id": "0afa33fd-767f-d6da-ade3-7bb78fe59bd2", @@ -87,16 +87,16 @@ "StatusCode": 200, "ResponseHeaders": { "Accept-Ranges": "bytes", - "Cache-Control": "|cache control?", - "Content-Disposition": "|content disposition?", - "Content-Encoding": "|content encoding?", - "Content-Language": "|content language?", + "Cache-Control": "\\cache control?", + "Content-Disposition": "\\content disposition?", + "Content-Encoding": "\\content encoding?", + "Content-Language": "\\content language?", "Content-Length": "1024", "Content-MD5": "xtQ/QWLUqcBN0QuMbJ5ynw==", - "Content-Type": "|content type?", - "Date": "Thu, 02 Jan 2020 21:54:49 GMT", - "ETag": "\u00220x8D78FCE63C6083C\u0022", - "Last-Modified": "Thu, 02 Jan 2020 21:54:49 GMT", + "Content-Type": "\\content type?", + "Date": "Fri, 03 Jan 2020 18:29:28 GMT", + "ETag": "\u00220x8D7907ADE5680BB\u0022", + "Last-Modified": "Fri, 03 Jan 2020 18:29:28 GMT", "Server": [ "Windows-Azure-Blob/1.0", "Microsoft-HTTPAPI/2.0" @@ -106,10 +106,10 @@ "x-ms-access-tier-inferred": "true", "x-ms-blob-type": "BlockBlob", "x-ms-client-request-id": "0afa33fd-767f-d6da-ade3-7bb78fe59bd2", - "x-ms-creation-time": "Thu, 02 Jan 2020 21:54:49 GMT", + "x-ms-creation-time": "Fri, 03 Jan 2020 18:29:28 GMT", "x-ms-lease-state": "available", "x-ms-lease-status": "unlocked", - "x-ms-request-id": "25745585-001e-0016-41b7-c164ec000000", + "x-ms-request-id": "7b269c7a-401e-0038-6b63-c236fb000000", "x-ms-server-encrypted": "true", "x-ms-version": "2019-02-02" }, @@ -120,13 +120,13 @@ "RequestMethod": "DELETE", "RequestHeaders": { "Authorization": "Sanitized", - "traceparent": "00-4e1225b982f70744976e2869a0388668-fd65b447d1654c49-00", + "traceparent": "00-48af9d1fd3874c47affe57ed91ef455d-18c72f0fd4ce4446-00", "User-Agent": [ - "azsdk-net-Storage.Blobs/12.1.0-dev.20200102.1\u002B4b0e11299bbf0498cff51c0544be2ce2ca0954e5", + "azsdk-net-Storage.Blobs/12.1.0-dev.20200103.1\u002B0e0c22e672bc86f72c031a4e0ca3ff7881fe7bfe", "(.NET Core 4.6.28207.04; Microsoft Windows 10.0.18363 )" ], "x-ms-client-request-id": "2fa4982b-f608-4f99-0112-7c94eedab34c", - "x-ms-date": "Thu, 02 Jan 2020 21:54:49 GMT", + "x-ms-date": "Fri, 03 Jan 2020 18:29:28 GMT", "x-ms-return-client-request-id": "true", "x-ms-version": "2019-02-02" }, @@ -134,20 +134,20 @@ "StatusCode": 202, "ResponseHeaders": { "Content-Length": "0", - "Date": "Thu, 02 Jan 2020 21:54:49 GMT", + "Date": "Fri, 03 Jan 2020 18:29:28 GMT", "Server": [ "Windows-Azure-Blob/1.0", "Microsoft-HTTPAPI/2.0" ], "x-ms-client-request-id": "2fa4982b-f608-4f99-0112-7c94eedab34c", - "x-ms-request-id": "25745586-001e-0016-42b7-c164ec000000", + "x-ms-request-id": "7b269c7b-401e-0038-6c63-c236fb000000", "x-ms-version": "2019-02-02" }, "ResponseBody": [] } ], "Variables": { - "DateTimeOffsetNow": "2020-01-02T13:54:49.7124969-08:00", + "DateTimeOffsetNow": "2020-01-03T10:29:28.8544288-08:00", "RandomSeed": "880505182", "Storage_TestConfigDefault": "ProductionTenant\nseanstagetest\nU2FuaXRpemVk\nhttp://seanstagetest.blob.core.windows.net\nhttp://seanstagetest.file.core.windows.net\nhttp://seanstagetest.queue.core.windows.net\nhttp://seanstagetest.table.core.windows.net\n\n\n\n\nhttp://seanstagetest-secondary.blob.core.windows.net\nhttp://seanstagetest-secondary.file.core.windows.net\nhttp://seanstagetest-secondary.queue.core.windows.net\nhttp://seanstagetest-secondary.table.core.windows.net\n\nSanitized\n\n\nCloud\nBlobEndpoint=http://seanstagetest.blob.core.windows.net/;QueueEndpoint=http://seanstagetest.queue.core.windows.net/;FileEndpoint=http://seanstagetest.file.core.windows.net/;BlobSecondaryEndpoint=http://seanstagetest-secondary.blob.core.windows.net/;QueueSecondaryEndpoint=http://seanstagetest-secondary.queue.core.windows.net/;FileSecondaryEndpoint=http://seanstagetest-secondary.file.core.windows.net/;AccountName=seanstagetest;AccountKey=Sanitized" } diff --git a/sdk/storage/Azure.Storage.Blobs/tests/SessionRecords/BlobBaseClientTests/GetPropertiesAsync_BlobSasWithContentHeadersAsync.json b/sdk/storage/Azure.Storage.Blobs/tests/SessionRecords/BlobBaseClientTests/GetPropertiesAsync_BlobSasWithContentHeadersAsync.json index b8206fb948b78..a9eaa0d8d4c6d 100644 --- a/sdk/storage/Azure.Storage.Blobs/tests/SessionRecords/BlobBaseClientTests/GetPropertiesAsync_BlobSasWithContentHeadersAsync.json +++ b/sdk/storage/Azure.Storage.Blobs/tests/SessionRecords/BlobBaseClientTests/GetPropertiesAsync_BlobSasWithContentHeadersAsync.json @@ -5,14 +5,14 @@ "RequestMethod": "PUT", "RequestHeaders": { "Authorization": "Sanitized", - "traceparent": "00-9481fcbf34dee748976d6b5770c9e9d6-a1ea8ea43747194a-00", + "traceparent": "00-1d2b43852338ba4f81e1cfaea1fb8836-9ccc3f4dc3b9e248-00", "User-Agent": [ - "azsdk-net-Storage.Blobs/12.1.0-dev.20200102.1\u002B4b0e11299bbf0498cff51c0544be2ce2ca0954e5", + "azsdk-net-Storage.Blobs/12.1.0-dev.20200103.1\u002B0e0c22e672bc86f72c031a4e0ca3ff7881fe7bfe", "(.NET Core 4.6.28207.04; Microsoft Windows 10.0.18363 )" ], "x-ms-blob-public-access": "container", "x-ms-client-request-id": "2de99e39-3ed6-6ec6-2ce6-dd8fef91014b", - "x-ms-date": "Thu, 02 Jan 2020 21:54:45 GMT", + "x-ms-date": "Fri, 03 Jan 2020 18:29:29 GMT", "x-ms-return-client-request-id": "true", "x-ms-version": "2019-02-02" }, @@ -20,15 +20,15 @@ "StatusCode": 201, "ResponseHeaders": { "Content-Length": "0", - "Date": "Thu, 02 Jan 2020 21:54:45 GMT", - "ETag": "\u00220x8D78FCE6156FADD\u0022", - "Last-Modified": "Thu, 02 Jan 2020 21:54:45 GMT", + "Date": "Fri, 03 Jan 2020 18:29:28 GMT", + "ETag": "\u00220x8D7907ADE8A61E0\u0022", + "Last-Modified": "Fri, 03 Jan 2020 18:29:29 GMT", "Server": [ "Windows-Azure-Blob/1.0", "Microsoft-HTTPAPI/2.0" ], "x-ms-client-request-id": "2de99e39-3ed6-6ec6-2ce6-dd8fef91014b", - "x-ms-request-id": "25745574-001e-0016-38b7-c164ec000000", + "x-ms-request-id": "7b269c7c-401e-0038-6d63-c236fb000000", "x-ms-version": "2019-02-02" }, "ResponseBody": [] @@ -39,14 +39,14 @@ "RequestHeaders": { "Authorization": "Sanitized", "Content-Length": "1024", - "traceparent": "00-b07bfb42bd0fb345accdd5200e4769a3-3e18618acc43914f-00", + "traceparent": "00-b184f22dca74e8468d22df64d347d598-e4bbd60af8586448-00", "User-Agent": [ - "azsdk-net-Storage.Blobs/12.1.0-dev.20200102.1\u002B4b0e11299bbf0498cff51c0544be2ce2ca0954e5", + "azsdk-net-Storage.Blobs/12.1.0-dev.20200103.1\u002B0e0c22e672bc86f72c031a4e0ca3ff7881fe7bfe", "(.NET Core 4.6.28207.04; Microsoft Windows 10.0.18363 )" ], "x-ms-blob-type": "BlockBlob", "x-ms-client-request-id": "389957cf-3ed1-72f3-2147-639a816941b4", - "x-ms-date": "Thu, 02 Jan 2020 21:54:45 GMT", + "x-ms-date": "Fri, 03 Jan 2020 18:29:29 GMT", "x-ms-return-client-request-id": "true", "x-ms-version": "2019-02-02" }, @@ -55,28 +55,28 @@ "ResponseHeaders": { "Content-Length": "0", "Content-MD5": "IWPl4Xzz\u002BhrHmOLFrIItqg==", - "Date": "Thu, 02 Jan 2020 21:54:45 GMT", - "ETag": "\u00220x8D78FCE616FE2F7\u0022", - "Last-Modified": "Thu, 02 Jan 2020 21:54:45 GMT", + "Date": "Fri, 03 Jan 2020 18:29:28 GMT", + "ETag": "\u00220x8D7907ADE98437C\u0022", + "Last-Modified": "Fri, 03 Jan 2020 18:29:29 GMT", "Server": [ "Windows-Azure-Blob/1.0", "Microsoft-HTTPAPI/2.0" ], "x-ms-client-request-id": "389957cf-3ed1-72f3-2147-639a816941b4", "x-ms-content-crc64": "R8JhYEv0AVI=", - "x-ms-request-id": "25745577-001e-0016-39b7-c164ec000000", + "x-ms-request-id": "7b269c7e-401e-0038-6e63-c236fb000000", "x-ms-request-server-encrypted": "true", "x-ms-version": "2019-02-02" }, "ResponseBody": [] }, { - "RequestUri": "http://seanstagetest.blob.core.windows.net/test-container-0096c6bd-b332-5602-a86e-990a51131fc5/test-blob-9627e3b8-4f17-b099-23a3-c471545d601a?sv=2019-02-02\u0026st=2020-01-02T20%3A54%3A45Z\u0026se=2020-01-02T22%3A54%3A45Z\u0026sr=b\u0026sp=racwd\u0026rscc=|cache\u002Bcontrol%3F\u0026rscd=|content\u002Bdisposition%3F\u0026rsce=|content\u002Bencoding%3F\u0026rscl=|content\u002Blanguage%3F\u0026rsct=|content\u002Btype%3F\u0026sig=Sanitized", + "RequestUri": "http://seanstagetest.blob.core.windows.net/test-container-0096c6bd-b332-5602-a86e-990a51131fc5/test-blob-9627e3b8-4f17-b099-23a3-c471545d601a?sv=2019-02-02\u0026st=2020-01-03T17%3A29%3A29Z\u0026se=2020-01-03T19%3A29%3A29Z\u0026sr=b\u0026sp=racwd\u0026rscc=%5Ccache\u002Bcontrol%3F\u0026rscd=%5Ccontent\u002Bdisposition%3F\u0026rsce=%5Ccontent\u002Bencoding%3F\u0026rscl=%5Ccontent\u002Blanguage%3F\u0026rsct=%5Ccontent\u002Btype%3F\u0026sig=Sanitized", "RequestMethod": "HEAD", "RequestHeaders": { - "traceparent": "00-85648503381ef24daf1283ac47cefc66-3c6091f63a782943-00", + "traceparent": "00-8b1108d7f78e5e4daa86453eb6445fd8-e48a2d7cebe7c348-00", "User-Agent": [ - "azsdk-net-Storage.Blobs/12.1.0-dev.20200102.1\u002B4b0e11299bbf0498cff51c0544be2ce2ca0954e5", + "azsdk-net-Storage.Blobs/12.1.0-dev.20200103.1\u002B0e0c22e672bc86f72c031a4e0ca3ff7881fe7bfe", "(.NET Core 4.6.28207.04; Microsoft Windows 10.0.18363 )" ], "x-ms-client-request-id": "73561c8b-a86c-628a-f638-5d8665fa703a", @@ -87,16 +87,16 @@ "StatusCode": 200, "ResponseHeaders": { "Accept-Ranges": "bytes", - "Cache-Control": "|cache control?", - "Content-Disposition": "|content disposition?", - "Content-Encoding": "|content encoding?", - "Content-Language": "|content language?", + "Cache-Control": "\\cache control?", + "Content-Disposition": "\\content disposition?", + "Content-Encoding": "\\content encoding?", + "Content-Language": "\\content language?", "Content-Length": "1024", "Content-MD5": "IWPl4Xzz\u002BhrHmOLFrIItqg==", - "Content-Type": "|content type?", - "Date": "Thu, 02 Jan 2020 21:54:45 GMT", - "ETag": "\u00220x8D78FCE616FE2F7\u0022", - "Last-Modified": "Thu, 02 Jan 2020 21:54:45 GMT", + "Content-Type": "\\content type?", + "Date": "Fri, 03 Jan 2020 18:29:28 GMT", + "ETag": "\u00220x8D7907ADE98437C\u0022", + "Last-Modified": "Fri, 03 Jan 2020 18:29:29 GMT", "Server": [ "Windows-Azure-Blob/1.0", "Microsoft-HTTPAPI/2.0" @@ -106,10 +106,10 @@ "x-ms-access-tier-inferred": "true", "x-ms-blob-type": "BlockBlob", "x-ms-client-request-id": "73561c8b-a86c-628a-f638-5d8665fa703a", - "x-ms-creation-time": "Thu, 02 Jan 2020 21:54:45 GMT", + "x-ms-creation-time": "Fri, 03 Jan 2020 18:29:29 GMT", "x-ms-lease-state": "available", "x-ms-lease-status": "unlocked", - "x-ms-request-id": "2574557b-001e-0016-3bb7-c164ec000000", + "x-ms-request-id": "7b269c80-401e-0038-7063-c236fb000000", "x-ms-server-encrypted": "true", "x-ms-version": "2019-02-02" }, @@ -120,13 +120,13 @@ "RequestMethod": "DELETE", "RequestHeaders": { "Authorization": "Sanitized", - "traceparent": "00-727456db4599384e8c79fcf8bfe2eb12-1be4636357d5964c-00", + "traceparent": "00-ba4801a0838bae4d9e45a9a626aa7527-34bdd0488c2ff940-00", "User-Agent": [ - "azsdk-net-Storage.Blobs/12.1.0-dev.20200102.1\u002B4b0e11299bbf0498cff51c0544be2ce2ca0954e5", + "azsdk-net-Storage.Blobs/12.1.0-dev.20200103.1\u002B0e0c22e672bc86f72c031a4e0ca3ff7881fe7bfe", "(.NET Core 4.6.28207.04; Microsoft Windows 10.0.18363 )" ], "x-ms-client-request-id": "650f38ad-cd13-af47-7697-b23ad0b0fc51", - "x-ms-date": "Thu, 02 Jan 2020 21:54:45 GMT", + "x-ms-date": "Fri, 03 Jan 2020 18:29:29 GMT", "x-ms-return-client-request-id": "true", "x-ms-version": "2019-02-02" }, @@ -134,20 +134,20 @@ "StatusCode": 202, "ResponseHeaders": { "Content-Length": "0", - "Date": "Thu, 02 Jan 2020 21:54:45 GMT", + "Date": "Fri, 03 Jan 2020 18:29:28 GMT", "Server": [ "Windows-Azure-Blob/1.0", "Microsoft-HTTPAPI/2.0" ], "x-ms-client-request-id": "650f38ad-cd13-af47-7697-b23ad0b0fc51", - "x-ms-request-id": "2574557c-001e-0016-3cb7-c164ec000000", + "x-ms-request-id": "7b269c81-401e-0038-7163-c236fb000000", "x-ms-version": "2019-02-02" }, "ResponseBody": [] } ], "Variables": { - "DateTimeOffsetNow": "2020-01-02T13:54:45.7966891-08:00", + "DateTimeOffsetNow": "2020-01-03T10:29:29.2875973-08:00", "RandomSeed": "2138850126", "Storage_TestConfigDefault": "ProductionTenant\nseanstagetest\nU2FuaXRpemVk\nhttp://seanstagetest.blob.core.windows.net\nhttp://seanstagetest.file.core.windows.net\nhttp://seanstagetest.queue.core.windows.net\nhttp://seanstagetest.table.core.windows.net\n\n\n\n\nhttp://seanstagetest-secondary.blob.core.windows.net\nhttp://seanstagetest-secondary.file.core.windows.net\nhttp://seanstagetest-secondary.queue.core.windows.net\nhttp://seanstagetest-secondary.table.core.windows.net\n\nSanitized\n\n\nCloud\nBlobEndpoint=http://seanstagetest.blob.core.windows.net/;QueueEndpoint=http://seanstagetest.queue.core.windows.net/;FileEndpoint=http://seanstagetest.file.core.windows.net/;BlobSecondaryEndpoint=http://seanstagetest-secondary.blob.core.windows.net/;QueueSecondaryEndpoint=http://seanstagetest-secondary.queue.core.windows.net/;FileSecondaryEndpoint=http://seanstagetest-secondary.file.core.windows.net/;AccountName=seanstagetest;AccountKey=Sanitized" }