aboutsummaryrefslogtreecommitdiffstats
path: root/brillo/http/curl_api.h
blob: ac4c0eaaaecd7e0157735ec24b00473bba0a7670 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
// Copyright 2014 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef LIBBRILLO_BRILLO_HTTP_CURL_API_H_
#define LIBBRILLO_BRILLO_HTTP_CURL_API_H_

#include <curl/curl.h>

#include <string>

#include <base/macros.h>
#include <brillo/brillo_export.h>

namespace brillo {
namespace http {

// Abstract wrapper around libcurl C API that allows us to mock it out in tests.
class CurlInterface {
 public:
  CurlInterface() = default;
  virtual ~CurlInterface() = default;

  // Wrapper around curl_easy_init().
  virtual CURL* EasyInit() = 0;

  // Wrapper around curl_easy_cleanup().
  virtual void EasyCleanup(CURL* curl) = 0;

  // Wrappers around curl_easy_setopt().
  virtual CURLcode EasySetOptInt(CURL* curl, CURLoption option, int value) = 0;
  virtual CURLcode EasySetOptStr(CURL* curl,
                                 CURLoption option,
                                 const std::string& value) = 0;
  virtual CURLcode EasySetOptPtr(CURL* curl,
                                 CURLoption option,
                                 void* value) = 0;
  virtual CURLcode EasySetOptCallback(CURL* curl,
                                      CURLoption option,
                                      intptr_t address) = 0;
  virtual CURLcode EasySetOptOffT(CURL* curl,
                                  CURLoption option,
                                  curl_off_t value) = 0;

  // A type-safe wrapper around function callback options.
  template<typename R, typename... Args>
  inline CURLcode EasySetOptCallback(CURL* curl,
                                     CURLoption option,
                                     R(*callback)(Args...)) {
    return EasySetOptCallback(
        curl, option, reinterpret_cast<intptr_t>(callback));
  }

  // Wrapper around curl_easy_perform().
  virtual CURLcode EasyPerform(CURL* curl) = 0;

  // Wrappers around curl_easy_getinfo().
  virtual CURLcode EasyGetInfoInt(CURL* curl,
                                  CURLINFO info,
                                  int* value) const = 0;
  virtual CURLcode EasyGetInfoDbl(CURL* curl,
                                  CURLINFO info,
                                  double* value) const = 0;
  virtual CURLcode EasyGetInfoStr(CURL* curl,
                                  CURLINFO info,
                                  std::string* value) const = 0;
  virtual CURLcode EasyGetInfoPtr(CURL* curl,
                                  CURLINFO info,
                                  void** value) const = 0;

  // Wrapper around curl_easy_strerror().
  virtual std::string EasyStrError(CURLcode code) const = 0;

  // Wrapper around curl_multi_init().
  virtual CURLM* MultiInit() = 0;

  // Wrapper around curl_multi_cleanup().
  virtual CURLMcode MultiCleanup(CURLM* multi_handle) = 0;

  // Wrapper around curl_multi_info_read().
  virtual CURLMsg* MultiInfoRead(CURLM* multi_handle, int* msgs_in_queue) = 0;

  // Wrapper around curl_multi_add_handle().
  virtual CURLMcode MultiAddHandle(CURLM* multi_handle, CURL* curl_handle) = 0;

  // Wrapper around curl_multi_remove_handle().
  virtual CURLMcode MultiRemoveHandle(CURLM* multi_handle,
                                      CURL* curl_handle) = 0;

  // Wrapper around curl_multi_setopt(CURLMOPT_SOCKETFUNCTION/SOCKETDATA).
  virtual CURLMcode MultiSetSocketCallback(
      CURLM* multi_handle,
      curl_socket_callback socket_callback,
      void* userp) = 0;

  // Wrapper around curl_multi_setopt(CURLMOPT_TIMERFUNCTION/TIMERDATA).
  virtual CURLMcode MultiSetTimerCallback(
      CURLM* multi_handle,
      curl_multi_timer_callback timer_callback,
      void* userp) = 0;

