Можно ли ускорить выполнение 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);
→ Ссылка