Можно ли ускорить выполнение curl, если сервер посылает Connection close?
Мне нужно рекурсивно загружать страницы с JSON, пока next_page не будет NULL.
Окей, это сделано, страницы грузятся, но, 50 страниц, прогружаются где-то за 20-30 секунд, как я понимаю, это потому что API сервер всегда отсылает заголовок Connection: close, но возможно я что-то упустил?
Что можно подправить в коде, если это возможно что бы это дело шло быстрее?
Функция отвечающая за прогрузку:
kodik_materials_list_t *kodik_materials_list(const char *psz_url) {
char *psz_tmp_url = strdup(psz_url);
CURL *curl = NULL;
CURLcode res = CURLE_OK;
kodik_materials_list_t *list = NULL;
string_t s;
json_object *j_obj = NULL;
curl = curl_easy_init();
if (curl) {
kodik_materials_list_t **current_list = &list;
res = curl_easy_setopt(curl, CURLOPT_URL, psz_tmp_url);
res = curl_easy_setopt(curl, CURLOPT_USE_SSL, CURLUSESSL_ALL);
res = curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_func);
res = curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); // NOLINT(bugprone-sizeof-expression)
#ifndef NDEBUG
uint32_t pages_loaded = 0U;
uint32_t total = 0U;
#endif
do {
init_string(&s);
res = curl_easy_setopt(curl, CURLOPT_URL, psz_tmp_url);
res = curl_easy_setopt(curl, CURLOPT_TCP_KEEPALIVE, 1L);
res = curl_easy_setopt(curl, CURLOPT_TCP_KEEPIDLE, 120L);
res = curl_easy_setopt(curl, CURLOPT_TCP_KEEPINTVL, 60L);
res = curl_easy_perform(curl);
if (CURLE_OK == res) {
#ifndef NDEBUG
pages_loaded++;
#endif
j_obj = json_tokener_parse(s.string);
cleanup_string(&s);
array_list *array_materials = json_object_get_array(json_object_object_get(j_obj, "results"));
for (size_t i = 0; i < array_materials->length; ++i) {
kodik_material_t *current_material = kodik_material_from_json(array_materials->array[i]);
if (NULL == *current_list) {
*current_list = malloc(sizeof(kodik_materials_list_t));
memset(*current_list, 0, sizeof(kodik_materials_list_t));
(*current_list)->p_material = current_material;
}
current_list = &(*current_list)->p_next;
}
}
free(psz_tmp_url);
psz_tmp_url = strdup(json_object_get_string(json_object_object_get(j_obj, "next_page")));
json_object_put(j_obj);
#ifndef NDEBUG
printf("Pages loaded: %d\n", pages_loaded);
#endif
} while (NULL != psz_tmp_url);
curl_easy_cleanup(curl);
}
free(psz_tmp_url);
return list;
}
Ответы (1 шт):
Автор решения: Sergey Tatarincev
→ Ссылка
попробуйте запихать заголовок принудительно
struct curl_slist *list = NULL;
list = curl_slist_append(list, "Connection: Keep-Alive");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list);