  // Wrapper around curl_multi_assign().
  virtual CURLMcode MultiAssign(CURLM* multi_handle,
                                curl_socket_t sockfd,
                                void* sockp) = 0;

  // Wrapper around curl_multi_socket_action().
  virtual CURLMcode MultiSocketAction(CURLM* multi_handle,
                                      curl_socket_t s,
                                      int ev_bitmask,
                                      int* running_handles) = 0;

  // Wrapper around curl_multi_strerror().
  virtual std::string MultiStrError(CURLMcode code) const = 0;

 private:
  DISALLOW_COPY_AND_ASSIGN(CurlInterface);
};

class BRILLO_EXPORT CurlApi : public CurlInterface {
 public:
  CurlApi();
  ~CurlApi() override;

  // Wrapper around curl_easy_init().
  CURL* EasyInit() override;

  // Wrapper around curl_easy_cleanup().
  void EasyCleanup(CURL* curl) override;

  // Wrappers around curl_easy_setopt().
  CURLcode EasySetOptInt(CURL* curl, CURLoption option, int value) override;
  CURLcode EasySetOptStr(CURL* curl,
                         CURLoption option,
                         const std::string& value) override;
  CURLcode EasySetOptPtr(CURL* curl, CURLoption option, void* value) override;
  CURLcode EasySetOptCallback(CURL* curl,
                              CURLoption option,
                              intptr_t address) override;
  CURLcode EasySetOptOffT(CURL* curl,
                          CURLoption option,
                          curl_off_t value) override;

  // Wrapper around curl_easy_perform().
  CURLcode EasyPerform(CURL* curl) override;

  // Wrappers around curl_easy_getinfo().
  CURLcode EasyGetInfoInt(CURL* curl, CURLINFO info, int* value) const override;
  CURLcode EasyGetInfoDbl(CURL* curl,
                          CURLINFO info,
                          double* value) const override;
  CURLcode EasyGetInfoStr(CURL* curl,
                          CURLINFO info,
                          std::string* value) const override;
  CURLcode EasyGetInfoPtr(CURL* curl,
                          CURLINFO info,
                          void** value) const override;

  // Wrapper around curl_easy_strerror().
  std::string EasyStrError(CURLcode code) const override;

  // Wrapper around curl_multi_init().
  CURLM* MultiInit() override;

  // Wrapper around curl_multi_cleanup().
  CURLMcode MultiCleanup(CURLM* multi_handle) override;

  // Wrapper around curl_multi_info_read().
  CURLMsg* MultiInfoRead(CURLM* multi_handle, int* msgs_in_queue) override;

  // Wrapper around curl_multi_add_handle().
  CURLMcode MultiAddHandle(CURLM* multi_handle, CURL* curl_handle) override;

  // Wrapper around curl_multi_remove_handle().
  CURLMcode MultiRemoveHandle(CURLM* multi_handle, CURL* curl_handle) override;

  // Wrapper around curl_multi_setopt(CURLMOPT_SOCKETFUNCTION/SOCKETDATA).
  CURLMcode MultiSetSocketCallback(
      CURLM* multi_handle,
      curl_socket_callback socket_callback,
      void* userp) override;

  // Wrapper around curl_multi_setopt(CURLMOPT_TIMERFUNCTION/TIMERDATA).
  CURLMcode MultiSetTimerCallback(
      CURLM* multi_handle,
      curl_multi_timer_callback timer_callback,
      void* userp) override;

  // Wrapper around curl_multi_assign().
  CURLMcode MultiAssign(CURLM* multi_handle,
                        curl_socket_t sockfd,
                        void* sockp) override;

  // Wrapper around curl_multi_socket_action().
  CURLMcode MultiSocketAction(CURLM* multi_handle,
                              curl_socket_t s,
                              int ev_bitmask,
                              int* running_handles) override;

  // Wrapper around curl_multi_strerror().
  std::string MultiStrError(CURLMcode code) const override;

 private:
  DISALLOW_COPY_AND_ASSIGN(CurlApi);
};

}  // namespace http
}  // namespace brillo

#endif  // LIBBRILLO_BRILLO_HTTP_CURL_API_H_