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