libcurl: curl_easy_perform блокируется, если не установлено CURLOPT_READFUNCTION - PullRequest
0 голосов
/ 28 мая 2018

Я пытаюсь использовать libcurl C ++ для выполнения запросов REST / HTTP.Я заметил блоки curl_easy_perform, но если я установил CURLOPT_READFUNCTION, это не так.Я просто хочу понять, почему это так, я новичок в libcurl или протокол HTTP / REST.

Вот код:

m_pCurl = curl_easy_init();
curl_easy_setopt(m_pCurl, CURLOPT_URL, "https://blahblahblah/api/auth/user/login");      
curl_easy_setopt(m_pCurl, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(m_pCurl, CURLOPT_POST, 1);
curl_easy_setopt(m_pCurl, CURLOPT_COOKIE, "SKEY=BLAHBLAHBLAH");

struct curl_slist *list = NULL;

list = curl_slist_append(list, "Accept: application/json");
list = curl_slist_append(list, "Connection: keep-alive");
list = curl_slist_append(list, "Expect:");
list = curl_slist_append(list, "Content-Type: application/json");
list = curl_slist_append(list, "x-website-parameters: LALALALA");
curl_easy_setopt(m_pCurl, CURLOPT_HTTPHEADER, list);

// Callbacks
readarg_t rarg;

// readcb is a callback function
// Removing the two lines below will cause curl_easy_perform to hang
curl_easy_setopt(m_pCurl, CURLOPT_READFUNCTION, readcb);
curl_easy_setopt(m_pCurl, CURLOPT_READDATA, &rarg);

CURLcode res = curl_easy_perform(m_pCurl);

Примечание: некоторые из закодированных данных изменены выше.

Любая помощь будет принята с благодарностью.

Спасибо, K

1 Ответ

0 голосов
/ 28 мая 2018

Согласно Руководству ...

CURLOPT_READFUNCTION объяснено

...

Если выустановите для этого указателя обратного вызова значение NULL или не устанавливайте его вообще, будет использоваться внутренняя функция чтения по умолчанию.Он выполняет fread () для пользовательских данных FILE *, установленных с помощью CURLOPT_READDATA.

Однако вы также не устанавливаете CURLOPT_READDATA.Итак, снова посмотрев на Руководство ...

CURLOPT_READDATA объяснено

...

По умолчаниюэто ФАЙЛ * к стандартному.

Таким образом, причина, по которой ваша программа "зависает", заключается в том, что она ожидает поступления чего-либо на стандартный ввод stdin.

Таким образом, он должен работать следующим образом.

1) Если вы не сделаете ничего , данные, отправленные на сервер, поступают из стандартный ввод (который часто является клавиатурой).

2) Если вы установите only CURLOPT_READDATA, тогда must будет FILE*, который вы открыли для входного файла, содержащего данные, которые вы хотите отправить.

3) Если вы установите CURLOPT_READFUNCTION, тогда CURLOPT_READDATA может указывать на что угодно ваша функция должна выполнить задачу по отправке данных на сервер.

...