TLS Setup
So far we've been using plain HTTP, but in the real world, HTTPS is the norm. To use HTTPS with cpp-httplib, you need a TLS library.
In this tour, we'll use OpenSSL. It's the most widely used option, and you'll find plenty of resources online.
Installing OpenSSL
Install it for your OS.
| OS | How to install |
|---|---|
| macOS | Homebrew (brew install openssl) |
| Ubuntu / Debian | sudo apt install libssl-dev |
| Windows | vcpkg (vcpkg install openssl) |
Compile Options
To enable TLS, define the CPPHTTPLIB_OPENSSL_SUPPORT macro when compiling. You'll need a few extra options compared to the previous chapters.
# macOS (Homebrew) clang++ -std=c++17 -DCPPHTTPLIB_OPENSSL_SUPPORT \ -I$(brew --prefix openssl)/include \ -L$(brew --prefix openssl)/lib \ -lssl -lcrypto \ -framework CoreFoundation -framework Security \ -o server server.cpp # Linux clang++ -std=c++17 -pthread -DCPPHTTPLIB_OPENSSL_SUPPORT \ -lssl -lcrypto \ -o server server.cpp # Windows (Developer Command Prompt) cl /EHsc /std:c++17 /DCPPHTTPLIB_OPENSSL_SUPPORT server.cpp libssl.lib libcrypto.lib
# macOS (Homebrew) clang++ -std=c++17 -DCPPHTTPLIB_OPENSSL_SUPPORT \ -I$(brew --prefix openssl)/include \ -L$(brew --prefix openssl)/lib \ -lssl -lcrypto \ -framework CoreFoundation -framework Security \ -o server server.cpp # Linux clang++ -std=c++17 -pthread -DCPPHTTPLIB_OPENSSL_SUPPORT \ -lssl -lcrypto \ -o server server.cpp # Windows (Developer Command Prompt) cl /EHsc /std:c++17 /DCPPHTTPLIB_OPENSSL_SUPPORT server.cpp libssl.lib libcrypto.lib
Let's look at what each option does.
-DCPPHTTPLIB_OPENSSL_SUPPORT— Defines the macro that enables TLS support-lssl -lcrypto— Links the OpenSSL libraries-I/-L(macOS only) — Points to the Homebrew OpenSSL paths-framework CoreFoundation -framework Security(macOS only) — Needed to automatically load system certificates from the Keychain
Verifying the Setup
Let's make sure everything works. Here's a simple program that passes an HTTPS URL to httplib::Client.
#define CPPHTTPLIB_OPENSSL_SUPPORT #include "httplib.h" #include <iostream> int main() { httplib::Client cli("https://www.google.com"); auto res = cli.Get("/"); if (res) { std::cout << "Status: " << res->status << std::endl; } else { std::cout << "Error: " << httplib::to_string(res.error()) << std::endl; } }
#define CPPHTTPLIB_OPENSSL_SUPPORT #include "httplib.h" #include <iostream> int main() { httplib::Client cli("https://www.google.com"); auto res = cli.Get("/"); if (res) { std::cout << "Status: " << res->status << std::endl; } else { std::cout << "Error: " << httplib::to_string(res.error()) << std::endl; } }
Compile and run it. If you see Status: 200, your setup is complete.
Other TLS Backends
cpp-httplib also supports Mbed TLS and wolfSSL in addition to OpenSSL. You can switch between them just by changing the macro definition and linked libraries.
| Backend | Macro | Libraries to link |
|---|---|---|
| OpenSSL | CPPHTTPLIB_OPENSSL_SUPPORT | libssl, libcrypto |
| Mbed TLS | CPPHTTPLIB_MBEDTLS_SUPPORT | libmbedtls, libmbedx509, libmbedcrypto |
| wolfSSL | CPPHTTPLIB_WOLFSSL_SUPPORT | libwolfssl |
This tour assumes OpenSSL, but the API is the same regardless of which backend you choose.
Next Step
You're all set with TLS. Next, let's send a request to an HTTPS site.
Next: HTTPS Client