xref: /aosp_15_r20/external/libbrillo/brillo/http/curl_api.h (revision 1a96fba65179ea7d3f56207137718607415c5953)
1*1a96fba6SXin Li // Copyright 2014 The Chromium OS Authors. All rights reserved.
2*1a96fba6SXin Li // Use of this source code is governed by a BSD-style license that can be
3*1a96fba6SXin Li // found in the LICENSE file.
4*1a96fba6SXin Li 
5*1a96fba6SXin Li #ifndef LIBBRILLO_BRILLO_HTTP_CURL_API_H_
6*1a96fba6SXin Li #define LIBBRILLO_BRILLO_HTTP_CURL_API_H_
7*1a96fba6SXin Li 
8*1a96fba6SXin Li #include <curl/curl.h>
9*1a96fba6SXin Li 
10*1a96fba6SXin Li #include <string>
11*1a96fba6SXin Li 
12*1a96fba6SXin Li #include <base/macros.h>
13*1a96fba6SXin Li #include <brillo/brillo_export.h>
14*1a96fba6SXin Li 
15*1a96fba6SXin Li namespace brillo {
16*1a96fba6SXin Li namespace http {
17*1a96fba6SXin Li 
18*1a96fba6SXin Li // Abstract wrapper around libcurl C API that allows us to mock it out in tests.
19*1a96fba6SXin Li class CurlInterface {
20*1a96fba6SXin Li  public:
21*1a96fba6SXin Li   CurlInterface() = default;
22*1a96fba6SXin Li   virtual ~CurlInterface() = default;
23*1a96fba6SXin Li 
24*1a96fba6SXin Li   // Wrapper around curl_easy_init().
25*1a96fba6SXin Li   virtual CURL* EasyInit() = 0;
26*1a96fba6SXin Li 
27*1a96fba6SXin Li   // Wrapper around curl_easy_cleanup().
28*1a96fba6SXin Li   virtual void EasyCleanup(CURL* curl) = 0;
29*1a96fba6SXin Li 
30*1a96fba6SXin Li   // Wrappers around curl_easy_setopt().
31*1a96fba6SXin Li   virtual CURLcode EasySetOptInt(CURL* curl, CURLoption option, int value) = 0;
32*1a96fba6SXin Li   virtual CURLcode EasySetOptStr(CURL* curl,
33*1a96fba6SXin Li                                  CURLoption option,
34*1a96fba6SXin Li                                  const std::string& value) = 0;
35*1a96fba6SXin Li   virtual CURLcode EasySetOptPtr(CURL* curl,
36*1a96fba6SXin Li                                  CURLoption option,
37*1a96fba6SXin Li                                  void* value) = 0;
38*1a96fba6SXin Li   virtual CURLcode EasySetOptCallback(CURL* curl,
39*1a96fba6SXin Li                                       CURLoption option,
40*1a96fba6SXin Li                                       intptr_t address) = 0;
41*1a96fba6SXin Li   virtual CURLcode EasySetOptOffT(CURL* curl,
42*1a96fba6SXin Li                                   CURLoption option,
43*1a96fba6SXin Li                                   curl_off_t value) = 0;
44*1a96fba6SXin Li 
45*1a96fba6SXin Li   // A type-safe wrapper around function callback options.
46*1a96fba6SXin Li   template<typename R, typename... Args>
EasySetOptCallback(CURL * curl,CURLoption option,R (* callback)(Args...))47*1a96fba6SXin Li   inline CURLcode EasySetOptCallback(CURL* curl,
48*1a96fba6SXin Li                                      CURLoption option,
49*1a96fba6SXin Li                                      R(*callback)(Args...)) {
50*1a96fba6SXin Li     return EasySetOptCallback(
51*1a96fba6SXin Li         curl, option, reinterpret_cast<intptr_t>(callback));
52*1a96fba6SXin Li   }
53*1a96fba6SXin Li 
54*1a96fba6SXin Li   // Wrapper around curl_easy_perform().
55*1a96fba6SXin Li   virtual CURLcode EasyPerform(CURL* curl) = 0;
56*1a96fba6SXin Li 
57*1a96fba6SXin Li   // Wrappers around curl_easy_getinfo().
58*1a96fba6SXin Li   virtual CURLcode EasyGetInfoInt(CURL* curl,
59*1a96fba6SXin Li                                   CURLINFO info,
60*1a96fba6SXin Li                                   int* value) const = 0;
61*1a96fba6SXin Li   virtual CURLcode EasyGetInfoDbl(CURL* curl,
62*1a96fba6SXin Li                                   CURLINFO info,
63*1a96fba6SXin Li                                   double* value) const = 0;
64*1a96fba6SXin Li   virtual CURLcode EasyGetInfoStr(CURL* curl,
65*1a96fba6SXin Li                                   CURLINFO info,
66*1a96fba6SXin Li                                   std::string* value) const = 0;
67*1a96fba6SXin Li   virtual CURLcode EasyGetInfoPtr(CURL* curl,
68*1a96fba6SXin Li                                   CURLINFO info,
69*1a96fba6SXin Li                                   void** value) const = 0;
70*1a96fba6SXin Li 
71*1a96fba6SXin Li   // Wrapper around curl_easy_strerror().
72*1a96fba6SXin Li   virtual std::string EasyStrError(CURLcode code) const = 0;
73*1a96fba6SXin Li 
74*1a96fba6SXin Li   // Wrapper around curl_multi_init().
75*1a96fba6SXin Li   virtual CURLM* MultiInit() = 0;
76*1a96fba6SXin Li 
77*1a96fba6SXin Li   // Wrapper around curl_multi_cleanup().
78*1a96fba6SXin Li   virtual CURLMcode MultiCleanup(CURLM* multi_handle) = 0;
79*1a96fba6SXin Li 
80*1a96fba6SXin Li   // Wrapper around curl_multi_info_read().
81*1a96fba6SXin Li   virtual CURLMsg* MultiInfoRead(CURLM* multi_handle, int* msgs_in_queue) = 0;
82*1a96fba6SXin Li 
83*1a96fba6SXin Li   // Wrapper around curl_multi_add_handle().
84*1a96fba6SXin Li   virtual CURLMcode MultiAddHandle(CURLM* multi_handle, CURL* curl_handle) = 0;
85*1a96fba6SXin Li 
86*1a96fba6SXin Li   // Wrapper around curl_multi_remove_handle().
87*1a96fba6SXin Li   virtual CURLMcode MultiRemoveHandle(CURLM* multi_handle,
88*1a96fba6SXin Li                                       CURL* curl_handle) = 0;
89*1a96fba6SXin Li 
90*1a96fba6SXin Li   // Wrapper around curl_multi_setopt(CURLMOPT_SOCKETFUNCTION/SOCKETDATA).
91*1a96fba6SXin Li   virtual CURLMcode MultiSetSocketCallback(
92*1a96fba6SXin Li       CURLM* multi_handle,
93*1a96fba6SXin Li       curl_socket_callback socket_callback,
94*1a96fba6SXin Li       void* userp) = 0;
95*1a96fba6SXin Li 
96*1a96fba6SXin Li   // Wrapper around curl_multi_setopt(CURLMOPT_TIMERFUNCTION/TIMERDATA).
97*1a96fba6SXin Li   virtual CURLMcode MultiSetTimerCallback(
98*1a96fba6SXin Li       CURLM* multi_handle,
99*1a96fba6SXin Li       curl_multi_timer_callback timer_callback,
100*1a96fba6SXin Li       void* userp) = 0;
101*1a96fba6SXin Li 
102*1a96fba6SXin Li   // Wrapper around curl_multi_assign().
103*1a96fba6SXin Li   virtual CURLMcode MultiAssign(CURLM* multi_handle,
104*1a96fba6SXin Li                                 curl_socket_t sockfd,
105*1a96fba6SXin Li                                 void* sockp) = 0;
106*1a96fba6SXin Li 
107*1a96fba6SXin Li   // Wrapper around curl_multi_socket_action().
108*1a96fba6SXin Li   virtual CURLMcode MultiSocketAction(CURLM* multi_handle,
109*1a96fba6SXin Li                                       curl_socket_t s,
110*1a96fba6SXin Li                                       int ev_bitmask,
111*1a96fba6SXin Li                                       int* running_handles) = 0;
112*1a96fba6SXin Li 
113*1a96fba6SXin Li   // Wrapper around curl_multi_strerror().
114*1a96fba6SXin Li   virtual std::string MultiStrError(CURLMcode code) const = 0;
115*1a96fba6SXin Li 
116*1a96fba6SXin Li   // Wrapper around curl_multi_perform().
117*1a96fba6SXin Li   virtual CURLMcode MultiPerform(CURLM* multi_handle,
118*1a96fba6SXin Li                                  int* running_handles) = 0;
119*1a96fba6SXin Li 
120*1a96fba6SXin Li   // Wrapper around curl_multi_wait().
121*1a96fba6SXin Li   virtual CURLMcode MultiWait(CURLM* multi_handle,
122*1a96fba6SXin Li                               curl_waitfd extra_fds[],
123*1a96fba6SXin Li                               unsigned int extra_nfds,
124*1a96fba6SXin Li                               int timeout_ms,
125*1a96fba6SXin Li                               int* numfds) = 0;
126*1a96fba6SXin Li 
127*1a96fba6SXin Li  private:
128*1a96fba6SXin Li   DISALLOW_COPY_AND_ASSIGN(CurlInterface);
129*1a96fba6SXin Li };
130*1a96fba6SXin Li 
131*1a96fba6SXin Li class BRILLO_EXPORT CurlApi : public CurlInterface {
132*1a96fba6SXin Li  public:
133*1a96fba6SXin Li   CurlApi();
134*1a96fba6SXin Li   ~CurlApi() override;
135*1a96fba6SXin Li 
136*1a96fba6SXin Li   // Wrapper around curl_easy_init().
137*1a96fba6SXin Li   CURL* EasyInit() override;
138*1a96fba6SXin Li 
139*1a96fba6SXin Li   // Wrapper around curl_easy_cleanup().
140*1a96fba6SXin Li   void EasyCleanup(CURL* curl) override;
141*1a96fba6SXin Li 
142*1a96fba6SXin Li   // Wrappers around curl_easy_setopt().
143*1a96fba6SXin Li   CURLcode EasySetOptInt(CURL* curl, CURLoption option, int value) override;
144*1a96fba6SXin Li   CURLcode EasySetOptStr(CURL* curl,
145*1a96fba6SXin Li                          CURLoption option,
146*1a96fba6SXin Li                          const std::string& value) override;
147*1a96fba6SXin Li   CURLcode EasySetOptPtr(CURL* curl, CURLoption option, void* value) override;
148*1a96fba6SXin Li   CURLcode EasySetOptCallback(CURL* curl,
149*1a96fba6SXin Li                               CURLoption option,
150*1a96fba6SXin Li                               intptr_t address) override;
151*1a96fba6SXin Li   CURLcode EasySetOptOffT(CURL* curl,
152*1a96fba6SXin Li                           CURLoption option,
153*1a96fba6SXin Li                           curl_off_t value) override;
154*1a96fba6SXin Li 
155*1a96fba6SXin Li   // Wrapper around curl_easy_perform().
156*1a96fba6SXin Li   CURLcode EasyPerform(CURL* curl) override;
157*1a96fba6SXin Li 
158*1a96fba6SXin Li   // Wrappers around curl_easy_getinfo().
159*1a96fba6SXin Li   CURLcode EasyGetInfoInt(CURL* curl, CURLINFO info, int* value) const override;
160*1a96fba6SXin Li   CURLcode EasyGetInfoDbl(CURL* curl,
161*1a96fba6SXin Li                           CURLINFO info,
162*1a96fba6SXin Li                           double* value) const override;
163*1a96fba6SXin Li   CURLcode EasyGetInfoStr(CURL* curl,
164*1a96fba6SXin Li                           CURLINFO info,
165*1a96fba6SXin Li                           std::string* value) const override;
166*1a96fba6SXin Li   CURLcode EasyGetInfoPtr(CURL* curl,
167*1a96fba6SXin Li                           CURLINFO info,
168*1a96fba6SXin Li                           void** value) const override;
169*1a96fba6SXin Li 
170*1a96fba6SXin Li   // Wrapper around curl_easy_strerror().
171*1a96fba6SXin Li   std::string EasyStrError(CURLcode code) const override;
172*1a96fba6SXin Li 
173*1a96fba6SXin Li   // Wrapper around curl_multi_init().
174*1a96fba6SXin Li   CURLM* MultiInit() override;
175*1a96fba6SXin Li 
176*1a96fba6SXin Li   // Wrapper around curl_multi_cleanup().
177*1a96fba6SXin Li   CURLMcode MultiCleanup(CURLM* multi_handle) override;
178*1a96fba6SXin Li 
179*1a96fba6SXin Li   // Wrapper around curl_multi_info_read().
180*1a96fba6SXin Li   CURLMsg* MultiInfoRead(CURLM* multi_handle, int* msgs_in_queue) override;
181*1a96fba6SXin Li 
182*1a96fba6SXin Li   // Wrapper around curl_multi_add_handle().
183*1a96fba6SXin Li   CURLMcode MultiAddHandle(CURLM* multi_handle, CURL* curl_handle) override;
184*1a96fba6SXin Li 
185*1a96fba6SXin Li   // Wrapper around curl_multi_remove_handle().
186*1a96fba6SXin Li   CURLMcode MultiRemoveHandle(CURLM* multi_handle, CURL* curl_handle) override;
187*1a96fba6SXin Li 
188*1a96fba6SXin Li   // Wrapper around curl_multi_setopt(CURLMOPT_SOCKETFUNCTION/SOCKETDATA).
189*1a96fba6SXin Li   CURLMcode MultiSetSocketCallback(
190*1a96fba6SXin Li       CURLM* multi_handle,
191*1a96fba6SXin Li       curl_socket_callback socket_callback,
192*1a96fba6SXin Li       void* userp) override;
193*1a96fba6SXin Li 
194*1a96fba6SXin Li   // Wrapper around curl_multi_setopt(CURLMOPT_TIMERFUNCTION/TIMERDATA).
195*1a96fba6SXin Li   CURLMcode MultiSetTimerCallback(
196*1a96fba6SXin Li       CURLM* multi_handle,
197*1a96fba6SXin Li       curl_multi_timer_callback timer_callback,
198*1a96fba6SXin Li       void* userp) override;
199*1a96fba6SXin Li 
200*1a96fba6SXin Li   // Wrapper around curl_multi_assign().
201*1a96fba6SXin Li   CURLMcode MultiAssign(CURLM* multi_handle,
202*1a96fba6SXin Li                         curl_socket_t sockfd,
203*1a96fba6SXin Li                         void* sockp) override;
204*1a96fba6SXin Li 
205*1a96fba6SXin Li   // Wrapper around curl_multi_socket_action().
206*1a96fba6SXin Li   CURLMcode MultiSocketAction(CURLM* multi_handle,
207*1a96fba6SXin Li                               curl_socket_t s,
208*1a96fba6SXin Li                               int ev_bitmask,
209*1a96fba6SXin Li                               int* running_handles) override;
210*1a96fba6SXin Li 
211*1a96fba6SXin Li   // Wrapper around curl_multi_strerror().
212*1a96fba6SXin Li   std::string MultiStrError(CURLMcode code) const override;
213*1a96fba6SXin Li 
214*1a96fba6SXin Li   // Wrapper around curl_multi_perform().
215*1a96fba6SXin Li   CURLMcode MultiPerform(CURLM* multi_handle,
216*1a96fba6SXin Li                          int* running_handles) override;
217*1a96fba6SXin Li 
218*1a96fba6SXin Li   // Wrapper around curl_multi_wait().
219*1a96fba6SXin Li   CURLMcode MultiWait(CURLM* multi_handle,
220*1a96fba6SXin Li                       curl_waitfd extra_fds[],
221*1a96fba6SXin Li                       unsigned int extra_nfds,
222*1a96fba6SXin Li                       int timeout_ms,
223*1a96fba6SXin Li                       int* numfds) override;
224*1a96fba6SXin Li 
225*1a96fba6SXin Li  private:
226*1a96fba6SXin Li   DISALLOW_COPY_AND_ASSIGN(CurlApi);
227*1a96fba6SXin Li };
228*1a96fba6SXin Li 
229*1a96fba6SXin Li }  // namespace http
230*1a96fba6SXin Li }  // namespace brillo
231*1a96fba6SXin Li 
232*1a96fba6SXin Li #endif  // LIBBRILLO_BRILLO_HTTP_CURL_API_H_
233