Libcurl.Отменить запрос во время продолжения - PullRequest
0 голосов
/ 13 сентября 2011

ОБНОВЛЕНО: проблема не в libcurl. Правильный способ отменить запрос, если вернуть из обратного вызова ненулевое значение. Я использовал функцию curl_progress_callback, и все отлично работает.

1 Ответ

0 голосов
/ 13 сентября 2011

Что вам нужно понять, так это то, что CURL - это библиотека C. В общем, вы не можете передавать указатели на объекты или функции C ++, потому что C ничего не знает о классах C ++ и соглашении о вызовах.

Например, эта строка неверна:

curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errorBuffer);

CURL setopt CURLOPT_ERRORBUFFER ожидает, что третий параметр является указателем на строку в стиле C (массив C-style char), в которой есть место для символов CURL_ERROR_SIZE. Вместо этого вы передаете указатель на объект std::string. Поскольку CURL, написанный на C, не знает, что такое std::string, он просто перезаписывает байтовое представление, имеющее sizeof (std::string) байт, данными об ошибках, потому что считает, что указатель на массив char в стиле C.

Используйте это вместо:

char errorBuffer[CURL_ERROR_SIZE + 1]; errorBuffer[CURL_ERROR_SIZE] = '\0';
curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errorBuffer);

errorBuffer заполняется только допустимой строкой, если curl_easy_perform() возвращает код ошибки.

Кроме того, Uploader::WriteResponce - это функция C ++. С этой строкой:

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteResponce);

CURL ожидает, что третий параметр будет функцией указателя на C. Здесь вы передаете функцию указателя на C ++. Вам нужно заключить вызов в WriteResponce в функцию extern "C", которая вызывает функцию C ++:

extern "C" size_t call_uploader_writeresponce(char *ptr, size_t size, size_t nmemb, void *user_data) {
    return Uploader::WriteResponce(ptr, size, nmemb, static_cast<std::string *>(user_data));
}


// ...
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &call_uploader_writeresponce);

«Функция записи» должна возвращать size_t, а не int; Uploader::WriteResponce нужно вернуть size_t.

...