Как использовать функцию ne_add_auth из библиотеки libneon

Пытаюсь реализовать с помощью библиотеки libneon подключение к серверу, использующему базовую аутентификацию. При ручном формировании заголовка Authorization все работает. Но если я пытаюсь использовать функцию ne_add_auth, то авторизация не проходит. Получаю код 401.


#include<neon/ne_request.h>
#include<neon/ne_auth.h>

#include <iostream>
#include <fstream>
#include <cstring>

std::ofstream file{"data.txt"};

#define SHOW_STR(str)  (str==nullptr ? "NULL" : str)

//----------------------------------------------------------------------------
int my_auth_verify(void *, int attempt, unsigned protocol, const char *realm,
    char *username, char* password, size_t)
{
    strcpy(username, "admin");
    strcpy(password, "123");
    std::cout << "attempt: " << attempt << "; protocol: " << protocol <<
        SHOW_STR(realm) << "; username: " << SHOW_STR(username) <<
        "; password: " << SHOW_STR(password) << std::endl;

    return 0;
}
//-----------------------------------------------------------------------------
void make_request(const char *request, const char *method, const char *path)
{
    file << "-------------------------------------------------------------"<< std::endl;
    ne_uri parsed_uri;
    if(ne_uri_parse(request, &parsed_uri))
    {
        std::cout << "ne_uri_parse failed" << std::endl;
        return;
    }
    auto sess = ne_session_create(parsed_uri.scheme, parsed_uri.host, parsed_uri.port);
    ne_add_auth(sess, NE_AUTH_BASIC, my_auth_verify, nullptr);
    auto req = ne_request_create(sess, method, path);

    //So work:
    //ne_add_request_header(req, "Authorization", "Basic YWRtaW46MTIz");

    ne_begin_request(req);
    file << "Code is " << ne_get_status(req)->code << std::endl;
    char buffer[128] = "";
    auto size = ne_read_response_block(req, buffer, 127);
    while(size > 0)
    {
        file << std::string{buffer, size};
        size = ne_read_response_block(req, buffer, 127);
    }

    ne_end_request(req);
    ne_request_destroy(req);
    ne_session_destroy(sess);
}
//-----------------------------------------------------------------------------
int main()
{
    ne_sock_init();
    make_request("http://127.0.0.1:8080", "GET", "/");

    ne_sock_exit();
    std::cout << "finish" << std::endl;
    return 0;
}

Судя по выводу callback my_auth_verify вызывается 1 раз.

Можно конечно и вручную формировать заголовок. Но хотелось бы понять, как это должно работать с иcпользованием ne_add_auth (или ее аналога, допускаю, что использую не ту функцию).


Ответы (0 шт):