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