xref: /aosp_15_r20/external/federated-compute/fcp/client/http/curl/curl_api.cc (revision 14675a029014e728ec732f129a32e299b2da0601)
1 /*
2  * Copyright 2022 Google LLC
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 #include "fcp/client/http/curl/curl_api.h"
17 
18 #include <memory>
19 #include <string>
20 
21 #include "fcp/base/monitoring.h"
22 
23 namespace fcp::client::http::curl {
24 // CurlEasyHandle
25 
CurlEasyHandle()26 CurlEasyHandle::CurlEasyHandle() : easy_handle_(curl_easy_init()) {
27   FCP_CHECK(easy_handle_ != nullptr);
28 }
29 
~CurlEasyHandle()30 CurlEasyHandle::~CurlEasyHandle() { curl_easy_cleanup(easy_handle_); }
31 
GetInfo(CURLINFO info,curl_off_t * value) const32 CURLcode CurlEasyHandle::GetInfo(CURLINFO info, curl_off_t* value) const {
33   curl_off_t data = 0;
34   CURLcode code = curl_easy_getinfo(easy_handle_, info, &data);
35   if (code == CURLE_OK) *value = static_cast<curl_off_t>(data);
36   return code;
37 }
38 
StrError(CURLcode code)39 std::string CurlEasyHandle::StrError(CURLcode code) {
40   return curl_easy_strerror(code);
41 }
42 
GetEasyHandle() const43 CURL* CurlEasyHandle::GetEasyHandle() const { return easy_handle_; }
44 
45 // CurlMultiHandle
46 
CurlMultiHandle()47 CurlMultiHandle::CurlMultiHandle() : multi_handle_(curl_multi_init()) {
48   FCP_CHECK(multi_handle_ != nullptr);
49 }
50 
~CurlMultiHandle()51 CurlMultiHandle::~CurlMultiHandle() { curl_multi_cleanup(multi_handle_); }
52 
InfoRead(int * msgs_in_queue)53 CURLMsg* CurlMultiHandle::InfoRead(int* msgs_in_queue) {
54   return curl_multi_info_read(multi_handle_, msgs_in_queue);
55 }
56 
AddEasyHandle(CurlEasyHandle * easy_handle)57 CURLMcode CurlMultiHandle::AddEasyHandle(CurlEasyHandle* easy_handle) {
58   return curl_multi_add_handle(multi_handle_, easy_handle->GetEasyHandle());
59 }
60 
RemoveEasyHandle(CurlEasyHandle * easy_handle)61 CURLMcode CurlMultiHandle::RemoveEasyHandle(CurlEasyHandle* easy_handle) {
62   return curl_multi_remove_handle(multi_handle_, easy_handle->GetEasyHandle());
63 }
64 
Perform(int * num_running_handles)65 CURLMcode CurlMultiHandle::Perform(int* num_running_handles) {
66   return curl_multi_perform(multi_handle_, num_running_handles);
67 }
68 
Poll(curl_waitfd extra_fds[],unsigned int extra_nfds,int timeout_ms,int * numfds)69 CURLMcode CurlMultiHandle::Poll(curl_waitfd extra_fds[],
70                                 unsigned int extra_nfds, int timeout_ms,
71                                 int* numfds) {
72   return curl_multi_poll(multi_handle_, extra_fds, extra_nfds, timeout_ms,
73                          numfds);
74 }
75 
StrError(CURLMcode code)76 std::string CurlMultiHandle::StrError(CURLMcode code) {
77   return curl_multi_strerror(code);
78 }
79 
80 // CurlApi
81 
CurlApi()82 CurlApi::CurlApi() { curl_global_init(CURL_GLOBAL_ALL); }
83 
~CurlApi()84 CurlApi::~CurlApi() { curl_global_cleanup(); }
85 
CreateEasyHandle() const86 std::unique_ptr<CurlEasyHandle> CurlApi::CreateEasyHandle() const {
87   absl::MutexLock lock(&mutex_);
88   // make_unique cannot access the private constructor, so we use
89   // an old-fashioned new.
90   return std::unique_ptr<CurlEasyHandle>(new CurlEasyHandle());
91 }
92 
CreateMultiHandle() const93 std::unique_ptr<CurlMultiHandle> CurlApi::CreateMultiHandle() const {
94   absl::MutexLock lock(&mutex_);
95   // make_unique cannot access the private constructor, so we use
96   // an old-fashioned new.
97   return std::unique_ptr<CurlMultiHandle>(new CurlMultiHandle());
98 }
99 
100 }  // namespace fcp::client::http::curl
101