Я наблюдаю странное поведение движка cookie libcurls под Android, хотя он корректно работает в iOS.
Анализ даты истечения срока действия файлов cookie не работает в Android, если год истечения срока действия равен 2038 или выше. Мне известно о проблеме переполнения int с метками времени Unix, но это должно произойти только 19 января 2038 года. С libcurl, как только я перехожу к 1 января 2038 00:00 AM, проблема возникает.
Следующее не является точным исходным кодом, потому что это более сложно. Но строки 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
Таким образом, для первых 2 файлов cookie, которые имеют возраст 2038 года и старше, истечение срока действия приводит к 0. Это означает, что они рассматриваются как сеансовые файлы cookie, что плохо для меня. Как ни странно, это не вызвано 32-битным переполнением int, потому что с синтаксисом netscape поддерживаются гораздо большие значения срока действия.
Я не могу поделиться точной настройкой сборки для libcurl, но она была получена из скриптов, используемых здесь, и все еще довольно похожа: https://github.com/gcesarmza/curl-android-ios. Мы используем эту настройку для сборки бинарных файлов libcurl для iOS и Android (версия 7.62.0). Опять же, с бинарниками iOS все работает нормально (срок действия всех файлов cookie истек).
В реальном коде я также проверяю возвращение curl_easy_setopt
, и оно успешно. Если вам нужно больше кода установки, я могу попытаться собрать более полный пример, но это займет немного времени.
Кто-нибудь знает, что может вызвать это?