一個支持併發, 支持異步/同步, 支持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

相關文章
相關標籤/搜索