如何使用curl从私有存储库下载文件?

nkhmeac6  于 2022-11-13  发布在  其他
关注(0)|答案(2)|浏览(277)

我正在尝试从private GitHub资源库下载一个文件,当前代码:

  1. #include <curl/curl.h>
  2. static size_t WriteMemoryCallback(void* contents, size_t size, size_t nmemb, void* userp) {
  3. size_t realsize = size * nmemb;
  4. auto& mem = *static_cast<std::string*>(userp);
  5. mem.append(static_cast<char*>(contents), realsize);
  6. return realsize;
  7. }
  8. void Download(std::string& data, char* url)
  9. {
  10. CURL* curl_handle;
  11. CURLcode res;
  12. struct curl_slist* slist{};
  13. curl_handle = curl_easy_init();
  14. curl_easy_setopt(curl_handle, CURLOPT_URL, url);
  15. SecureZeroMemory(url, strlen(url));
  16. slist = curl_slist_append(slist, "Authorization: token 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");
  17. slist = curl_slist_append(slist, "Content-Type: application/json");
  18. curl_easy_setopt(curl_handle, CURLOPT_HTTPHEADER, slist);
  19. curl_easy_setopt(curl_handle, CURLOPT_TCP_KEEPALIVE, 0);
  20. curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
  21. curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, &data);
  22. curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "libcurl-agent/1.0");
  23. curl_easy_setopt(curl_handle, CURLOPT_FOLLOWLOCATION, 1L); // redirects
  24. //curl_easy_setopt(curl_handle, CURLOPT_VERBOSE, 1L); // only to debug
  25. res = curl_easy_perform(curl_handle);
  26. if(res != CURLE_OK)
  27. std::cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << '\n';
  28. curl_easy_cleanup(curl_handle);
  29. curl_global_cleanup();
  30. }
  31. int main(int argc, char* argv[]) {
  32. std::string data;
  33. Download(data, /* link */);
  34. }

这是下载到data的内容:

  1. <!DOCTYPE html>
  2. <html lang="en" data-color-mode="auto" data-light-theme="light" data-dark-theme="dark" data-a11y-animated-images="system">
  3. <head>
  4. <meta charset="utf-8">
  5. <link rel="dns-prefetch" href="https://github.githubassets.com">
  6. <link rel="dns-prefetch" href="https://avatars.githubusercontent.com">
  7. <link rel="dns-prefetch" href="https://github-cloud.s3.amazonaws.com">
  8. <link rel="dns-prefetch" href="https://user-images.githubusercontent.com/">
  9. <link rel="preconnect" href="https://github.githubassets.com" crossorigin>
  10. <link rel="preconnect" href="https://avatars.githubusercontent.com">
  11. ...

我想问题出在设置授权令牌上,我也试过了:

  1. slist = curl_slist_append(slist, "Authorization: Bearer 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");
  2. slist = curl_slist_append(slist, "Content-Type: application/json");
xpszyzbs

xpszyzbs1#

添加授权和接受标头,如下所示:

  1. slist = curl_slist_append(slist, "Authorization: token <Your Token>");
  2. slist = curl_slist_append(slist, "Accept: application/vnd.github.v3+raw");

则呼叫了

  1. curl_easy_setopt(curl_handle, CURLOPT_HTTPHEADER, slist);

并以以下形式提供指向该文件的链接:

  1. https://api.github.com/repos/<owner>/<repository>/contents/<path>
eaf3rand

eaf3rand2#

您应该包括以下行

  1. curl_easy_setopt(curl_handle, CURLOPT_HTTPHEADER, slist);

否则,在请求中根本不会使用您精心创建的头列表,并且根本不会传输任何身份验证令牌。
此外,由于您使用的是GET请求,因此标头

  1. slist = curl_slist_append(slist, "Content-Type: application/json");

没有任何意义

  1. slist = curl_slist_append(slist, "Authorization: Bearer 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");

就足够了(我非常希望这不是您的实际令牌!如果是,请迅速使其无效并生成一个新令牌!)。

相关问题