1+ #include " Http/GAHttpCurl.h"
2+ #include " GAHTTPApi.h"
3+ #include " GALogger.h"
4+
5+ namespace gameanalytics
6+ {
7+ size_t writefunc (void *ptr, size_t size, size_t nmemb, GAHttpWrapper::Response *s)
8+ {
9+ if (!s || !ptr)
10+ {
11+ return 0 ;
12+ }
13+
14+ const size_t new_len = s->packet .size () + size * nmemb + 1 ;
15+ s->packet .reserve (new_len);
16+
17+ s->packet .insert (s->packet .end (), reinterpret_cast <char *>(ptr), reinterpret_cast <char *>(ptr) + size * nmemb);
18+ s->packet .push_back (' \0 ' );
19+
20+ return size*nmemb;
21+ }
22+
23+ void GAHttpCurl::initialize ()
24+ {
25+ curl_global_init (CURL_GLOBAL_DEFAULT);
26+ }
27+
28+ void GAHttpCurl::cleanup ()
29+ {
30+ curl_global_cleanup ();
31+ }
32+
33+ GAHttpWrapper::Response GAHttpCurl::sendRequest (std::string const & url, std::string const & auth, std::vector<uint8_t > const & payloadData, bool useGzip, void * userData)
34+ {
35+ CURL* curl = nullptr ;
36+ CURLcode res{};
37+ curl = curl_easy_init ();
38+ if (!curl)
39+ {
40+ return {};
41+ }
42+
43+ curl_easy_setopt (curl, CURLOPT_SSL_VERIFYPEER, 0L );
44+
45+ GAHttpWrapper::Response s = {};
46+
47+ curl_easy_setopt (curl, CURLOPT_WRITEFUNCTION, writefunc);
48+ curl_easy_setopt (curl, CURLOPT_WRITEDATA, &s);
49+
50+ createRequest (curl, url, auth, payloadData, useGzip);
51+
52+ res = curl_easy_perform (curl);
53+ if (res != CURLE_OK)
54+ {
55+ logging::GALogger::d (" %s" , curl_easy_strerror (res));
56+ return {};
57+ }
58+
59+ curl_easy_getinfo (curl, CURLINFO_RESPONSE_CODE, &s.code );
60+ curl_easy_cleanup (curl);
61+
62+ return s;
63+ }
64+
65+ void GAHttpCurl::createRequest (CURL *curl, std::string const & url, std::string const & auth, const std::vector<uint8_t >& payloadData, bool gzip)
66+ {
67+ if (!curl)
68+ {
69+ return ;
70+ }
71+
72+ curl_easy_setopt (curl, CURLOPT_URL, url.c_str ());
73+ curl_easy_setopt (curl, CURLOPT_POST, 1L );
74+ struct curl_slist *header = NULL ;
75+
76+ if (gzip)
77+ {
78+ header = curl_slist_append (header, " Content-Encoding: gzip" );
79+ }
80+
81+ header = curl_slist_append (header, auth.c_str ());
82+
83+ // always JSON
84+ header = curl_slist_append (header, " Content-Type: application/json" );
85+
86+ curl_easy_setopt (curl, CURLOPT_HTTPHEADER, header);
87+ curl_easy_setopt (curl, CURLOPT_POSTFIELDS, payloadData.data ());
88+ curl_easy_setopt (curl, CURLOPT_SSL_VERIFYPEER, 0L );
89+ curl_easy_setopt (curl, CURLOPT_POSTFIELDSIZE, payloadData.size ());
90+ }
91+ }
0 commit comments