libcurl, как использовать строку в качестве пароля? - PullRequest
0 голосов
/ 25 февраля 2019

Следуя этому примеру:

https://github.com/curl/curl/blob/master/docs/examples/smtp-tls.c

Мне удалось заставить его работать, установив пароль следующим образом:

curl_easy_setopt(curl, CURLOPT_PASSWORD, "password");

Однако я хочуустановить пароль в виде строки, то есть:

string myPassword = "password";
curl_easy_setopt(curl, CURLOPT_PASSWORD, myPassword);

Однако, когда я это делаю, я получаю сообщение об ошибке

curl_easy_perform() failed: Login denied

Я дважды проверил, и программа напечатала значенияоригинальный пароль и строка перед отправкой.Они точно такие же.У меня есть две функции, чтобы проверить это.Они почти полностью идентичны, за исключением того, что один использует жестко заданный пароль, а другой использует строку.Жестко закодированный работает хорошо, но тот, который использует строку, имеет проблемы с логином.Как я мог это исправить?

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Опция CURLOPT_PASSWORD предполагает char*, а не std::string.Вы передаете неправильный тип.Библиотека интерпретирует ваши данные «неправильным» способом и получает ерунду.

Это не диагностируется, потому что curl_easy_setopt использует varargs для принятия произвольных параметров различныхтипы, в зависимости от устанавливаемой опции.(В идеале ваш компилятор отклонил бы или хотя бы предупредил о программе, но это стоит работы с небезопасными библиотеками C!)

Вы можете передать версию вашей строки C-string, используя std::string::c_str(), например:

curl_easy_setopt(curl, CURLOPT_PASSWORD, myPassword.c_str());

Существует проект с именем curlpp , который подразумевает безопасную для типов оболочку вокруг libcurl, иэто может стоить посмотреть.

0 голосов
/ 25 февраля 2019

Сбой, потому что curl_easy_setopt() ожидает строку в стиле C (т. Е. char *).

В этом случае вы должны преобразовать std::string в строку в стиле C, используя .c_str().

Таким образом, вы должны передать пароль, выполнив:

std::string myPassword = "password";
curl_easy_setopt(curl, CURLOPT_PASSWORD, myPassword.c_str());
...