1#include "cpr/response.h"
2
3namespace cpr {
4
5Response::Response(std::shared_ptr<CurlHolder> curl, std::string&& p_text, std::string&& p_header_string, Cookies&& p_cookies = Cookies{}, Error&& p_error = Error{}) : curl_(std::move(curl)), text(std::move(p_text)), cookies(std::move(p_cookies)), error(std::move(p_error)), raw_header(std::move(p_header_string)) {
6 header = cpr::util::parseHeader(headers: raw_header, status_line: &status_line, reason: &reason);
7 assert(curl_);
8 assert(curl_->handle);
9 curl_easy_getinfo(curl_->handle, CURLINFO_RESPONSE_CODE, &status_code);
10 curl_easy_getinfo(curl_->handle, CURLINFO_TOTAL_TIME, &elapsed);
11 char* url_string{nullptr};
12 curl_easy_getinfo(curl_->handle, CURLINFO_EFFECTIVE_URL, &url_string);
13 url = Url(url_string);
14#if LIBCURL_VERSION_NUM >= 0x073700
15 curl_easy_getinfo(curl_->handle, CURLINFO_SIZE_DOWNLOAD_T, &downloaded_bytes);
16 curl_easy_getinfo(curl_->handle, CURLINFO_SIZE_UPLOAD_T, &uploaded_bytes);
17#else
18 double downloaded_bytes_double, uploaded_bytes_double;
19 curl_easy_getinfo(curl_->handle, CURLINFO_SIZE_DOWNLOAD, &downloaded_bytes_double);
20 curl_easy_getinfo(curl_->handle, CURLINFO_SIZE_UPLOAD, &uploaded_bytes_double);
21 downloaded_bytes = downloaded_bytes_double;
22 uploaded_bytes = uploaded_bytes_double;
23#endif
24 curl_easy_getinfo(curl_->handle, CURLINFO_REDIRECT_COUNT, &redirect_count);
25}
26
27std::vector<CertInfo> Response::GetCertInfos() {
28 assert(curl_);
29 assert(curl_->handle);
30 curl_certinfo* ci{nullptr};
31 curl_easy_getinfo(curl_->handle, CURLINFO_CERTINFO, &ci);
32
33 std::vector<CertInfo> cert_infos;
34 for (int i = 0; i < ci->num_of_certs; i++) {
35 CertInfo cert_info;
36 // NOLINTNEXTLINE (cppcoreguidelines-pro-bounds-pointer-arithmetic)
37 for (curl_slist* slist = ci->certinfo[i]; slist; slist = slist->next) {
38 cert_info.emplace_back(str: std::string{slist->data});
39 }
40 cert_infos.emplace_back(args&: cert_info);
41 }
42 return cert_infos;
43}
44} // namespace cpr
45