共享Windows下C++库之异步http组件


简介
最近在做一个crawler,为了更好的发挥抓取web的能力,需要用到异步http。其中DNS解析、下载都需要异步。 本组件基于WinHTTP实现,如果以后有需要再从头构造轮子吧(基于iocp的异步框架)。

对于WinHTTP的思想,MSDN很多介绍,这里这里

说明
该组件使用十分简单,只需要完成几种回调接口即可
1. 完成HTTP HEADER
2. 完成HTTP 整个内容
3. 读取HTTP正文
4. 跳转URL
5. 错误处理


针对WinHTTP的思想,抽象了几个重要概念
1. url--对URL的一个简单wrapper
2. session--每个http访问都会产生一个session,用于记录状态及调整访问策略属性
3. connection--链接到http服务器需要此对象,通过一个session和一个url来构造一个链接
4. request--链接上服务器后需要请求服务器上相应资源,控制请求服务器方式

示例

void header(const http::request &req, std::uint32_t size)
{
	http::query::raw_headers accept;
	req.query_http_header(accept);

	http::query::content_type content_type;
	req.query_http_header(content_type);

	http::query::date date;
	req.query_http_header(date);

	http::query::expires expires;
	req.query_http_header(expires);

	std::wcout << (const wchar_t *)accept.buffer() << std::endl << size << std::endl;
}

void response_complete(bool suc)
{
	assert(suc);
}

bool read(const char *buf, size_t len)
{
	std::cout.write(buf, len);
	return true;
}

void redirect(const wchar_t *url, size_t len)
{
	std::cout << url << std::endl;
}

void error(const std::string &msg)
{
	std::cout << msg << std::endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
	try
	{
		http::session session(L"test");

		std::chrono::seconds second(5);
		session.set_timeout(second, second, second, second);
		

		http::url url(L"http://www.baidu.com");
		http::connection con(session, url);
		http::request request(con, L"GET", url);
		/*request.set_option(http::option::security(SECURITY_FLAG_IGNORE_CERT_CN_INVALID
			| SECURITY_FLAG_IGNORE_CERT_DATE_INVALID
			| SECURITY_FLAG_IGNORE_UNKNOWN_CA));
		request.set_option(http::option::user_name(L"default proxy name"));
		request.set_option(http::option::password(L"default proxy password"));*/
		request.register_callback(&header, &response_complete, &read, &redirect, &error);

		request.send_request(L"");
		system("pause");
	}
	catch(std::exception &e)
	{
		std::cerr << e.what() << std::endl;
	}

	system("pause");
	return 0;
}


可以看到,接口使用非常简单,这里有几个需要注意的地方。
1. std::chrono::seconds,这是最新进入标准库的time libaray,具体请参看文档
2. request.set_option(...),针对访问策略进行属性配置,这里预定义了一组option,具体参看源码
3. request.register_callback,这就是对处理过程的回调注册。有

  • http接受完成header回调
  • 返回信息完全成功与否回调
  • 读取返回数据回调
  • 重定向回调
  • 错误处理回调



环境

注意:本组件使用C++0x写成,开发环境VS2010以上。

遗憾

当然,本组件还很不完善,但是对于目前我的应用来说已经够用,如果遇到需要扩展的,也十分容易。
比如可以加上身份验证代理设置

如有不妥之处,请大家互相讨论,谢谢。

下载

猛击 这里进行下载

你可能感兴趣的:(C++探索)