來自支付寶的代理工具:anyproxy

jopen 10年前發布 | 102K 次閱讀 anyproxy

來自支付寶的代理工具anyproxy已經開源,支持https代理及各類二次開發接口,前端開發環境的利器。在NodeJS一個完全可配置的代理服務器:anyproxy

業界的代理工具已經不少了,windows有fiddler,mac有charles,跨平臺的有騰訊alloy team出品的liver pool。滿足特定功能的民間產品更是層出不窮,如代理線上combo文件的flex-combo,clam中的doji等等。

如此之多的產品,仍無法滿足前端攻城師們奇葩的需求。舉幾個調試場景的栗子:

  • 調試線上頁面,需要在頁面里注入某個腳本,或是替換一些html數據。
  • 向同一個URL發送post,需要根據post body來mock數據。
  • 服務器不支持跨域頭Access-Control-Allow-*,調試時卻需要發送跨域請求。
  • 需要模擬個別接口超時。
  • 不改url,把請求發送到另一個地址,移動端的dns結果又有緩存,改host效率太低。
  • 替換cookie,模擬多賬戶/越過登錄過程。

anyproxy的誕生,就是為了提供一個大底層,讓類似的工具不再遙遠,分分鐘提升我們的調試效率。

代理服務器的戰略價值

代理服務器是個中間人,站在了客戶端和服務端中間,雙方通信的每個比特,都會滴水不漏地經過它。 從http協議的角度來看,它控制了完整的請求頭、請求體、響應頭、響應體,可以在客戶端與服務端都無感知的情況下介入處理所有的流程,是通信過程中的戰略要塞。

AnyProxy的開放式代理服務器設計

可編程的API接口(rule)

面對紛繁的調試需求,傳統的“配置文件”遭遇了靈活性瓶頸,因此我們決定開放接口,由攻城師們自己來編寫各類代理規則。

類似obj-c中的delegate機制,我們把http請求的每個過程都進行分拆,用戶可以根據需求對網絡請求的任一環節進行干預。在這里,用戶編寫的規則文件被稱為 rule

接口流程

具體來說,我們允許用戶干預的接口:

  • 收到用戶請求之后
    • shouldUseLocalResponse ,是否在本地直接發送響應(不再向服務器發出請求)
    • dealLocalResponse 如果shouldUseLocalResponse返回true,會調用這個函數來獲取本地響應內容(異步接口)
  • 向服務端發出請求之前
    • replaceRequestProtocol 替換向服務器發出的請求協議,支持http和https的替換
    • replaceRequestOption 替換向服務器發出的請求參數,即nodeJS中的 request option
    • replaceRequestData 替換請求的body
  • 向用戶返回服務端的響應之前
    • replaceResponseStatusCode 替換服務器響應的http狀態碼
    • replaceResponseHeader 替換服務器響應的http頭
    • replaceServerResDataAsync 替換服務器響應的數據(異步接口)
    • pauseBeforeSendingResponse 在請求返回給用戶前的延遲時間

清晰易懂的圖解

右側加粗氣泡里即是anyproxy的接口。

在NodeJS一個完全可配置的代理服務器:anyproxy

實踐和sample

為了幫助你更快地編寫規則(rule)文件,我們提供了些sample(點擊訪問):

  • rule__blank.js
    • 空白的規則文件模板,和一些注釋
  • rule_adjust_response_time.js
    • 把所有的響應延遲1500毫秒
  • rule_allow_CORS.js
    • 為ajax請求增加跨域頭
  • rule_intercept_some_https_requests.js
    • 截獲github.com的https請求,再在最后加點文字
  • rule_remove_cache_header.js
    • 去除響應頭里緩存相關的頭
  • rule_replace_request_option.js
    • 在請求發送到服務端前對參數做一些調整
  • rule_replace_response_data.js
    • 修改響應數據
  • rule_replace_response_status_code.js
    • 改變服務端響應的http狀態碼
  • rule_use_local_data.js
    • 把響應映射到本地

界面

可視化查看流量的利器。界面中的數據通信用websocket完成,保證了傳輸的實時性。

在NodeJS一個完全可配置的代理服務器:anyproxy

Https的中間人(man-in-the-middle)代理

Charles和fiddler有https的代理,可以做https的明文解碼,anyProxy也做到了。

配合openSSL,制作一個根證書并在宿主機信任,anyproxy可以實時簽發任意域名的二級證書,來協助https明文代理。

在NodeJS一個完全可配置的代理服務器:anyproxy

其他特性

  • 網速模擬,弱網絡環境優化必備,你懂的!

項目主頁:http://www.baiduhome.net/lib/view/home/1417187456737

     本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
     轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
     本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!