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 предназначен для данных, а не для файла с сервера.
Код настроен таким образом, что список экспериментов извлекается при каждой частоте опроса. Проблема заключается в следующем сценарии
- приложение запускается и получает список экспериментов, который в настоящее время имеет одну запись
- удалите запись из базы данных сервера, подождите, пока приложение повторно опросит сервер
- Приложение видит ответ сервера, все еще содержащий удаленную запись. Я подтверждаю его удаление, делая скручивание из командной строки
Кажется, есть проблема с библиотекой 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;
}