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