diff options
author | Brad Bishop <bradleyb@fuzziesquirrel.com> | 2019-04-08 22:21:03 +0300 |
---|---|---|
committer | Brad Bishop <bradleyb@fuzziesquirrel.com> | 2019-04-08 22:21:12 +0300 |
commit | 34ae60030e520db4235f13b99849052e594fde7b (patch) | |
tree | f672a23d5bf8d8cf74737e80a304c55766a7d596 /meta-openembedded/meta-oe/recipes-support/cpprest | |
parent | 4e3797a177a8edd3909ab428353e5186447b8312 (diff) | |
download | openbmc-34ae60030e520db4235f13b99849052e594fde7b.tar.xz |
meta-openembedded: refresh master: 0435c9e193..4a9deabbc8
Update meta-openembedded to master HEAD.
Alistair Francis (7):
python3-pyaudio: Initial commit
python3-pyfann2: Initial commit
python3-pocketsphinx: Initial commit
python3-xxhash: Initial commit
mycroft: Initial commit
libfann: Initial commit
python-cryptography: Bump from 2.4.1 to 2.6.1
Andreas Müller (10):
xfce4-screenshooter: upgrade 1.9.4 -> 1.9.5
networkmanager: Fix upstream regex for 1.16
networkmanager: fix build with musl
gvfs: fix configure options and DDEPENDS
rrdtool: fix build by disabling docs
libpeas: rework gobject-introspection handling
gvfs: Fix missing executable permission flags for files in libexec
gnome-desktop3: remove gconf from DEPENDS
gnome-desktop3: rework gobject-introspection handling
gnome-desktop3: Disable libseccomp for all archs
Brad Bishop (1):
libvncserver: enable split client/server packages
Fabio Berton (1):
python*-requests: Update 2.20.1 -> 2.21.0
Gianfranco Costamagna (2):
cpprest: fix build failure on 32bit systems, with upstream merged patch
libmodbus: start to prefer version 3.1.4 as default
Hongxu Jia (1):
dracut: fix udevdir not found
Khem Raj (5):
ncmpc: Rename artist_screen to library_screen
networkmanager: Fix build with clang
alsa-oss: Upgrade to 1.1.8
redis: Fix ocasional parallel build failure
lcdproc: Fix parallel build
Nikolay Nizov (2):
android-tools-conf: fix typo
android-tools-conf: Make sure /dev/pts/0 exists
Oleksandr Kravchuk (2):
fping: update to 4.2
nuttcp: update to 7.3.3
Peter Kjellerstedt (1):
doxygen: Make it build with ninja 1.9.0
Qi.Chen@windriver.com (2):
openldap: add missing CVE tag to patch
ipsec-tools: add missing CVE tags to patches
Randy MacLeod (2):
imagemagic: upgrade to 7.0.8-35
wolfssl: update to 3.15.8 and use github SRC_URI
Slater, Joseph (1):
tcpreplay: update to version 4.3.2
Vincent Prince (4):
Rsyslog: Add mmjsonparse to PACKAGECONFIG
zeromq: bump version 4.2.5 => 4.3.1
cppzmq: bump version 4.2.3 => 4.3.0
czmq: bump version 4.1.1 => 4.2.0
Yi Zhao (3):
python-engineio: add recipe
python-socketio: add recipe
python-flask-socketio
Zang Ruochen (4):
augeas: upgrade 1.10.1 -> 1.11.0
libedit: upgrade 20181209-3.1 -> 20190324-3.1
mcelog: upgrade 161 -> 162
lockfile-progs: upgrade 0.1.17 -> 0.1.18
leimaohui (1):
Fix build error for armeb.
Change-Id: Ie79748c484bcf4fd28b3bde84e2194044e1c08a8
Signed-off-by: Brad Bishop <bradleyb@fuzziesquirrel.com>
Diffstat (limited to 'meta-openembedded/meta-oe/recipes-support/cpprest')
4 files changed, 308 insertions, 1586 deletions
diff --git a/meta-openembedded/meta-oe/recipes-support/cpprest/cpprest/1094.patch b/meta-openembedded/meta-oe/recipes-support/cpprest/cpprest/1094.patch new file mode 100644 index 000000000..3daad97f0 --- /dev/null +++ b/meta-openembedded/meta-oe/recipes-support/cpprest/cpprest/1094.patch @@ -0,0 +1,307 @@ +From d672de675a16e5ab9efcf783705cbd171f38188e Mon Sep 17 00:00:00 2001 +From: "Billy O'Neal (VC LIBS)" <bion@microsoft.com> +Date: Thu, 28 Mar 2019 15:17:12 -0700 +Subject: [PATCH] Avoid tripping over 32 bit time_t mistakes. + +Resolves https://github.com/Microsoft/cpprestsdk/issues/1090 +--- + Release/src/utilities/asyncrt_utils.cpp | 30 ++--- + Release/tests/functional/utils/datetime.cpp | 140 ++++++++++---------- + 2 files changed, 84 insertions(+), 86 deletions(-) + +diff --git a/Release/src/utilities/asyncrt_utils.cpp b/Release/src/utilities/asyncrt_utils.cpp +index 4a692e5fa..986b64bb7 100644 +--- a/Release/src/utilities/asyncrt_utils.cpp ++++ b/Release/src/utilities/asyncrt_utils.cpp +@@ -618,7 +618,7 @@ std::string __cdecl conversions::to_utf8string(const utf16string& value) { retur + + utf16string __cdecl conversions::to_utf16string(const std::string& value) { return utf8_to_utf16(value); } + +-static const uint64_t ntToUnixOffsetSeconds = 11644473600U; // diff between windows and unix epochs (seconds) ++static const int64_t ntToUnixOffsetSeconds = 11644473600; // diff between windows and unix epochs (seconds) + + datetime __cdecl datetime::utc_now() + { +@@ -634,10 +634,10 @@ datetime __cdecl datetime::utc_now() + #else // LINUX + struct timeval time; + gettimeofday(&time, nullptr); +- uint64_t result = ntToUnixOffsetSeconds + time.tv_sec; ++ int64_t result = ntToUnixOffsetSeconds + time.tv_sec; + result *= _secondTicks; // convert to 10e-7 + result += time.tv_usec * 10; // convert and add microseconds, 10e-6 to 10e-7 +- return datetime(result); ++ return datetime(static_cast<interval_type>(result)); + #endif + } + +@@ -646,7 +646,7 @@ static const char monthNames[] = "Jan\0Feb\0Mar\0Apr\0May\0Jun\0Jul\0Aug\0Sep\0O + + utility::string_t datetime::to_string(date_format format) const + { +- const uint64_t input = m_interval / _secondTicks; // convert to seconds ++ const int64_t input = static_cast<int64_t>(m_interval / _secondTicks); // convert to seconds + const int frac_sec = static_cast<int>(m_interval % _secondTicks); + const time_t time = static_cast<time_t>(input - ntToUnixOffsetSeconds); + struct tm t; +@@ -797,22 +797,20 @@ static int atoi2(const CharT* str) + return (static_cast<unsigned char>(str[0]) - '0') * 10 + (static_cast<unsigned char>(str[1]) - '0'); + } + +-static const time_t maxTimeT = sizeof(time_t) == 4 ? (time_t)INT_MAX : (time_t)LLONG_MAX; +- +-static time_t timezone_adjust(time_t result, unsigned char chSign, int adjustHours, int adjustMinutes) ++static int64_t timezone_adjust(int64_t result, unsigned char chSign, int adjustHours, int adjustMinutes) + { + if (adjustHours > 23) + { +- return (time_t)-1; ++ return -1; + } + + // adjustMinutes > 59 is impossible due to digit 5 check + const int tzAdjust = adjustMinutes * 60 + adjustHours * 60 * 60; + if (chSign == '-') + { +- if (maxTimeT - result < tzAdjust) ++ if (INT64_MAX - result < tzAdjust) + { +- return (time_t)-1; ++ return -1; + } + + result += tzAdjust; +@@ -821,7 +819,7 @@ static time_t timezone_adjust(time_t result, unsigned char chSign, int adjustHou + { + if (tzAdjust > result) + { +- return (time_t)-1; ++ return -1; + } + + result -= tzAdjust; +@@ -830,10 +828,10 @@ static time_t timezone_adjust(time_t result, unsigned char chSign, int adjustHou + return result; + } + +-static time_t make_gm_time(struct tm* t) ++static int64_t make_gm_time(struct tm* t) + { + #ifdef _MSC_VER +- return _mkgmtime(t); ++ return static_cast<int64_t>(_mkgmtime(t)); + #elif (defined(ANDROID) || defined(__ANDROID__)) + // HACK: The (nonportable?) POSIX function timegm is not available in + // bionic. As a workaround[1][2], we set the C library timezone to +@@ -867,9 +865,9 @@ static time_t make_gm_time(struct tm* t) + unsetenv("TZ"); + } + } +- return time; ++ return static_cast<int64_t>(time); + #else // ^^^ ANDROID // Other POSIX platforms vvv +- return timegm(t); ++ return static_cast<int64_t>(timegm(t)); + #endif // _MSC_VER + } + +@@ -916,7 +914,7 @@ zone = "UT" / "GMT" ; Universal Time + datetime __cdecl datetime::from_string(const utility::string_t& dateString, date_format format) + { + datetime result; +- time_t seconds; ++ int64_t seconds; + uint64_t frac_sec = 0; + struct tm t{}; + auto str = dateString.c_str(); +diff --git a/Release/tests/functional/utils/datetime.cpp b/Release/tests/functional/utils/datetime.cpp +index ae7f7a5e4..acd6fddb0 100644 +--- a/Release/tests/functional/utils/datetime.cpp ++++ b/Release/tests/functional/utils/datetime.cpp +@@ -133,75 +133,77 @@ SUITE(datetime) + + TEST(parsing_time_rfc1123_accepts_each_day) + { +- TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 00:00:00 GMT"), (time_t) 0); +- TestRfc1123IsTimeT(_XPLATSTR("Fri, 02 Jan 1970 00:00:00 GMT"), (time_t) 86400 * 1); +- TestRfc1123IsTimeT(_XPLATSTR("Sat, 03 Jan 1970 00:00:00 GMT"), (time_t) 86400 * 2); +- TestRfc1123IsTimeT(_XPLATSTR("Sun, 04 Jan 1970 00:00:00 GMT"), (time_t) 86400 * 3); +- TestRfc1123IsTimeT(_XPLATSTR("Mon, 05 Jan 1970 00:00:00 GMT"), (time_t) 86400 * 4); +- TestRfc1123IsTimeT(_XPLATSTR("Tue, 06 Jan 1970 00:00:00 GMT"), (time_t) 86400 * 5); +- TestRfc1123IsTimeT(_XPLATSTR("Wed, 07 Jan 1970 00:00:00 GMT"), (time_t) 86400 * 6); ++ TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 00:00:00 GMT"), (time_t)0); ++ TestRfc1123IsTimeT(_XPLATSTR("Fri, 02 Jan 1970 00:00:00 GMT"), (time_t)86400 * 1); ++ TestRfc1123IsTimeT(_XPLATSTR("Sat, 03 Jan 1970 00:00:00 GMT"), (time_t)86400 * 2); ++ TestRfc1123IsTimeT(_XPLATSTR("Sun, 04 Jan 1970 00:00:00 GMT"), (time_t)86400 * 3); ++ TestRfc1123IsTimeT(_XPLATSTR("Mon, 05 Jan 1970 00:00:00 GMT"), (time_t)86400 * 4); ++ TestRfc1123IsTimeT(_XPLATSTR("Tue, 06 Jan 1970 00:00:00 GMT"), (time_t)86400 * 5); ++ TestRfc1123IsTimeT(_XPLATSTR("Wed, 07 Jan 1970 00:00:00 GMT"), (time_t)86400 * 6); + } + + TEST(parsing_time_rfc1123_boundary_cases) + { +- TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 00:00:00 GMT"), (time_t) 0); +- TestRfc1123IsTimeT(_XPLATSTR("19 Jan 2038 03:14:06 GMT"), (time_t) INT_MAX - 1); +-#ifndef _USE_32BIT_TIME_T +- TestRfc1123IsTimeT(_XPLATSTR("19 Jan 2038 03:13:07 -0001"), (time_t) INT_MAX); +- TestRfc1123IsTimeT(_XPLATSTR("19 Jan 2038 03:14:07 -0000"), (time_t) INT_MAX); +-#endif // _USE_32BIT_TIME_T +- TestRfc1123IsTimeT(_XPLATSTR("14 Jan 2019 23:16:21 +0000"), (time_t) 1547507781); +- TestRfc1123IsTimeT(_XPLATSTR("14 Jan 2019 23:16:21 -0001"), (time_t) 1547507841); +- TestRfc1123IsTimeT(_XPLATSTR("14 Jan 2019 23:16:21 +0001"), (time_t) 1547507721); +- TestRfc1123IsTimeT(_XPLATSTR("14 Jan 2019 23:16:21 -0100"), (time_t) 1547511381); +- TestRfc1123IsTimeT(_XPLATSTR("14 Jan 2019 23:16:21 +0100"), (time_t) 1547504181); ++ TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 00:00:00 GMT"), (time_t)0); ++ TestRfc1123IsTimeT(_XPLATSTR("19 Jan 2038 03:14:06 GMT"), (time_t)INT_MAX - 1); ++ if (sizeof(time_t) == 8) ++ { ++ TestRfc1123IsTimeT(_XPLATSTR("19 Jan 2038 03:13:07 -0001"), (time_t)INT_MAX); ++ TestRfc1123IsTimeT(_XPLATSTR("19 Jan 2038 03:14:07 -0000"), (time_t)INT_MAX); ++ } ++ TestRfc1123IsTimeT(_XPLATSTR("14 Jan 2019 23:16:21 +0000"), (time_t)1547507781); ++ TestRfc1123IsTimeT(_XPLATSTR("14 Jan 2019 23:16:21 -0001"), (time_t)1547507841); ++ TestRfc1123IsTimeT(_XPLATSTR("14 Jan 2019 23:16:21 +0001"), (time_t)1547507721); ++ TestRfc1123IsTimeT(_XPLATSTR("14 Jan 2019 23:16:21 -0100"), (time_t)1547511381); ++ TestRfc1123IsTimeT(_XPLATSTR("14 Jan 2019 23:16:21 +0100"), (time_t)1547504181); + } + + TEST(parsing_time_rfc1123_uses_each_field) + { +- TestRfc1123IsTimeT(_XPLATSTR("02 Jan 1970 00:00:00 GMT"), (time_t) 86400); +- TestRfc1123IsTimeT(_XPLATSTR("12 Jan 1970 00:00:00 GMT"), (time_t) 950400); +- TestRfc1123IsTimeT(_XPLATSTR("01 Feb 1970 00:00:00 GMT"), (time_t) 2678400); +- TestRfc1123IsTimeT(_XPLATSTR("01 Jan 2000 00:00:00 GMT"), (time_t) 946684800); +-#ifndef _USE_32BIT_TIME_T +- TestRfc1123IsTimeT(_XPLATSTR("01 Jan 2100 00:00:00 GMT"), (time_t) 4102444800); +-#endif // _USE_32BIT_TIME_T +- TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1990 00:00:00 GMT"), (time_t) 631152000); +- TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1971 00:00:00 GMT"), (time_t) 31536000); +- TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 10:00:00 GMT"), (time_t) 36000); +- TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 01:00:00 GMT"), (time_t) 3600); +- TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 00:10:00 GMT"), (time_t) 600); +- TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 00:01:00 GMT"), (time_t) 60); +- TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 00:00:10 GMT"), (time_t) 10); +- TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 00:00:01 GMT"), (time_t) 1); +- TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 10:00:00 GMT"), (time_t) 36000); +- TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 02:00:00 PST"), (time_t) 36000); +- TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 03:00:00 PDT"), (time_t) 36000); +- TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 03:00:00 MST"), (time_t) 36000); +- TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 04:00:00 MDT"), (time_t) 36000); +- TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 04:00:00 CST"), (time_t) 36000); +- TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 05:00:00 CDT"), (time_t) 36000); +- TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 05:00:00 EST"), (time_t) 36000); +- TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 06:00:00 EDT"), (time_t) 36000); +- TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 06:00:00 -0400"), (time_t) 36000); +- TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 05:59:00 -0401"), (time_t) 36000); ++ TestRfc1123IsTimeT(_XPLATSTR("02 Jan 1970 00:00:00 GMT"), (time_t)86400); ++ TestRfc1123IsTimeT(_XPLATSTR("12 Jan 1970 00:00:00 GMT"), (time_t)950400); ++ TestRfc1123IsTimeT(_XPLATSTR("01 Feb 1970 00:00:00 GMT"), (time_t)2678400); ++ TestRfc1123IsTimeT(_XPLATSTR("01 Jan 2000 00:00:00 GMT"), (time_t)946684800); ++ if (sizeof(time_t) == 8) ++ { ++ TestRfc1123IsTimeT(_XPLATSTR("01 Jan 2100 00:00:00 GMT"), (time_t)4102444800); ++ } ++ TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1990 00:00:00 GMT"), (time_t)631152000); ++ TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1971 00:00:00 GMT"), (time_t)31536000); ++ TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 10:00:00 GMT"), (time_t)36000); ++ TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 01:00:00 GMT"), (time_t)3600); ++ TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 00:10:00 GMT"), (time_t)600); ++ TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 00:01:00 GMT"), (time_t)60); ++ TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 00:00:10 GMT"), (time_t)10); ++ TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 00:00:01 GMT"), (time_t)1); ++ TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 10:00:00 GMT"), (time_t)36000); ++ TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 02:00:00 PST"), (time_t)36000); ++ TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 03:00:00 PDT"), (time_t)36000); ++ TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 03:00:00 MST"), (time_t)36000); ++ TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 04:00:00 MDT"), (time_t)36000); ++ TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 04:00:00 CST"), (time_t)36000); ++ TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 05:00:00 CDT"), (time_t)36000); ++ TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 05:00:00 EST"), (time_t)36000); ++ TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 06:00:00 EDT"), (time_t)36000); ++ TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 06:00:00 -0400"), (time_t)36000); ++ TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 05:59:00 -0401"), (time_t)36000); + } + + TEST(parsing_time_rfc1123_max_days) + { +- TestRfc1123IsTimeT(_XPLATSTR("31 Jan 1970 00:00:00 GMT"), (time_t) 2592000); +- TestRfc1123IsTimeT(_XPLATSTR("28 Feb 2019 00:00:00 GMT"), (time_t) 1551312000); // non leap year allows feb 28 +- TestRfc1123IsTimeT(_XPLATSTR("29 Feb 2020 00:00:00 GMT"), (time_t) 1582934400); // leap year allows feb 29 +- TestRfc1123IsTimeT(_XPLATSTR("31 Mar 1970 00:00:00 GMT"), (time_t) 7689600); +- TestRfc1123IsTimeT(_XPLATSTR("30 Apr 1970 00:00:00 GMT"), (time_t) 10281600); +- TestRfc1123IsTimeT(_XPLATSTR("31 May 1970 00:00:00 GMT"), (time_t) 12960000); +- TestRfc1123IsTimeT(_XPLATSTR("30 Jun 1970 00:00:00 GMT"), (time_t) 15552000); +- TestRfc1123IsTimeT(_XPLATSTR("31 Jul 1970 00:00:00 GMT"), (time_t) 18230400); +- TestRfc1123IsTimeT(_XPLATSTR("31 Aug 1970 00:00:00 GMT"), (time_t) 20908800); +- TestRfc1123IsTimeT(_XPLATSTR("30 Sep 1970 00:00:00 GMT"), (time_t) 23500800); +- TestRfc1123IsTimeT(_XPLATSTR("31 Oct 1970 00:00:00 GMT"), (time_t) 26179200); +- TestRfc1123IsTimeT(_XPLATSTR("30 Nov 1970 00:00:00 GMT"), (time_t) 28771200); +- TestRfc1123IsTimeT(_XPLATSTR("31 Dec 1970 00:00:00 GMT"), (time_t) 31449600); ++ TestRfc1123IsTimeT(_XPLATSTR("31 Jan 1970 00:00:00 GMT"), (time_t)2592000); ++ TestRfc1123IsTimeT(_XPLATSTR("28 Feb 2019 00:00:00 GMT"), (time_t)1551312000); // non leap year allows feb 28 ++ TestRfc1123IsTimeT(_XPLATSTR("29 Feb 2020 00:00:00 GMT"), (time_t)1582934400); // leap year allows feb 29 ++ TestRfc1123IsTimeT(_XPLATSTR("31 Mar 1970 00:00:00 GMT"), (time_t)7689600); ++ TestRfc1123IsTimeT(_XPLATSTR("30 Apr 1970 00:00:00 GMT"), (time_t)10281600); ++ TestRfc1123IsTimeT(_XPLATSTR("31 May 1970 00:00:00 GMT"), (time_t)12960000); ++ TestRfc1123IsTimeT(_XPLATSTR("30 Jun 1970 00:00:00 GMT"), (time_t)15552000); ++ TestRfc1123IsTimeT(_XPLATSTR("31 Jul 1970 00:00:00 GMT"), (time_t)18230400); ++ TestRfc1123IsTimeT(_XPLATSTR("31 Aug 1970 00:00:00 GMT"), (time_t)20908800); ++ TestRfc1123IsTimeT(_XPLATSTR("30 Sep 1970 00:00:00 GMT"), (time_t)23500800); ++ TestRfc1123IsTimeT(_XPLATSTR("31 Oct 1970 00:00:00 GMT"), (time_t)26179200); ++ TestRfc1123IsTimeT(_XPLATSTR("30 Nov 1970 00:00:00 GMT"), (time_t)28771200); ++ TestRfc1123IsTimeT(_XPLATSTR("31 Dec 1970 00:00:00 GMT"), (time_t)31449600); + } + + TEST(parsing_time_rfc1123_invalid_cases) +@@ -266,7 +268,7 @@ SUITE(datetime) + _XPLATSTR("Thu, 01 Jan 1970 00:00:00 G"), + _XPLATSTR("Thu, 01 Jan 1970 00:00:00 GM"), + _XPLATSTR("Fri, 01 Jan 1970 00:00:00 GMT"), // wrong day +- _XPLATSTR("01 Jan 4970 00:00:00 GMT"), // year too big ++ _XPLATSTR("01 Jan 4970 00:00:00 GMT"), // year too big + _XPLATSTR("01 Jan 3001 00:00:00 GMT"), + _XPLATSTR("01 Xxx 1971 00:00:00 GMT"), // month bad + _XPLATSTR("00 Jan 1971 00:00:00 GMT"), // day too small +@@ -288,8 +290,8 @@ SUITE(datetime) + _XPLATSTR("01 Jan 1971 00:60:00 GMT"), // minute too big + _XPLATSTR("01 Jan 1971 00:00:70 GMT"), // second too big + _XPLATSTR("01 Jan 1971 00:00:61 GMT"), +- _XPLATSTR("01 Jan 1969 00:00:00 GMT"), // underflow +- _XPLATSTR("01 Jan 1969 00:00:00 CEST"), // bad tz ++ _XPLATSTR("01 Jan 1969 00:00:00 GMT"), // underflow ++ _XPLATSTR("01 Jan 1969 00:00:00 CEST"), // bad tz + _XPLATSTR("01 Jan 1970 00:00:00 +2400"), // bad tzoffsets + _XPLATSTR("01 Jan 1970 00:00:00 -3000"), + _XPLATSTR("01 Jan 1970 00:00:00 +2160"), +@@ -309,11 +311,12 @@ SUITE(datetime) + // boundary cases: + TestDateTimeRoundtrip(_XPLATSTR("1970-01-01T00:00:00Z")); // epoch + TestDateTimeRoundtrip(_XPLATSTR("2038-01-19T03:14:06+00:00"), _XPLATSTR("2038-01-19T03:14:06Z")); // INT_MAX - 1 +-#ifndef _USE_32BIT_TIME_T +- TestDateTimeRoundtrip(_XPLATSTR("2038-01-19T03:13:07-00:01"), +- _XPLATSTR("2038-01-19T03:14:07Z")); // INT_MAX after subtacting 1 +- TestDateTimeRoundtrip(_XPLATSTR("2038-01-19T03:14:07-00:00"), _XPLATSTR("2038-01-19T03:14:07Z")); +-#endif // _USE_32BIT_TIME_T ++ if (sizeof(time_t) == 8) ++ { ++ TestDateTimeRoundtrip(_XPLATSTR("2038-01-19T03:13:07-00:01"), ++ _XPLATSTR("2038-01-19T03:14:07Z")); // INT_MAX after subtacting 1 ++ TestDateTimeRoundtrip(_XPLATSTR("2038-01-19T03:14:07-00:00"), _XPLATSTR("2038-01-19T03:14:07Z")); ++ } + } + + TEST(parsing_time_iso8601_uses_each_timezone_digit) +@@ -456,11 +459,8 @@ SUITE(datetime) + _XPLATSTR("1971-01-01T00:60:00Z"), // minute too big + _XPLATSTR("1971-01-01T00:00:70Z"), // second too big + _XPLATSTR("1971-01-01T00:00:61Z"), +- _XPLATSTR("1969-01-01T00:00:00Z"), // underflow +-#ifdef _USE_32BIT_TIME_T +- _XPLATSTR("3000-01-01T00:00:01Z"), // overflow +-#endif +- _XPLATSTR("3001-01-01T00:00:00Z"), ++ _XPLATSTR("1969-01-01T00:00:00Z"), // underflow ++ _XPLATSTR("3001-01-01T00:00:00Z"), // overflow + _XPLATSTR("1970-01-01T00:00:00+00:01"), // time zone underflow + // _XPLATSTR("1970-01-01T00:00:00.Z"), // accepted as invalid timezone above + _XPLATSTR("1970-01-01T00:00:00+24:00"), // bad tzoffsets diff --git a/meta-openembedded/meta-oe/recipes-support/cpprest/cpprest/revert-9b670e5b33dfdbd501d618cd7e7498148ffbd559.patch b/meta-openembedded/meta-oe/recipes-support/cpprest/cpprest/revert-9b670e5b33dfdbd501d618cd7e7498148ffbd559.patch deleted file mode 100644 index 9af2cbf36..000000000 --- a/meta-openembedded/meta-oe/recipes-support/cpprest/cpprest/revert-9b670e5b33dfdbd501d618cd7e7498148ffbd559.patch +++ /dev/null @@ -1,26 +0,0 @@ -Description: revert upstream bugfix (see:https://github.com/Microsoft/cpprestsdk/issues/1090) -Last-Update: 2019-03-28 - ---- cpprest-2.10.12.orig/Release/src/utilities/asyncrt_utils.cpp -+++ cpprest-2.10.12/Release/src/utilities/asyncrt_utils.cpp -@@ -1393,16 +1393,15 @@ utility::seconds __cdecl timespan::xml_d - return utility::seconds(numSecs); - } - --static const char c_allowed_chars[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; --static const int chars_count = static_cast<int>(sizeof(c_allowed_chars) - 1); -+static const utility::char_t c_allowed_chars[] = -+ _XPLATSTR("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"); - - utility::string_t nonce_generator::generate() - { -- std::uniform_int_distribution<> distr(0, chars_count - 1); -+ std::uniform_int_distribution<> distr(0, static_cast<int>(sizeof(c_allowed_chars) / sizeof(utility::char_t)) - 1); - utility::string_t result; - result.reserve(length()); -- std::generate_n(std::back_inserter(result), length(), -- [&] { return static_cast<utility::char_t>(c_allowed_chars[distr(m_random)]); }); -+ std::generate_n(std::back_inserter(result), length(), [&]() { return c_allowed_chars[distr(m_random)]; }); - return result; - } - diff --git a/meta-openembedded/meta-oe/recipes-support/cpprest/cpprest/revert-f10d9f8e214516d2c19aa6ef831ee874a58c0479.patch b/meta-openembedded/meta-oe/recipes-support/cpprest/cpprest/revert-f10d9f8e214516d2c19aa6ef831ee874a58c0479.patch deleted file mode 100644 index 01e463113..000000000 --- a/meta-openembedded/meta-oe/recipes-support/cpprest/cpprest/revert-f10d9f8e214516d2c19aa6ef831ee874a58c0479.patch +++ /dev/null @@ -1,1557 +0,0 @@ -Description: revert upstream bugfix (see:https://github.com/Microsoft/cpprestsdk/issues/1090) -Last-Update: 2019-03-28 - ---- cpprest-2.10.12.orig/Release/include/cpprest/asyncrt_utils.h -+++ cpprest-2.10.12/Release/include/cpprest/asyncrt_utils.h -@@ -630,6 +630,15 @@ private: - static const interval_type _hourTicks = 60 * 60 * _secondTicks; - static const interval_type _dayTicks = 24 * 60 * 60 * _secondTicks; - -+#ifdef _WIN32 -+ // void* to avoid pulling in windows.h -+ static _ASYNCRTIMP bool __cdecl system_type_to_datetime(/*SYSTEMTIME*/ void* psysTime, -+ uint64_t seconds, -+ datetime* pdt); -+#else -+ static datetime timeval_to_datetime(const timeval& time); -+#endif -+ - // Private constructor. Use static methods to create an instance. - datetime(interval_type interval) : m_interval(interval) {} - -@@ -690,6 +699,7 @@ public: - void set_length(int length) { m_length = length; } - - private: -+ static const utility::string_t c_allowed_chars; - std::mt19937 m_random; - int m_length; - }; ---- cpprest-2.10.12.orig/Release/src/pch/stdafx.h -+++ cpprest-2.10.12/Release/src/pch/stdafx.h -@@ -61,6 +61,7 @@ - #undef BOOST_NO_CXX11_NULLPTR - #endif - #include "boost/bind/bind.hpp" -+#include "boost/date_time/posix_time/posix_time_types.hpp" - #include "boost/thread/condition_variable.hpp" - #include "boost/thread/mutex.hpp" - #include <fcntl.h> ---- cpprest-2.10.12.orig/Release/src/utilities/asyncrt_utils.cpp -+++ cpprest-2.10.12/Release/src/utilities/asyncrt_utils.cpp -@@ -15,9 +15,20 @@ - - #include <algorithm> - #include <cpprest/asyncrt_utils.h> --#include <stdexcept> -+#include <sstream> - #include <string> --#include <time.h> -+ -+#ifndef _WIN32 -+#if defined(__clang__) -+#pragma clang diagnostic push -+#pragma clang diagnostic ignored "-Wunused-local-typedef" -+#endif -+#include <boost/date_time/posix_time/posix_time.hpp> -+#include <boost/date_time/posix_time/posix_time_io.hpp> -+#if defined(__clang__) -+#pragma clang diagnostic pop -+#endif -+#endif - - using namespace web; - using namespace utility; -@@ -618,7 +629,18 @@ std::string __cdecl conversions::to_utf8 - - utf16string __cdecl conversions::to_utf16string(const std::string& value) { return utf8_to_utf16(value); } - --static const uint64_t ntToUnixOffsetSeconds = 11644473600U; // diff between windows and unix epochs (seconds) -+#ifndef WIN32 -+datetime datetime::timeval_to_datetime(const timeval& time) -+{ -+ const uint64_t epoch_offset = 11644473600LL; // diff between windows and unix epochs (seconds) -+ uint64_t result = epoch_offset + time.tv_sec; -+ result *= _secondTicks; // convert to 10e-7 -+ result += time.tv_usec * 10; // convert and add microseconds, 10e-6 to 10e-7 -+ return datetime(result); -+} -+#endif -+ -+static bool is_digit(utility::char_t c) { return c >= _XPLATSTR('0') && c <= _XPLATSTR('9'); } - - datetime __cdecl datetime::utc_now() - { -@@ -634,649 +656,450 @@ datetime __cdecl datetime::utc_now() - #else // LINUX - struct timeval time; - gettimeofday(&time, nullptr); -- uint64_t result = ntToUnixOffsetSeconds + time.tv_sec; -- result *= _secondTicks; // convert to 10e-7 -- result += time.tv_usec * 10; // convert and add microseconds, 10e-6 to 10e-7 -- return datetime(result); -+ return timeval_to_datetime(time); - #endif - } - --static const char dayNames[] = "Sun\0Mon\0Tue\0Wed\0Thu\0Fri\0Sat"; --static const char monthNames[] = "Jan\0Feb\0Mar\0Apr\0May\0Jun\0Jul\0Aug\0Sep\0Oct\0Nov\0Dec"; -- - utility::string_t datetime::to_string(date_format format) const - { -- const uint64_t input = m_interval / _secondTicks; // convert to seconds -- const int frac_sec = static_cast<int>(m_interval % _secondTicks); -- const time_t time = static_cast<time_t>(input - ntToUnixOffsetSeconds); -- struct tm t; --#ifdef _MSC_VER -- if (gmtime_s(&t, &time) != 0) --#else // ^^^ _MSC_VER ^^^ // vvv !_MSC_VER vvv -- if (gmtime_r(&time, &t) == 0) --#endif // _MSC_VER -- { -- throw std::invalid_argument("gmtime_r/s failed on the time supplied"); -- } -- -- char outBuffer[38]; // Thu, 01 Jan 1970 00:00:00 GMT\0 -- // 1970-01-01T00:00:00.1234567Z\0 -- char* outCursor = outBuffer; -- switch (format) -- { -- case RFC_1123: --#ifdef _MSC_VER -- sprintf_s(outCursor, -- 26, -- "%s, %02d %s %04d %02d:%02d:%02d", -- dayNames + 4 * t.tm_wday, -- t.tm_mday, -- monthNames + 4 * t.tm_mon, -- t.tm_year + 1900, -- t.tm_hour, -- t.tm_min, -- t.tm_sec); --#else // ^^^ _MSC_VER // !_MSC_VER vvv -- sprintf(outCursor, -- "%s, %02d %s %04d %02d:%02d:%02d", -- dayNames + 4 * t.tm_wday, -- t.tm_mday, -- monthNames + 4 * t.tm_mon, -- t.tm_year + 1900, -- t.tm_hour, -- t.tm_min, -- t.tm_sec); --#endif // _MSC_VER -- outCursor += 25; -- memcpy(outCursor, " GMT", 4); -- outCursor += 4; -- return utility::string_t(outBuffer, outCursor); -- case ISO_8601: --#ifdef _MSC_VER -- sprintf_s(outCursor, -- 20, -- "%04d-%02d-%02dT%02d:%02d:%02d", -- t.tm_year + 1900, -- t.tm_mon + 1, -- t.tm_mday, -- t.tm_hour, -- t.tm_min, -- t.tm_sec); --#else // ^^^ _MSC_VER // !_MSC_VER vvv -- sprintf(outCursor, -- "%04d-%02d-%02dT%02d:%02d:%02d", -- t.tm_year + 1900, -- t.tm_mon + 1, -- t.tm_mday, -- t.tm_hour, -- t.tm_min, -- t.tm_sec); --#endif // _MSC_VER -- outCursor += 19; -- if (frac_sec != 0) -- { -- // Append fractional second, which is a 7-digit value with no trailing zeros -- // This way, '1200' becomes '00012' --#ifdef _MSC_VER -- size_t appended = sprintf_s(outCursor, 9, ".%07d", frac_sec); --#else // ^^^ _MSC_VER // !_MSC_VER vvv -- size_t appended = sprintf(outCursor, ".%07d", frac_sec); --#endif // _MSC_VER -- while (outCursor[appended - 1] == '0') -- { -- --appended; // trim trailing zeros -- } -- -- outCursor += appended; -- } -- -- *outCursor = 'Z'; -- ++outCursor; -- return utility::string_t(outBuffer, outCursor); -- default: throw std::invalid_argument("Unrecognized date format."); -- } --} -- --template<class CharT> --static bool string_starts_with(const CharT* haystack, const char* needle) --{ -- while (*needle) -- { -- if (*haystack != static_cast<CharT>(*needle)) -- { -- return false; -- } -- -- ++haystack; -- ++needle; -- } -- -- return true; --} -- --#define ascii_isdigit(c) ((unsigned char)((unsigned char)(c) - '0') <= 9) --#define ascii_isdigit6(c) ((unsigned char)((unsigned char)(c) - '0') <= 6) --#define ascii_isdigit5(c) ((unsigned char)((unsigned char)(c) - '0') <= 5) --#define ascii_isdigit3(c) ((unsigned char)((unsigned char)(c) - '0') <= 3) --#define ascii_isdigit2(c) ((unsigned char)((unsigned char)(c) - '0') <= 2) --#define ascii_isdigit1(c) ((unsigned char)((unsigned char)(c) - '0') <= 1) -- --static const unsigned char max_days_in_month[12] = { -- 31, // Jan -- 00, // Feb, special handling for leap years -- 31, // Mar -- 30, // Apr -- 31, // May -- 30, // Jun -- 31, // Jul -- 31, // Aug -- 30, // Sep -- 31, // Oct -- 30, // Nov -- 31 // Dec --}; -- --static bool validate_day_month(int day, int month, int year) --{ -- int maxDaysThisMonth; -- if (month == 1) -- { // Feb needs leap year testing -- maxDaysThisMonth = 28 + (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)); -- } -- else -- { -- maxDaysThisMonth = max_days_in_month[month]; -- } -- -- return day >= 1 && day <= maxDaysThisMonth; --} -+#ifdef _WIN32 -+ int status; - --template<class CharT> --static int atoi2(const CharT* str) --{ -- return (static_cast<unsigned char>(str[0]) - '0') * 10 + (static_cast<unsigned char>(str[1]) - '0'); --} -+ ULARGE_INTEGER largeInt; -+ largeInt.QuadPart = m_interval; - --static const time_t maxTimeT = sizeof(time_t) == 4 ? (time_t)INT_MAX : (time_t)LLONG_MAX; -+ FILETIME ft; -+ ft.dwHighDateTime = largeInt.HighPart; -+ ft.dwLowDateTime = largeInt.LowPart; - --static time_t timezone_adjust(time_t result, unsigned char chSign, int adjustHours, int adjustMinutes) --{ -- if (adjustHours > 23) -+ SYSTEMTIME systemTime; -+ if (!FileTimeToSystemTime((const FILETIME*)&ft, &systemTime)) - { -- return (time_t)-1; -+ throw utility::details::create_system_error(GetLastError()); - } - -- // adjustMinutes > 59 is impossible due to digit 5 check -- const int tzAdjust = adjustMinutes * 60 + adjustHours * 60 * 60; -- if (chSign == '-') -+ std::wstring result; -+ if (format == RFC_1123) - { -- if (maxTimeT - result < tzAdjust) - { -- return (time_t)-1; -+ wchar_t dateStr[18] = {0}; -+#if _WIN32_WINNT < _WIN32_WINNT_VISTA -+ status = GetDateFormatW( -+ LOCALE_INVARIANT, 0, &systemTime, L"ddd',' dd MMM yyyy", dateStr, sizeof(dateStr) / sizeof(wchar_t)); -+#else -+ status = GetDateFormatEx(LOCALE_NAME_INVARIANT, -+ 0, -+ &systemTime, -+ L"ddd',' dd MMM yyyy", -+ dateStr, -+ sizeof(dateStr) / sizeof(wchar_t), -+ NULL); -+#endif // _WIN32_WINNT < _WIN32_WINNT_VISTA -+ if (status == 0) -+ { -+ throw utility::details::create_system_error(GetLastError()); -+ } -+ -+ result += dateStr; -+ result += L' '; - } - -- result += tzAdjust; -- } -- else -- { -- if (tzAdjust > result) - { -- return (time_t)-1; -- } -- -- result -= tzAdjust; -- } -- -- return result; --} -- --static time_t make_gm_time(struct tm* t) --{ --#ifdef _MSC_VER -- return _mkgmtime(t); --#elif (defined(ANDROID) || defined(__ANDROID__)) -- // HACK: The (nonportable?) POSIX function timegm is not available in -- // bionic. As a workaround[1][2], we set the C library timezone to -- // UTC, call mktime, then set the timezone back. However, the C -- // environment is fundamentally a shared global resource and thread- -- // unsafe. We can protect our usage here, however any other code might -- // manipulate the environment at the same time. -- // -- // [1] http://linux.die.net/man/3/timegm -- // [2] http://www.gnu.org/software/libc/manual/html_node/Broken_002ddown-Time.html -- time_t time; -- static boost::mutex env_var_lock; -- { -- boost::lock_guard<boost::mutex> lock(env_var_lock); -- std::string prev_env; -- auto prev_env_cstr = getenv("TZ"); -- if (prev_env_cstr != nullptr) -- { -- prev_env = prev_env_cstr; -- } -- setenv("TZ", "UTC", 1); -- -- time = mktime(t); -+ wchar_t timeStr[10] = {0}; -+#if _WIN32_WINNT < _WIN32_WINNT_VISTA -+ status = GetTimeFormatW(LOCALE_INVARIANT, -+ TIME_NOTIMEMARKER | TIME_FORCE24HOURFORMAT, -+ &systemTime, -+ L"HH':'mm':'ss", -+ timeStr, -+ sizeof(timeStr) / sizeof(wchar_t)); -+#else -+ status = GetTimeFormatEx(LOCALE_NAME_INVARIANT, -+ TIME_NOTIMEMARKER | TIME_FORCE24HOURFORMAT, -+ &systemTime, -+ L"HH':'mm':'ss", -+ timeStr, -+ sizeof(timeStr) / sizeof(wchar_t)); -+#endif // _WIN32_WINNT < _WIN32_WINNT_VISTA -+ if (status == 0) -+ { -+ throw utility::details::create_system_error(GetLastError()); -+ } - -- if (prev_env_cstr) -- { -- setenv("TZ", prev_env.c_str(), 1); -- } -- else -- { -- unsetenv("TZ"); -+ result += timeStr; -+ result += L" GMT"; - } - } -- return time; --#else // ^^^ ANDROID // Other POSIX platforms vvv -- return timegm(t); --#endif // _MSC_VER --} -- --/* --https://tools.ietf.org/html/rfc822 --https://tools.ietf.org/html/rfc1123 -- --date-time = [ day "," ] date time ; dd mm yy -- ; hh:mm:ss zzz -- --day = "Mon" / "Tue" / "Wed" / "Thu" -- / "Fri" / "Sat" / "Sun" -- --date = 1*2DIGIT month 2DIGIT ; day month year -- ; e.g. 20 Jun 82 --RFC1123 changes this to: --date = 1*2DIGIT month 2*4DIGIT ; day month year -- ; e.g. 20 Jun 1982 --This implementation only accepts 4 digit years. -- --month = "Jan" / "Feb" / "Mar" / "Apr" -- / "May" / "Jun" / "Jul" / "Aug" -- / "Sep" / "Oct" / "Nov" / "Dec" -- --time = hour zone ; ANSI and Military -- --hour = 2DIGIT ":" 2DIGIT [":" 2DIGIT] -- ; 00:00:00 - 23:59:59 -- --zone = "UT" / "GMT" ; Universal Time -- ; North American : UT -- / "EST" / "EDT" ; Eastern: - 5/ - 4 -- / "CST" / "CDT" ; Central: - 6/ - 5 -- / "MST" / "MDT" ; Mountain: - 7/ - 6 -- / "PST" / "PDT" ; Pacific: - 8/ - 7 -- --// military time deleted by RFC 1123 -- -- / ( ("+" / "-") 4DIGIT ) ; Local differential -- ; hours+min. (HHMM) --*/ -- -- --datetime __cdecl datetime::from_string(const utility::string_t& dateString, date_format format) --{ -- datetime result; -- time_t seconds; -- uint64_t frac_sec = 0; -- struct tm t{}; -- auto str = dateString.c_str(); -- if (format == RFC_1123) -+ else if (format == ISO_8601) - { -- int parsedWeekday = -1; -- for (int day = 0; day < 7; ++day) -+ const size_t buffSize = 64; - { -- if (string_starts_with(str, dayNames + day * 4) && str[3] == _XPLATSTR(',') && str[4] == _XPLATSTR(' ')) -+ wchar_t dateStr[buffSize] = {0}; -+#if _WIN32_WINNT < _WIN32_WINNT_VISTA -+ status = GetDateFormatW(LOCALE_INVARIANT, 0, &systemTime, L"yyyy-MM-dd", dateStr, buffSize); -+#else -+ status = GetDateFormatEx(LOCALE_NAME_INVARIANT, 0, &systemTime, L"yyyy-MM-dd", dateStr, buffSize, NULL); -+#endif // _WIN32_WINNT < _WIN32_WINNT_VISTA -+ if (status == 0) - { -- parsedWeekday = day; -- str += 5; // parsed day of week -- break; -+ throw utility::details::create_system_error(GetLastError()); - } -- } - -- if (ascii_isdigit3(str[0]) && ascii_isdigit(str[1]) && str[2] == _XPLATSTR(' ')) -- { -- t.tm_mday = atoi2(str); // validity checked later -- str += 3; // parsed day -- } -- else if (ascii_isdigit(str[0]) && str[1] == _XPLATSTR(' ')) -- { -- t.tm_mday = str[0] - _XPLATSTR('0'); -- str += 2; // parsed day -- } -- else -- { -- return result; -+ result += dateStr; -+ result += L'T'; - } - -- t.tm_mon = -1; -- for (int month = 0; month < 12; ++month) - { -- if (string_starts_with(str, monthNames + month * 4)) -+ wchar_t timeStr[buffSize] = {0}; -+#if _WIN32_WINNT < _WIN32_WINNT_VISTA -+ status = GetTimeFormatW(LOCALE_INVARIANT, -+ TIME_NOTIMEMARKER | TIME_FORCE24HOURFORMAT, -+ &systemTime, -+ L"HH':'mm':'ss", -+ timeStr, -+ buffSize); -+#else -+ status = GetTimeFormatEx(LOCALE_NAME_INVARIANT, -+ TIME_NOTIMEMARKER | TIME_FORCE24HOURFORMAT, -+ &systemTime, -+ L"HH':'mm':'ss", -+ timeStr, -+ buffSize); -+#endif // _WIN32_WINNT < _WIN32_WINNT_VISTA -+ if (status == 0) - { -- t.tm_mon = month; -- break; -+ throw utility::details::create_system_error(GetLastError()); - } -- } - -- if (t.tm_mon == -1 || str[3] != _XPLATSTR(' ')) -- { -- return result; -+ result += timeStr; - } - -- str += 4; // parsed month -- -- if (!ascii_isdigit3(str[0]) || !ascii_isdigit(str[1]) || !ascii_isdigit(str[2]) || !ascii_isdigit(str[3]) || -- str[4] != ' ') -+ uint64_t frac_sec = largeInt.QuadPart % _secondTicks; -+ if (frac_sec > 0) - { -- return result; -+ // Append fractional second, which is a 7-digit value with no trailing zeros -+ // This way, '1200' becomes '00012' -+ wchar_t buf[9] = {0}; -+ size_t appended = swprintf_s(buf, 9, L".%07ld", static_cast<long>(frac_sec)); -+ while (buf[appended - 1] == L'0') -+ --appended; // trim trailing zeros -+ result.append(buf, appended); - } - -- t.tm_year = (str[0] - _XPLATSTR('0')) * 1000 + (str[1] - _XPLATSTR('0')) * 100 + -- (str[2] - _XPLATSTR('0')) * 10 + (str[3] - _XPLATSTR('0')); -- if (t.tm_year < 1970 || t.tm_year > 3000) -- { -- return result; -- } -+ result += L'Z'; -+ } - -- // days in month validity check -- if (!validate_day_month(t.tm_mday, t.tm_mon, t.tm_year)) -- { -- return result; -- } -+ return result; -+#else // LINUX -+ uint64_t input = m_interval; -+ uint64_t frac_sec = input % _secondTicks; -+ input /= _secondTicks; // convert to seconds -+ time_t time = (time_t)input - (time_t)11644473600LL; // diff between windows and unix epochs (seconds) -+ -+ struct tm datetime; -+ gmtime_r(&time, &datetime); -+ -+ const int max_dt_length = 64; -+ char output[max_dt_length + 1] = {0}; -+ -+ if (format != RFC_1123 && frac_sec > 0) -+ { -+ // Append fractional second, which is a 7-digit value with no trailing zeros -+ // This way, '1200' becomes '00012' -+ const int max_frac_length = 8; -+ char buf[max_frac_length + 1] = {0}; -+ snprintf(buf, sizeof(buf), ".%07ld", (long int)frac_sec); -+ // trim trailing zeros -+ for (int i = max_frac_length - 1; buf[i] == '0'; i--) -+ buf[i] = '\0'; -+ // format the datetime into a separate buffer -+ char datetime_str[max_dt_length - max_frac_length - 1 + 1] = {0}; -+ strftime(datetime_str, sizeof(datetime_str), "%Y-%m-%dT%H:%M:%S", &datetime); -+ // now print this buffer into the output buffer -+ snprintf(output, sizeof(output), "%s%sZ", datetime_str, buf); -+ } -+ else -+ { -+ strftime( -+ output, sizeof(output), format == RFC_1123 ? "%a, %d %b %Y %H:%M:%S GMT" : "%Y-%m-%dT%H:%M:%SZ", &datetime); -+ } - -- t.tm_year -= 1900; -- str += 5; // parsed year -+ return std::string(output); -+#endif -+} - -- if (!ascii_isdigit2(str[0]) || !ascii_isdigit(str[1]) || str[2] != _XPLATSTR(':') || !ascii_isdigit5(str[3]) || -- !ascii_isdigit(str[4])) -- { -- return result; -- } -+#ifdef _WIN32 -+bool __cdecl datetime::system_type_to_datetime(void* pvsysTime, uint64_t seconds, datetime* pdt) -+{ -+ SYSTEMTIME* psysTime = (SYSTEMTIME*)pvsysTime; -+ FILETIME fileTime; - -- t.tm_hour = atoi2(str); -- if (t.tm_hour > 23) -- { -- return result; -- } -+ if (SystemTimeToFileTime(psysTime, &fileTime)) -+ { -+ ULARGE_INTEGER largeInt; -+ largeInt.LowPart = fileTime.dwLowDateTime; -+ largeInt.HighPart = fileTime.dwHighDateTime; - -- str += 3; // parsed hour -- t.tm_min = atoi2(str); -- str += 2; // parsed mins -+ // Add hundredths of nanoseconds -+ largeInt.QuadPart += seconds; - -- if (str[0] == ':') -- { -- if (!ascii_isdigit6(str[1]) || !ascii_isdigit(str[2]) || str[3] != _XPLATSTR(' ')) -- { -- return result; -- } -+ *pdt = datetime(largeInt.QuadPart); -+ return true; -+ } -+ return false; -+} -+#endif - -- t.tm_sec = atoi2(str + 1); -- str += 4; // parsed seconds -- } -- else if (str[0] == _XPLATSTR(' ')) -- { -- t.tm_sec = 0; -- str += 1; // parsed seconds -- } -- else -- { -- return result; -+// Take a string that represents a fractional second and return the number of ticks -+// This is equivalent to doing atof on the string and multiplying by 10000000, -+// but does not lose precision -+template<typename StringIterator> -+uint64_t timeticks_from_second(StringIterator begin, StringIterator end) -+{ -+ int size = (int)(end - begin); -+ _ASSERTE(begin[0] == U('.')); -+ uint64_t ufrac_second = 0; -+ for (int i = 1; i <= 7; ++i) -+ { -+ ufrac_second *= 10; -+ int add = i < size ? begin[i] - U('0') : 0; -+ ufrac_second += add; -+ } -+ return ufrac_second; -+} -+ -+void extract_fractional_second(const utility::string_t& dateString, -+ utility::string_t& resultString, -+ uint64_t& ufrac_second) -+{ -+ resultString = dateString; -+ // First, the string must be strictly longer than 2 characters, and the trailing character must be 'Z' -+ if (resultString.size() > 2 && resultString[resultString.size() - 1] == U('Z')) -+ { -+ // Second, find the last non-digit by scanning the string backwards -+ auto last_non_digit = std::find_if_not(resultString.rbegin() + 1, resultString.rend(), is_digit); -+ if (last_non_digit < resultString.rend() - 1) -+ { -+ // Finally, make sure the last non-digit is a dot: -+ auto last_dot = last_non_digit.base() - 1; -+ if (*last_dot == U('.')) -+ { -+ // Got it! Now extract the fractional second -+ auto last_before_Z = std::end(resultString) - 1; -+ ufrac_second = timeticks_from_second(last_dot, last_before_Z); -+ // And erase it from the string -+ resultString.erase(last_dot, last_before_Z); -+ } - } -+ } -+} - -- if (t.tm_sec > 60) -- { // 60 to allow leap seconds -- return result; -- } -+datetime __cdecl datetime::from_string(const utility::string_t& dateString, date_format format) -+{ -+ // avoid floating point math to preserve precision -+ uint64_t ufrac_second = 0; - -- t.tm_isdst = 0; -- seconds = make_gm_time(&t); -- if (seconds < 0) -- { -- return result; -- } -+#ifdef _WIN32 -+ datetime result; -+ if (format == RFC_1123) -+ { -+ SYSTEMTIME sysTime = {0}; - -- if (parsedWeekday >= 0 && parsedWeekday != t.tm_wday) -- { -- return result; -- } -+ std::wstring month(3, L'\0'); -+ std::wstring unused(3, L'\0'); - -- if (!string_starts_with(str, "GMT") && !string_starts_with(str, "UT")) -- { -- // some timezone adjustment necessary -- auto tzCh = _XPLATSTR('-'); -- int tzHours; -- int tzMinutes = 0; -- if (string_starts_with(str, "EDT")) -- { -- tzHours = 4; -- } -- else if (string_starts_with(str, "EST") || string_starts_with(str, "CDT")) -- { -- tzHours = 5; -- } -- else if (string_starts_with(str, "CST") || string_starts_with(str, "MDT")) -- { -- tzHours = 6; -- } -- else if (string_starts_with(str, "MST") || string_starts_with(str, "PDT")) -- { -- tzHours = 7; -- } -- else if (string_starts_with(str, "PST")) -- { -- tzHours = 8; -- } -- else if ((tzCh == _XPLATSTR('+') || tzCh == _XPLATSTR('-')) && ascii_isdigit2(str[1]) && -- ascii_isdigit(str[2]) && ascii_isdigit5(str[3]) && ascii_isdigit(str[4])) -- { -- tzCh = str[0]; -- tzHours = atoi2(str + 1); -- tzMinutes = atoi2(str + 3); -- } -- else -- { -- return result; -- } -+ const wchar_t* formatString = L"%3c, %2d %3c %4d %2d:%2d:%2d %3c"; -+ auto n = swscanf_s(dateString.c_str(), -+ formatString, -+ unused.data(), -+ unused.size(), -+ &sysTime.wDay, -+ month.data(), -+ month.size(), -+ &sysTime.wYear, -+ &sysTime.wHour, -+ &sysTime.wMinute, -+ &sysTime.wSecond, -+ unused.data(), -+ unused.size()); -+ -+ if (n == 8) -+ { -+ std::wstring monthnames[12] = { -+ L"Jan", L"Feb", L"Mar", L"Apr", L"May", L"Jun", L"Jul", L"Aug", L"Sep", L"Oct", L"Nov", L"Dec"}; -+ auto loc = -+ std::find_if(monthnames, monthnames + 12, [&month](const std::wstring& m) { return m == month; }); - -- seconds = timezone_adjust(seconds, static_cast<unsigned char>(tzCh), tzHours, tzMinutes); -- if (seconds < 0) -+ if (loc != monthnames + 12) - { -- return result; -+ sysTime.wMonth = (short)((loc - monthnames) + 1); -+ if (system_type_to_datetime(&sysTime, ufrac_second, &result)) -+ { -+ return result; -+ } - } - } - } - else if (format == ISO_8601) - { -- // parse year -- if (!ascii_isdigit3(str[0]) || !ascii_isdigit(str[1]) || !ascii_isdigit(str[2]) || !ascii_isdigit(str[3])) -- { -- return result; -- } -+ // Unlike FILETIME, SYSTEMTIME does not have enough precision to hold seconds in 100 nanosecond -+ // increments. Therefore, start with seconds and milliseconds set to 0, then add them separately - -- t.tm_year = (str[0] - _XPLATSTR('0')) * 1000 + (str[1] - _XPLATSTR('0')) * 100 + -- (str[2] - _XPLATSTR('0')) * 10 + (str[3] - _XPLATSTR('0')); -- if (t.tm_year < 1970 || t.tm_year > 3000) -- { -- return result; -- } -+ // Try to extract the fractional second from the timestamp -+ utility::string_t input; -+ extract_fractional_second(dateString, input, ufrac_second); -+ { -+ SYSTEMTIME sysTime = {0}; -+ const wchar_t* formatString = L"%4d-%2d-%2dT%2d:%2d:%2dZ"; -+ auto n = swscanf_s(input.c_str(), -+ formatString, -+ &sysTime.wYear, -+ &sysTime.wMonth, -+ &sysTime.wDay, -+ &sysTime.wHour, -+ &sysTime.wMinute, -+ &sysTime.wSecond); - -- str += 4; -- if (*str == _XPLATSTR('-')) -- { -- ++str; -+ if (n == 3 || n == 6) -+ { -+ if (system_type_to_datetime(&sysTime, ufrac_second, &result)) -+ { -+ return result; -+ } -+ } - } -- -- // parse month -- if (!ascii_isdigit1(str[0]) || !ascii_isdigit(str[1])) - { -- return result; -- } -+ SYSTEMTIME sysTime = {0}; -+ DWORD date = 0; - -- t.tm_mon = atoi2(str); -- if (t.tm_mon < 1 || t.tm_mon > 12) -- { -- return result; -- } -- -- t.tm_mon -= 1; -- str += 2; -+ const wchar_t* formatString = L"%8dT%2d:%2d:%2dZ"; -+ auto n = swscanf_s(input.c_str(), formatString, &date, &sysTime.wHour, &sysTime.wMinute, &sysTime.wSecond); - -- if (*str == _XPLATSTR('-')) -- { -- ++str; -- } -+ if (n == 1 || n == 4) -+ { -+ sysTime.wDay = date % 100; -+ date /= 100; -+ sysTime.wMonth = date % 100; -+ date /= 100; -+ sysTime.wYear = (WORD)date; - -- // parse day -- if (!ascii_isdigit3(str[0]) || !ascii_isdigit(str[1])) -- { -- return result; -+ if (system_type_to_datetime(&sysTime, ufrac_second, &result)) -+ { -+ return result; -+ } -+ } - } -- -- t.tm_mday = atoi2(str); -- if (!validate_day_month(t.tm_mday, t.tm_mon, t.tm_year)) - { -- return result; -- } -+ SYSTEMTIME sysTime = {0}; -+ GetSystemTime(&sysTime); // Fill date portion with today's information -+ sysTime.wSecond = 0; -+ sysTime.wMilliseconds = 0; - -- t.tm_year -= 1900; -- str += 2; -+ const wchar_t* formatString = L"%2d:%2d:%2dZ"; -+ auto n = swscanf_s(input.c_str(), formatString, &sysTime.wHour, &sysTime.wMinute, &sysTime.wSecond); - -- if (str[0] != _XPLATSTR('T') && str[0] != _XPLATSTR('t')) -- { -- // No time -- seconds = make_gm_time(&t); -- if (seconds < 0) -+ if (n == 3) - { -- return result; -+ if (system_type_to_datetime(&sysTime, ufrac_second, &result)) -+ { -+ return result; -+ } - } -- -- seconds += ntToUnixOffsetSeconds; -- result.m_interval = static_cast<interval_type>(seconds) * _secondTicks; -- return result; - } -+ } - -- ++str; // skip 'T' -+ return datetime(); -+#else -+ std::string input(dateString); - -- // parse hour -- if (!ascii_isdigit2(str[0]) || !ascii_isdigit(str[1])) -- { -- return result; -- } -+ struct tm output = tm(); - -- t.tm_hour = atoi2(str); -- str += 2; -- if (t.tm_hour > 23) -- { -- return result; -- } -+ if (format == RFC_1123) -+ { -+ strptime(input.data(), "%a, %d %b %Y %H:%M:%S GMT", &output); -+ } -+ else -+ { -+ // Try to extract the fractional second from the timestamp -+ utility::string_t input; -+ extract_fractional_second(dateString, input, ufrac_second); - -- if (*str == _XPLATSTR(':')) -- { -- ++str; -- } -+ auto result = strptime(input.data(), "%Y-%m-%dT%H:%M:%SZ", &output); - -- // parse minute -- if (!ascii_isdigit5(str[0]) || !ascii_isdigit(str[1])) -+ if (result == nullptr) - { -- return result; -+ result = strptime(input.data(), "%Y%m%dT%H:%M:%SZ", &output); - } -- t.tm_min = atoi2(str); -- // t.tm_min > 59 is impossible because we checked that the first digit is <= 5 in the basic format -- // check above -- -- str += 2; -- -- if (*str == _XPLATSTR(':')) -+ if (result == nullptr) - { -- ++str; -+ // Fill the date portion with the epoch, -+ // strptime will do the rest -+ memset(&output, 0, sizeof(struct tm)); -+ output.tm_year = 70; -+ output.tm_mon = 1; -+ output.tm_mday = 1; -+ result = strptime(input.data(), "%H:%M:%SZ", &output); - } -- -- // parse seconds -- if (!ascii_isdigit6(str[0]) || !ascii_isdigit(str[1])) -+ if (result == nullptr) - { -- return result; -+ result = strptime(input.data(), "%Y-%m-%d", &output); - } -- -- t.tm_sec = atoi2(str); -- // We allow 60 to account for leap seconds -- if (t.tm_sec > 60) -+ if (result == nullptr) - { -- return result; -+ result = strptime(input.data(), "%Y%m%d", &output); - } -- -- str += 2; -- if (str[0] == _XPLATSTR('.') && ascii_isdigit(str[1])) -+ if (result == nullptr) - { -- ++str; -- int digits = 7; -- for (;;) -- { -- frac_sec *= 10; -- frac_sec += *str - _XPLATSTR('0'); -- --digits; -- ++str; -- if (digits == 0) -- { -- while (ascii_isdigit(*str)) -- { -- // consume remaining fractional second digits we can't use -- ++str; -- } -- -- break; -- } -- -- if (!ascii_isdigit(*str)) -- { -- // no more digits in the input, do the remaining multiplies we need -- for (; digits != 0; --digits) -- { -- frac_sec *= 10; -- } -- -- break; -- } -- } -+ return datetime(); - } -+ } - -- seconds = make_gm_time(&t); -- if (seconds < 0) -- { -- return result; -- } -+#if (defined(ANDROID) || defined(__ANDROID__)) -+ // HACK: The (nonportable?) POSIX function timegm is not available in -+ // bionic. As a workaround[1][2], we set the C library timezone to -+ // UTC, call mktime, then set the timezone back. However, the C -+ // environment is fundamentally a shared global resource and thread- -+ // unsafe. We can protect our usage here, however any other code might -+ // manipulate the environment at the same time. -+ // -+ // [1] http://linux.die.net/man/3/timegm -+ // [2] http://www.gnu.org/software/libc/manual/html_node/Broken_002ddown-Time.html -+ time_t time; - -- if (str[0] == _XPLATSTR('Z') || str[0] == _XPLATSTR('z')) -+ static boost::mutex env_var_lock; -+ { -+ boost::lock_guard<boost::mutex> lock(env_var_lock); -+ std::string prev_env; -+ auto prev_env_cstr = getenv("TZ"); -+ if (prev_env_cstr != nullptr) - { -- // no adjustment needed for zulu time -+ prev_env = prev_env_cstr; - } -- else if (str[0] == _XPLATSTR('+') || str[0] == _XPLATSTR('-')) -- { -- const unsigned char offsetDirection = static_cast<unsigned char>(str[0]); -- if (!ascii_isdigit2(str[1]) || !ascii_isdigit(str[2]) || str[3] != _XPLATSTR(':') || -- !ascii_isdigit5(str[4]) || !ascii_isdigit(str[5])) -- { -- return result; -- } -+ setenv("TZ", "UTC", 1); - -- seconds = timezone_adjust(seconds, offsetDirection, atoi2(str + 1), atoi2(str + 4)); -- if (seconds < 0) -- { -- return result; -- } -+ time = mktime(&output); -+ -+ if (prev_env_cstr) -+ { -+ setenv("TZ", prev_env.c_str(), 1); - } - else - { -- // the timezone is malformed, but cpprestsdk currently accepts this as no timezone -+ unsetenv("TZ"); - } - } -- else -- { -- throw std::invalid_argument("unrecognized date format"); -- } -+#else -+ time_t time = timegm(&output); -+#endif -+ -+ struct timeval tv = timeval(); -+ tv.tv_sec = time; -+ auto result = timeval_to_datetime(tv); - -- seconds += ntToUnixOffsetSeconds; -- result.m_interval = static_cast<interval_type>(seconds) * _secondTicks + frac_sec; -+ // fractional seconds are already in correct format so just add them. -+ result = result + ufrac_second; - return result; -+#endif - } - - /// <summary> -@@ -1358,32 +1181,38 @@ utility::seconds __cdecl timespan::xml_d - // The final S could be omitted - - int64_t numSecs = 0; -- auto cursor = timespanString.c_str(); -- auto c = *cursor++; // skip 'P' -- while (c) -+ -+ utility::istringstream_t is(timespanString); -+ is.imbue(std::locale::classic()); -+ auto eof = std::char_traits<utility::char_t>::eof(); -+ -+ std::basic_istream<utility::char_t>::int_type c; -+ c = is.get(); // P -+ -+ while (c != eof) - { - int val = 0; -- c = *cursor++; -+ c = is.get(); - -- while (ascii_isdigit(c)) -+ while (is_digit((utility::char_t)c)) - { -- val = val * 10 + (c - _XPLATSTR('0')); -- c = *cursor++; -+ val = val * 10 + (c - L'0'); -+ c = is.get(); - -- if (c == _XPLATSTR('.')) -+ if (c == '.') - { - // decimal point is not handled - do - { -- c = *cursor++; -- } while (ascii_isdigit(c)); -+ c = is.get(); -+ } while (is_digit((utility::char_t)c)); - } - } - -- if (c == _XPLATSTR('D')) numSecs += val * 24 * 3600; // days -- if (c == _XPLATSTR('H')) numSecs += val * 3600; // Hours -- if (c == _XPLATSTR('M')) numSecs += val * 60; // Minutes -- if (c == _XPLATSTR('S') || c == _XPLATSTR('\0')) -+ if (c == L'D') numSecs += val * 24 * 3600; // days -+ if (c == L'H') numSecs += val * 3600; // Hours -+ if (c == L'M') numSecs += val * 60; // Minutes -+ if (c == L'S' || c == eof) - { - numSecs += val; // seconds - break; -@@ -1393,12 +1222,12 @@ utility::seconds __cdecl timespan::xml_d - return utility::seconds(numSecs); - } - --static const utility::char_t c_allowed_chars[] = -- _XPLATSTR("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"); -+const utility::string_t nonce_generator::c_allowed_chars( -+ _XPLATSTR("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789")); - - utility::string_t nonce_generator::generate() - { -- std::uniform_int_distribution<> distr(0, static_cast<int>(sizeof(c_allowed_chars) / sizeof(utility::char_t)) - 1); -+ std::uniform_int_distribution<> distr(0, static_cast<int>(c_allowed_chars.length() - 1)); - utility::string_t result; - result.reserve(length()); - std::generate_n(std::back_inserter(result), length(), [&]() { return c_allowed_chars[distr(m_random)]; }); ---- cpprest-2.10.12.orig/Release/tests/functional/utils/datetime.cpp -+++ cpprest-2.10.12/Release/tests/functional/utils/datetime.cpp -@@ -74,6 +74,16 @@ SUITE(datetime) - } - } - -+ TEST(parsing_time_extended) -+ { -+ // ISO 8601 -+ { -+ auto dt = utility::datetime::from_string(_XPLATSTR("14:30:01Z"), utility::datetime::ISO_8601); -+ -+ VERIFY_ARE_NOT_EQUAL(0u, dt.to_interval()); -+ } -+ } -+ - void TestDateTimeRoundtrip(utility::string_t str, utility::string_t strExpected) - { - auto dt = utility::datetime::from_string(str, utility::datetime::ISO_8601); -@@ -91,8 +101,6 @@ SUITE(datetime) - - TEST(parsing_time_roundtrip_datetime2) - { -- // lose the last '000' -- TestDateTimeRoundtrip(_XPLATSTR("2013-11-19T14:30:59.1234567000Z"), _XPLATSTR("2013-11-19T14:30:59.1234567Z")); - // lose the last '999' without rounding up - TestDateTimeRoundtrip(_XPLATSTR("2013-11-19T14:30:59.1234567999Z"), _XPLATSTR("2013-11-19T14:30:59.1234567Z")); - } -@@ -121,260 +129,16 @@ SUITE(datetime) - TestDateTimeRoundtrip(_XPLATSTR("2013-11-19T14:30:59.5Z")); - } - -- void TestRfc1123IsTimeT(const utility::char_t* str, time_t t) -- { -- datetime dt = datetime::from_string(str, utility::datetime::RFC_1123); -- uint64_t interval = dt.to_interval(); -- VERIFY_ARE_EQUAL(0, interval % 10000000); -- interval /= 10000000; -- interval -= 11644473600; // NT epoch adjustment -- VERIFY_ARE_EQUAL(static_cast<uint64_t>(t), interval); -- } -- -- TEST(parsing_time_rfc1123_accepts_each_day) -- { -- TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 00:00:00 GMT"), (time_t) 0); -- TestRfc1123IsTimeT(_XPLATSTR("Fri, 02 Jan 1970 00:00:00 GMT"), (time_t) 86400 * 1); -- TestRfc1123IsTimeT(_XPLATSTR("Sat, 03 Jan 1970 00:00:00 GMT"), (time_t) 86400 * 2); -- TestRfc1123IsTimeT(_XPLATSTR("Sun, 04 Jan 1970 00:00:00 GMT"), (time_t) 86400 * 3); -- TestRfc1123IsTimeT(_XPLATSTR("Mon, 05 Jan 1970 00:00:00 GMT"), (time_t) 86400 * 4); -- TestRfc1123IsTimeT(_XPLATSTR("Tue, 06 Jan 1970 00:00:00 GMT"), (time_t) 86400 * 5); -- TestRfc1123IsTimeT(_XPLATSTR("Wed, 07 Jan 1970 00:00:00 GMT"), (time_t) 86400 * 6); -- } -- -- TEST(parsing_time_rfc1123_boundary_cases) -- { -- TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 00:00:00 GMT"), (time_t) 0); -- TestRfc1123IsTimeT(_XPLATSTR("19 Jan 2038 03:14:06 GMT"), (time_t) INT_MAX - 1); --#ifndef _USE_32BIT_TIME_T -- TestRfc1123IsTimeT(_XPLATSTR("19 Jan 2038 03:13:07 -0001"), (time_t) INT_MAX); -- TestRfc1123IsTimeT(_XPLATSTR("19 Jan 2038 03:14:07 -0000"), (time_t) INT_MAX); --#endif // _USE_32BIT_TIME_T -- TestRfc1123IsTimeT(_XPLATSTR("14 Jan 2019 23:16:21 +0000"), (time_t) 1547507781); -- TestRfc1123IsTimeT(_XPLATSTR("14 Jan 2019 23:16:21 -0001"), (time_t) 1547507841); -- TestRfc1123IsTimeT(_XPLATSTR("14 Jan 2019 23:16:21 +0001"), (time_t) 1547507721); -- TestRfc1123IsTimeT(_XPLATSTR("14 Jan 2019 23:16:21 -0100"), (time_t) 1547511381); -- TestRfc1123IsTimeT(_XPLATSTR("14 Jan 2019 23:16:21 +0100"), (time_t) 1547504181); -- } -- -- TEST(parsing_time_rfc1123_uses_each_field) -- { -- TestRfc1123IsTimeT(_XPLATSTR("02 Jan 1970 00:00:00 GMT"), (time_t) 86400); -- TestRfc1123IsTimeT(_XPLATSTR("12 Jan 1970 00:00:00 GMT"), (time_t) 950400); -- TestRfc1123IsTimeT(_XPLATSTR("01 Feb 1970 00:00:00 GMT"), (time_t) 2678400); -- TestRfc1123IsTimeT(_XPLATSTR("01 Jan 2000 00:00:00 GMT"), (time_t) 946684800); --#ifndef _USE_32BIT_TIME_T -- TestRfc1123IsTimeT(_XPLATSTR("01 Jan 2100 00:00:00 GMT"), (time_t) 4102444800); --#endif // _USE_32BIT_TIME_T -- TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1990 00:00:00 GMT"), (time_t) 631152000); -- TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1971 00:00:00 GMT"), (time_t) 31536000); -- TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 10:00:00 GMT"), (time_t) 36000); -- TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 01:00:00 GMT"), (time_t) 3600); -- TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 00:10:00 GMT"), (time_t) 600); -- TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 00:01:00 GMT"), (time_t) 60); -- TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 00:00:10 GMT"), (time_t) 10); -- TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 00:00:01 GMT"), (time_t) 1); -- TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 10:00:00 GMT"), (time_t) 36000); -- TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 02:00:00 PST"), (time_t) 36000); -- TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 03:00:00 PDT"), (time_t) 36000); -- TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 03:00:00 MST"), (time_t) 36000); -- TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 04:00:00 MDT"), (time_t) 36000); -- TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 04:00:00 CST"), (time_t) 36000); -- TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 05:00:00 CDT"), (time_t) 36000); -- TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 05:00:00 EST"), (time_t) 36000); -- TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 06:00:00 EDT"), (time_t) 36000); -- TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 06:00:00 -0400"), (time_t) 36000); -- TestRfc1123IsTimeT(_XPLATSTR("01 Jan 1970 05:59:00 -0401"), (time_t) 36000); -- } -- -- TEST(parsing_time_rfc1123_max_days) -- { -- TestRfc1123IsTimeT(_XPLATSTR("31 Jan 1970 00:00:00 GMT"), (time_t) 2592000); -- TestRfc1123IsTimeT(_XPLATSTR("28 Feb 2019 00:00:00 GMT"), (time_t) 1551312000); // non leap year allows feb 28 -- TestRfc1123IsTimeT(_XPLATSTR("29 Feb 2020 00:00:00 GMT"), (time_t) 1582934400); // leap year allows feb 29 -- TestRfc1123IsTimeT(_XPLATSTR("31 Mar 1970 00:00:00 GMT"), (time_t) 7689600); -- TestRfc1123IsTimeT(_XPLATSTR("30 Apr 1970 00:00:00 GMT"), (time_t) 10281600); -- TestRfc1123IsTimeT(_XPLATSTR("31 May 1970 00:00:00 GMT"), (time_t) 12960000); -- TestRfc1123IsTimeT(_XPLATSTR("30 Jun 1970 00:00:00 GMT"), (time_t) 15552000); -- TestRfc1123IsTimeT(_XPLATSTR("31 Jul 1970 00:00:00 GMT"), (time_t) 18230400); -- TestRfc1123IsTimeT(_XPLATSTR("31 Aug 1970 00:00:00 GMT"), (time_t) 20908800); -- TestRfc1123IsTimeT(_XPLATSTR("30 Sep 1970 00:00:00 GMT"), (time_t) 23500800); -- TestRfc1123IsTimeT(_XPLATSTR("31 Oct 1970 00:00:00 GMT"), (time_t) 26179200); -- TestRfc1123IsTimeT(_XPLATSTR("30 Nov 1970 00:00:00 GMT"), (time_t) 28771200); -- TestRfc1123IsTimeT(_XPLATSTR("31 Dec 1970 00:00:00 GMT"), (time_t) 31449600); -- } -- -- TEST(parsing_time_rfc1123_invalid_cases) -- { -- const utility::string_t bad_strings[] = { -- _XPLATSTR("Ahu, 01 Jan 1970 00:00:00 GMT"), // bad letters in each place -- _XPLATSTR("TAu, 01 Jan 1970 00:00:00 GMT"), -- _XPLATSTR("ThA, 01 Jan 1970 00:00:00 GMT"), -- _XPLATSTR("ThuA 01 Jan 1970 00:00:00 GMT"), -- _XPLATSTR("Thu,A01 Jan 1970 00:00:00 GMT"), -- _XPLATSTR("Thu, A1 Jan 1970 00:00:00 GMT"), -- _XPLATSTR("Thu, 0A Jan 1970 00:00:00 GMT"), -- _XPLATSTR("Thu, 01AJan 1970 00:00:00 GMT"), -- _XPLATSTR("Thu, 01 Aan 1970 00:00:00 GMT"), -- _XPLATSTR("Thu, 01 JAn 1970 00:00:00 GMT"), -- _XPLATSTR("Thu, 01 JaA 1970 00:00:00 GMT"), -- _XPLATSTR("Thu, 01 JanA1970 00:00:00 GMT"), -- _XPLATSTR("Thu, 01 Jan A970 00:00:00 GMT"), -- _XPLATSTR("Thu, 01 Jan 1A70 00:00:00 GMT"), -- _XPLATSTR("Thu, 01 Jan 19A0 00:00:00 GMT"), -- _XPLATSTR("Thu, 01 Jan 197A 00:00:00 GMT"), -- _XPLATSTR("Thu, 01 Jan 1970A00:00:00 GMT"), -- _XPLATSTR("Thu, 01 Jan 1970 A0:00:00 GMT"), -- _XPLATSTR("Thu, 01 Jan 1970 0A:00:00 GMT"), -- _XPLATSTR("Thu, 01 Jan 1970 00A00:00 GMT"), -- _XPLATSTR("Thu, 01 Jan 1970 00:A0:00 GMT"), -- _XPLATSTR("Thu, 01 Jan 1970 00:0A:00 GMT"), -- _XPLATSTR("Thu, 01 Jan 1970 00:00A00 GMT"), -- _XPLATSTR("Thu, 01 Jan 1970 00:00:A0 GMT"), -- _XPLATSTR("Thu, 01 Jan 1970 00:00:0A GMT"), -- _XPLATSTR("Thu, 01 Jan 1970 00:00:00AGMT"), -- _XPLATSTR("Thu, 01 Jan 1970 00:00:00 AMT"), -- _XPLATSTR("Thu, 01 Jan 1970 00:00:00 GAT"), -- _XPLATSTR("Thu, 01 Jan 1970 00:00:00 GMA"), -- _XPLATSTR(""), // truncation -- _XPLATSTR("T"), -- _XPLATSTR("Th"), -- _XPLATSTR("Thu"), -- _XPLATSTR("Thu,"), -- _XPLATSTR("Thu, "), -- _XPLATSTR("Thu, 0"), -- _XPLATSTR("Thu, 01"), -- _XPLATSTR("Thu, 01 "), -- _XPLATSTR("Thu, 01 J"), -- _XPLATSTR("Thu, 01 Ja"), -- _XPLATSTR("Thu, 01 Jan"), -- _XPLATSTR("Thu, 01 Jan "), -- _XPLATSTR("Thu, 01 Jan 1"), -- _XPLATSTR("Thu, 01 Jan 19"), -- _XPLATSTR("Thu, 01 Jan 197"), -- _XPLATSTR("Thu, 01 Jan 1970"), -- _XPLATSTR("Thu, 01 Jan 1970 "), -- _XPLATSTR("Thu, 01 Jan 1970 0"), -- _XPLATSTR("Thu, 01 Jan 1970 00"), -- _XPLATSTR("Thu, 01 Jan 1970 00:"), -- _XPLATSTR("Thu, 01 Jan 1970 00:0"), -- _XPLATSTR("Thu, 01 Jan 1970 00:00"), -- _XPLATSTR("Thu, 01 Jan 1970 00:00:"), -- _XPLATSTR("Thu, 01 Jan 1970 00:00:0"), -- _XPLATSTR("Thu, 01 Jan 1970 00:00:00"), -- _XPLATSTR("Thu, 01 Jan 1970 00:00:00 "), -- _XPLATSTR("Thu, 01 Jan 1970 00:00:00 G"), -- _XPLATSTR("Thu, 01 Jan 1970 00:00:00 GM"), -- _XPLATSTR("Fri, 01 Jan 1970 00:00:00 GMT"), // wrong day -- _XPLATSTR("01 Jan 4970 00:00:00 GMT"), // year too big -- _XPLATSTR("01 Jan 3001 00:00:00 GMT"), -- _XPLATSTR("01 Xxx 1971 00:00:00 GMT"), // month bad -- _XPLATSTR("00 Jan 1971 00:00:00 GMT"), // day too small -- _XPLATSTR("32 Jan 1971 00:00:00 GMT"), // day too big -- _XPLATSTR("30 Feb 1971 00:00:00 GMT"), // day too big for feb -- _XPLATSTR("30 Feb 1971 00:00:00 GMT"), // day too big for feb (non-leap year) -- _XPLATSTR("32 Mar 1971 00:00:00 GMT"), // other months -- _XPLATSTR("31 Apr 1971 00:00:00 GMT"), -- _XPLATSTR("32 May 1971 00:00:00 GMT"), -- _XPLATSTR("31 Jun 1971 00:00:00 GMT"), -- _XPLATSTR("32 Jul 1971 00:00:00 GMT"), -- _XPLATSTR("32 Aug 1971 00:00:00 GMT"), -- _XPLATSTR("31 Sep 1971 00:00:00 GMT"), -- _XPLATSTR("32 Oct 1971 00:00:00 GMT"), -- _XPLATSTR("31 Nov 1971 00:00:00 GMT"), -- _XPLATSTR("32 Dec 1971 00:00:00 GMT"), -- _XPLATSTR("01 Jan 1971 70:00:00 GMT"), // hour too big -- _XPLATSTR("01 Jan 1971 24:00:00 GMT"), -- _XPLATSTR("01 Jan 1971 00:60:00 GMT"), // minute too big -- _XPLATSTR("01 Jan 1971 00:00:70 GMT"), // second too big -- _XPLATSTR("01 Jan 1971 00:00:61 GMT"), -- _XPLATSTR("01 Jan 1969 00:00:00 GMT"), // underflow -- _XPLATSTR("01 Jan 1969 00:00:00 CEST"), // bad tz -- _XPLATSTR("01 Jan 1970 00:00:00 +2400"), // bad tzoffsets -- _XPLATSTR("01 Jan 1970 00:00:00 -3000"), -- _XPLATSTR("01 Jan 1970 00:00:00 +2160"), -- _XPLATSTR("01 Jan 1970 00:00:00 -2400"), -- _XPLATSTR("01 Jan 1970 00:00:00 -2160"), -- }; -- -- for (const auto& str : bad_strings) -- { -- auto dt = utility::datetime::from_string(str, utility::datetime::RFC_1123); -- VERIFY_ARE_EQUAL(0, dt.to_interval()); -- } -- } -- -- TEST(parsing_time_iso8601_boundary_cases) -- { -- // boundary cases: -- TestDateTimeRoundtrip(_XPLATSTR("1970-01-01T00:00:00Z")); // epoch -- TestDateTimeRoundtrip(_XPLATSTR("2038-01-19T03:14:06+00:00"), _XPLATSTR("2038-01-19T03:14:06Z")); // INT_MAX - 1 --#ifndef _USE_32BIT_TIME_T -- TestDateTimeRoundtrip(_XPLATSTR("2038-01-19T03:13:07-00:01"), -- _XPLATSTR("2038-01-19T03:14:07Z")); // INT_MAX after subtacting 1 -- TestDateTimeRoundtrip(_XPLATSTR("2038-01-19T03:14:07-00:00"), _XPLATSTR("2038-01-19T03:14:07Z")); --#endif // _USE_32BIT_TIME_T -- } -- -- TEST(parsing_time_iso8601_uses_each_timezone_digit) -- { -- TestDateTimeRoundtrip(_XPLATSTR("2019-01-14T23:16:21+00:00"), _XPLATSTR("2019-01-14T23:16:21Z")); -- TestDateTimeRoundtrip(_XPLATSTR("2019-01-14T23:16:21-00:01"), _XPLATSTR("2019-01-14T23:17:21Z")); -- TestDateTimeRoundtrip(_XPLATSTR("2019-01-14T23:16:21+00:01"), _XPLATSTR("2019-01-14T23:15:21Z")); -- TestDateTimeRoundtrip(_XPLATSTR("2019-01-14T23:16:21-01:00"), _XPLATSTR("2019-01-15T00:16:21Z")); -- TestDateTimeRoundtrip(_XPLATSTR("2019-01-14T23:16:21+01:00"), _XPLATSTR("2019-01-14T22:16:21Z")); -- } -- -- TEST(parsing_time_iso8601_uses_each_digit) -- { -- TestDateTimeRoundtrip(_XPLATSTR("1970-01-01T00:00:01Z")); -- TestDateTimeRoundtrip(_XPLATSTR("1970-01-01T00:01:00Z")); -- TestDateTimeRoundtrip(_XPLATSTR("1970-01-01T01:00:00Z")); -- TestDateTimeRoundtrip(_XPLATSTR("1970-01-02T00:00:00Z")); -- TestDateTimeRoundtrip(_XPLATSTR("1970-02-01T00:00:00Z")); -- TestDateTimeRoundtrip(_XPLATSTR("1971-01-01T00:00:00Z")); -- -- TestDateTimeRoundtrip(_XPLATSTR("1999-01-01T00:00:00Z")); -- TestDateTimeRoundtrip(_XPLATSTR("1970-12-01T00:00:00Z")); -- TestDateTimeRoundtrip(_XPLATSTR("1970-09-01T00:00:00Z")); -- TestDateTimeRoundtrip(_XPLATSTR("1970-01-30T00:00:00Z")); -- TestDateTimeRoundtrip(_XPLATSTR("1970-01-31T00:00:00Z")); -- TestDateTimeRoundtrip(_XPLATSTR("1970-01-01T23:00:00Z")); -- TestDateTimeRoundtrip(_XPLATSTR("1970-01-01T19:00:00Z")); -- TestDateTimeRoundtrip(_XPLATSTR("1970-01-01T00:59:00Z")); -- TestDateTimeRoundtrip(_XPLATSTR("1970-01-01T00:00:59Z")); -- TestDateTimeRoundtrip(_XPLATSTR("1970-01-01T00:00:60Z"), _XPLATSTR("1970-01-01T00:01:00Z")); // leap seconds -- } -- -- TEST(parsing_time_iso8601_accepts_month_max_days) -- { -- TestDateTimeRoundtrip(_XPLATSTR("1970-01-31T00:00:00Z")); // jan -- TestDateTimeRoundtrip(_XPLATSTR("2019-02-28T00:00:00Z")); // non leap year allows feb 28 -- TestDateTimeRoundtrip(_XPLATSTR("2020-02-29T00:00:00Z")); // leap year allows feb 29 -- TestDateTimeRoundtrip(_XPLATSTR("1970-03-31T00:00:00Z")); // mar -- TestDateTimeRoundtrip(_XPLATSTR("1970-04-30T00:00:00Z")); // apr -- TestDateTimeRoundtrip(_XPLATSTR("1970-05-31T00:00:00Z")); // may -- TestDateTimeRoundtrip(_XPLATSTR("1970-06-30T00:00:00Z")); // jun -- TestDateTimeRoundtrip(_XPLATSTR("1970-07-31T00:00:00Z")); // jul -- TestDateTimeRoundtrip(_XPLATSTR("1970-08-31T00:00:00Z")); // aug -- TestDateTimeRoundtrip(_XPLATSTR("1970-09-30T00:00:00Z")); // sep -- TestDateTimeRoundtrip(_XPLATSTR("1970-10-31T00:00:00Z")); // oct -- TestDateTimeRoundtrip(_XPLATSTR("1970-11-30T00:00:00Z")); // nov -- TestDateTimeRoundtrip(_XPLATSTR("1970-12-31T00:00:00Z")); // dec -- } -- -- TEST(parsing_time_iso8601_accepts_lowercase_t_z) -- { -- TestDateTimeRoundtrip(_XPLATSTR("1970-01-01t00:00:00Z"), _XPLATSTR("1970-01-01T00:00:00Z")); -- TestDateTimeRoundtrip(_XPLATSTR("1970-01-01T00:00:00z"), _XPLATSTR("1970-01-01T00:00:00Z")); -- } -- -- TEST(parsing_time_roundtrip_datetime_accepts_invalid_no_trailing_timezone) -+ TEST(parsing_time_roundtrip_datetime_invalid1, -+ "Ignore:Linux", -+ "Codeplex issue #115", -+ "Ignore:Apple", -+ "Codeplex issue #115") - { - // No digits after the dot, or non-digits. This is not a valid input, but we should not choke on it, - // Simply ignore the bad fraction - const utility::string_t bad_strings[] = {_XPLATSTR("2013-11-19T14:30:59.Z"), -- _XPLATSTR("2013-11-19T14:30:59.a12Z")}; -+ _XPLATSTR("2013-11-19T14:30:59.1a2Z")}; - utility::string_t str_corrected = _XPLATSTR("2013-11-19T14:30:59Z"); - - for (const auto& str : bad_strings) -@@ -387,87 +151,12 @@ SUITE(datetime) - - TEST(parsing_time_roundtrip_datetime_invalid2) - { -- // Various unsupported cases. In all cases, we have produce an empty date time -+ // Variouls unsupported cases. In all cases, we have produce an empty date time - const utility::string_t bad_strings[] = { -- _XPLATSTR(""), // empty -- _XPLATSTR(".Z"), // too short -- _XPLATSTR(".Zx"), // no trailing Z -- _XPLATSTR("3.14Z") // not a valid date -- _XPLATSTR("a971-01-01T00:00:00Z"), // any non digits or valid separators -- _XPLATSTR("1a71-01-01T00:00:00Z"), -- _XPLATSTR("19a1-01-01T00:00:00Z"), -- _XPLATSTR("197a-01-01T00:00:00Z"), -- _XPLATSTR("1971a01-01T00:00:00Z"), -- _XPLATSTR("1971-a1-01T00:00:00Z"), -- _XPLATSTR("1971-0a-01T00:00:00Z"), -- _XPLATSTR("1971-01a01T00:00:00Z"), -- _XPLATSTR("1971-01-a1T00:00:00Z"), -- _XPLATSTR("1971-01-0aT00:00:00Z"), -- // _XPLATSTR("1971-01-01a00:00:00Z"), parsed as complete date -- _XPLATSTR("1971-01-01Ta0:00:00Z"), -- _XPLATSTR("1971-01-01T0a:00:00Z"), -- _XPLATSTR("1971-01-01T00a00:00Z"), -- _XPLATSTR("1971-01-01T00:a0:00Z"), -- _XPLATSTR("1971-01-01T00:0a:00Z"), -- _XPLATSTR("1971-01-01T00:00a00Z"), -- _XPLATSTR("1971-01-01T00:00:a0Z"), -- _XPLATSTR("1971-01-01T00:00:0aZ"), -- // "1971-01-01T00:00:00a", accepted as per invalid_no_trailing_timezone above -- _XPLATSTR("1"), // truncation -- _XPLATSTR("19"), -- _XPLATSTR("197"), -- _XPLATSTR("1970"), -- _XPLATSTR("1970-"), -- _XPLATSTR("1970-0"), -- _XPLATSTR("1970-01"), -- _XPLATSTR("1970-01-"), -- _XPLATSTR("1970-01-0"), -- // _XPLATSTR("1970-01-01"), complete date -- _XPLATSTR("1970-01-01T"), -- _XPLATSTR("1970-01-01T0"), -- _XPLATSTR("1970-01-01T00"), -- _XPLATSTR("1970-01-01T00:"), -- _XPLATSTR("1970-01-01T00:0"), -- _XPLATSTR("1970-01-01T00:00"), -- _XPLATSTR("1970-01-01T00:00:"), -- _XPLATSTR("1970-01-01T00:00:0"), -- // _XPLATSTR("1970-01-01T00:00:00"), // accepted as invalid timezone above -- _XPLATSTR("4970-01-01T00:00:00Z"), // year too big -- _XPLATSTR("3001-01-01T00:00:00Z"), -- _XPLATSTR("1971-00-01T00:00:00Z"), // month too small -- _XPLATSTR("1971-20-01T00:00:00Z"), // month too big -- _XPLATSTR("1971-13-01T00:00:00Z"), -- _XPLATSTR("1971-01-00T00:00:00Z"), // day too small -- _XPLATSTR("1971-01-32T00:00:00Z"), // day too big -- _XPLATSTR("1971-02-30T00:00:00Z"), // day too big for feb -- _XPLATSTR("1971-02-30T00:00:00Z"), // day too big for feb (non-leap year) -- _XPLATSTR("1971-03-32T00:00:00Z"), // other months -- _XPLATSTR("1971-04-31T00:00:00Z"), -- _XPLATSTR("1971-05-32T00:00:00Z"), -- _XPLATSTR("1971-06-31T00:00:00Z"), -- _XPLATSTR("1971-07-32T00:00:00Z"), -- _XPLATSTR("1971-08-32T00:00:00Z"), -- _XPLATSTR("1971-09-31T00:00:00Z"), -- _XPLATSTR("1971-10-32T00:00:00Z"), -- _XPLATSTR("1971-11-31T00:00:00Z"), -- _XPLATSTR("1971-12-32T00:00:00Z"), -- _XPLATSTR("1971-01-01T70:00:00Z"), // hour too big -- _XPLATSTR("1971-01-01T24:00:00Z"), -- _XPLATSTR("1971-01-01T00:60:00Z"), // minute too big -- _XPLATSTR("1971-01-01T00:00:70Z"), // second too big -- _XPLATSTR("1971-01-01T00:00:61Z"), -- _XPLATSTR("1969-01-01T00:00:00Z"), // underflow --#ifdef _USE_32BIT_TIME_T -- _XPLATSTR("3000-01-01T00:00:01Z"), // overflow --#endif -- _XPLATSTR("3001-01-01T00:00:00Z"), -- _XPLATSTR("1970-01-01T00:00:00+00:01"), // time zone underflow -- // _XPLATSTR("1970-01-01T00:00:00.Z"), // accepted as invalid timezone above -- _XPLATSTR("1970-01-01T00:00:00+24:00"), // bad tzoffsets -- _XPLATSTR("1970-01-01T00:00:00-30:00"), -- _XPLATSTR("1970-01-01T00:00:00+21:60"), -- _XPLATSTR("1970-01-01T00:00:00-24:00"), -- _XPLATSTR("1970-01-01T00:00:00-21:60"), -+ _XPLATSTR(""), // empty -+ _XPLATSTR(".Z"), // too short -+ _XPLATSTR(".Zx"), // no trailing Z -+ _XPLATSTR("3.14Z") // not a valid date - }; - - for (const auto& str : bad_strings) -@@ -477,6 +166,16 @@ SUITE(datetime) - } - } - -+ TEST(parsing_time_roundtrip_time) -+ { -+ // time only without date -+ utility::string_t str = _XPLATSTR("14:30:59.1234567Z"); -+ auto dt = utility::datetime::from_string(str, utility::datetime::ISO_8601); -+ utility::string_t str2 = dt.to_string(utility::datetime::ISO_8601); -+ // Must look for a substring now, since the date part is filled with today's date -+ VERIFY_IS_TRUE(str2.find(str) != std::string::npos); -+ } -+ - } // SUITE(datetime) - - } // namespace utils_tests diff --git a/meta-openembedded/meta-oe/recipes-support/cpprest/cpprest_2.10.12.bb b/meta-openembedded/meta-oe/recipes-support/cpprest/cpprest_2.10.12.bb index 92c04535d..67edf5691 100644 --- a/meta-openembedded/meta-oe/recipes-support/cpprest/cpprest_2.10.12.bb +++ b/meta-openembedded/meta-oe/recipes-support/cpprest/cpprest_2.10.12.bb @@ -8,9 +8,7 @@ DEPENDS = "openssl websocketpp zlib boost brotli" EXTRA_OECMAKE = "-DCPPREST_EXPORT_DIR=cmake -DCPPREST_EXCLUDE_BROTLI=OFF" SRC_URI = "git://github.com/Microsoft/cpprestsdk.git;protocol=https;branch=master \ - file://revert-9b670e5b33dfdbd501d618cd7e7498148ffbd559.patch \ - file://revert-f10d9f8e214516d2c19aa6ef831ee874a58c0479.patch \ - " + file://1094.patch " # tag 2.10.12 SRCREV= "d4fb1cf7f7d22c12e2e442ba5a5e98d09b0a28ab" |