[From HTTP to AWS][4]使用LibcURL with OpenSSL support
其实LibcURL有不少语言的Binding,我比较喜欢C++,但鉴于CURLPP太麻烦,所以就直接C语言版LibcURL。
>> Build OpenSSL
从www.openssl.org下载OpenSSL并安装perl环境
1> perl Configure VC-WIN32 --prefix=c:/some/openssl/dir
2> ms\do_ms
3> nmake -f ms\nt.mak (for static library)
or
3> nmake -f ms\ntdll.mak (for DLL)
>> Build LibcURL
从http://curl.haxx.se下载LibcURL, 打开vc6curl.dsw编译。
注意Preprocessor中有没有:USE_SSLEAY和USE_OPENSSL
>> Certification
http://curl.haxx.se/docs/sslcerts.html
LibCURL提供了一个mk-ca-bundle.pl,从Mozilla下载一个certdata.txt再倒腾一把,可以生成想要的*.crt文件。
'http://mxr.mozilla.org/seamonkey/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1'
运行perl script利用OpenSSL生成ca-bundle.crt,然后配置CURLOPT_CAINFO就可以大功告成:
// Run this script to generate ca-bundle.crt
S:\Components\CPlusPlus\cURL\curl-7.20.0\lib\mk-ca-bundle.pl
如果配置不成功,在访问HTTPS的时候会报错CURLE_SSL_CACERT。
>> 初试LibcURL
最简单的例子, 在这个例子内,将"http://curl.haxx.se/docs/thanks.html"页面内容取回并写到本地文件内。
尽管比起Python的UrlLib麻烦些,还是不错的。
对于Easy Interface,基本的步骤如下:
初始化LibCurl
初始化Easy Interface
设置所需的Option
执行请求
清理Easy Interface
清理LibCurl
Code:
// --------------------------------------------------------------------------------------------------------
// Initialize libcurl
//
CURLcode return_code;
return_code = curl_global_init(CURL_GLOBAL_WIN32);
if (CURLE_OK != return_code) return ;
// Get easy handle
//
CURL *easy_handle = curl_easy_init();
if (NULL == easy_handle)
{
curl_global_cleanup();
return ;
}
// Open a local file
//
FILE *fp = fopen("c:\\thanks.html", "ab+");
// Set easy handle properties
//
curl_easy_setopt(easy_handle, CURLOPT_URL, "http://curl.haxx.se/docs/thanks.html");
curl_easy_setopt(easy_handle, CURLOPT_WRITEFUNCTION, &process_data);
curl_easy_setopt(easy_handle, CURLOPT_WRITEDATA, fp);
// Perform Request
//
curl_easy_perform(easy_handle);
// Close File
//
fclose(fp);
// clean up curl
//
curl_easy_cleanup(easy_handle);
curl_global_cleanup();
// --------------------------------------------------------------------------------------------------------