Refactoring: Renamed class IPHelper to a more meaningful name IPAddrHelper.
[bpdyndnsd] / src / httphelper.cpp
CommitLineData
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 15HTTPHelper::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 30HTTPHelper::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 */
46HTTPHelper::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
58HTTPHelper::~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 68long 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 */
97string 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 */
109CURL* 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 */
138void 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 */
149void 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 */
164int HTTPHelper::http_receive( char *inBuffer, size_t size, size_t nmemb, string *outBuffer )
165{
166 outBuffer->append(inBuffer);
167 return (size*nmemb);
168}
169