一个支持并发, 支持异步/同步, 支持http/https, 支持socks4/socks5代理, 支持续传的 HTTP 开发库 avhttp

时间:2022-09-08 23:22:00
起源
问题起源于 microcai 和 jack 的一次谈话。他们注意到了 HTTP 多线程下载模式,其实本质上不过是向服务器发起了多个TCP连接。使用一个线程一样能完成这样的工作——只要他们使用的是异步方式进行的。boost.asio 是一个非常优秀的异步网络库,要是能基于 asio 开发,就能实现单线程并发下载。得益于asio的良好架构,如果单线程性能不足的时候,只需要简单的开启多个线程跑 asio::io_service::run() 即可。这样是进行多线程还是单线程都可以由用户灵活的控制。


引线
虽然 jack 和 microcai 意识到了一个基于 asio 的并发 HTTP 下载库的重要性。但是真正导致他们动手的原因却是一个女人 —— 猫是也。

猫据说希望开发一个某客户端,需要用到多线程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

10 个解决方案

#1


不错,看起来很全,也很复杂,谢谢! 在这找到一个HTTP的简单实现HttpClnt:
http://download.csdn.net/detail/geoff08zhang/4571358

#2


一个支持并发, 支持异步/同步, 支持http/https, 支持socks4/socks5代理, 支持续传的 HTTP 开发库 avhttp

#3


感谢分享. 一个支持并发, 支持异步/同步, 支持http/https, 支持socks4/socks5代理, 支持续传的 HTTP 开发库 avhttp

#4



CSDN 好冷清, 200分的技术分享贴, 居然就几个带星的版主回复....

#5


不知道说啥好。好高深的样子。

#6


引用 5 楼 xkfy198608 的回复:
不知道说啥好。好高深的样子。

没有啥高深吧?

#7


一个支持并发, 支持异步/同步, 支持http/https, 支持socks4/socks5代理, 支持续传的 HTTP 开发库 avhttp这里验证了用户名密码之后,应该request了吧,回调是不是写错了

#8


引用 7 楼 ffvsff 的回复:
一个支持并发, 支持异步/同步, 支持http/https, 支持socks4/socks5代理, 支持续传的 HTTP 开发库 avhttp这里验证了用户名密码之后,应该request了吧,回调是不是写错了


没有写错啊? 参考 http://tools.ietf.org/html/rfc1929 

#9


确实有点问题, 已经修复, 3Q.

#10


https://github.com/Jackarain/socks_server

#1


不错,看起来很全,也很复杂,谢谢! 在这找到一个HTTP的简单实现HttpClnt:
http://download.csdn.net/detail/geoff08zhang/4571358

#2


一个支持并发, 支持异步/同步, 支持http/https, 支持socks4/socks5代理, 支持续传的 HTTP 开发库 avhttp

#3


感谢分享. 一个支持并发, 支持异步/同步, 支持http/https, 支持socks4/socks5代理, 支持续传的 HTTP 开发库 avhttp

#4



CSDN 好冷清, 200分的技术分享贴, 居然就几个带星的版主回复....

#5


不知道说啥好。好高深的样子。

#6


引用 5 楼 xkfy198608 的回复:
不知道说啥好。好高深的样子。

没有啥高深吧?

#7


一个支持并发, 支持异步/同步, 支持http/https, 支持socks4/socks5代理, 支持续传的 HTTP 开发库 avhttp这里验证了用户名密码之后,应该request了吧,回调是不是写错了

#8


引用 7 楼 ffvsff 的回复:
一个支持并发, 支持异步/同步, 支持http/https, 支持socks4/socks5代理, 支持续传的 HTTP 开发库 avhttp这里验证了用户名密码之后,应该request了吧,回调是不是写错了


没有写错啊? 参考 http://tools.ietf.org/html/rfc1929 

#9


确实有点问题, 已经修复, 3Q.

#10


https://github.com/Jackarain/socks_server