前言
前面分享过一个Windows上封装Winhttp和WinInet API的代码,结果下载页好评特别多(呵呵),谢谢大家赏脸。文章地址:开源一个C++实现的简单HTTP协议处理库,里面有代码资源下载地址。但是,在实际开发过程中我发现WinHttp API严重依赖微软的IE组件,下载过程中会出现些很少见的异常。(比如下载文件和使用chrome浏览器下载的文件不一样。。。。)因此,有必要替换掉这个HTTP封装库。为什么选择Libcurl?大名鼎鼎的Libcurl,很多开源软件以及国内客户端都使用了,跨平台、强大的功能(各种请求、重定向、断电续传、支持HTTPS……)。前面还写过一篇使用Libcurl下载文件的小例子,那只是很久前的入门文章:使用libcurl下载文件小例。
代码
/*****************************************
*封装Libcurl下载库
*author:Jelin
*date:2016年2月24日
*/
#pragma once
#include <curl/curl.h>
#include <string>
using std::string;
class CLibcurlCallback
{
public:
virtual void Progress(void* lpParam, double dTotal, double bLoaded) = 0;
};
enum LibcurlFlag
{
Lf_None = 0,
Lf_Download,
Lf_Post,
Lf_Get,
};
class CLibcurl
{
public:
CLibcurl(void);
~CLibcurl(void);
/******************************************************************************
*封装类的外部调用接口
*/
bool SetPort(LONG port); //设置连接端口号
bool SetTimeout(int nSecond); //设置执行超时(秒)
bool SetConnectTimeout(int nSecond); //设置连接超时(秒)
bool SetUserAgent(LPCSTR lpAgent); //设置用户代理
bool SetResumeFrom(LONG lPos); //设置断点续传起始位置
bool SetResumeFromLarge(LONGLONG llPos); //设置断点续传起始位置,针对大文件
bool AddHeader(LPCSTR lpKey, LPCSTR lpValue); //添加自定义头
void ClearHeaderList(); //清理HTTP列表头
bool SetCookie(LPCSTR lpCookie); //设置HTTP请求cookie
bool SetCookieFile(LPCSTR lpFilePath); //设置HTTP请求cookie文件
const char* GetError()const; //获取错误详细信息
void SetCallback(CLibcurlCallback* pCallback, void* lpParam); //设置下载进度回调
bool DownloadToFile(LPCSTR lpUrl, LPCSTR lpFile); //下载文件到磁盘
bool Post(LPCSTR lpUrl, LPCSTR lpData); //Post 字符串数据
bool Post(LPCSTR lpUrl, unsigned char* lpData, unsigned int nSize); //Post 字符串或者二进制数据
bool Get(LPCSTR lpUrl); //Get 请求
const string& GetRespons()const; //获取Post/Get请求返回数据
const char* GetResponsPtr()const; //获取Post/Get请求返回数据
protected:
static size_t WriteCallback