Changeset 44530 for titan/titan/sock.h
- Timestamp:
- 01/16/20 15:12:00 (3 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
titan/titan/sock.h
r44294 r44530 1150 1150 } 1151 1151 1152 #include <stdio.h>1153 #include <curl/curl.h>1154 1155 struct MemoryStruct {1156 char *memory;1157 size_t size;1158 };1159 1160 static size_t1161 WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp)1162 {1163 size_t realsize = size * nmemb;1164 struct MemoryStruct *mem = (struct MemoryStruct *)userp;1165 1166 mem->memory = realloc(mem->memory, mem->size + realsize + 1);1167 if(mem->memory == NULL) {1168 /* out of memory! */1169 printf("not enough memory (realloc returned NULL)\n");1170 return 0;1171 }1172 1173 memcpy(&(mem->memory[mem->size]), contents, realsize);1174 mem->size += realsize;1175 mem->memory[mem->size] = 0;1176 1177 return realsize;1178 }1179 1180 static size_t writeCallback(void *contents, size_t size, size_t nitems, FILE *file) {1181 return fwrite(contents, size, nitems, file);1182 }1183 1184 // flag = 0 (without header in output)1185 // flag = 1 (with header in output)1186 char* gethttps(char* url, char* localfile, char* data, char* user, char* pass, char* referer, int flag)1187 {1188 debug(99, "url: %s", url);1189 1190 int debuglevel = getconfigint("debuglevel", NULL);1191 1192 char* tmpstr = NULL;1193 FILE *fp;1194 1195 CURL *curl_handle;1196 CURLcode res;1197 1198 struct MemoryStruct chunk;1199 1200 chunk.memory = malloc(1); /* will be grown as needed by the realloc above */1201 chunk.size = 0; /* no data at this point */1202 1203 curl_global_init(CURL_GLOBAL_ALL);1204 1205 /* init the curl session */1206 curl_handle = curl_easy_init();1207 if(curl_handle)1208 {1209 if(localfile != NULL)1210 fp = fopen(localfile,"wb");1211 1212 /* specify URL to get */1213 curl_easy_setopt(curl_handle, CURLOPT_URL, url);1214 1215 if(user != NULL && pass != NULL)1216 {1217 curl_easy_setopt(curl_handle, CURLOPT_USERNAME, user);1218 curl_easy_setopt(curl_handle, CURLOPT_PASSWORD, pass);1219 curl_easy_setopt(curl_handle, CURLOPT_HTTPAUTH, CURLAUTH_ANY);1220 }1221 if(data == NULL)1222 curl_easy_setopt(curl_handle, CURLOPT_HTTPGET, 1L);1223 else1224 {1225 curl_easy_setopt(curl_handle, CURLOPT_POST, 1);1226 curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDS, data);1227 1228 /* example.com is redirected, so we tell libcurl to send POST on 301, 302 and1229 303 HTTP response codes */1230 curl_easy_setopt(curl_handle, CURLOPT_POSTREDIR, CURL_REDIR_POST_ALL);1231 }1232 if(flag == 1)1233 curl_easy_setopt(curl_handle, CURLOPT_HEADER, 1L);1234 curl_easy_setopt(curl_handle, CURLOPT_CONNECTTIMEOUT, 5);1235 curl_easy_setopt(curl_handle, CURLOPT_TIMEOUT, 3);1236 // curl_easy_setopt(curl_handle, CURLOPT_RETURNTRANSFER, 1);1237 1238 if(localfile == NULL)1239 {1240 /* send all data to this function */1241 curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);1242 }1243 else1244 {1245 /* When data arrives, curl will call writeCallback. */1246 curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, writeCallback);1247 }1248 1249 1250 1251 if(localfile == NULL)1252 {1253 /* we pass our 'chunk' struct to the callback function */1254 curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&chunk);1255 }1256 else1257 {1258 /* The last argument to writeCallback will be our file: */1259 curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)fp);1260 }1261 1262 /* some servers don't like requests that are made without a user-agent field, so we provide one */1263 // curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "libcurl-agent/1.0");1264 curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.7.3000 Chrome/30.0.1599.101 Safari/537.36");1265 1266 // This is occassionally required to stop CURL from verifying the peers certificate.1267 // CURLOPT_SSL_VERIFYHOST may also need to be TRUE or FALSE if1268 // CURLOPT_SSL_VERIFYPEER is disabled (it defaults to 2 - check the existence of a1269 // common name and also verify that it matches the hostname provided)1270 #ifdef MIPSEL1271 curl_easy_setopt(curl_handle, CURLOPT_SSL_VERIFYPEER, 1L);1272 #else1273 curl_easy_setopt(curl_handle, CURLOPT_SSL_VERIFYPEER, 0L);1274 1152 #endif 1275 1276 curl_easy_setopt(curl_handle, CURLOPT_SSL_VERIFYHOST, 0L);1277 if(debuglevel == 99)1278 curl_easy_setopt(curl_handle, CURLOPT_VERBOSE, 1);1279 curl_easy_setopt(curl_handle, CURLOPT_COOKIEFILE, "/mnt/network/cookies");1280 curl_easy_setopt(curl_handle, CURLOPT_COOKIEJAR, "/mnt/network/cookies");1281 /* enable redirect following */1282 curl_easy_setopt(curl_handle, CURLOPT_FOLLOWLOCATION, 1L);1283 /* allow three redirects */1284 curl_easy_setopt(curl_handle, CURLOPT_MAXREDIRS, 3L);1285 1286 1287 /* enable all supported built-in compressions */1288 curl_easy_setopt(curl_handle, CURLOPT_ACCEPT_ENCODING, "");1289 1290 if(referer == NULL)1291 curl_easy_setopt(curl_handle, CURLOPT_AUTOREFERER, 1L);1292 else1293 curl_easy_setopt(curl_handle, CURLOPT_REFERER, referer);1294 1295 1296 /* get it! */1297 res = curl_easy_perform(curl_handle);1298 1299 /* check for errors */1300 if(res != CURLE_OK)1301 {1302 err("failed: %s", curl_easy_strerror(res));1303 printf("curl error\n");1304 }1305 else1306 {1307 /*1308 * Now, our chunk.memory points to a memory block that is chunk.size1309 * bytes big and contains the remote file.1310 *1311 * Do something nice with it!1312 */1313 printf("%lu bytes retrieved\n", (long)chunk.size);1314 }1315 1316 /* cleanup curl stuff */1317 curl_easy_cleanup(curl_handle);1318 if(localfile != NULL)1319 fclose(fp);1320 }1321 1322 if(localfile == NULL)1323 tmpstr = ostrcat(chunk.memory, NULL, 0, 0);1324 1325 free(chunk.memory);1326 /* we're done with libcurl, so clean it up */1327 1328 curl_global_cleanup();1329 1330 if(localfile != NULL)1331 free(tmpstr), tmpstr = NULL;1332 1333 return tmpstr;1334 }1335 1336 #endif
Note: See TracChangeset
for help on using the changeset viewer.