深度解析:HTTP/1.0 與 HTTP/1.1 雙協(xié)議代理如何協(xié)同工作)
WebOne 架構(gòu)深度解析HTTP/1.0 與 HTTP/1.1 雙協(xié)議代理如何協(xié)同工作【免費(fèi)下載鏈接】weboneHTTP 1.x proxy that makes old web browsers usable again in the Web 2.0 world.項(xiàng)目地址: https://gitcode.com/gh_mirrors/we/weboneWebOne 是一個(gè) HTTP 1.x 代理服務(wù)器專門讓 Web 1.0 時(shí)代的老舊瀏覽器重新訪問(wèn)現(xiàn)代 Web 2.0 網(wǎng)站。本文將帶你拆解它的核心架構(gòu)HTTP/1.0 與 HTTP/1.1 雙協(xié)議代理如何分工協(xié)作、一個(gè)請(qǐng)求從瀏覽器到目標(biāo)服務(wù)器要經(jīng)歷的 7 個(gè)處理環(huán)節(jié)以及 HTTPS 隧道是如何被解鎖并雙向轉(zhuǎn)換的。 一句話認(rèn)識(shí) WebOne 雙協(xié)議代理WebOne 本質(zhì)上是一個(gè)適配器一頭連接現(xiàn)代互聯(lián)網(wǎng)HTTPS、UTF-8、JavaScript 框架另一頭連接 90 年代風(fēng)格的客戶端HTTP/1.0、CERN 風(fēng)格請(qǐng)求甚至 Netscape Navigator 3。它默認(rèn)運(yùn)行在 8080 端口只需在舊瀏覽器的代理設(shè)置中填入服務(wù)器地址老機(jī)器就能重新沖浪。 典型痛點(diǎn)老瀏覽器訪問(wèn)現(xiàn)代 HTTPS 網(wǎng)站時(shí)常因加密算法不匹配而直接報(bào)錯(cuò)例如下面這個(gè)Secure Connection Failed場(chǎng)景? 整體架構(gòu)一個(gè)抽象基類 兩個(gè)協(xié)議服務(wù)器WebOne 的服務(wù)器層采用經(jīng)典的模板方法設(shè)計(jì)抽象基類 HTTPServer.cs 只定義Working、Start()、Stop()三個(gè)契約具體協(xié)議由兩個(gè)子類實(shí)現(xiàn)組件文件底層機(jī)制協(xié)議支持服務(wù)器契約HTTPServer.cs抽象基類—服務(wù)器 A舊版HttpServer1.csHttpListenerHTTP/1.1服務(wù)器 B新版HttpServer2.csTcpListener原始 TCPHTTP 0.9 / 1.0 / 1.1 CONNECT入口調(diào)度Program.cs配置項(xiàng)選擇—入口程序 Program.cs 在啟動(dòng)時(shí)根據(jù)配置項(xiàng)UseMsHttpApi決定實(shí)例化哪一個(gè)服務(wù)器默認(rèn)使用功能更全的 HttpServer2。?? 雙協(xié)議如何分工HttpServer1 與 HttpServer2服務(wù)器 A穩(wěn)定但挑食的 HTTP/1.1 實(shí)現(xiàn)HttpServer1 是 WebOne 0.8.5 ~ 0.15.3 時(shí)代的服務(wù)器基于 .NET 的HttpListener? 非常穩(wěn)定、快速、專業(yè)級(jí)兼容? 不接受CONNECT方法即無(wú)法代理 HTTPS? 不接受 CERN 風(fēng)格請(qǐng)求如瀏覽器直接發(fā)GET ftp://...? 強(qiáng)制要求請(qǐng)求帶Host:頭——而 HTTP/1.0 時(shí)代的老瀏覽器往往沒(méi)有自 v0.16.0 起它被保留下來(lái)僅用于故障排查作者在 HttpServer1.cs 的注釋中坦誠(chéng)列出了這些短板。服務(wù)器 B幾乎完整的 HTTP 0.9/1.0/1.1 實(shí)現(xiàn)HttpServer2 是 v0.16 的新服務(wù)器直接監(jiān)聽原始 TCP 端口想怎么解析就怎么解析? 完整支持 HTTP 0.9 / 1.0 / 1.1 三種版本? 支持CONNECT方法HTTPS 隧道的前提? 支持通過(guò)瀏覽器直接GET ftp://地址CERN 代理模式? 兼容各種老瀏覽器的怪異請(qǐng)求頭例如 Netscape 的 CONNECT 格式缺陷這就是雙協(xié)議協(xié)同的第一層含義同一個(gè)端口上既接待 HTTP/1.1 的現(xiàn)代流量也接待 HTTP/1.0 甚至 HTTP 0.9 的懷舊流量。 請(qǐng)求的一生從 TCP 連接到頁(yè)面送達(dá)無(wú)論請(qǐng)求來(lái)自哪種協(xié)議進(jìn)入服務(wù)器后都會(huì)匯入同一條中轉(zhuǎn)流水線。以 HttpServer2 為例接受連接HttpServer2.cs 異步接受 TCP 連接并立即排隊(duì)等待下一個(gè)連接把當(dāng)前連接交給請(qǐng)求處理器逐字符解析HttpRequestProcessor.cs 從數(shù)據(jù)流中逐字符讀取直到遇到雙換行才認(rèn)定請(qǐng)求頭結(jié)束——這個(gè)樸素的設(shè)計(jì)天然兼容 HTTP 0.9/1.0/1.1 的格式差異識(shí)別請(qǐng)求類型根據(jù)請(qǐng)求行與Host頭判斷是標(biāo)準(zhǔn)代理、本地代理還是 CONNECT 隧道HttpRequestProcessor.cs進(jìn)入中轉(zhuǎn)核心構(gòu)建HttpTransit對(duì)象啟動(dòng)完整處理流程安全檢查IP 黑名單/白名單、代理登錄認(rèn)證、URL 黑名單HttpTransit.cs協(xié)議版本鏡像響應(yīng)直接復(fù)制請(qǐng)求的協(xié)議版本——你發(fā) HTTP/1.0它就用 HTTP/1.0 回HttpTransit.cs。這是雙協(xié)議協(xié)同最關(guān)鍵的一行邏輯取回網(wǎng)頁(yè)并翻譯從現(xiàn)代服務(wù)器取回內(nèi)容后替換字符編碼、改寫 HTML/JS、按需轉(zhuǎn)換圖片最終以老瀏覽器看得懂的格式寫回 HTTPS 隧道如何被解鎖當(dāng)瀏覽器發(fā)送CONNECT example.com:443時(shí)HttpTransit.cs 會(huì)按四條岔路分發(fā)岔路觸發(fā)條件處理方式直通模式匹配ConnectPassThrough規(guī)則只建隧道不窺探內(nèi)容非 HTTP 解密匹配NonHttpSslDecrypt針對(duì) SMTP/POP3 等服務(wù)解密標(biāo)準(zhǔn) HTTPS目標(biāo)是 443 端口交給假 HTTPS 服務(wù)器其他端口非 443 的 CONNECT按配置放行或解密標(biāo)準(zhǔn) HTTPS 路徑由 HttpSecureServer.cs 完成三件事現(xiàn)場(chǎng)簽發(fā)一張合法證書用內(nèi)置 CA 為目標(biāo)域名即時(shí)生成證書HttpSecureServer.cs完成 SSL/TLS 握手與客戶端建立加密隧道并把加密套件降級(jí)為老瀏覽器認(rèn)識(shí)的老算法隧道內(nèi)再跑一遍流水線解出明文 HTTP 后遞歸調(diào)用同一個(gè)請(qǐng)求處理器HttpSecureServer.cs——HTTPS 1.1 流量由此被轉(zhuǎn)換為 HTTP 1.0 風(fēng)格的響應(yīng) 這套 MITM 機(jī)制是 WebOne 能翻譯整個(gè)現(xiàn)代 Web 的根基也解釋了為什么它只適合在隔離的懷舊局域網(wǎng)中使用。 連接復(fù)用HTTP/1.1 Keep-Alive 與 HTTP/1.0 一次一斷協(xié)議差異還體現(xiàn)在連接管理上HTTP/1.1 Keep-Alive處理器完成一次響應(yīng)后若雙方都聲明keep-alive就在同一條連接上遞歸處理下一個(gè)請(qǐng)求HttpRequestProcessor.cs避免老瀏覽器頻繁重連HTTP/1.0 語(yǔ)義對(duì)識(shí)別出的 HTTP/1.0-only 客戶端響應(yīng)會(huì)降級(jí)為更簡(jiǎn)單的內(nèi)容類型HttpTransit.cs并遵循一次一斷的短連接習(xí)慣? 實(shí)戰(zhàn)驗(yàn)證讓老瀏覽器連上雙協(xié)議代理理解了架構(gòu)配置就水到渠成。以 Netscape 為例不同瀏覽器的設(shè)置界面大同小異核心都是填HTTP 代理地址 端口配置完成后訪問(wèn)http://proxyhost:8080/即可看到 WebOne 的信息頁(yè)確認(rèn)雙協(xié)議代理已就緒。所有運(yùn)行參數(shù)端口、SSL、黑白名單等都定義在 webone.conf 中由 ConfigFileLoader.cs 加載。 核心源碼文件速查表模塊文件職責(zé)程序入口Program.cs加載配置、初始化 CA 證書、選擇并啟動(dòng)服務(wù)器服務(wù)器契約HTTPServer.cs定義啟動(dòng)/停止/狀態(tài)三個(gè)抽象接口HTTP/1.1 服務(wù)器HttpServer1.csHttpListener實(shí)現(xiàn)保留用于故障排查雙協(xié)議服務(wù)器HttpServer2.csTcpListener實(shí)現(xiàn)支持 0.9/1.0/1.1 與 CONNECT請(qǐng)求解析HttpRequestProcessor.cs逐字符解析原始報(bào)文識(shí)別請(qǐng)求類型中轉(zhuǎn)流水線HttpTransit.cs黑白名單、認(rèn)證、協(xié)議版本鏡像、內(nèi)容翻譯假 HTTPS 服務(wù)器HttpSecureServer.cs現(xiàn)場(chǎng)簽發(fā)證書、SSL 握手、隧道內(nèi)遞歸處理全局配置webone.conf端口、SSL、黑白名單等全部運(yùn)行參數(shù)小結(jié)WebOne 的雙協(xié)議架構(gòu)可以濃縮為三句話一個(gè)抽象基類統(tǒng)一生命周期兩個(gè)服務(wù)器類分別守住 HTTP/1.1 與全版本協(xié)議兩條通道一條中轉(zhuǎn)流水線讓所有請(qǐng)求共享認(rèn)證、安全與翻譯邏輯。正是這套協(xié)同設(shè)計(jì)讓 1994 年的瀏覽器也能讀懂今天的網(wǎng)頁(yè)。【免費(fèi)下載鏈接】weboneHTTP 1.x proxy that makes old web browsers usable again in the Web 2.0 world.項(xiàng)目地址: https://gitcode.com/gh_mirrors/we/webone創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考