本文主要是讓你們對 whistle 功能有個總體認識,詳細用法參考幫助文檔:wproxy.org/whistle/javascript
若是你還不知道 whistle 是什麼,能夠訪問 GitHub 瞭解:github.com/avwo/whistl…html
whistle 的基本上全部操做均可以經過形以下面的配置方式實現(標準模式):java
pattern operation1 operation2 ... [filter1 filter2 ...]
複製代碼
其中:node
如:git
ke.qq.com 127.0.0.1:6001 reqCookies://(x-env=test) includeFilter://reqH:user-agent=chrome excludeFilter://m:post
複製代碼
上述表示全部 ke.qq.com
的請求,若是請求頭 user-agent
包含 chrome
(不區分大小寫)字符串且不是 post
請求,則設置host(127.0.0.1:6001
),並添加請求Cookie(x-env=test
)。es6
因爲本地沒有開啓
6001
端口的服務,因此請求被拒絕了github
若是規則的前兩個不一樣時爲 URL,還能夠用以下配置方式:web
operation pattern1 pattern2 … [filter1 filter2 …]
複製代碼
operation 和 pattern1 不一樣時爲 URL正則表達式
也能夠支持兼容模式:chrome
operation1 operation2 … pattern1 pattern2 … [filter1 filter2 …]
複製代碼
operation1 ... operationN 不能爲 URL
如:
127.0.0.1:6001 ke.qq.com fudao.qq.com includeFilter://reqH:user-agent=chrome excludeFilter://m:post
resCors://* *.url.cn *.alicdn.com
127.0.0.1:6001 reqCookies://(x-env=test) ke.qq.com fudao.qq.com includeFilter://reqH:user-agent=chrome excludeFilter://m:post
複製代碼
pattern 能夠爲域名,路徑,正則,通配符等:
ke.qq.com 127.0.0.1:6001
10.1.1.1:8080 *.url.cn *.alicdn.com
複製代碼
# 只能匹配域名 ke.qq.com 且端口 5566 的請求
ke.qq.com:5566 127.0.0.1:6001
# 匹配 http 的 80 端口或 https 的 443 端口
ke.qq.com/ 127.0.0.1:6001
複製代碼
https://ke.qq.com 127.0.0.1:6001
http://ke.qq.com 127.0.0.1:7001
複製代碼
路徑匹配跟域名匹配差很少,只是多了須要匹配路徑片斷:
ke.qq.com/statics file:///User/xxx/test
ke.qq.com/cgi-bin 10.1.1.1:8080
複製代碼
file:///User/xxx/test ke.qq.com:8080/page fudao.qq.com/page/
ke.qq.com:8080/cgi-bin 10.1.1.1
複製代碼
file:///User/xxx/test https://ke.qq.com:8080/page fudao.qq.com/page/
https://ke.qq.com:8080/cgi-bin 10.1.1.1
複製代碼
跟普通 js 的正則表達式一致,支持 /regexp/
和 /regexp/i
兩種模式,且支持子匹配,能夠在 opValue
獲取子匹配的值:
ke.qq.com/cgi-bin/
及其子路徑 ke.qq.com/cgi-bin/path/to?xxx
的請求忽略全部規則(至關於直接請求現網)/^\w+://ke\.qq\.com/cgi-bin\// ignore://*
複製代碼
imweb-test
(且忽略大小寫)的 URL 請求忽略全部規則/imweb-test/i ignore://*
複製代碼
/^\w+://\d\.url\.cn/path/to/(\w+)\.\w+\.\w+/ file:///User/test/xxx/dev/$1.$2
複製代碼
正則表達式涉及轉義符及精確匹配,有時寫起比較繁瑣,爲解決這類問題,whistle 提供了通配符匹配解決經常使用匹配問題:
精確匹配
# 只匹配 protocol://ke.qq.com 請求,能夠帶端口及請求參數,但不包含子路徑
$ke.qq.com file:///User/test/index.html
# 只匹配 http://ke.qq.com/test.html 請求,能夠包含請求參數,但不包含子路徑
$http://ke.qq.com file:///User/test/index.html
複製代碼
通配路徑匹配
# 匹配全部域名下的 /cgi-bin 及其子路徑 /cgi-bin/path/to 請求(本地替換會自動補齊後續路徑)
*/cgi-bin file:///User/test/
複製代碼
普統統配符匹配(1個或連續幾個 * 表示通配符,且能夠做爲一個子匹配)
^*.url.cn/path/to/*.*.* file:///User/test/xxx/dev/$2.$3
複製代碼
域名匹配、路徑匹配、通配路徑匹配有一個好處是會自動補齊路徑,即:
*/cgi-bin file:///User/test/
複製代碼
請求 https://ke.qq.com/cgi-bin/test.json
會自動匹配本地文件 /User/test/test.json
,而其它匹配方式須要經過子匹配把路徑本身補齊,詳細匹配規則參見文檔:wproxy.org/whistle/pat…
whistle 將每類操做抽象成一個協議,每一個具體操做對應一個值,即:operation=protocol://opValue
,protocol 表示操做類型,opValue 表示具體操做。
whistle 把每類操做抽象成一個 protocol
,若是修改請求方法(method://post
),修改請求頭(reqHeaders://x-client=test&x-id=123
),修改響應 cors(resCors://*
) 等等,大體可分紅這幾類:
@
功能詳細文檔參見:wproxy.org/whistle/rul…
每一個具體操做對應一個 opValue
,即爲一個字符串或對像,opValue
有一下幾種寫法:
內聯值:
# 一些支持字符串等規則,能夠不用小括號
ke.qq.com proxy://127.0.0.1:8888
# 通常須要設置小括號
fudao.qq.com file://(hello) reqCookies://(x-env=test&x-id=abc)
複製代碼
``` keyName1
Hello world!
-- 2020-1-1
```
``` keyName2
x-env: test
x-id: abc
```
fudao.qq.com file://{keyName1} reqCookies://{keyName2}
複製代碼
用三個及以上等反引號 ` 對 + 鍵名做爲內嵌值的邊界
Values
對一些比較大對值,不適宜直接內嵌到規則裏面,能夠放在跟 Rules
同級到 Values
裏面,用法跟內嵌方式一致。
文件或目錄
有些內容太大不適合放在 WebUI 裏面,或者要本地替換,能夠採用文件或目錄到方式:
ke.qq.com/test file:///User/statics resCookies:///User/json/cookies.json
複製代碼
ke.qq.com/test 及其子路徑請求會自動到 /Users/statics 經過補齊路徑找到對應文件,並會設置
/User/json/cookies.json
裏面的 cookies
模板字符串 方便你們在規則裏面獲取請求 URL、方法、請求參數、請求頭、請求Cookie 以及響應等相關內容,whistle 提供了相似 es6 等模板字符串功能,該功能只支持 內聯值 或 Values 裏面設置的值,不支持文件及目錄:
ke.qq.com file://`(${query.test})`
複製代碼
訪問
https://ke.qq.com?test=hello
返回hello
``` test.html
url: ${url}
```
ke.qq.com file://`{test.html}`
複製代碼
訪問
https://ke.qq.com?test=hello
返回url: https://ke.qq.com?test=hello
,也能夠放 Values 裏面
詳細內容參見:wproxy.org/whistle/dat…
pattern
只能匹配請求的 URL,若是根據請求方法、客戶端IP、請求頭、請求內容,響應狀態碼,響應頭等進行跟靈活精確的匹配,能夠採用 filter
,filter
包含 includeFilter
和 excludeFilter
分別用於實現包含及排除匹配規則,一行規則能夠用任意多個 filter
:
ke.qq.com/cgi-bin resCors://enable resMerge://retcode=10000 includeFilter://resH:content-type=javascript includeFilter://resH:content-type=json excludeFilter://resH:content-type=gbk
複製代碼
上述配置表示因此 ke.qq.com/cgi-bin
及其子路徑 ke.qq.com/cgi-bin/path/to
的請求,若是響應的 content-type
包含(不區分大小寫) javascript
或 json
,且不能包含 gbk,則會執行 resCors://enable
和 resMerge://retcode=10000
操做。
若是你覺這一行太長了,也能夠寫成:
line`
ke.qq.com/cgi-bin resCors://enable resMerge://retcode=10000
includeFilter://resH:content-type=javascript
includeFilter://resH:content-type=json
excludeFilter://resH:content-type=gbk
`
複製代碼
多個 includeFilter
或 excludeFilter
混合時,includeFilter
表示 或
的關係,excludeFilter
表示 且
的關係,即:
pattern operation1 ... excludeFilter://p1 includeFilter://p2 excludeFilter://p3 includeFilter://p4 includeFilter://p5
複製代碼
上述表示 URL 匹配 pattern 的請求,還要匹配 p2 或 p4 或 p5 中的一個,且不能匹配 p1 及 p3。
filter 還支持正則表達式,詳細文檔參見:wproxy.org/whistle/rul…
上面提到的 filter
只能針對單行進行過濾,有時須要在其它行或配置文件裏面過濾可能存在的規則,這時能夠用 pattern ignore://protocol1|protocol2|...
的方式來過濾指定協議:
^**/cgi-* ignore://*
^**/cgi-proxy ignore://!host
ke.qq.com/index.html ignore://file|host
www.baidu.com ignore://proxy|jsAppend
複製代碼
上述表示全部形如 protocol://xxx/cgi-yyy
及其子路徑的請求都忽略全部配置規則,至關於不配任何規則(但 protocol://xxx/cgi-proxy
及其子路徑保留 host 規則);ke.qq.com/index.html
的請求忽略本地替換及host規則;www.baidu.com
的全部請求忽略代理及追加jsAppend的規則。
有關 ignore
的內容參見:wproxy.org/whistle/rul…
除了 filter
和 ignore
,還能夠結合腳本或插件實現更復雜的匹配方式,具體參見:
w2 add
:執行當前目錄的 .whistle.js
文件設置項目規則,詳細文檔參見:wproxy.org/whistle/cli…w2 i whistle.xxx
:安裝 whislte 插件(插件也能夠用 npm 全局安裝)
也能夠指定 registy 安裝插件:
w2 i whistle.xxx --registry=http://xxx
,或直接用內部命令安裝如tnpm
:w2 ti whistle.xxx
w2 uninstall whistle.xxx
:這種卸載方式只支持經過 w2 [x]i whistle.xxx
安裝的插件w2 run xxx
:執行經過 w2 i
安裝的插件自帶命令(不是全局安裝,因此不能直接執行)w2 help
whistle 提供了強大且較爲完善的操做協議,並支持經過插件定製本身的操做協議,每一個插件就是一個 npm 包,不只擁有 whistle 提供的擴展能力,且具有 node 的全部能力,插件至少能夠作如下事情:
如何開發、調試、發佈、使用插件,這裏不贅述,參見文檔便可:wproxy.org/whistle/plu…
whistle 不只支持插件擴展,也能夠做爲普通 npm 包和插件一塊兒打包到第三方應用,具體實現參考: github.com/nohosts/noh…
本文簡單說明了 whistle 的操做方式(pattern operation filter
,其中 operation=protocol://opValue
)、命令行操做、插件擴展、以及如何在應用裏面集成 whistle,除此以外 whistle 還有不少功能,很難在一篇文章裏面詳細羅列清楚,你們結合自身業務不斷挖掘其功能,期間有什麼問題或建議能夠經過 GitHub 的 issue 反饋:github.com/avwo/whistl…