Я наблюдаю странное поведение с механизмом cookie libcurls под Android, хотя в iOS он работает правильно.
Анализ даты истечения срока действия файлов cookie, похоже, не работает в Android, если год истечения срока действия составляет 2038 или выше. Я знаю о проблеме переполнения int с отметками времени unix, но это должно произойти только 19 января 2038 года. С libcurl проблема возникает, как только я перехожу к 00:00 1 января 2038 года.
Ниже приведен не точный исходный код, потому что он более сложный. Но строки cookie и вызовы curl абсолютно одинаковы.
// ...create the curl handle...
// Add test cookies in Set-Cookie syntax, because the issue seems to have to do with expiry parsing
static const std::string border = "Tue, 19-Jan-2087 03:14:08 GMT";
static const std::string borderP1 = "Fri, 01-Jan-2038 00:00:00 GMT";
static const std::string borderM1 = "Thu, 31-Dec-2037 23:59:59 GMT";
curl_easy_setopt(curlHandle, CURLOPT_COOKIELIST, ("Set-Cookie: my1=border;Domain=10.101.32.24;Path=/;Expires = " + border).c_str());
curl_easy_setopt(curlHandle, CURLOPT_COOKIELIST, ("Set-Cookie: my2=borderP1;Domain=10.101.32.24;Path=/;Expires = " + borderP1).c_str());
curl_easy_setopt(curlHandle, CURLOPT_COOKIELIST, ("Set-Cookie: my3=borderM1;Domain=10.101.32.24;Path=/;Expires = " + borderM1).c_str());
// Add another cookie in netscape syntax to compare (this one expires on July 10, 3145 9:20:00 AM)
curl_easy_setopt(curlHandle, CURLOPT_COOKIELIST, "10.101.32.24\tFALSE\t/\tFALSE\t37095873600\ttest\tcookie")
// Code to print all cookies known to curl for test purposes:
struct curl_slist *cookies;
curl_easy_getinfo(curlHandle, CURLINFO_COOKIELIST, &cookies);
for (auto c = cookies; c; c = c->next) {
LogStream::debug("Cookie") << c->data;
}
curl_slist_free_all(cookies);
Полученные строки в логе выглядят так:
Cookie: 10.101.32.24 FALSE / FALSE 0 my1 border
Cookie: 10.101.32.24 FALSE / FALSE 0 my2 borderP1
Cookie: 10.101.32.24 FALSE / FALSE 2145916799 my3 borderM1
Cookie: 10.101.32.24 FALSE / FALSE 37095873600 test cookie
Таким образом, для первых двух куки-файлов 2038 года или старше срок действия составляет 0. Это означает, что они рассматриваются как сеансовые куки-файлы, что плохо для меня. Как ни странно, похоже, что это не вызвано переполнением 32-битного целого числа, потому что с синтаксисом netscape поддерживаются гораздо большие значения истечения срока действия.
Я не могу поделиться точной настройкой сборки для libcurl, но она была получена из использованных здесь скриптов и все еще довольно похожа: https://github.com/gcesarmza/curl-android-ios . Мы используем эту настройку для сборки двоичных файлов libcurl для iOS и Android (версия 7.62.0). Опять же, с двоичными файлами iOS все работает нормально (все файлы cookie имеют правильный срок действия).
В реальном коде я также проверяю возврат curl_easy_setopt, и это успешно. Если вам нужно больше кода установки, я могу попытаться собрать более полный пример, но это займет немного времени.
Кто-нибудь знает, что может быть причиной этого?
@Botje большое спасибо, я не знал, что curl_getdate существует. Да, у него та же проблема, и в документах говорится, что он возвращает -1 для любого года> 2037, если sizeof(time_t) 32-битный. Что это для андроида. Если вы опубликуете ответ на этот счет, я приму его :)





curl_setopt вызывает Curl_cookie_add, который, в свою очередь, вызывает curl_getdate для ввода в стиле «Set-Cookie».
Эта функция в конечном итоге заканчивается здесь со следующим кодом:
/* a signed 32 bit time_t can only hold dates to the beginning of 2038 */
if (yearnum > 2037) {
*output = TIME_T_MAX;
return PARSEDATE_LATER;
}
Можете ли вы увидеть, проявляет ли
curl_getdateту же проблему? А что такоеsizeof(time_t)на Android?