истечение срока действия cookie libcurl на андроид - PullRequest
1 голос
/ 03 июля 2019

Я наблюдаю странное поведение движка 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, и оно успешно. Если вам нужно больше кода установки, я могу попытаться собрать более полный пример, но это займет немного времени.

Кто-нибудь знает, что может вызвать это?

1 Ответ

0 голосов
/ 03 июля 2019

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;
}
...