Line data Source code
1 : // SPDX-FileCopyrightText: 2025 Pairinteraction Developers 2 : // SPDX-License-Identifier: LGPL-3.0-or-later 3 : 4 : #include <filesystem> 5 : #include <fstream> 6 : #include <httplib.h> 7 : 8 1 : int main(int /*argc*/, char ** /*argv*/) { 9 : // Store the certificate 10 : const std::string cert{R"(Comodo AAA Services root 11 : ======================== 12 : -----BEGIN CERTIFICATE----- 13 : MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS 14 : R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg 15 : TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw 16 : MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl 17 : c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV 18 : BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC 19 : ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG 20 : C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs 21 : i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW 22 : Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH 23 : Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK 24 : Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f 25 : BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl 26 : cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz 27 : LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm 28 : 7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz 29 : Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z 30 : 8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C 31 : 12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== 32 1 : -----END CERTIFICATE-----)"}; 33 : 34 : std::filesystem::path cert_path = 35 1 : std::filesystem::temp_directory_path() / "pairinteraction-test-ca-bundle.crt"; 36 1 : if (std::filesystem::exists(cert_path)) { 37 0 : std::filesystem::remove(cert_path); 38 : } 39 1 : std::ofstream out(cert_path); 40 1 : if (!out) { 41 0 : throw std::runtime_error("Failed to create certificate file at " + cert_path.string()); 42 : } 43 1 : out << cert; 44 1 : out.close(); 45 : 46 : // Use the certificate to make a request 47 1 : httplib::SSLClient cli("api.github.com"); 48 1 : cli.set_ca_cert_path(cert_path.string()); 49 1 : const auto res = cli.Get("/rate_limit"); 50 : 51 : // Clean up 52 1 : std::filesystem::remove(cert_path); 53 : 54 : // Check the response 55 1 : if (!res || res->status != 200) { 56 0 : throw std::runtime_error("Error: " + httplib::to_string(res.error())); 57 : } 58 1 : return 0; 59 1 : }