From 97235cb46bc6083759053b8b1c1335c486aa06a9 Mon Sep 17 00:00:00 2001 From: Anton Kolesnyk <41349689+antkmsft@users.noreply.github.com> Date: Mon, 12 Dec 2022 13:16:11 -0800 Subject: [PATCH] Add support for space character instead of 'T' when parsing RFC3339 DateTimes (#4184) Co-authored-by: Anton Kolesnyk --- sdk/core/azure-core/CHANGELOG.md | 2 ++ sdk/core/azure-core/src/datetime.cpp | 3 ++- sdk/core/azure-core/test/ut/datetime_test.cpp | 7 +++++++ .../azure-identity/src/token_credential_impl.cpp | 14 +++----------- 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/sdk/core/azure-core/CHANGELOG.md b/sdk/core/azure-core/CHANGELOG.md index e4665ffdd..66e7c1ccd 100644 --- a/sdk/core/azure-core/CHANGELOG.md +++ b/sdk/core/azure-core/CHANGELOG.md @@ -4,6 +4,8 @@ ### Features Added +- Added support for parsing space character in place of 'T' in RFC3339 DateTimes. + ### Breaking Changes ### Bugs Fixed diff --git a/sdk/core/azure-core/src/datetime.cpp b/sdk/core/azure-core/src/datetime.cpp index d506f6d6f..7c0152dad 100644 --- a/sdk/core/azure-core/src/datetime.cpp +++ b/sdk/core/azure-core/src/datetime.cpp @@ -604,7 +604,8 @@ DateTime DateTime::Parse(std::string const& dateTime, DateFormat format) day = ParseNumber(&cursor, dateTime, DateTimeLength, parsingArea, 2, 2); } - if (cursor < DateTimeLength && (dateTime[cursor] == 'T' || dateTime[cursor] == 't')) + if (cursor < DateTimeLength + && (dateTime[cursor] == 'T' || dateTime[cursor] == 't' || dateTime[cursor] == ' ')) { ++cursor; IncreaseAndCheckMinLength(&minDateTimeLength, DateTimeLength, 7); diff --git a/sdk/core/azure-core/test/ut/datetime_test.cpp b/sdk/core/azure-core/test/ut/datetime_test.cpp index 249681992..eaf59d018 100644 --- a/sdk/core/azure-core/test/ut/datetime_test.cpp +++ b/sdk/core/azure-core/test/ut/datetime_test.cpp @@ -895,3 +895,10 @@ TEST(DateTime, LeapYear) EXPECT_NO_THROW(static_cast(DateTime(2021, 2, 28))); EXPECT_THROW(static_cast(DateTime(2021, 2, 29)), std::invalid_argument); } + +TEST(DateTime, Rfc3339Space) +{ + auto const datetime + = DateTime::Parse("2022-08-24 00:43:08.0004308Z", DateTime::DateFormat::Rfc3339); + EXPECT_EQ(datetime.ToString(DateTime::DateFormat::Rfc3339), "2022-08-24T00:43:08.0004308Z"); +} diff --git a/sdk/identity/azure-identity/src/token_credential_impl.cpp b/sdk/identity/azure-identity/src/token_credential_impl.cpp index 8e832f7f2..114d16f81 100644 --- a/sdk/identity/azure-identity/src/token_credential_impl.cpp +++ b/sdk/identity/azure-identity/src/token_credential_impl.cpp @@ -181,17 +181,9 @@ AccessToken TokenCredentialImpl::ParseToken( } else { - auto expiresOn = parsedJson[expiresOnPropertyName].get(); - { - auto const spacePos = expiresOn.find(' '); - if (spacePos != std::string::npos) - { - expiresOn = expiresOn.replace(spacePos, 1, 1, 'T'); - } - } - - accessToken.ExpiresOn - = Azure::DateTime::Parse(expiresOn, Azure::DateTime::DateFormat::Rfc3339); + accessToken.ExpiresOn = Azure::DateTime::Parse( + parsedJson[expiresOnPropertyName].get(), + Azure::DateTime::DateFormat::Rfc3339); } return accessToken;