一个支持并发, 支持异步/同步, 支持http/https, 支持续传的avhttp

起源

问题起源于 microcai 和 jack 的一次谈话。他们注意到了 HTTP 多线程下载模式,其实本质上不过是向服务器发起了多个TCP链接。使用一个线程同样能完成这样的工做——只要他们使用的是异步方式进行的。boost.asio 是一个很是优秀的异步网络库,要是能基于 asio 开发,就能实现单线程并发下载。得益于asio的良好架构,若是单线程性能不足的时候,只须要简单的开启多个线程跑 asio::io_service::run() 便可。这样是进行多线程仍是单线程均可以由用户灵活的控制。 git


引线

虽然 jack 和 microcai 意识到了一个基于 asio 的并发 HTTP 下载库的重要性。可是真正致使他们动手的缘由倒是一个女人 —— 猫是也。 github

猫听说但愿开发一个某客户端,须要用到多线程HTTP下载功能,因而向社区列位大牛求救。 microcai 告诉她,jack在一份私有项目里实现过一个多线程 HTTP 下载代码,找他要一下, jack 说不定能剥离出来给猫用。 服务器

jack 说剥离太麻烦了,反正一直有个想用 asio 重写一个 HTTP 并发下载库的想法,不如重复发明一下轮子,用 asio 的方式完全重写一个满意的HTTP库。 网络

恰逢 avbot 的 WebQQ 协议须要 HTTP 库,可是基于 asio 的 HTTP库目前只有urdl (也是asio做者的大做,惋惜已经不维护了)能够用,因而勉强用了这个早就中止开发的urdl,并且修修补补才勉强凑合使用。 多线程

重写一个真正合用的基于asio的异步HTTP库确实能帮助avbot项目,因而microcai也同意jack的决定。了解microcai脾气的人都知道,microcai是一个坚决的反轮子党——一切重复发明轮子的行为都要被他批判。 架构

命名

经过讨论,决定将库的名称命名为avhttp。av是avplayer.org社区项目的标志性前缀,http表示他是一个用于支持HTTP协议的库。 并发

设计

avhttp由2大部分组成:avhttp::http_stream 和avhttp::multi_download。 异步

  • avhttp::http_stream是一个异步HTTP实现。每一个http_stream对象支持一个HTTP会话。这个http_stream也是 avbot 所须要的。
  • avhttp::multi_download 利用http_stream进行HTTP访问,内部经过调度逻辑组合,将复杂的多TCP下载逻辑都封装起来。

另外包含一些支持类,好比 avhttp::url 用于解析URI字符串,avhtt::request_opts 用户设置HTTP请求头。 性能

实现

jack 承当了主要的编码工做。microcai懒人只负责骂jack,尤为是他做出了错误的技术决定的时候。 当 http_stream 接近完成的时候, microcai 以迅雷不及掩耳之速度将 avbot 移植到 avhttp 上。并利用变态的腾讯服务器作了第一个测试。找到了许多意料以外的bug。这个bug故事"恐怕要消失在历史了"。 测试

使用

avhttp 是HeaderOnly 的库,使用的时候不须要编译,也不用添加库。只须要 #include <avhttp.hpp> 便可开始享受

TO BE CONTINED ...

源码见: https://github.com/avplayer/avhttp

相关文章
相关标签/搜索