xref: /aosp_15_r20/external/google-breakpad/src/common/linux/libcurl_wrapper.h (revision 9712c20fc9bbfbac4935993a2ca0b3958c5adad2)
1*9712c20fSFrederick Mayle // Copyright 2009 Google LLC
2*9712c20fSFrederick Mayle //
3*9712c20fSFrederick Mayle // Redistribution and use in source and binary forms, with or without
4*9712c20fSFrederick Mayle // modification, are permitted provided that the following conditions are
5*9712c20fSFrederick Mayle // met:
6*9712c20fSFrederick Mayle //
7*9712c20fSFrederick Mayle //     * Redistributions of source code must retain the above copyright
8*9712c20fSFrederick Mayle // notice, this list of conditions and the following disclaimer.
9*9712c20fSFrederick Mayle //     * Redistributions in binary form must reproduce the above
10*9712c20fSFrederick Mayle // copyright notice, this list of conditions and the following disclaimer
11*9712c20fSFrederick Mayle // in the documentation and/or other materials provided with the
12*9712c20fSFrederick Mayle // distribution.
13*9712c20fSFrederick Mayle //     * Neither the name of Google LLC nor the names of its
14*9712c20fSFrederick Mayle // contributors may be used to endorse or promote products derived from
15*9712c20fSFrederick Mayle // this software without specific prior written permission.
16*9712c20fSFrederick Mayle //
17*9712c20fSFrederick Mayle // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18*9712c20fSFrederick Mayle // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19*9712c20fSFrederick Mayle // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20*9712c20fSFrederick Mayle // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21*9712c20fSFrederick Mayle // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22*9712c20fSFrederick Mayle // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23*9712c20fSFrederick Mayle // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24*9712c20fSFrederick Mayle // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25*9712c20fSFrederick Mayle // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26*9712c20fSFrederick Mayle // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27*9712c20fSFrederick Mayle // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*9712c20fSFrederick Mayle 
29*9712c20fSFrederick Mayle // A wrapper for libcurl to do HTTP Uploads, to support easy mocking
30*9712c20fSFrederick Mayle // and unit testing of the HTTPUpload class.
31*9712c20fSFrederick Mayle 
32*9712c20fSFrederick Mayle #ifndef COMMON_LINUX_LIBCURL_WRAPPER_H_
33*9712c20fSFrederick Mayle #define COMMON_LINUX_LIBCURL_WRAPPER_H_
34*9712c20fSFrederick Mayle 
35*9712c20fSFrederick Mayle #include <string>
36*9712c20fSFrederick Mayle #include <map>
37*9712c20fSFrederick Mayle 
38*9712c20fSFrederick Mayle #include "common/using_std_string.h"
39*9712c20fSFrederick Mayle #include "third_party/curl/curl.h"
40*9712c20fSFrederick Mayle 
41*9712c20fSFrederick Mayle namespace google_breakpad {
42*9712c20fSFrederick Mayle 
43*9712c20fSFrederick Mayle // This class is only safe to be used on single-threaded code because of its
44*9712c20fSFrederick Mayle // usage of libcurl's curl_global_cleanup().
45*9712c20fSFrederick Mayle class LibcurlWrapper {
46*9712c20fSFrederick Mayle  public:
47*9712c20fSFrederick Mayle   LibcurlWrapper();
48*9712c20fSFrederick Mayle   virtual ~LibcurlWrapper();
49*9712c20fSFrederick Mayle   virtual bool Init();
50*9712c20fSFrederick Mayle   virtual bool SetProxy(const string& proxy_host,
51*9712c20fSFrederick Mayle                         const string& proxy_userpwd);
52*9712c20fSFrederick Mayle   virtual bool AddFile(const string& upload_file_path,
53*9712c20fSFrederick Mayle                        const string& basename);
54*9712c20fSFrederick Mayle   virtual bool SendRequest(const string& url,
55*9712c20fSFrederick Mayle                            const std::map<string, string>& parameters,
56*9712c20fSFrederick Mayle                            long* http_status_code,
57*9712c20fSFrederick Mayle                            string* http_header_data,
58*9712c20fSFrederick Mayle                            string* http_response_data);
59*9712c20fSFrederick Mayle   bool SendGetRequest(const string& url,
60*9712c20fSFrederick Mayle                       long* http_status_code,
61*9712c20fSFrederick Mayle                       string* http_header_data,
62*9712c20fSFrederick Mayle                       string* http_response_data);
63*9712c20fSFrederick Mayle   bool SendPutRequest(const string& url,
64*9712c20fSFrederick Mayle                       const string& path,
65*9712c20fSFrederick Mayle                       long* http_status_code,
66*9712c20fSFrederick Mayle                       string* http_header_data,
67*9712c20fSFrederick Mayle                       string* http_response_data);
68*9712c20fSFrederick Mayle   bool SendSimplePostRequest(const string& url,
69*9712c20fSFrederick Mayle                              const string& body,
70*9712c20fSFrederick Mayle                              const string& content_type,
71*9712c20fSFrederick Mayle                              long* http_status_code,
72*9712c20fSFrederick Mayle                              string* http_header_data,
73*9712c20fSFrederick Mayle                              string* http_response_data);
74*9712c20fSFrederick Mayle 
75*9712c20fSFrederick Mayle  private:
76*9712c20fSFrederick Mayle   // This function initializes class state corresponding to function
77*9712c20fSFrederick Mayle   // pointers into the CURL library.
78*9712c20fSFrederick Mayle   bool SetFunctionPointers();
79*9712c20fSFrederick Mayle 
80*9712c20fSFrederick Mayle   bool SendRequestInner(const string& url,
81*9712c20fSFrederick Mayle                         long* http_status_code,
82*9712c20fSFrederick Mayle                         string* http_header_data,
83*9712c20fSFrederick Mayle                         string* http_response_data);
84*9712c20fSFrederick Mayle 
85*9712c20fSFrederick Mayle   void Reset();
86*9712c20fSFrederick Mayle 
87*9712c20fSFrederick Mayle   bool CheckInit();
88*9712c20fSFrederick Mayle 
89*9712c20fSFrederick Mayle   bool init_ok_;                 // Whether init succeeded
90*9712c20fSFrederick Mayle   void* curl_lib_;               // Pointer to result of dlopen() on
91*9712c20fSFrederick Mayle                                  // curl library
92*9712c20fSFrederick Mayle   string last_curl_error_;  // The text of the last error when
93*9712c20fSFrederick Mayle                                  // dealing
94*9712c20fSFrederick Mayle   // with CURL.
95*9712c20fSFrederick Mayle 
96*9712c20fSFrederick Mayle   CURL* curl_;                   // Pointer for handle for CURL calls.
97*9712c20fSFrederick Mayle 
98*9712c20fSFrederick Mayle   CURL* (*easy_init_)(void);
99*9712c20fSFrederick Mayle 
100*9712c20fSFrederick Mayle   // Stateful pointers for calling into curl_formadd()
101*9712c20fSFrederick Mayle   struct curl_httppost* formpost_;
102*9712c20fSFrederick Mayle   struct curl_httppost* lastptr_;
103*9712c20fSFrederick Mayle   struct curl_slist* headerlist_;
104*9712c20fSFrederick Mayle 
105*9712c20fSFrederick Mayle   // Function pointers into CURL library
106*9712c20fSFrederick Mayle   CURLcode (*easy_setopt_)(CURL*, CURLoption, ...);
107*9712c20fSFrederick Mayle   CURLFORMcode (*formadd_)(struct curl_httppost**,
108*9712c20fSFrederick Mayle                            struct curl_httppost**, ...);
109*9712c20fSFrederick Mayle   struct curl_slist* (*slist_append_)(struct curl_slist*, const char*);
110*9712c20fSFrederick Mayle   void (*slist_free_all_)(struct curl_slist*);
111*9712c20fSFrederick Mayle   CURLcode (*easy_perform_)(CURL*);
112*9712c20fSFrederick Mayle   const char* (*easy_strerror_)(CURLcode);
113*9712c20fSFrederick Mayle   void (*easy_cleanup_)(CURL*);
114*9712c20fSFrederick Mayle   CURLcode (*easy_getinfo_)(CURL*, CURLINFO info, ...);
115*9712c20fSFrederick Mayle   void (*easy_reset_)(CURL*);
116*9712c20fSFrederick Mayle   void (*formfree_)(struct curl_httppost*);
117*9712c20fSFrederick Mayle   void (*global_cleanup_)(void);
118*9712c20fSFrederick Mayle 
119*9712c20fSFrederick Mayle };
120*9712c20fSFrederick Mayle }
121*9712c20fSFrederick Mayle 
122*9712c20fSFrederick Mayle #endif  // COMMON_LINUX_LIBCURL_WRAPPER_H_
123