Commit | Line | Data |
---|---|---|
efbde536 BS |
1 | /** @file |
2 | * @brief HTTPHelper class implementation. This class represents a Helper to perform HTTP operations easily. | |
3 | * | |
4 | * | |
5 | * | |
6 | * @copyright Intra2net AG | |
7 | * @license GPLv2 | |
8 | */ | |
9 | ||
10 | #include "httphelper.h" | |
11 | ||
d5a516ba BS |
12 | /** |
13 | * Default Constructor | |
14 | */ | |
efbde536 | 15 | HTTPHelper::HTTPHelper() |
b30f392d BS |
16 | : Log(new Logger) |
17 | , ProxyPort(0) | |
efbde536 BS |
18 | { |
19 | } | |
20 | ||
d5a516ba BS |
21 | |
22 | /** | |
7de01277 | 23 | * Constructor. Use this constructor if HTTP AUTH should be used. Username and password will then be set as HTTP auth options. |
d5a516ba BS |
24 | * @param _log Logger Object |
25 | * @param _proxy Proxy to use | |
26 | * @param _proxy_port Proxy Port | |
27 | * @param _username Username | |
28 | * @param _password Password | |
29 | */ | |
2dd2db3e | 30 | HTTPHelper::HTTPHelper(Logger::Ptr _log, const string& _proxy, const int _proxy_port, const string& _username, const string& _password) |
6ec86aff TJ |
31 | : Log(_log) |
32 | , Proxy(_proxy) | |
33 | , ProxyPort(_proxy_port) | |
efbde536 | 34 | { |
efbde536 | 35 | CurlEasyHandle = init_curl(CurlWritedataBuff, CurlErrBuff); |
2dd2db3e | 36 | set_curl_auth(_username,_password); |
efbde536 BS |
37 | } |
38 | ||
39 | ||
d5a516ba | 40 | /** |
7de01277 BS |
41 | * Constructor. Use this constructor if you have to encode the username and password into the url |
42 | * @param _log Logger Object | |
43 | * @param _proxy Proxy to use | |
44 | * @param _proxy_port Proxy Port | |
45 | */ | |
46 | HTTPHelper::HTTPHelper(Logger::Ptr _log, const string& _proxy, const int _proxy_port) | |
6ec86aff TJ |
47 | : Log(_log) |
48 | , Proxy(_proxy) | |
49 | , ProxyPort(_proxy_port) | |
7de01277 | 50 | { |
7de01277 BS |
51 | CurlEasyHandle = init_curl(CurlWritedataBuff, CurlErrBuff); |
52 | } | |
53 | ||
54 | ||
55 | /** | |
d5a516ba BS |
56 | * Destructor |
57 | */ | |
efbde536 BS |
58 | HTTPHelper::~HTTPHelper() |
59 | { | |
60 | } | |
61 | ||
62 | ||
efbde536 BS |
63 | /** |
64 | * Perform a HTTP GET operation | |
65 | * @param url URL for HTTP GET operation | |
d5a516ba | 66 | * @return The status code from the http operation or -1 if an curl error occurs |
efbde536 | 67 | */ |
d5a516ba | 68 | long HTTPHelper::http_get(const string& url) |
efbde536 BS |
69 | { |
70 | int curl_err_code; | |
d5a516ba | 71 | long curl_info; |
efbde536 BS |
72 | |
73 | set_curl_url(url); | |
74 | ||
75 | if ( (curl_err_code = curl_easy_perform(CurlEasyHandle) ) != 0 ) | |
76 | { | |
d5a516ba BS |
77 | Log->print_curl_error(url,curl_err_code,CurlErrBuff); |
78 | return -1; | |
79 | } | |
80 | if ( (curl_err_code = curl_easy_getinfo(CurlEasyHandle,CURLINFO_RESPONSE_CODE,&curl_info)) != 0 ) | |
81 | { | |
82 | Log->print_curl_error(url,curl_err_code); | |
83 | return -1; | |
efbde536 | 84 | } |
d5a516ba BS |
85 | |
86 | Log->print_curl_data(CurlWritedataBuff); | |
87 | ||
88 | // Operation performed without any problems so we can return the curl_info | |
89 | return curl_info; | |
efbde536 BS |
90 | } |
91 | ||
92 | ||
93 | /** | |
b6228761 BS |
94 | * Getter for member CurlWritedataBuff |
95 | * @return CurlWritedataBuff | |
96 | */ | |
97 | string HTTPHelper::get_curl_data() const | |
98 | { | |
99 | return CurlWritedataBuff; | |
100 | } | |
101 | ||
102 | ||
103 | /** | |
efbde536 BS |
104 | * Initialized curl easy handle with a few options. |
105 | * @param curl_writedata_buff Reference to a string wich will be filled with the curl result | |
106 | * @param curl_err_buff A pointer to an char array which will be filled with error message. | |
107 | * @return A pointer to the easy curl handle. | |
108 | */ | |
109 | CURL* HTTPHelper::init_curl(string& curl_writedata_buff,char* curl_err_buff) const | |
110 | { | |
1a00eac6 | 111 | string user_agent = "Bullet Proof DYNDNS Daemon - Intra2net AG 2009"; |
b6228761 | 112 | |
efbde536 BS |
113 | CURL *curl_easy_handle = curl_easy_init(); |
114 | ||
115 | curl_easy_setopt(curl_easy_handle,CURLOPT_NOPROGRESS,1); | |
116 | curl_easy_setopt(curl_easy_handle,CURLOPT_CONNECTTIMEOUT,5); | |
117 | curl_easy_setopt(curl_easy_handle,CURLOPT_TIMEOUT,10); | |
118 | curl_easy_setopt(curl_easy_handle,CURLOPT_BUFFERSIZE,1024); | |
119 | curl_easy_setopt(curl_easy_handle,CURLOPT_ERRORBUFFER,curl_err_buff); | |
120 | curl_easy_setopt(curl_easy_handle,CURLOPT_WRITEFUNCTION,http_receive); | |
121 | curl_easy_setopt(curl_easy_handle,CURLOPT_WRITEDATA,&curl_writedata_buff); | |
b6228761 | 122 | curl_easy_setopt(curl_easy_handle,CURLOPT_USERAGENT,&user_agent); |
efbde536 BS |
123 | |
124 | if ( !Proxy.empty() ) | |
125 | { | |
126 | curl_easy_setopt(curl_easy_handle,CURLOPT_PROXY,Proxy.c_str()); | |
127 | curl_easy_setopt(curl_easy_handle,CURLOPT_PROXYPORT,ProxyPort); | |
128 | } | |
129 | ||
130 | return curl_easy_handle; | |
131 | } | |
132 | ||
133 | ||
134 | /** | |
135 | * Sets a url to the easy curl handle | |
136 | * @param url The url to set. | |
137 | */ | |
138 | void HTTPHelper::set_curl_url(const string& url) | |
139 | { | |
140 | curl_easy_setopt(CurlEasyHandle,CURLOPT_URL,url.c_str()); | |
141 | } | |
142 | ||
143 | ||
144 | /** | |
2dd2db3e BS |
145 | * Sets HTTP AUTH parameters |
146 | * @param username The username for HTTP AUTH | |
147 | * @param password The password for HTTP AUTH | |
148 | */ | |
149 | void HTTPHelper::set_curl_auth(const string& username, const string& password) | |
150 | { | |
151 | curl_easy_setopt(CurlEasyHandle,CURLOPT_USERNAME,username.c_str()); | |
152 | curl_easy_setopt(CurlEasyHandle,CURLOPT_PASSWORD,password.c_str()); | |
153 | } | |
154 | ||
155 | ||
156 | /** | |
efbde536 BS |
157 | * Callback Function is called every time CURL is receiving data from HTTPS-Server and will copy all received Data to the given stream pointer |
158 | * @param inBuffer Pointer to input. | |
159 | * @param size How many mem blocks are received | |
160 | * @param nmemb size of each memblock | |
161 | * @param outBuffer Pointer to output stream. | |
162 | * @return The size received. | |
163 | */ | |
164 | int HTTPHelper::http_receive( char *inBuffer, size_t size, size_t nmemb, string *outBuffer ) | |
165 | { | |
166 | outBuffer->append(inBuffer); | |
167 | return (size*nmemb); | |
168 | } | |
169 |