C++ libcurl Кэширование данных ответа

Для этого я использую curl lib и расширение easy_curl. Сейчас я собираюсь пропустить код, так как не думаю, что это необходимо для объяснения проблемы. Я использую C++ и curl lib для получения сериализованного прототипа Google с сервера. Сериализованный протобуфф содержит целое число и статический массив объектов. Скомпилированный протобуфф выглядит так

typedef struct _ExperimentRunner_ExperimentList_RES {
    int32_t pollFrequency;
    pb_size_t activeExperiments_count;
    ExperimentRunner_ExperimentInfo activeExperiments[5];
/* @@protoc_insertion_point(struct:ExperimentRunner_ExperimentList_RES) */
} ExperimentRunner_ExperimentList_RES;

После тестирования все работает нормально, а протобуфф извлекается с сервера и анализируется правильно. Запрос get предназначен для данных, а не для файла с сервера.

Код настроен таким образом, что список экспериментов извлекается при каждой частоте опроса. Проблема заключается в следующем сценарии

  1. приложение запускается и получает список экспериментов, который в настоящее время имеет одну запись
  2. удалите запись из базы данных сервера, подождите, пока приложение повторно опросит сервер
  3. Приложение видит ответ сервера, все еще содержащий удаленную запись. Я подтверждаю его удаление, делая скручивание из командной строки

Кажется, есть проблема с библиотекой curl, которая кэширует результат данных с сервера, а затем возвращает его, когда я делаю запрос. так как, когда я перезапускаю приложение, оно получает правильные данные. Я реализовал CURLOPT_DEBUGFUNCTION и вижу старые данные, возвращаемые запросом, когда я знаю, что сервер удалил их из базы данных. Любые предложения, какие варианты или кеширование может происходить, чтобы вызвать это?

1 ответ

Решение

Это закончилось тем, что я сделал ошибку дампа, вызванную неправильным пониманием того, как работает curl lib (я думаю). Я использовал CURLOPT_WRITEFUNCTION для захвата данных в массив символов. Я не полностью очищал этот буфер между запросами, так как предполагал, что curllib завершит новые полученные данные с помощью "\0", аннулируя старые данные. но я думаю, что это предположение не соответствует действительности. Как только я очистил весь буфер до следующего запроса, все работало замечательно. ниже приведена функция сбора данных для случая

size_t CURL_RECIEVE_DATA_BUFF(void *buffer, size_t size, size_t nmemb, void *userp)
{
    CURL_DATA_BUFF* curlData = (CURL_DATA_BUFF*)userp;
    if (curlData)
    {
        if (curlData->amountWriten >= curlData->maxSize) {
            LogIt.Add(Error, "%s:%s Server sending more data than expected, max is: %d bytes\n", __FILE__, __FUNCTION__, curlData->maxSize);
            return 0;
        }
        memcpy(&(curlData->buff[curlData->amountWriten]), buffer, size * nmemb);
        curlData->amountWriten += size * nmemb;
        return size * nmemb;
    }
    return 0;
}
Другие вопросы по тегам