| 562 | } |
| 563 | |
| 564 | std::pair<long, std::vector<char>> common_remote_get_content(const std::string & url, const common_remote_params & params) { |
| 565 | curl_ptr curl(curl_easy_init(), &curl_easy_cleanup); |
| 566 | curl_slist_ptr http_headers; |
| 567 | std::vector<char> res_buffer; |
| 568 | |
| 569 | curl_easy_setopt(curl.get(), CURLOPT_URL, url.c_str()); |
| 570 | curl_easy_setopt(curl.get(), CURLOPT_NOPROGRESS, 1L); |
| 571 | curl_easy_setopt(curl.get(), CURLOPT_FOLLOWLOCATION, 1L); |
| 572 | typedef size_t(*CURLOPT_WRITEFUNCTION_PTR)(void * ptr, size_t size, size_t nmemb, void * data); |
| 573 | auto write_callback = [](void * ptr, size_t size, size_t nmemb, void * data) -> size_t { |
| 574 | auto data_vec = static_cast<std::vector<char> *>(data); |
| 575 | data_vec->insert(data_vec->end(), (char *)ptr, (char *)ptr + size * nmemb); |
| 576 | return size * nmemb; |
| 577 | }; |
| 578 | curl_easy_setopt(curl.get(), CURLOPT_WRITEFUNCTION, static_cast<CURLOPT_WRITEFUNCTION_PTR>(write_callback)); |
| 579 | curl_easy_setopt(curl.get(), CURLOPT_WRITEDATA, &res_buffer); |
| 580 | #if defined(_WIN32) |
| 581 | curl_easy_setopt(curl.get(), CURLOPT_SSL_OPTIONS, CURLSSLOPT_NATIVE_CA); |
| 582 | #endif |
| 583 | if (params.timeout > 0) { |
| 584 | curl_easy_setopt(curl.get(), CURLOPT_TIMEOUT, params.timeout); |
| 585 | } |
| 586 | if (params.max_size > 0) { |
| 587 | curl_easy_setopt(curl.get(), CURLOPT_MAXFILESIZE, params.max_size); |
| 588 | } |
| 589 | http_headers.ptr = curl_slist_append(http_headers.ptr, "User-Agent: llama-cpp"); |
| 590 | for (const auto & header : params.headers) { |
| 591 | http_headers.ptr = curl_slist_append(http_headers.ptr, header.c_str()); |
| 592 | } |
| 593 | curl_easy_setopt(curl.get(), CURLOPT_HTTPHEADER, http_headers.ptr); |
| 594 | |
| 595 | CURLcode res = curl_easy_perform(curl.get()); |
| 596 | |
| 597 | if (res != CURLE_OK) { |
| 598 | std::string error_msg = curl_easy_strerror(res); |
| 599 | throw std::runtime_error("error: cannot make GET request: " + error_msg); |
| 600 | } |
| 601 | |
| 602 | long res_code; |
| 603 | curl_easy_getinfo(curl.get(), CURLINFO_RESPONSE_CODE, &res_code); |
| 604 | |
| 605 | return { res_code, std::move(res_buffer) }; |
| 606 | } |
| 607 | |
| 608 | /** |
| 609 | * Allow getting the HF file from the HF repo with tag (like ollama), for example: |