Estoy intentando realizar algunas solicitudes HTTP ( S ) con cpp-httplib. Por que

#include <iostream>
#include "httplib.h"

using namespace std;

int main()
{
    cout << "hi" << endl;

    auto res = httplib::Client("http://stackoverflow.com").Get("/");
    cout << res << endl;

    return 0;
}

Impresión

hi
0x5605c058db50

(Bien pero

#include <iostream>
#include "httplib.h"

using namespace std;

int main()
{
    cout << "hi" << endl;

    auto res = httplib::Client("https://stackoverflow.com").Get("/");
    cout << res << endl;

    return 0;
}

(mismo código, recién cambiado http a https)

hi
Segmentation fault (core dumped)

?

GDB backtrace me da esto después del segfault:

#0  0x000055555555eee8 in httplib::ClientImpl::Socket::is_open (this=0x50) at /home/viktor/delayWatcher/cpp-fetcher/libs/httplib.h:822
#1  0x0000555555569a20 in httplib::ClientImpl::send (this=0x0, req=..., res=...) at /home/viktor/delayWatcher/cpp-fetcher/libs/httplib.h:4579
#2  0x000055555556bb8b in httplib::ClientImpl::Get(char const*, std::multimap<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, httplib::detail::ci, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > const&, std::function<bool (unsigned long, unsigned long)>) (this=0x0, path=0x5555555bc887 "/", headers=std::multimap with 0 elements, progress=...) at /home/viktor/delayWatcher/cpp-fetcher/libs/httplib.h:4980
#3  0x000055555556ba1d in httplib::ClientImpl::Get (this=0x0, path=0x5555555bc887 "/") at /home/viktor/delayWatcher/cpp-fetcher/libs/httplib.h:4958
#4  0x000055555556c345 in httplib::Client::Get (this=0x7fffffffe320, path=0x5555555bc887 "/") at /home/viktor/delayWatcher/cpp-fetcher/libs/httplib.h:6015
#5  0x000055555555d767 in main () at /home/viktor/delayWatcher/cpp-fetcher/fetcher/main.cpp:11
0
mimo31 3 ago. 2020 a las 13:23

1 respuesta

La mejor respuesta

Siguiendo el archivo README en cpp-httplib github:

  • agregar #define CPPHTTPLIB_OPENSSL_SUPPORT,
  • enlace libssl y libcrypto.

Entonces el código sería así:

#include <iostream>

#define CPPHTTPLIB_OPENSSL_SUPPORT

#include "httplib.h"

using namespace std;

int main()
{
    cout << "hi" << endl;

    auto res = httplib::Client("https://stackoverflow.com").Get("/");
    cout << res << endl;

    return 0;
}

Y en mi caso ejecutando g++ con -lssl -lcrypto al final.

Lo que intenté y fue (¿tal vez obviamente?) Incorrecto: el #define debe ir antes que #include "httplib.h".

// WRONG order, still segfault
#include "httplib.h"

#define CPPHTTPLIB_OPENSSL_SUPPORT
0
mimo31 3 ago. 2020 a las 10:23