Срок действия файла cookie libcurl на Android

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

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

Можете ли вы увидеть, проявляет ли curl_getdate ту же проблему? А что такое sizeof(time_t) на Android?

Botje 03.07.2019 14:01

@Botje большое спасибо, я не знал, что curl_getdate существует. Да, у него та же проблема, и в документах говорится, что он возвращает -1 для любого года> 2037, если sizeof(time_t) 32-битный. Что это для андроида. Если вы опубликуете ответ на этот счет, я приму его :)

JanB 03.07.2019 16:15
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Другие вопросы по теме