OS_THREAD_ROUTINE _ingest_get_hosts()

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;
}