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 BS |
15 | HTTPHelper::HTTPHelper() |
16 | : Proxy("") | |
17 | , ProxyPort(0) | |
18 | , Log(new Logger) | |
19 | { | |
20 | } | |
21 | ||
d5a516ba BS |
22 | |
23 | /** | |
24 | * Constructor | |
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 | */ | |
2dd2db3e | 31 | HTTPHelper::HTTPHelper(Logger::Ptr _log, const string& _proxy, const int _proxy_port, const string& _username, const string& _password) |
efbde536 BS |
32 | { |
33 | Log = _log; | |
34 | Proxy = _proxy; | |
35 | ProxyPort = _proxy_port; | |
36 | CurlEasyHandle = init_curl(CurlWritedataBuff, CurlErrBuff); | |
2dd2db3e BS |
37 | |
38 | set_curl_auth(_username,_password); | |
efbde536 BS |
39 | } |
40 | ||
41 | ||
d5a516ba BS |
42 | /** |
43 | * Destructor | |
44 | */ | |
efbde536 BS |
45 | HTTPHelper::~HTTPHelper() |
46 | { | |
47 | } | |
48 | ||
49 | ||
efbde536 BS |
50 | /** |
51 | * Perform a HTTP GET operation | |
52 | * @param url URL for HTTP GET operation | |
d5a516ba | 53 | * @return The status code from the http operation or -1 if an curl error occurs |
efbde536 | 54 | */ |
d5a516ba | 55 | long HTTPHelper::http_get(const string& url) |
efbde536 BS |
56 | { |
57 | int curl_err_code; | |
d5a516ba | 58 | long curl_info; |
efbde536 BS |
59 | |
60 | set_curl_url(url); | |
61 | ||
62 | if ( (curl_err_code = curl_easy_perform(CurlEasyHandle) ) != 0 ) | |
63 | { | |
d5a516ba BS |
64 | Log->print_curl_error(url,curl_err_code,CurlErrBuff); |
65 | return -1; | |
66 | } | |
67 | if ( (curl_err_code = curl_easy_getinfo(CurlEasyHandle,CURLINFO_RESPONSE_CODE,&curl_info)) != 0 ) | |
68 | { | |
69 | Log->print_curl_error(url,curl_err_code); | |
70 | return -1; | |
efbde536 | 71 | } |
d5a516ba BS |
72 | |
73 | Log->print_curl_data(CurlWritedataBuff); | |
74 | ||
75 | // Operation performed without any problems so we can return the curl_info | |
76 | return curl_info; | |
efbde536 BS |
77 | } |
78 | ||
79 | ||
80 | /** | |
81 | * Initialized curl easy handle with a few options. | |
82 | * @param curl_writedata_buff Reference to a string wich will be filled with the curl result | |
83 | * @param curl_err_buff A pointer to an char array which will be filled with error message. | |
84 | * @return A pointer to the easy curl handle. | |
85 | */ | |
86 | CURL* HTTPHelper::init_curl(string& curl_writedata_buff,char* curl_err_buff) const | |
87 | { | |
88 | CURL *curl_easy_handle = curl_easy_init(); | |
89 | ||
90 | curl_easy_setopt(curl_easy_handle,CURLOPT_NOPROGRESS,1); | |
91 | curl_easy_setopt(curl_easy_handle,CURLOPT_CONNECTTIMEOUT,5); | |
92 | curl_easy_setopt(curl_easy_handle,CURLOPT_TIMEOUT,10); | |
93 | curl_easy_setopt(curl_easy_handle,CURLOPT_BUFFERSIZE,1024); | |
94 | curl_easy_setopt(curl_easy_handle,CURLOPT_ERRORBUFFER,curl_err_buff); | |
95 | curl_easy_setopt(curl_easy_handle,CURLOPT_WRITEFUNCTION,http_receive); | |
96 | curl_easy_setopt(curl_easy_handle,CURLOPT_WRITEDATA,&curl_writedata_buff); | |
97 | ||
98 | if ( !Proxy.empty() ) | |
99 | { | |
100 | curl_easy_setopt(curl_easy_handle,CURLOPT_PROXY,Proxy.c_str()); | |
101 | curl_easy_setopt(curl_easy_handle,CURLOPT_PROXYPORT,ProxyPort); | |
102 | } | |
103 | ||
104 | return curl_easy_handle; | |
105 | } | |
106 | ||
107 | ||
108 | /** | |
109 | * Sets a url to the easy curl handle | |
110 | * @param url The url to set. | |
111 | */ | |
112 | void HTTPHelper::set_curl_url(const string& url) | |
113 | { | |
114 | curl_easy_setopt(CurlEasyHandle,CURLOPT_URL,url.c_str()); | |
115 | } | |
116 | ||
117 | ||
118 | /** | |
2dd2db3e BS |
119 | * Sets HTTP AUTH parameters |
120 | * @param username The username for HTTP AUTH | |
121 | * @param password The password for HTTP AUTH | |
122 | */ | |
123 | void HTTPHelper::set_curl_auth(const string& username, const string& password) | |
124 | { | |
125 | curl_easy_setopt(CurlEasyHandle,CURLOPT_USERNAME,username.c_str()); | |
126 | curl_easy_setopt(CurlEasyHandle,CURLOPT_PASSWORD,password.c_str()); | |
127 | } | |
128 | ||
129 | ||
130 | /** | |
efbde536 BS |
131 | * Callback Function is called every time CURL is receiving data from HTTPS-Server and will copy all received Data to the given stream pointer |
132 | * @param inBuffer Pointer to input. | |
133 | * @param size How many mem blocks are received | |
134 | * @param nmemb size of each memblock | |
135 | * @param outBuffer Pointer to output stream. | |
136 | * @return The size received. | |
137 | */ | |
138 | int HTTPHelper::http_receive( char *inBuffer, size_t size, size_t nmemb, string *outBuffer ) | |
139 | { | |
140 | outBuffer->append(inBuffer); | |
141 | return (size*nmemb); | |
142 | } | |
143 |