anyproxy學習2-rule模塊實現接口mock功能

前言

AnyProxy不單單能夠抓包,還能夠攔截請求並修改服務端響應,實現接口mock功能。
面試時候常常會問到第三方支付如何測試這種,若是對接的第三方沒提供測試環境,那麼就須要搭建一個mock服務器,模擬支付接口返回的各類狀況。git

rule模塊

AnyProxy提供了二次開發的能力,你能夠用js編寫本身的規則模塊(rule),來自定義網絡請求的處理邏輯。github

注意:引用規則前,請務必確保文件來源可靠,以避免發生安全問題面試

  • 攔截並修改正在發送的請求

可修改內容包括請求頭(request header),請求體(request body),甚至是請求的目標地址等npm

  • 攔截並修改服務端響應

可修改的內容包括http狀態碼(status code)、響應頭(response header)、響應內容等瀏覽器

  • 攔截https請求,對內容作修改

本質是中間人攻擊(man-in-the-middle attack),須要客戶端提早信任AnyProxy生成的CA安全

開發示例

舉個栗子: 須要編寫一個規則模塊,在 GET http://httpbin.org/user-agent 的返回值里加上測試信息,並延遲5秒返回服務器

Step 1,編寫規則以下, 保存爲sample.js文件,能夠放電腦任意位置網絡

// file: sample.js
module.exports = {
  summary: 'a rule to hack response',
  *beforeSendResponse(requestDetail, responseDetail) {
    if (requestDetail.url === 'http://httpbin.org/user-agent') {
      const newResponse = responseDetail.response;
      newResponse.body += '- AnyProxy Hacked!';

      return new Promise((resolve, reject) => {
        setTimeout(() => { // delay
          resolve({ response: newResponse });
        }, 5000);
      });
    }
  },
};

Step 2, 啓動AnyProxy,加載規則curl

anyproxy -i --rule sample.js測試

當看到出現:Active rule is: a rule to hack response 那就是加載成功了

Step 3, 測試規則

用curl測試

curl http://httpbin.org/user-agent --proxy http://127.0.0.1:8001

也可使用瀏覽器測試,配置瀏覽器http代理爲 127.0.0.1:8001,訪問 http://httpbin.org/user-agent, 通過代理服務器後,指望的返回以下

{
  "user-agent": "curl/7.43.0"
}
- AnyProxy Hacked!

Step 4, 查看請求信息.瀏覽器訪問http://127.0.0.1:8002 ,界面上能看到剛纔的請求信息

處理流程

當http請求通過代理服務器時,具體處理過程是:

-收集請求全部請求參數,包括method, header, body等

  • AnyProxy調用規則模塊beforeSendRequest方法,由模塊作處理,返回新的請求參數,或返回響應內容
  • 若是beforeSendRequest返回了響應內容,則當即把此響應返回到客戶端(而再也不發送到真正的服務端),流程結束。
  • 根據請求參數,向服務端發出請求,接收服務端響應。
  • 調用規則模塊beforeSendResponse方法,由模塊對響應內容進行處理
  • 把響應信息返回給客戶端

當代理服務器收到https請求時,AnyProxy能夠替換證書,對請求作明文解析。

  • 調用規則模塊beforeDealHttpsRequest方法,若是返回true,會明文解析這個請求,其餘請求不處理
  • 被明文解析後的https請求,處理流程同http一致。未明文解析請求不會再進入規則模塊作處理。

如何引用

以下幾種方案均可以用來引用規則模塊:

使用本地路徑

anyproxy --rule ./rule.js

使用在線地址

anyproxy --rule https://sample.com/rule.js

使用npm包,AnyProxy使用require()加載本地規則,你能夠在參數裏傳入一個本地的npm包路徑,或是某個全局安裝的npm包

anyproxy --rule ./myRulePkg/ #本地包 npm i -g myRulePkg && anyproxy --rule myRulePkg #全局包

rule接口文檔

規則模塊應該符合cmd規範,一個典型的規則模塊代碼結構以下。模塊中全部方法都是可選的,只需實現業務感興趣的部分便可。

module.exports = {
// 模塊介紹
summary: 'my customized rule for AnyProxy',
// 發送請求前攔截處理
*beforeSendRequest(requestDetail) { /* ... */ },
// 發送響應前處理
*beforeSendResponse(requestDetail, responseDetail) { /* ... */ },
// 是否處理https請求
*beforeDealHttpsRequest(requestDetail) { /* ... */ },
// 請求出錯的事件
*onError(requestDetail, error) { /* ... */ },
// https鏈接服務器出錯
*onConnectError(requestDetail, error) { /* ... */ }
};

更多資料參考anyproxy 官方文檔https://github.com/alibaba/anyproxy/blob/master/docs/cn/src_doc.md

相關文章
相關標籤/搜索