in libftl/ingest.c [226:339]
OS_THREAD_ROUTINE _ingest_get_hosts(ftl_stream_configuration_private_t *ftl) {
CURL *curl_handle;
CURLcode res;
struct MemoryStruct chunk;
char *query_result = NULL;
size_t i = 0;
int total_ingest_cnt = 0;
json_error_t error;
json_t *ingests = NULL, *ingest_item = NULL, *ingest_array = NULL;
curl_handle = curl_easy_init();
chunk.memory = malloc(1); /* will be grown as needed by realloc */
chunk.size = 0; /* no data at this point */
char ingestBestUrl[1024], vendorName[100], vendorVersion[100], ftlSdkVersion[20];
struct curl_slist *list = NULL;
int formatUri = snprintf(ingestBestUrl, sizeof(ingestBestUrl), INGEST_LIST_URI, ftl->channel_id);
curl_easy_setopt(curl_handle, CURLOPT_URL, ingestBestUrl);
int formatVendorName = snprintf(vendorName, sizeof(vendorName), "MS-ClientId: %s", ftl->vendor_name);
int formatVendorVersion = snprintf(vendorVersion, sizeof(vendorVersion), "MS-ClientVersion: %s", ftl->vendor_version);
int formatFtlSdkVersion = snprintf(ftlSdkVersion, sizeof(ftlSdkVersion), "ftlsdk/%d.%d.%d", FTL_VERSION_MAJOR, FTL_VERSION_MINOR, FTL_VERSION_MAINTENANCE);
if (formatVendorName > 0) {
list = curl_slist_append(list, vendorName);
}
if (formatVendorVersion > 0) {
list = curl_slist_append(list, vendorVersion);
}
if (list != NULL) {
curl_easy_setopt(curl_handle, CURLOPT_HTTPHEADER, list);
}
curl_easy_setopt(curl_handle, CURLOPT_SSL_VERIFYPEER, TRUE);
curl_easy_setopt(curl_handle, CURLOPT_SSL_VERIFYHOST, 2L);
curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, _curl_write_callback);
curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&chunk);
if (formatFtlSdkVersion > 0) {
curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, ftlSdkVersion);
}
else {
curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "ftlsdk/0.10.0");
}
curl_easy_setopt(curl_handle, CURLOPT_FOLLOWLOCATION, 1L);
#if LIBCURL_VERSION_NUM >= 0x072400
// A lot of servers don't yet support ALPN
curl_easy_setopt(curl_handle, CURLOPT_SSL_ENABLE_ALPN, 0);
#endif
res = curl_easy_perform(curl_handle);
if (res != CURLE_OK) {
printf("curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
goto cleanup;
}
if ((ingests = json_loadb(chunk.memory, chunk.size, 0, &error)) == NULL) {
goto cleanup;
}
ingest_array = json_object_get(ingests, "ingests");
size_t size = json_array_size(ingest_array);
for (i = 0; i < size; i++) {
char *name = NULL;
ingest_item = json_array_get(ingest_array, i);
if (json_unpack(ingest_item, "{s:s}", "name", &name) < 0) {
continue;
}
ftl_ingest_t *ingest_elmt;
if ((ingest_elmt = malloc(sizeof(ftl_ingest_t))) == NULL) {
goto cleanup;
}
ingest_elmt->name = _strdup(name);
ingest_elmt->rtt = 500;
ingest_elmt->next = NULL;
if (ftl->ingest_list == NULL) {
ftl->ingest_list = ingest_elmt;
}
else {
ftl_ingest_t *tail = ftl->ingest_list;
while (tail->next != NULL) {
tail = tail->next;
}
tail->next = ingest_elmt;
}
total_ingest_cnt++;
}
cleanup:
free(chunk.memory);
curl_easy_cleanup(curl_handle);
if (ingests != NULL) {
json_decref(ingests);
}
ftl->ingest_count = total_ingest_cnt;
return total_ingest_cnt;
}