使用CURL从HTTPS连接中获取内容

时间:2012-10-02 21:48:19

标签: c++ curl https

我最近一直在努力了解有关CURL的更多信息,并最终成功地将其编译并安装为我的测试项目的静态库。最后,我将继续学习发布表格等。

我已成功设法连接并打印http://www.google.se的页面内容。

当连接到安全的http页面https://www.google.se时,我得到一个空字符串作为页面内容。

我正在使用this来获取有关选项的信息。

我尝试了this answer中的内容,但它没有用,或者我做错了 我也尝试关闭verifypeer和verifyhost(虽然我真的想练习安全解决方案),但它也没有用。

我需要做些什么才能让它发挥作用? 我做错了吗?


这是测试代码

#include <iostream>
#include <string>
#include <curl/curl.h>

using namespace std;

static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp){
    ((string*)userp)->append((char*)contents, size * nmemb);
    return size * nmemb;
}

int main(){
  CURL *curl;
  CURLcode res;
  string readBuffer;

  curl = curl_easy_init();
  if(curl){
    curl_easy_setopt(curl, CURLOPT_URL, "https://www.google.se");
    //curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, TRUE);

    //Doesn't seem to work
    curl_easy_setopt(curl, CURLOPT_CAINFO, "path\\cacert.pem");

    //Neither does this
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, FALSE);

    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);
    res = curl_easy_perform(curl);
    curl_easy_cleanup(curl);

    cout<<readBuffer<<endl;

    system("pause");
  }
  return 0;
}

更新

所以我从curl说Unsupported protocol得到了错误消息,我猜它是SSL无效的说法。所以我不得不用SSL重新编译它(这很奇怪,因为我认为我是第一次做的)但是......

我快要放弃了。叹。出于某种原因,现在它给了我错误 NMAKE: fatal error U1077 nasmw在制作SSL时,即使我明确地给了它正确的%PATH%到nasm。我按照信中的步骤进行了操作。

所以我尝试使用curl binaries of type libcurl,但我不知道如何在VC ++中正确链接它,因为我不熟悉库文件。

在尝试编译测试项目时,我不断收到这些链接器错误。

1>main.obj : error LNK2019: unresolved external symbol _curl_easy_cleanup referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol _curl_easy_strerror referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol _curl_easy_perform referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol _curl_easy_setopt referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol _curl_easy_init referenced in function _main

如此沮丧......我希望我明白为什么它必须如此复杂 我只想使用该库!


更新2

好的......我设法使用SSL编译curl库并启用报告CURL_VERSION_SSL

curl_version_info_data * vinfo = curl_version_info(CURLVERSION_NOW);

if(vinfo->features & CURL_VERSION_SSL){
    cout<<"CURL: SSL enabled"<<endl;
}else{
    cout<<"CURL: SSL not enabled"<<endl;
}

//Prints out "CURL: SSL enabled"

但我仍然收到相同的错误消息Unsupported protocol。我不知道我做错了什么。

2 个答案:

答案 0 :(得分:2)

好吧,在我第n次编译库之后,一切看起来都很好,直到我调试它并且它给了我堆错误,这表明我犯了一个错误*再次抽搐抽搐*。

在开始新的编译会话之前,我再次浏览了curl.haxx并找到了一个MSVC包。这让我很高兴,因为我知道如何处理这些!我选择了静态库,因为这就是我想要的。

虽然并非一切顺利,但我必须添加一些额外的链接器依赖项才能使其正常工作。

#pragma comment(lib, "curllib_static.lib")
#pragma comment(lib, "wldap32.lib")
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "winmm.lib")
#pragma comment(lib, "ssleay32.lib")
#pragma comment(lib, "openldap.lib")
#pragma comment(lib, "libeay32.lib")

将其放入并使用我下载的其他软件包中的证书包,以便我可以连接到HTTPS。

curl_easy_setopt(curl, CURLOPT_CAINFO, "_path_\ca-bundle.crt");

我收到了一些警告,警告我以前从未见过。它们不会弄乱任何东西,但它与PDB文件“vc90”有关,我认为VC ++本身可以处理。

这是在 最终 具有正确的CURL库之后连接到https://www.google.se的代码(在项目属性下删除并添加了链接器依赖项中的pragma)。

这是MSVC package(已启用SSL)。您可以使用this package中的一个脚本(perl或VBscript)为您制作证书包。

哦,如果你使用像我这样的静态库,你必须添加预处理器定义CURL_STATICLIB

#include <iostream>
#include <string>
#include <curl/curl.h>

using namespace std;

static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp){
    ((string*)userp)->append((char*)contents, size * nmemb);
    return size * nmemb;
}

int main(){
  CURL *curl;
  CURLcode res;
  string readBuffer;

  curl = curl_easy_init();
  if(curl){
    curl_easy_setopt(curl, CURLOPT_URL, "https://www.google.se");
    curl_easy_setopt(curl, CURLOPT_CAINFO, "C:\\libcurl_static\\ca-bundle.crt");
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);
    res = curl_easy_perform(curl);
    curl_easy_cleanup(curl);

    cout<<readBuffer<<endl;

    system("pause");
  }
  return 0;
}

真的是我的错,我应该检查他们拥有的下载向导的描述。我只下载了档案中的最新资源(7.27.0),因为我认为我 自己编译以获得我想要的东西。

整件事令人尴尬。不过我从中学到了很多东西。

答案 1 :(得分:1)

使用-v检查完整响应。它可能是一个重定向。此外,谷歌已知会阻止使用curl默认用户代理完成的请求......