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