From a4dd21a627873f000b42f6476a20bff1023532b2 Mon Sep 17 00:00:00 2001
From: ottomao <ottomao@gmail.com>
Date: Thu, 13 Apr 2017 14:21:42 +0800
Subject: [PATCH] add 4.x doc to home page

---
 .gitignore                                    |    1 +
 4.x/cn.html                                   |  810 +------------
 4.x/en.html                                   |  807 +------------
 4.x/index.html                                |  805 +------------
 {4.x/assets => assets}/css/atom-one-light.css |    0
 {4.x/assets => assets}/css/custom.css         |    0
 .../assets => assets}/css/github-markdown.css |    0
 {4.x/assets => assets}/css/pilcrow.css        |    0
 cn.html                                       |  837 +++++++++++++
 cn/index.html                                 |  248 ----
 dest/github.css                               |  123 --
 dest/index.css                                |  308 -----
 dest/lib.js                                   |    5 -
 en.html                                       |  832 +++++++++++++
 en/index.html                                 |  243 ----
 gulpfile.js                                   |   35 -
 index.html                                    | 1055 +++++++++++++----
 package.json                                  |    1 -
 sampleA.png                                   |  Bin 17215 -> 0 bytes
 sampleB.png                                   |  Bin 19380 -> 0 bytes
 sampleC.png                                   |  Bin 23255 -> 0 bytes
 sampleD.png                                   |  Bin 18899 -> 0 bytes
 src/i18n.json                                 |   71 --
 src/index.html                                |  250 ----
 src/index.js                                  |    0
 src/index.less                                |  407 -------
 26 files changed, 2496 insertions(+), 4342 deletions(-)
 rename {4.x/assets => assets}/css/atom-one-light.css (100%)
 rename {4.x/assets => assets}/css/custom.css (100%)
 rename {4.x/assets => assets}/css/github-markdown.css (100%)
 rename {4.x/assets => assets}/css/pilcrow.css (100%)
 create mode 100644 cn.html
 delete mode 100644 cn/index.html
 delete mode 100644 dest/github.css
 delete mode 100644 dest/index.css
 delete mode 100644 dest/lib.js
 create mode 100644 en.html
 delete mode 100644 en/index.html
 delete mode 100644 gulpfile.js
 delete mode 100644 sampleA.png
 delete mode 100644 sampleB.png
 delete mode 100644 sampleC.png
 delete mode 100644 sampleD.png
 delete mode 100644 src/i18n.json
 delete mode 100644 src/index.html
 delete mode 100644 src/index.js
 delete mode 100644 src/index.less

diff --git a/.gitignore b/.gitignore
index f76f798..1b4f111 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,6 +5,7 @@
 .hg
 .lock-wscript
 .svn
+.vscode
 .wafpickle-*
 CVS
 npm-debug.log
diff --git a/4.x/cn.html b/4.x/cn.html
index 9e14363..5968c39 100644
--- a/4.x/cn.html
+++ b/4.x/cn.html
@@ -15,7 +15,7 @@
   <script>
     //redirect to Chinese version if in China
     if (new Date().getTimezoneOffset() == "-480" && !(/(cn|en)/i.test(location.href))) {
-      location.href = "./cn.html";
+      location.href = "/";
     } else {
       var _hmt = _hmt || []; (function () { var hm = document.createElement("script"); hm.src = "//hm.baidu.com/hm.js?4e51565b7d471fd6623c163a8fd79e07"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })();
     }
@@ -23,815 +23,7 @@
 </head>
 
 <body>
-  <a href="https://github.com/alibaba/anyproxy/tree/4.x" target="_blank">
-    <img style="position: fixed; top: 0; right: 0; border: 0;z-index: 1;" src="https://camo.githubusercontent.com/a6677b08c955af8400f44c6298f40e7d19cc5b2d/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f72696768745f677261795f3664366436642e706e67"
-      alt="Fork me on GitHub" data-canonical-src="https://s3.amazonaws.com/github/ribbons/forkme_right_gray_6d6d6d.png">
-  </a>
 
-  <article class="markdown-body">
-    <div class="toc-container" id="j_toc">
-      <div class="toc-content"><ul class="nav nav-list">
-    <li class="sidebar-header-1"><a href="#anyproxy">AnyProxy</a></li>
-    <li class="sidebar-header-2"><a href="#快速上手">快速上手</a></li>
-    <li class="sidebar-header-3"><a href="#安装">安装</a></li>
-    <li class="sidebar-header-3"><a href="#启动">启动</a></li>
-    <li class="sidebar-header-3"><a href="#其他命令">其他命令</a></li>
-    <li class="sidebar-header-2"><a href="#代理https请求">代理https请求</a></li>
-    <li class="sidebar-header-2"><a href="#规则模块(rule)">规则模块(Rule)</a></li>
-    <li class="sidebar-header-3"><a href="#开发示例">开发示例</a></li>
-    <li class="sidebar-header-3"><a href="#处理流程">处理流程</a></li>
-    <li class="sidebar-header-3"><a href="#如何引用">如何引用</a></li>
-    <li class="sidebar-header-2"><a href="#规则接口文档">规则接口文档</a></li>
-    <li class="sidebar-header-3"><a href="#summary">summary</a></li>
-    <li class="sidebar-header-4"><a href="#summary-1">summary</a></li>
-    <li class="sidebar-header-3"><a href="#beforesendrequest">beforeSendRequest</a></li>
-    <li class="sidebar-header-4"><a href="#beforesendrequest(requestdetail)">beforeSendRequest(requestDetail)</a></li>
-    <li class="sidebar-header-3"><a href="#beforesendresponse">beforeSendResponse</a></li>
-    <li class="sidebar-header-4"><a href="#beforesendresponse(requestdetail,-responsedetail)">beforeSendResponse(requestDetail, responseDetail)</a></li>
-    <li class="sidebar-header-3"><a href="#beforedealhttpsrequest">beforeDealHttpsRequest</a></li>
-    <li class="sidebar-header-4"><a href="#beforedealhttpsrequest(requestdetail)">beforeDealHttpsRequest(requestDetail)</a></li>
-    <li class="sidebar-header-3"><a href="#onerror">onError</a></li>
-    <li class="sidebar-header-4"><a href="#onerror(requestdetail,-error)">onError(requestDetail, error)</a></li>
-    <li class="sidebar-header-3"><a href="#onconnecterror">onConnectError</a></li>
-    <li class="sidebar-header-4"><a href="#onconnecterror(requestdetail,-error)">onConnectError(requestDetail, error)</a></li>
-    <li class="sidebar-header-3"><a href="#faq">FAQ</a></li>
-    <li class="sidebar-header-2"><a href="#规则模块样例">规则模块样例</a></li>
-    <li class="sidebar-header-3"><a href="#使用本地数据">使用本地数据</a></li>
-    <li class="sidebar-header-3"><a href="#修改请求头">修改请求头</a></li>
-    <li class="sidebar-header-3"><a href="#修改请求数据">修改请求数据</a></li>
-    <li class="sidebar-header-3"><a href="#修改请求的目标地址">修改请求的目标地址</a></li>
-    <li class="sidebar-header-3"><a href="#修改请求协议">修改请求协议</a></li>
-    <li class="sidebar-header-3"><a href="#修改返回状态码">修改返回状态码</a></li>
-    <li class="sidebar-header-3"><a href="#修改返回头">修改返回头</a></li>
-    <li class="sidebar-header-3"><a href="#修改返回内容并延迟">修改返回内容并延迟</a></li>
-    <li class="sidebar-header-2"><a href="#作为npm模块使用">作为npm模块使用</a></li>
-    <li class="sidebar-header-2"><a href="#关于anyproxy">关于AnyProxy</a></li>
-    <li class="sidebar-header-2"><a href="#配置帮助">配置帮助</a></li>
-    <li class="sidebar-header-3"><a href="#osx系统信任ca证书">OSX系统信任CA证书</a></li>
-    <li class="sidebar-header-3"><a href="#windows系统信任ca证书">Windows系统信任CA证书</a></li>
-    <li class="sidebar-header-3"><a href="#配置osx系统代理">配置OSX系统代理</a></li>
-    <li class="sidebar-header-3"><a href="#配置浏览器http代理">配置浏览器HTTP代理</a></li>
-    <li class="sidebar-header-3"><a href="#ios系统信任ca证书">iOS系统信任CA证书</a></li>
-    <li class="sidebar-header-3"><a href="#ios-&gt;&#x3D;-10.3信任ca证书">iOS &gt;&#x3D; 10.3信任CA证书</a></li>
-    <li class="sidebar-header-3"><a href="#配置ios/android系统代理">配置iOS/Android系统代理</a></li>
-</ul>
-      </div>
-    </div>
-    <div class="main-content"><h1 id="anyproxy"><a class="header-link" href="#anyproxy"></a>AnyProxy</h1>
-<blockquote>
-<p>本文档的适用范围是AnyProxy 4.0,此版本当前正在beta中,欢迎提供反馈</p>
-</blockquote>
-<p>Ref: <a href="./en.html">English Doc</a></p>
-<p>AnyProxy是一个开放式的HTTP代理服务器。</p>
-<p>Github主页:<a href="https://github.com/alibaba/anyproxy/tree/4.x">https://github.com/alibaba/anyproxy/tree/4.x</a></p>
-<p>主要特性包括:</p>
-<ul class="list">
-<li>基于Node.js,开放二次开发能力,允许自定义请求处理逻辑</li>
-<li>支持Https的解析</li>
-<li>提供GUI界面,用以观察请求</li>
-</ul>
-<p>相比3.x版本,AnyProxy 4.0的主要变化:</p>
-<ul class="list">
-<li>规则文件(Rule)全面支持Promise和Generator</li>
-<li>简化了规则文件内的接口</li>
-<li>Web版界面重构</li>
-</ul>
-<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/SqVntpzmscXPbSzfcGcr.png" width="500" /></p>
-<h2 id="快速上手"><a class="header-link" href="#快速上手"></a>快速上手</h2>
-<h3 id="安装"><a class="header-link" href="#安装"></a>安装</h3>
-<pre class="hljs"><code>npm install -g anyproxy@beta <span class="hljs-comment">#本文档对应的AnyProxy为4.0Beta版</span></code></pre><h3 id="启动"><a class="header-link" href="#启动"></a>启动</h3>
-<ul class="list">
-<li>命令行启动AnyProxy,默认端口号8001</li>
-</ul>
-<pre class="hljs"><code>anyproxy</code></pre><ul class="list">
-<li>启动后将终端http代理服务器配置为127.0.0.1:8001即可</li>
-<li>访问<a href="http://127.0.0.1:8002">http://127.0.0.1:8002</a> ,web界面上能看到所有的请求信息</li>
-</ul>
-<h3 id="其他命令"><a class="header-link" href="#其他命令"></a>其他命令</h3>
-<ul class="list">
-<li>配置启动端口,如1080端口启动</li>
-</ul>
-<pre class="hljs"><code>anyproxy --port 1080</code></pre><h2 id="代理https请求"><a class="header-link" href="#代理https请求"></a>代理https请求</h2>
-<ul class="list">
-<li>AnyProxy默认不对https请求做处理,如需看到明文信息,需要配置CA证书</li>
-</ul>
-<blockquote>
-<p>解析https请求的原理是中间人攻击(man-in-the-middle),用户必须信任AnyProxy生成的CA证书,才能进行后续流程</p>
-</blockquote>
-<ul class="list">
-<li>生成证书并解析所有https请求</li>
-</ul>
-<pre class="hljs"><code>anyproxy-ca <span class="hljs-comment">#生成rootCA证书,生成后需要手动信任</span>
-anyproxy --intercept <span class="hljs-comment">#启动AnyProxy,并解析所有https请求</span></code></pre><ul class="list">
-<li><a href="#osx系统信任ca证书">附录:如何信任CA证书</a></li>
-</ul>
-<h2 id="规则模块(rule)"><a class="header-link" href="#规则模块(rule)"></a>规则模块(Rule)</h2>
-<p>AnyProxy提供了二次开发的能力,你可以用js编写自己的规则模块(rule),来自定义网络请求的处理逻辑。</p>
-<blockquote>
-<p>注意:引用规则前,请务必确保文件来源可靠,以免发生安全问题</p>
-</blockquote>
-<p>规则模块的能力范围包括:</p>
-<ul class="list">
-<li>拦截并修改正在发送的请求<ul class="list">
-<li>可修改内容包括请求头(request header),请求体(request body),甚至是请求的目标地址等</li>
-</ul>
-</li>
-<li>拦截并修改服务端响应<ul class="list">
-<li>可修改的内容包括http状态码(status code)、响应头(response header)、响应内容等</li>
-</ul>
-</li>
-<li>拦截https请求,对内容做修改<ul class="list">
-<li>本质是中间人攻击(man-in-the-middle attack),需要客户端提前信任AnyProxy生成的CA</li>
-</ul>
-</li>
-</ul>
-<h3 id="开发示例"><a class="header-link" href="#开发示例"></a>开发示例</h3>
-<ul class="list">
-<li><p>举例</p>
-<ul class="list">
-<li>需要编写一个规则模块,在 GET <a href="http://httpbin.org/user-agent">http://httpbin.org/user-agent</a> 的返回值里加上测试信息,并延迟5秒返回</li>
-</ul>
-</li>
-<li><p>Step 1,编写规则</p>
-<pre class="hljs"><code><span class="hljs-comment">// file: sample.js</span>
-<span class="hljs-built_in">module</span>.exports = {
-  <span class="hljs-attr">summary</span>: <span class="hljs-string">'a rule to modify response'</span>,
-  *beforeSendResponse(requestDetail, responseDetail) {
-    <span class="hljs-keyword">if</span> (requestDetail.url === <span class="hljs-string">'http://httpbin.org/user-agent'</span>) {
-      <span class="hljs-keyword">const</span> newResponse = responseDetail.response;
-      newResponse.body += <span class="hljs-string">'-- AnyProxy Hacked! --'</span>;
-      <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Promise</span>(<span class="hljs-function">(<span class="hljs-params">resolve, reject</span>) =&gt;</span> {
-        setTimeout(<span class="hljs-function"><span class="hljs-params">()</span> =&gt;</span> { <span class="hljs-comment">// delay</span>
-          resolve({ <span class="hljs-attr">response</span>: newResponse });
-        }, <span class="hljs-number">5000</span>);
-      });
-    }
-  },
-};</code></pre></li>
-<li><p>Step 2, 启动AnyProxy,加载规则</p>
-<ul class="list">
-<li>运行 <code>anyproxy --rule sample.js</code></li>
-</ul>
-</li>
-<li><p>Step 3, 测试规则</p>
-<ul class="list">
-<li><p>用curl测试 </p>
-<pre class="hljs"><code>curl http://httpbin.org/user-agent --proxy http://127.0.0.1:8001</code></pre></li>
-<li><p>用浏览器测试:配置浏览器http代理为 127.0.0.1:8001,访问 <a href="http://httpbin.org/user-agent">http://httpbin.org/user-agent</a> </p>
-</li>
-<li><p>经过代理服务器后,期望的返回如下</p>
-</li>
-</ul>
-<pre class="hljs"><code>{
-  <span class="hljs-string">"user-agent"</span>: <span class="hljs-string">"curl/7.43.0"</span>
-}
-- AnyProxy Hacked!</code></pre></li>
-<li><p>Step 4, 查看请求信息</p>
-<ul class="list">
-<li>浏览器访问<a href="http://127.0.0.1:8002">http://127.0.0.1:8002</a> ,界面上能看到刚才的请求信息</li>
-</ul>
-</li>
-</ul>
-<h3 id="处理流程"><a class="header-link" href="#处理流程"></a>处理流程</h3>
-<ul class="list">
-<li>处理流程图如下</li>
-</ul>
-<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/TWyNuSJtEZBdrdcOMRjE.png" width="550" /></p>
-<ul class="list">
-<li><p>当http请求经过代理服务器时,具体处理过程是:</p>
-<ul class="list">
-<li>收集请求所有请求参数,包括method, header, body等</li>
-<li>AnyProxy调用规则模块<code>beforeSendRequest</code>方法,由模块做处理,返回新的请求参数,或返回响应内容</li>
-<li>如果<code>beforeSendRequest</code>返回了响应内容,则立即把此响应返回到客户端(而不再发送到真正的服务端),流程结束。</li>
-<li>根据请求参数,向服务端发出请求,接收服务端响应。</li>
-<li>调用规则模块<code>beforeSendResponse</code>方法,由模块对响应内容进行处理</li>
-<li>把响应信息返回给客户端</li>
-</ul>
-</li>
-<li><p>当代理服务器收到https请求时,AnyProxy可以替换证书,对请求做明文解析。</p>
-<ul class="list">
-<li>调用规则模块<code>beforeDealHttpsRequest</code>方法,如果返回<code>true</code>,会明文解析这个请求,其他请求不处理</li>
-<li>被明文解析后的https请求,处理流程同http一致。未明文解析请求不会再进入规则模块做处理。</li>
-</ul>
-</li>
-</ul>
-<h3 id="如何引用"><a class="header-link" href="#如何引用"></a>如何引用</h3>
-<p>如下几种方案都可以用来引用规则模块:</p>
-<ul class="list">
-<li>使用本地路径<pre class="hljs"><code>anyproxy --rule ./rule.js</code></pre></li>
-<li><p>使用在线地址</p>
-<pre class="hljs"><code>anyproxy --rule https://sample.com/rule.js</code></pre></li>
-<li><p>使用npm包</p>
-<ul class="list">
-<li>AnyProxy使用<code>require()</code>加载本地规则,你可以在参数里传入一个本地的npm包路径,或是某个全局安装的npm包</li>
-</ul>
-<pre class="hljs"><code>anyproxy --rule ./myRulePkg/ <span class="hljs-comment">#本地包</span>
-npm i -g myRulePkg &amp;&amp; anyproxy --rule myRulePkg <span class="hljs-comment">#全局包</span></code></pre></li>
-</ul>
-<h2 id="规则接口文档"><a class="header-link" href="#规则接口文档"></a>规则接口文档</h2>
-<p>规则模块应该符合cmd规范,一个典型的规则模块代码结构如下。模块中所有方法都是可选的,只需实现业务感兴趣的部分即可。</p>
-<pre class="hljs"><code><span class="hljs-built_in">module</span>.exports = {
-  <span class="hljs-comment">// 模块介绍</span>
-  summary: <span class="hljs-string">'my customized rule for AnyProxy'</span>, 
-  <span class="hljs-comment">// 发送请求前拦截处理</span>
-  *beforeSendRequest(requestDetail) { <span class="hljs-comment">/* ... */</span> }, 
-  <span class="hljs-comment">// 发送响应前处理</span>
-  *beforeSendResponse(requestDetail, responseDetail) { <span class="hljs-comment">/* ... */</span> }, 
-  <span class="hljs-comment">// 是否处理https请求</span>
-  *beforeDealHttpsRequest(requestDetail) { <span class="hljs-comment">/* ... */</span> }, 
-  <span class="hljs-comment">// 请求出错的事件</span>
-  *onError(requestDetail, error) { <span class="hljs-comment">/* ... */</span> }, 
-  <span class="hljs-comment">// https连接服务器出错</span>
-  *onConnectError(requestDetail, error) { <span class="hljs-comment">/* ... */</span> } 
-};</code></pre><blockquote>
-<p>规则文件中,除了summary,都是由 <a href="https://www.npmjs.com/package/co">co</a> 驱动的,函数需要满足yieldable。可以返回promise或使用generator函数。</p>
-</blockquote>
-<h3 id="summary"><a class="header-link" href="#summary"></a>summary</h3>
-<h4 id="summary-1"><a class="header-link" href="#summary-1"></a>summary</h4>
-<ul class="list">
-<li>规则模块的介绍文案,用于AnyProxy提示用户</li>
-</ul>
-<h3 id="beforesendrequest"><a class="header-link" href="#beforesendrequest"></a>beforeSendRequest</h3>
-<h4 id="beforesendrequest(requestdetail)"><a class="header-link" href="#beforesendrequest(requestdetail)"></a>beforeSendRequest(requestDetail)</h4>
-<ul class="list">
-<li>AnyProxy向服务端发送请求前,会调用<code>beforeSendRequest</code>,并带上参数<code>requestDetail</code></li>
-<li><code>requestDetail</code> <ul class="list">
-<li><code>protocol</code> {string} 请求使用的协议,http或者https</li>
-<li><code>requestOptions</code> {object} 即将发送的请求配置,供require(&#39;http&#39;).request作为使用。详见:<a href="https://nodejs.org/api/http.html#http_http_request_options_callback">https://nodejs.org/api/http.html#http_http_request_options_callback</a></li>
-<li><code>requestData</code> {object} 请求Body</li>
-<li><code>url</code> {string} 请求url</li>
-<li><code>_req</code> {object} 请求的原始request</li>
-</ul>
-</li>
-<li><p>举例:请求 <em>anyproxy.io</em> 时,<code>requestDetail</code>参数内容大致如下</p>
-<pre class="hljs"><code>{
-  <span class="hljs-attr">protocol</span>: <span class="hljs-string">'http'</span>,
-  <span class="hljs-attr">url</span>: <span class="hljs-string">'http://anyproxy.io/'</span>,
-  <span class="hljs-attr">requestOptions</span>: {
-    <span class="hljs-attr">hostname</span>: <span class="hljs-string">'anyproxy.io'</span>,
-    <span class="hljs-attr">port</span>: <span class="hljs-number">80</span>,
-    <span class="hljs-attr">path</span>: <span class="hljs-string">'/'</span>,
-    <span class="hljs-attr">method</span>: <span class="hljs-string">'GET'</span>,
-    <span class="hljs-attr">headers</span>: {
-      <span class="hljs-attr">Host</span>: <span class="hljs-string">'anyproxy.io'</span>,
-      <span class="hljs-string">'Proxy-Connection'</span>: <span class="hljs-string">'keep-alive'</span>,
-      <span class="hljs-string">'User-Agent'</span>: <span class="hljs-string">'...'</span>
-    }
-  },
-  <span class="hljs-attr">requestData</span>: <span class="hljs-string">'...'</span>,
-  <span class="hljs-attr">_req</span>: { <span class="hljs-comment">/* ... */</span>}
-}</code></pre></li>
-<li><p>以下几种返回都是合法的</p>
-<ul class="list">
-<li>不做任何处理,返回null</li>
-</ul>
-<pre class="hljs"><code><span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;</code></pre><ul class="list">
-<li>修改请求协议,如强制改用https发起请求</li>
-</ul>
-<pre class="hljs"><code><span class="hljs-keyword">return</span> {
-  <span class="hljs-attr">protocol</span>: <span class="hljs-string">'https'</span>
-};</code></pre><ul class="list">
-<li>修改请求参数</li>
-</ul>
-<pre class="hljs"><code><span class="hljs-keyword">var</span> newOption = <span class="hljs-built_in">Object</span>.assign({}, requestDetail.requestOptions);
-newOption.path = <span class="hljs-string">'/redirect/to/another/path'</span>;
-<span class="hljs-keyword">return</span> {
-  <span class="hljs-attr">requestOptions</span>: newOption
-};</code></pre><ul class="list">
-<li>修改请求body</li>
-</ul>
-<pre class="hljs"><code><span class="hljs-keyword">return</span> {
-  <span class="hljs-attr">requestData</span>: <span class="hljs-string">'my new request data'</span>
-  <span class="hljs-comment">//这里也可以同时加上requestOptions</span>
-};</code></pre><ul class="list">
-<li>直接返回客户端,不再发起请求,其中<code>statusCode</code> <code>header</code> 是必选字段</li>
-</ul>
-<pre class="hljs"><code><span class="hljs-keyword">return</span> {
-  <span class="hljs-attr">response</span>: {
-    <span class="hljs-attr">statusCode</span>: <span class="hljs-number">200</span>,
-    <span class="hljs-attr">header</span>: { <span class="hljs-string">'content-type'</span>: <span class="hljs-string">'text/html'</span> },
-    <span class="hljs-attr">body</span>: <span class="hljs-string">'this could be a &lt;string&gt; or &lt;buffer&gt;'</span>
-  }
-};</code></pre></li>
-</ul>
-<h3 id="beforesendresponse"><a class="header-link" href="#beforesendresponse"></a>beforeSendResponse</h3>
-<h4 id="beforesendresponse(requestdetail,-responsedetail)"><a class="header-link" href="#beforesendresponse(requestdetail,-responsedetail)"></a>beforeSendResponse(requestDetail, responseDetail)</h4>
-<ul class="list">
-<li>AnyProxy向客户端发送请求前,会调用<code>beforeSendResponse</code>,并带上参数<code>requestDetail</code> <code>responseDetail</code></li>
-<li><code>requestDetail</code> 同<code>beforeSendRequest</code>中的参数</li>
-<li><code>responseDetail</code> <ul class="list">
-<li><code>response</code> {object} 服务端的返回信息,包括<code>statusCode</code> <code>header</code> <code>body</code>三个字段</li>
-<li><code>_res</code> {object} 原始的服务端返回对象</li>
-</ul>
-</li>
-<li><p>举例,请求 <em>anyproxy.io</em> 时,<code>responseDetail</code>参数内容大致如下</p>
-<pre class="hljs"><code>{ 
-  <span class="hljs-attr">response</span>: { 
-    <span class="hljs-attr">statusCode</span>: <span class="hljs-number">200</span>,
-    <span class="hljs-attr">header</span>: { 
-      <span class="hljs-string">'Content-Type'</span>: <span class="hljs-string">'image/gif'</span>,
-      <span class="hljs-attr">Connection</span>: <span class="hljs-string">'close'</span>,
-      <span class="hljs-string">'Cache-Control'</span>: <span class="hljs-string">'...'</span>
-    },
-    <span class="hljs-attr">body</span>: <span class="hljs-string">'...'</span>
-  },
-  <span class="hljs-attr">_res</span>: { <span class="hljs-comment">/* ... */</span> }
-}</code></pre></li>
-<li><p>以下几种返回都是合法的</p>
-<ul class="list">
-<li>不做任何处理,返回null</li>
-</ul>
-<pre class="hljs"><code><span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;</code></pre><ul class="list">
-<li>修改返回的状态码</li>
-</ul>
-<pre class="hljs"><code><span class="hljs-keyword">var</span> newResponse = <span class="hljs-built_in">Object</span>.assign({}, responseDetail.reponse);
-newResponse.statusCode = <span class="hljs-number">404</span>;
-<span class="hljs-keyword">return</span> {
-  <span class="hljs-attr">response</span>: newResponse
-};</code></pre><ul class="list">
-<li>修改返回的内容</li>
-</ul>
-<pre class="hljs"><code><span class="hljs-keyword">var</span> newResponse = <span class="hljs-built_in">Object</span>.assign({}, responseDetail.reponse);
-newResponse.body += <span class="hljs-string">'--from anyproxy--'</span>;
-<span class="hljs-keyword">return</span> {
-  <span class="hljs-attr">response</span>: newResponse
-};</code></pre></li>
-</ul>
-<h3 id="beforedealhttpsrequest"><a class="header-link" href="#beforedealhttpsrequest"></a>beforeDealHttpsRequest</h3>
-<h4 id="beforedealhttpsrequest(requestdetail)"><a class="header-link" href="#beforedealhttpsrequest(requestdetail)"></a>beforeDealHttpsRequest(requestDetail)</h4>
-<ul class="list">
-<li>AnyProxy收到https请求时,会调用<code>beforeDealHttpsRequest</code>,并带上参数<code>requestDetail</code></li>
-<li>如果配置了全局解析https的参数,则AnyProxy会略过这个调用</li>
-<li>只有返回<code>true</code>时,AnyProxy才会尝试替换证书、解析https。否则只做数据流转发,无法看到明文数据。</li>
-<li>注意:https over http的代理模式中,这里的request是CONNECT请求</li>
-<li><code>requestDetail</code><ul class="list">
-<li><code>host</code> {string} 请求目标的Host,受制于协议,这里无法获取完整url</li>
-<li><code>_req</code> {object} 请求的原始request</li>
-</ul>
-</li>
-<li>返回值<ul class="list">
-<li><code>true</code>或者<code>false</code>,表示是否需要AnyProxy替换证书并解析https</li>
-</ul>
-</li>
-</ul>
-<h3 id="onerror"><a class="header-link" href="#onerror"></a>onError</h3>
-<h4 id="onerror(requestdetail,-error)"><a class="header-link" href="#onerror(requestdetail,-error)"></a>onError(requestDetail, error)</h4>
-<ul class="list">
-<li>在请求处理过程中发生错误时,AnyProxy会调用<code>onError</code>方法,并提供对应的错误信息</li>
-<li>多数场景下,错误会在请求目标服务器的时候发生,比如DNS解析失败、请求超时等</li>
-<li><code>requestDetail</code> 同<code>beforeSendRequest</code>中的参数</li>
-<li><p>以下几种返回都是合法的</p>
-<ul class="list">
-<li>不做任何处理。此时AnyProxy会返回一个默认的错误页。</li>
-</ul>
-<pre class="hljs"><code><span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;</code></pre><ul class="list">
-<li>返回自定义错误页</li>
-</ul>
-<pre class="hljs"><code><span class="hljs-keyword">return</span> {
-  <span class="hljs-attr">response</span>: {
-    <span class="hljs-attr">statusCode</span>: <span class="hljs-number">200</span>,
-    <span class="hljs-attr">header</span>: { <span class="hljs-string">'content-type'</span>: <span class="hljs-string">'text/html'</span> },
-    <span class="hljs-attr">body</span>: <span class="hljs-string">'this could be a &lt;string&gt; or &lt;buffer&gt;'</span>
-  }
-};</code></pre></li>
-</ul>
-<h3 id="onconnecterror"><a class="header-link" href="#onconnecterror"></a>onConnectError</h3>
-<h4 id="onconnecterror(requestdetail,-error)"><a class="header-link" href="#onconnecterror(requestdetail,-error)"></a>onConnectError(requestDetail, error)</h4>
-<ul class="list">
-<li>AnyProxy在与目标HTTPS服务器建立连接的过程中,如果发生错误,AnyProxy会调用这个方法</li>
-<li><code>requestDetail</code> 同<code>beforeDealHttpsRequest</code>中的参数</li>
-<li>此处无法控制向客户端的返回信息,无需返回值。</li>
-</ul>
-<h3 id="faq"><a class="header-link" href="#faq"></a>FAQ</h3>
-<ul class="list">
-<li>Q: 为什么https请求不能进入处理函数?</li>
-<li><p>A: 以下任意一项都能用来改变https的处理特性:</p>
-<ol class="list">
-<li>命令行启动AnyProxy时配置<code>--intercept</code>参数,按npm模块启动时配置<code>forceProxyHttps</code>参数,所有Https请求都会被替换证书并解析</li>
-<li>规则文件内提供<code>beforeDealHttpsRequest</code>方法,返回 <em>true</em> 的https请求会被解析</li>
-</ol>
-</li>
-<li><p>Q: 提示 <em>function is not yieldable</em></p>
-</li>
-<li>A: 规则模块是用 <a href="https://www.npmjs.com/package/co">co</a> 驱动的,函数需要满足yieldable。可以使用generator方法或是返回Promise。</li>
-</ul>
-<h2 id="规则模块样例"><a class="header-link" href="#规则模块样例"></a>规则模块样例</h2>
-<ul class="list">
-<li>这里提供一些样例,来讲解规则模块的常见用法</li>
-<li>你可以通过 <code>anyproxy --rule http://....js</code> 来加载模块并体验</li>
-<li>用curl发请求测试的方法如下<ul class="list">
-<li>直接请求服务器:<code>curl http://httpbin.org/</code></li>
-<li>通过代理服务器请求:<code>curl http://httpbin.org/ --proxy http://127.0.0.1:8001</code></li>
-</ul>
-</li>
-</ul>
-<h3 id="使用本地数据"><a class="header-link" href="#使用本地数据"></a>使用本地数据</h3>
-<ul class="list">
-<li>拦截发送到 <a href="http://httpbin.org">http://httpbin.org</a> 的请求,使用本地数据代替服务端返回</li>
-</ul>
-<pre class="hljs"><code>anyproxy --rule https://raw.githubusercontent.com/alibaba/anyproxy/4.x/rule_sample/sample_use_local_response.js</code></pre><pre class="hljs"><code><span class="hljs-comment">/* 
-  sample: 
-    intercept all requests toward httpbin.org, use a local response
-  test:
-    curl http://httpbin.org/user-agent --proxy http://127.0.0.1:8001
-*/</span>
-<span class="hljs-built_in">module</span>.exports = {
-  *beforeSendRequest(requestDetail) {
-    <span class="hljs-keyword">const</span> localResponse = {
-      <span class="hljs-attr">statusCode</span>: <span class="hljs-number">200</span>,
-      <span class="hljs-attr">header</span>: { <span class="hljs-string">'Content-Type'</span>: <span class="hljs-string">'application/json'</span> },
-      <span class="hljs-attr">body</span>: <span class="hljs-string">'{"hello": "this is local response"}'</span>
-    };
-    <span class="hljs-keyword">if</span> (requestDetail.url.indexOf(<span class="hljs-string">'http://httpbin.org'</span>) === <span class="hljs-number">0</span>) {
-      <span class="hljs-keyword">return</span> {
-        <span class="hljs-attr">response</span>: localResponse
-      };
-    }
-  },
-};</code></pre><h3 id="修改请求头"><a class="header-link" href="#修改请求头"></a>修改请求头</h3>
-<ul class="list">
-<li>修改发送到 httpbin.org 的user-agent</li>
-</ul>
-<pre class="hljs"><code>anyproxy --rule https://raw.githubusercontent.com/alibaba/anyproxy/4.x/rule_sample/sample_modify_request_header.js</code></pre><pre class="hljs"><code><span class="hljs-comment">/* 
-  sample: 
-    modify the user-agent in requests toward httpbin.org
-  test:
-    curl http://httpbin.org/user-agent --proxy http://127.0.0.1:8001
-*/</span>
-<span class="hljs-built_in">module</span>.exports = {
-  *beforeSendRequest(requestDetail) {
-    <span class="hljs-keyword">if</span> (requestDetail.url.indexOf(<span class="hljs-string">'http://httpbin.org'</span>) === <span class="hljs-number">0</span>) {
-      <span class="hljs-keyword">const</span> newRequestOptions = requestDetail.requestOptions;
-      newRequestOptions.headers[<span class="hljs-string">'User-Agent'</span>] = <span class="hljs-string">'AnyProxy/0.0.0'</span>;
-      <span class="hljs-keyword">return</span> {
-        <span class="hljs-attr">requestOptions</span>: newRequestOptions
-      };
-    }
-  },
-};</code></pre><h3 id="修改请求数据"><a class="header-link" href="#修改请求数据"></a>修改请求数据</h3>
-<ul class="list">
-<li>修改发送到 <a href="http://httpbin.org/post">http://httpbin.org/post</a> 的post数据</li>
-</ul>
-<pre class="hljs"><code>anyproxy --rule https://raw.githubusercontent.com/alibaba/anyproxy/4.x/rule_sample/sample_modify_request_data.js</code></pre><pre class="hljs"><code><span class="hljs-comment">/* 
-  sample: 
-    modify the post data towards http://httpbin.org/post
-  test:
-    curl -H "Content-Type: text/plain" -X POST -d 'original post data' http://httpbin.org/post --proxy http://127.0.0.1:8001
-  expected response:
-    { "data": "i-am-anyproxy-modified-post-data" }
-*/</span>
-<span class="hljs-built_in">module</span>.exports = {
-  *beforeSendRequest(requestDetail) {
-    <span class="hljs-keyword">if</span> (requestDetail.url.indexOf(<span class="hljs-string">'http://httpbin.org/post'</span>) === <span class="hljs-number">0</span>) {
-      <span class="hljs-keyword">return</span> {
-        <span class="hljs-attr">requestData</span>: <span class="hljs-string">'i-am-anyproxy-modified-post-data'</span>
-      };
-    }
-  },
-};</code></pre><h3 id="修改请求的目标地址"><a class="header-link" href="#修改请求的目标地址"></a>修改请求的目标地址</h3>
-<ul class="list">
-<li>把所有发送到 <a href="http://httpbin.org/">http://httpbin.org/</a> 的请求全部改到 <a href="http://httpbin.org/user-agent">http://httpbin.org/user-agent</a></li>
-</ul>
-<pre class="hljs"><code>anyproxy --rule https://raw.githubusercontent.com/alibaba/anyproxy/4.x/rule_sample/sample_modify_request_path.js</code></pre><pre class="hljs"><code><span class="hljs-comment">/* 
-  sample: 
-    redirect all httpbin.org requests to http://httpbin.org/user-agent
-  test:
-    curl http://httpbin.org/any-path --proxy http://127.0.0.1:8001
-  expected response:
-    { "user-agent": "curl/7.43.0" }
-*/</span>
-<span class="hljs-built_in">module</span>.exports = {
-  *beforeSendRequest(requestDetail) {
-    <span class="hljs-keyword">if</span> (requestDetail.url.indexOf(<span class="hljs-string">'http://httpbin.org'</span>) === <span class="hljs-number">0</span>) {
-      <span class="hljs-keyword">const</span> newRequestOptions = requestDetail.requestOptions;
-      newRequestOptions.path = <span class="hljs-string">'/user-agent'</span>;
-      newRequestOptions.method = <span class="hljs-string">'GET'</span>;
-      <span class="hljs-keyword">return</span> {
-        <span class="hljs-attr">requestOptions</span>: newRequestOptions
-      };
-    }
-  },
-};</code></pre><h3 id="修改请求协议"><a class="header-link" href="#修改请求协议"></a>修改请求协议</h3>
-<ul class="list">
-<li>把用http协议请求的 <a href="http://httpbin.org">http://httpbin.org</a> 改成https并发送</li>
-</ul>
-<pre class="hljs"><code>anyproxy --rule https://raw.githubusercontent.com/alibaba/anyproxy/4.x/rule_sample/sample_modify_request_protocol.js</code></pre><pre class="hljs"><code><span class="hljs-comment">/* 
-  sample: 
-    redirect all http requests of httpbin.org to https
-  test:
-    curl 'http://httpbin.org/get?show_env=1' --proxy http://127.0.0.1:8001
-  expected response:
-    { "X-Forwarded-Protocol": "https" }
-*/</span>
-<span class="hljs-built_in">module</span>.exports = {
-  *beforeSendRequest(requestDetail) {
-    <span class="hljs-keyword">if</span> (requestDetail.url.indexOf(<span class="hljs-string">'http://httpbin.org'</span>) === <span class="hljs-number">0</span>) {
-      <span class="hljs-keyword">const</span> newOption = requestDetail.requestOptions;
-      newOption.port = <span class="hljs-number">443</span>;
-      <span class="hljs-keyword">return</span> {
-        <span class="hljs-attr">protocol</span>: <span class="hljs-string">'https'</span>,
-        <span class="hljs-attr">requestOptions</span>: newOption
-      };
-    }
-  }
-};</code></pre><h3 id="修改返回状态码"><a class="header-link" href="#修改返回状态码"></a>修改返回状态码</h3>
-<ul class="list">
-<li>把 所有<a href="http://httpbin.org">http://httpbin.org</a> 的返回状态码都改成404</li>
-</ul>
-<pre class="hljs"><code>anyproxy --rule https://raw.githubusercontent.com/alibaba/anyproxy/4.x/rule_sample/sample_modify_response_statuscode.js</code></pre><pre class="hljs"><code><span class="hljs-comment">/* 
-  sample: 
-    modify all status code of http://httpbin.org/ to 404
-  test:
-    curl -I 'http://httpbin.org/user-agent' --proxy http://127.0.0.1:8001
-  expected response:
-    HTTP/1.1 404 Not Found
-*/</span>
-<span class="hljs-built_in">module</span>.exports = {
-  *beforeSendResponse(requestDetail, responseDetail) {
-    <span class="hljs-keyword">if</span> (requestDetail.url.indexOf(<span class="hljs-string">'http://httpbin.org'</span>) === <span class="hljs-number">0</span>) {
-      <span class="hljs-keyword">const</span> newResponse = responseDetail.response;
-      newResponse.statusCode = <span class="hljs-number">404</span>;
-      <span class="hljs-keyword">return</span> {
-        <span class="hljs-attr">response</span>: newResponse
-      };
-    }
-  }
-};</code></pre><h3 id="修改返回头"><a class="header-link" href="#修改返回头"></a>修改返回头</h3>
-<ul class="list">
-<li>在 <a href="http://httpbin.org/user-agent">http://httpbin.org/user-agent</a> 的返回头里加上 X-Proxy-By:AnyProxy</li>
-</ul>
-<pre class="hljs"><code>anyproxy --rule https://raw.githubusercontent.com/alibaba/anyproxy/4.x/rule_sample/sample_modify_response_header.js</code></pre><pre class="hljs"><code><span class="hljs-comment">/* 
-  sample: 
-    modify response header of http://httpbin.org/user-agent
-  test:
-    curl -I 'http://httpbin.org/user-agent' --proxy http://127.0.0.1:8001
-  expected response:
-    X-Proxy-By: AnyProxy
-*/</span>
-<span class="hljs-built_in">module</span>.exports = {
-  *beforeSendResponse(requestDetail, responseDetail) {
-    <span class="hljs-keyword">if</span> (requestDetail.url.indexOf(<span class="hljs-string">'http://httpbin.org/user-agent'</span>) === <span class="hljs-number">0</span>) {
-      <span class="hljs-keyword">const</span> newResponse = responseDetail.response;
-      newResponse.header[<span class="hljs-string">'X-Proxy-By'</span>] = <span class="hljs-string">'AnyProxy'</span>;
-      <span class="hljs-keyword">return</span> {
-        <span class="hljs-attr">response</span>: newResponse
-      };
-    }
-  }
-};</code></pre><h3 id="修改返回内容并延迟"><a class="header-link" href="#修改返回内容并延迟"></a>修改返回内容并延迟</h3>
-<ul class="list">
-<li>在 <a href="http://httpbin.org/user-agent">http://httpbin.org/user-agent</a> 的返回最后追加AnyProxy的签名,并延迟5秒</li>
-</ul>
-<pre class="hljs"><code>anyproxy --rule https://raw.githubusercontent.com/alibaba/anyproxy/4.x/rule_sample/sample_modify_response_data.js</code></pre><pre class="hljs"><code><span class="hljs-comment">/* 
-  sample: 
-    modify response data of http://httpbin.org/user-agent
-  test:
-    curl 'http://httpbin.org/user-agent' --proxy http://127.0.0.1:8001
-  expected response:
-    { "user-agent": "curl/7.43.0" } -- AnyProxy Hacked! --
-*/</span>
-
-<span class="hljs-built_in">module</span>.exports = {
-  *beforeSendResponse(requestDetail, responseDetail) {
-    <span class="hljs-keyword">if</span> (requestDetail.url === <span class="hljs-string">'http://httpbin.org/user-agent'</span>) {
-      <span class="hljs-keyword">const</span> newResponse = responseDetail.response;
-      newResponse.body += <span class="hljs-string">'-- AnyProxy Hacked! --'</span>;
-      <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Promise</span>(<span class="hljs-function">(<span class="hljs-params">resolve, reject</span>) =&gt;</span> {
-        setTimeout(<span class="hljs-function"><span class="hljs-params">()</span> =&gt;</span> { <span class="hljs-comment">// delay the response for 5s</span>
-          resolve({ <span class="hljs-attr">response</span>: newResponse });
-        }, <span class="hljs-number">5000</span>);
-      });
-    }
-  },
-};</code></pre><h2 id="作为npm模块使用"><a class="header-link" href="#作为npm模块使用"></a>作为npm模块使用</h2>
-<p>AnyProxy可以作为一个npm模块使用,整合进其他工具。</p>
-<blockquote>
-<p>如要启用https解析,请在代理服务器启动前自行调用<code>AnyProxy.utils.certMgr</code>相关方法生成证书,并引导用户信任安装。或引导用户使用<code>anyproxy-ca</code>方法。</p>
-</blockquote>
-<ul class="list">
-<li>引入</li>
-</ul>
-<pre class="hljs"><code>npm i anyproxy@beta --save <span class="hljs-comment"># 4.0版正在beta中</span></code></pre><ul class="list">
-<li>使用举例</li>
-</ul>
-<pre class="hljs"><code><span class="hljs-keyword">const</span> AnyProxy = <span class="hljs-built_in">require</span>(<span class="hljs-string">'anyproxy'</span>);
-<span class="hljs-keyword">const</span> options = {
-  <span class="hljs-attr">port</span>: <span class="hljs-number">8001</span>,
-  <span class="hljs-attr">rule</span>: <span class="hljs-built_in">require</span>(<span class="hljs-string">'myRuleModule'</span>),
-  <span class="hljs-attr">webInterface</span>: {
-    <span class="hljs-attr">enable</span>: <span class="hljs-literal">true</span>,
-    <span class="hljs-attr">webPort</span>: <span class="hljs-number">8002</span>,
-    <span class="hljs-attr">wsPort</span>: <span class="hljs-number">8003</span>,
-  },
-  <span class="hljs-attr">throttle</span>: <span class="hljs-number">10000</span>,
-  <span class="hljs-attr">forceProxyHttps</span>: <span class="hljs-literal">false</span>,
-  <span class="hljs-attr">silent</span>: <span class="hljs-literal">false</span>
-};
-<span class="hljs-keyword">const</span> proxyServer = <span class="hljs-keyword">new</span> AnyProxy.ProxyServer(options);
-
-proxyServer.on(<span class="hljs-string">'ready'</span>, () =&gt; { <span class="hljs-comment">/* */</span> });
-proxyServer.on(<span class="hljs-string">'error'</span>, (e) =&gt; { <span class="hljs-comment">/* */</span> });
-proxyServer.start();
-
-<span class="hljs-comment">//when finished</span>
-proxyServer.close();</code></pre><ul class="list">
-<li><p>Class: AnyProxy.proxyServer</p>
-<ul class="list">
-<li><p>创建代理服务器</p>
-<pre class="hljs"><code><span class="hljs-keyword">const</span> proxy = <span class="hljs-keyword">new</span> AnyProxy.proxyServer(options)</code></pre></li>
-<li><p><code>options</code></p>
-<ul class="list">
-<li><code>port</code> {number} 必选,代理服务器端口</li>
-<li><code>rule</code> {object} 自定义规则模块</li>
-<li><code>throttle</code> {number} 限速值,单位kb/s,默认不限速</li>
-<li><code>forceProxyHttps</code> {boolean} 是否强制拦截所有的https,忽略规则模块的返回,默认<code>false</code></li>
-<li><code>silent</code> {boolean} 是否屏蔽所有console输出,默认<code>false</code></li>
-<li><code>dangerouslyIgnoreUnauthorized</code> {boolean} 是否忽略请求中的证书错误,默认<code>false</code></li>
-<li><code>webInterface</code> {object} web版界面配置<ul class="list">
-<li><code>enable</code> {boolean} 是否启用web版界面,默认<code>false</code></li>
-<li><code>webPort</code> {number} web版界面端口号,默认<code>8002</code></li>
-</ul>
-</li>
-</ul>
-</li>
-<li><p>Event: <code>ready</code></p>
-<ul class="list">
-<li>代理服务器启动完成</li>
-<li>示例</li>
-</ul>
-<pre class="hljs"><code>proxy.on(<span class="hljs-string">'ready'</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{ })</code></pre></li>
-<li><p>Event: <code>error</code></p>
-<ul class="list">
-<li>代理服务器发生错误</li>
-<li>示例</li>
-</ul>
-<pre class="hljs"><code>proxy.on(<span class="hljs-string">'error'</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{ })</code></pre></li>
-<li><p>Method: <code>start</code></p>
-<ul class="list">
-<li>启动代理服务器</li>
-<li>示例</li>
-</ul>
-<pre class="hljs"><code>proxy.start();</code></pre></li>
-<li><p>Method: <code>close</code></p>
-<ul class="list">
-<li>关闭代理服务器</li>
-<li>示例</li>
-</ul>
-<pre class="hljs"><code>proxy.close();</code></pre></li>
-</ul>
-</li>
-<li><p>AnyProxy.utils.systemProxyMgr</p>
-<ul class="list">
-<li>管理系统的全局代理配置,方法调用时可能会弹出密码框</li>
-<li>使用示例</li>
-</ul>
-<pre class="hljs"><code><span class="hljs-comment">// 配置127.0.0.1:8001为全局http代理服务器</span>
-AnyProxy.utils.systemProxyMgr.enableGlobalProxy(<span class="hljs-string">'127.0.0.1'</span>, <span class="hljs-string">'8001'</span>);    
-
-<span class="hljs-comment">// 关闭全局代理服务器</span>
-AnyProxy.utils.systemProxyMgr.disableGlobalProxy();</code></pre></li>
-<li><p>AnyProxy.utils.certMgr</p>
-<ul class="list">
-<li>管理AnyProxy的证书</li>
-<li><code>AnyProxy.utils.certMgr.ifRootCAFileExists()</code><ul class="list">
-<li>校验系统内是否存在AnyProxy的根证书</li>
-</ul>
-</li>
-<li><code>AnyProxy.utils.certMgr.generateRootCA(callback)</code><ul class="list">
-<li>生成AnyProxy的rootCA,完成后请引导用户信任.crt文件</li>
-</ul>
-</li>
-<li>样例</li>
-</ul>
-<pre class="hljs"><code>  <span class="hljs-keyword">const</span> AnyProxy = <span class="hljs-built_in">require</span>(<span class="hljs-string">'AnyProxy'</span>);
-  <span class="hljs-keyword">const</span> exec = <span class="hljs-built_in">require</span>(<span class="hljs-string">'child_process'</span>).exec;
-
-  <span class="hljs-keyword">if</span> (!AnyProxy.utils.certMgr.ifRootCAFileExists()) {
-    AnyProxy.utils.certMgr.generateRootCA(<span class="hljs-function">(<span class="hljs-params">error, keyPath</span>) =&gt;</span> {
-      <span class="hljs-comment">// let users to trust this CA before using proxy</span>
-      <span class="hljs-keyword">if</span> (!error) {
-        <span class="hljs-keyword">const</span> certDir = <span class="hljs-built_in">require</span>(<span class="hljs-string">'path'</span>).dirname(keyPath);
-        <span class="hljs-built_in">console</span>.log(<span class="hljs-string">'The cert is generated at'</span>, certDir);
-        <span class="hljs-keyword">const</span> isWin = <span class="hljs-regexp">/^win/</span>.test(process.platform);
-        <span class="hljs-keyword">if</span> (isWin) {
-          exec(<span class="hljs-string">'start .'</span>, { <span class="hljs-attr">cwd</span>: certDir });
-        } <span class="hljs-keyword">else</span> {
-          exec(<span class="hljs-string">'open .'</span>, { <span class="hljs-attr">cwd</span>: certDir });
-        }
-      } <span class="hljs-keyword">else</span> {
-        <span class="hljs-built_in">console</span>.error(<span class="hljs-string">'error when generating rootCA'</span>, error);
-      }
-    });
-  }</code></pre></li>
-</ul>
-<h2 id="关于anyproxy"><a class="header-link" href="#关于anyproxy"></a>关于AnyProxy</h2>
-<ul class="list">
-<li>AnyProxy是支付宝前端团队推出的开源产品</li>
-<li>Change Log: <a href="https://github.com/alibaba/anyproxy/blob/master/CHANGELOG">https://github.com/alibaba/anyproxy/blob/master/CHANGELOG</a></li>
-<li>代码库:<a href="https://github.com/alibaba/anyproxy">https://github.com/alibaba/anyproxy</a></li>
-<li>issue反馈:<a href="https://github.com/alibaba/anyproxy/issues">https://github.com/alibaba/anyproxy/issues</a></li>
-</ul>
-<h2 id="配置帮助"><a class="header-link" href="#配置帮助"></a>配置帮助</h2>
-<h3 id="osx系统信任ca证书"><a class="header-link" href="#osx系统信任ca证书"></a>OSX系统信任CA证书</h3>
-<ul class="list">
-<li>类似这种报错都是因为系统没有信任AnyProxy生成的CA所造成的</li>
-</ul>
-<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/CBkLGYgvoHAYwNVAYkpk.png" width="450" /></p>
-<blockquote>
-<p>警告:CA证书和系统安全息息相关,建议亲自生成,并妥善保管</p>
-</blockquote>
-<p>安装CA:</p>
-<ul class="list">
-<li><p>双击打开<em>rootCA.crt</em></p>
-</li>
-<li><p>确认将证书添加到login或system</p>
-</li>
-</ul>
-<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/bCwNUFFpvsmVuljQKrIk.png" width="350" /></p>
-<ul class="list">
-<li>找到刚刚导入的AnyProxy证书,配置为信任(Always Trust)</li>
-</ul>
-<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/HOmEElNGdoZEWFMLsTNT.png" width="700" /></p>
-<h3 id="windows系统信任ca证书"><a class="header-link" href="#windows系统信任ca证书"></a>Windows系统信任CA证书</h3>
-<p class="img-container"><img src="https://t.alipayobjects.com/tfscom/T1D3hfXeFtXXXXXXXX.jpg" width="700" /></p>
-<h3 id="配置osx系统代理"><a class="header-link" href="#配置osx系统代理"></a>配置OSX系统代理</h3>
-<ul class="list">
-<li>在wifi高级设置中,配置http代理即可</li>
-</ul>
-<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/vduwhobSTypTfgniBvoa.png" width="500" /></p>
-<h3 id="配置浏览器http代理"><a class="header-link" href="#配置浏览器http代理"></a>配置浏览器HTTP代理</h3>
-<ul class="list">
-<li>以Chrome的<a href="https://chrome.google.com/webstore/detail/padekgcemlokbadohgkifijomclgjgif">SwitchyOmega插件</a>为例</li>
-</ul>
-<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/jIPZrKmqXRaSledQeJUJ.png" width="500" /></p>
-<h3 id="ios系统信任ca证书"><a class="header-link" href="#ios系统信任ca证书"></a>iOS系统信任CA证书</h3>
-<ul class="list">
-<li>点击web ui中的 <em>Root CA</em>,按提示扫描二维码即可安装</li>
-</ul>
-<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/BrugmMelGVysLDOIBblj.png" width="260" /></p>
-<h3 id="ios->=-10.3信任ca证书"><a class="header-link" href="#ios->=-10.3信任ca证书"></a>iOS &gt;= 10.3信任CA证书</h3>
-<ul class="list">
-<li>除了上述证书安装过程,还需要在 <em>设置-&gt;通用-&gt;证书信任设置</em> 中把AnyProxy证书的开关打开,否则safari将报错。</li>
-</ul>
-<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/hVWkXHrzHmOKOtCKGUWx.png" width="500" /></p>
-<h3 id="配置ios/android系统代理"><a class="header-link" href="#配置ios/android系统代理"></a>配置iOS/Android系统代理</h3>
-<ul class="list">
-<li><p>代理服务器都在wifi设置中配置</p>
-</li>
-<li><p>iOS HTTP代理配置</p>
-</li>
-</ul>
-<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/tLGqIozhffTccUgPakuw.png" width="260" /></p>
-<ul class="list">
-<li>Android HTTP代理配置</li>
-</ul>
-<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/YQtbQYVNuOszZGdAOauU.png" width="260" /></p>
-    </div>
-  </article>
-
-  <script src="//cdn.bootcss.com/zepto/1.2.0/zepto.min.js"></script>
-  <script>
-  window.onload = function(){
-    var itemList = [];
-    var targetMap = {};
-    $("[id]", ".main-content").map(function (index, heading) {
-      targetMap[heading.getAttribute('id')] = heading;
-    });
-
-    $("#j_toc li").map(function (index, item) {
-      if (item.className.indexOf('sidebar-header-2') >= 0 || item.className.indexOf('sidebar-header-3') >= 0) {
-        var targetName = item.firstChild.getAttribute('href').replace('#', '');
-        var targetItem = targetMap[targetName];
-        itemList.push({ target: targetItem, tocItem: item, top: $(targetItem).position().top });
-      }
-    });
-
-    var updateTocActive = function (e) {
-      var windowHeight = window.innerHeight;
-      //find the first item to match
-      var scrollYThres = window.scrollY + 200;
-      var target;
-      if (scrollYThres < 100) {
-        target = itemList[0].tocItem;
-      } else {
-        itemList.forEach(function (item, index) {
-          if (target) return;
-          if (index > 0) {
-            if (item.top >= scrollYThres) {
-              target = itemList[index - 1].tocItem;
-            }
-          }
-        });
-      }
-
-      $('.toc-active').removeClass('toc-active');
-      $(target).addClass('toc-active');
-    };
-
-    window.onscroll = updateTocActive;
-    updateTocActive();
-  }
-  </script>
 </body>
 
 </html>
\ No newline at end of file
diff --git a/4.x/en.html b/4.x/en.html
index 3ee6ab7..2efb7d4 100644
--- a/4.x/en.html
+++ b/4.x/en.html
@@ -15,7 +15,7 @@
   <script>
     //redirect to Chinese version if in China
     if (new Date().getTimezoneOffset() == "-480" && !(/(cn|en)/i.test(location.href))) {
-      location.href = "./cn.html";
+      location.href = "/";
     } else {
       var _hmt = _hmt || []; (function () { var hm = document.createElement("script"); hm.src = "//hm.baidu.com/hm.js?4e51565b7d471fd6623c163a8fd79e07"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })();
     }
@@ -23,810 +23,7 @@
 </head>
 
 <body>
-  <a href="https://github.com/alibaba/anyproxy/tree/4.x" target="_blank">
-    <img style="position: fixed; top: 0; right: 0; border: 0;z-index: 1;" src="https://camo.githubusercontent.com/a6677b08c955af8400f44c6298f40e7d19cc5b2d/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f72696768745f677261795f3664366436642e706e67"
-      alt="Fork me on GitHub" data-canonical-src="https://s3.amazonaws.com/github/ribbons/forkme_right_gray_6d6d6d.png">
-  </a>
-
-  <article class="markdown-body">
-    <div class="toc-container" id="j_toc">
-      <div class="toc-content"><ul class="nav nav-list">
-    <li class="sidebar-header-1"><a href="#anyproxy">AnyProxy</a></li>
-    <li class="sidebar-header-2"><a href="#quick-start">Quick start</a></li>
-    <li class="sidebar-header-3"><a href="#install">install</a></li>
-    <li class="sidebar-header-3"><a href="#launch">launch</a></li>
-    <li class="sidebar-header-3"><a href="#other-commands">other commands</a></li>
-    <li class="sidebar-header-2"><a href="#proxy-https-request">Proxy https request</a></li>
-    <li class="sidebar-header-2"><a href="#use-rule-module">Use rule module</a></li>
-    <li class="sidebar-header-3"><a href="#sample">sample</a></li>
-    <li class="sidebar-header-3"><a href="#the-entire-process">the entire process</a></li>
-    <li class="sidebar-header-3"><a href="#how-to-load-rule-module">how to load rule module</a></li>
-    <li class="sidebar-header-2"><a href="#rule-module-interface">Rule module interface</a></li>
-    <li class="sidebar-header-3"><a href="#summary">summary</a></li>
-    <li class="sidebar-header-4"><a href="#summary-1">summary</a></li>
-    <li class="sidebar-header-3"><a href="#beforesendrequest">beforeSendRequest</a></li>
-    <li class="sidebar-header-4"><a href="#beforesendrequest(requestdetail)">beforeSendRequest(requestDetail)</a></li>
-    <li class="sidebar-header-3"><a href="#beforesendresponse">beforeSendResponse</a></li>
-    <li class="sidebar-header-4"><a href="#beforesendresponse(requestdetail,-responsedetail)">beforeSendResponse(requestDetail, responseDetail)</a></li>
-    <li class="sidebar-header-3"><a href="#beforedealhttpsrequest">beforeDealHttpsRequest</a></li>
-    <li class="sidebar-header-4"><a href="#beforedealhttpsrequest(requestdetail)">beforeDealHttpsRequest(requestDetail)</a></li>
-    <li class="sidebar-header-3"><a href="#onerror">onError</a></li>
-    <li class="sidebar-header-4"><a href="#onerror(requestdetail,-error)">onError(requestDetail, error)</a></li>
-    <li class="sidebar-header-3"><a href="#onconnecterror">onConnectError</a></li>
-    <li class="sidebar-header-4"><a href="#onconnecterror(requestdetail,-error)">onConnectError(requestDetail, error)</a></li>
-    <li class="sidebar-header-3"><a href="#faq">FAQ</a></li>
-    <li class="sidebar-header-2"><a href="#rule-samples">Rule Samples</a></li>
-    <li class="sidebar-header-3"><a href="#use-local-response">use local response</a></li>
-    <li class="sidebar-header-3"><a href="#modify-request-header">modify request header</a></li>
-    <li class="sidebar-header-3"><a href="#modify-request-body">modify request body</a></li>
-    <li class="sidebar-header-3"><a href="#modify-the-request-target">modify the request target</a></li>
-    <li class="sidebar-header-3"><a href="#modify-request-protocol">modify request protocol</a></li>
-    <li class="sidebar-header-3"><a href="#modify-response-status-code">modify response status code</a></li>
-    <li class="sidebar-header-3"><a href="#modify-the-response-header">modify the response header</a></li>
-    <li class="sidebar-header-3"><a href="#modify-response-data-and-delay">modify response data and delay</a></li>
-    <li class="sidebar-header-2"><a href="#use-anyproxy-as-an-npm-module">Use AnyProxy as an npm module</a></li>
-    <li class="sidebar-header-2"><a href="#about-anyproxy">About AnyProxy</a></li>
-    <li class="sidebar-header-2"><a href="#appendix">Appendix</a></li>
-    <li class="sidebar-header-3"><a href="#config-root-ca-in-osx">Config root CA in OSX</a></li>
-    <li class="sidebar-header-3"><a href="#trust-root-ca-in-windows">trust root CA in windows</a></li>
-    <li class="sidebar-header-3"><a href="#config-osx-system-proxy">config OSX system proxy</a></li>
-    <li class="sidebar-header-3"><a href="#config-http-proxy-server">config http proxy server</a></li>
-    <li class="sidebar-header-3"><a href="#trust-root-ca-in-ios">trust root CA in iOS</a></li>
-    <li class="sidebar-header-3"><a href="#trust-root-ca-in-ios-&gt;&#x3D;-10.3">trust root CA in iOS &gt;&#x3D; 10.3</a></li>
-    <li class="sidebar-header-3"><a href="#config-ios/android-proxy-server">config iOS/Android proxy server</a></li>
-</ul>
-      </div>
-    </div>
-    <div class="main-content"><h1 id="anyproxy"><a class="header-link" href="#anyproxy"></a>AnyProxy</h1>
-<p>AnyProxy is a fully configurable http/https proxy in NodeJS. Version 4.0 is in beta now.</p>
-<p>Ref: <a href="./cn.html">Chinese Doc 中文文档</a></p>
-<p>Github: </p>
-<ul class="list">
-<li><a href="https://github.com/alibaba/anyproxy/tree/4.x">https://github.com/alibaba/anyproxy/tree/4.x</a></li>
-</ul>
-<p>Features:</p>
-<ul class="list">
-<li>Offer you the ablity to handle http traffic by invoking a js module</li>
-<li>Intercept https</li>
-<li>GUI webinterface</li>
-</ul>
-<p>Change Logs since 3.x:</p>
-<ul class="list">
-<li>Support Promise and Generator in rule module</li>
-<li>Simplified interface in rule module</li>
-<li>A newly designed web interface</li>
-</ul>
-<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/SqVntpzmscXPbSzfcGcr.png" width="500" /></p>
-<h2 id="quick-start"><a class="header-link" href="#quick-start"></a>Quick start</h2>
-<h3 id="install"><a class="header-link" href="#install"></a>install</h3>
-<pre class="hljs"><code>npm install -g anyproxy@beta <span class="hljs-comment"># 4.x is in beta now</span></code></pre><h3 id="launch"><a class="header-link" href="#launch"></a>launch</h3>
-<ul class="list">
-<li>start AnyProxy in command line, with default port 8001</li>
-</ul>
-<pre class="hljs"><code>anyproxy</code></pre><ul class="list">
-<li>now you can use http proxy server by 127.0.0.1:8001</li>
-<li>visit <a href="http://127.0.0.1:8002">http://127.0.0.1:8002</a> to see the http requests</li>
-</ul>
-<h3 id="other-commands"><a class="header-link" href="#other-commands"></a>other commands</h3>
-<ul class="list">
-<li>specify the port of http proxy</li>
-</ul>
-<pre class="hljs"><code>anyproxy --port 1080</code></pre><h2 id="proxy-https-request"><a class="header-link" href="#proxy-https-request"></a>Proxy https request</h2>
-<ul class="list">
-<li>AnyProxy does NOT intercept https requests by default. To view decrypted info, you have to config the CA certificate.</li>
-</ul>
-<blockquote>
-<p>Under the hood, AnyProxy decryptes https requests by man-in-the-middle attack. Users have to trust the CA cert in advance. Otherwise, client side will issue errors about unsecure network.</p>
-</blockquote>
-<ul class="list">
-<li>generate certifycates and intercept</li>
-</ul>
-<pre class="hljs"><code>anyproxy-ca <span class="hljs-comment">#generate root CA. manually trust it after that.</span>
-anyproxy --intercept <span class="hljs-comment">#launch anyproxy and intercept all https traffic</span></code></pre><ul class="list">
-<li><a href="#osx系统信任ca证书">Appendix:how to trust CA</a></li>
-</ul>
-<h2 id="use-rule-module"><a class="header-link" href="#use-rule-module"></a>Use rule module</h2>
-<p>AnyProxy provides the ability to load your own rules written in javascript. With rule module, you could customize the logic to handle requests.</p>
-<blockquote>
-<p>Make sure your rule file is got from a trusted source. Otherwise, you may face some unknown security risk.</p>
-</blockquote>
-<p>Rule module could do the following stuff:</p>
-<ul class="list">
-<li>intercept and modify the request which is being sent<ul class="list">
-<li>editable fields include request header, body, target address</li>
-</ul>
-</li>
-<li>intercept and modify the response from server<ul class="list">
-<li>editable fields include response status code, header, body</li>
-</ul>
-</li>
-<li>intercept https requests, modify request and response</li>
-</ul>
-<h3 id="sample"><a class="header-link" href="#sample"></a>sample</h3>
-<ul class="list">
-<li><p>Target</p>
-<ul class="list">
-<li>write a rule module to append some text to the response of GET <a href="http://httpbin.org/user-agent">http://httpbin.org/user-agent</a>, and delay the response for 5 seconds</li>
-</ul>
-</li>
-<li><p>Step 1,Write the rule file, save as sample.js</p>
-<pre class="hljs"><code><span class="hljs-comment">// file: sample.js</span>
-<span class="hljs-built_in">module</span>.exports = {
-  <span class="hljs-attr">summary</span>: <span class="hljs-string">'a rule to modify response'</span>,
-  *beforeSendResponse(requestDetail, responseDetail) {
-    <span class="hljs-keyword">if</span> (requestDetail.url === <span class="hljs-string">'http://httpbin.org/user-agent'</span>) {
-      <span class="hljs-keyword">const</span> newResponse = responseDetail.response;
-      newResponse.body += <span class="hljs-string">'-- AnyProxy Hacked! --'</span>;
-      <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Promise</span>(<span class="hljs-function">(<span class="hljs-params">resolve, reject</span>) =&gt;</span> {
-        setTimeout(<span class="hljs-function"><span class="hljs-params">()</span> =&gt;</span> { <span class="hljs-comment">// delay</span>
-          resolve({ <span class="hljs-attr">response</span>: newResponse });
-        }, <span class="hljs-number">5000</span>);
-      });
-    }
-  },
-};</code></pre></li>
-<li><p>Step 2, start AnyProxy and load the rule file</p>
-<ul class="list">
-<li>run <code>anyproxy --rule sample.js</code></li>
-</ul>
-</li>
-<li><p>Step 3, test</p>
-<ul class="list">
-<li><p>use curl </p>
-<pre class="hljs"><code>curl http://httpbin.org/user-agent --proxy http://127.0.0.1:8001</code></pre></li>
-<li><p>use browser. Point the http proxy of browser to 127.0.0.1:8001, then visit <a href="http://httpbin.org/user-agent">http://httpbin.org/user-agent</a> </p>
-</li>
-<li><p>the expected response from proxy is </p>
-</li>
-</ul>
-<pre class="hljs"><code>{
-  <span class="hljs-string">"user-agent"</span>: <span class="hljs-string">"curl/7.43.0"</span>
-}
-- AnyProxy Hacked!</code></pre></li>
-<li><p>Step 4, view the request log</p>
-<ul class="list">
-<li>visit <a href="http://127.0.0.1:8002">http://127.0.0.1:8002</a>, the request just sent should be listed here</li>
-</ul>
-</li>
-</ul>
-<h3 id="the-entire-process"><a class="header-link" href="#the-entire-process"></a>the entire process</h3>
-<ul class="list">
-<li>The flow chart is as follows</li>
-</ul>
-<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/TWyNuSJtEZBdrdcOMRjE.png" width="550" /></p>
-<ul class="list">
-<li><p>When got an http request, the entire process of proxy server is</p>
-<ul class="list">
-<li>AnyProxy collects all the quest info, include method, header, body</li>
-<li>AnyProxy calls <code>beforeSendRequest</code> of the rule module. Rule module deal the request, return new request param or response content</li>
-<li>If <code>beforeSendRequest</code> returns the response content, AnyProxy will send the response to client without sending to target server. The process ends here.</li>
-<li>Send request to target server, collect response</li>
-<li>Call <code>beforeSendResponse</code> of the rule module. Rule module deal the response data</li>
-<li>Send response to client</li>
-</ul>
-</li>
-<li><p>When AnyProxy get https request, it could replace the certificate and decrypt the request data</p>
-<ul class="list">
-<li>AnyProxy calls <code>beforeDealHttpsRequest</code> of the rule module</li>
-<li>If the function returns <code>true</code>, AnyProxy will do the man-in-the-middle attack to it. Otherwise, the request will not be dealed.</li>
-</ul>
-</li>
-</ul>
-<h3 id="how-to-load-rule-module"><a class="header-link" href="#how-to-load-rule-module"></a>how to load rule module</h3>
-<ul class="list">
-<li><p>use local file</p>
-<pre class="hljs"><code>anyproxy --rule ./rule.js</code></pre></li>
-<li><p>use an online rule file</p>
-<pre class="hljs"><code>anyproxy --rule https://sample.com/rule.js</code></pre></li>
-<li><p>use an npm module</p>
-<ul class="list">
-<li>AnyProxy uses <code>require()</code> to load rule module. You could either load a local npm module or a global-installed one.</li>
-</ul>
-<pre class="hljs"><code>anyproxy --rule ./myRulePkg/ <span class="hljs-comment">#local module</span>
-npm i -g myRulePkg &amp;&amp; anyproxy --rule myRulePkg <span class="hljs-comment">#global-installed module</span></code></pre></li>
-</ul>
-<h2 id="rule-module-interface"><a class="header-link" href="#rule-module-interface"></a>Rule module interface</h2>
-<p>A typical rule module is as follows. All the functions are optional, just write the part you are interested in.</p>
-<pre class="hljs"><code><span class="hljs-built_in">module</span>.exports = {
-  <span class="hljs-comment">// introduction</span>
-  summary: <span class="hljs-string">'my customized rule for AnyProxy'</span>, 
-  <span class="hljs-comment">// intercept before send request to server</span>
-  *beforeSendRequest(requestDetail) { <span class="hljs-comment">/* ... */</span> }, 
-  <span class="hljs-comment">// deal response before send to client </span>
-  *beforeSendResponse(requestDetail, responseDetail) { <span class="hljs-comment">/* ... */</span> }, 
-  <span class="hljs-comment">// if deal https request</span>
-  *beforeDealHttpsRequest(requestDetail) { <span class="hljs-comment">/* ... */</span> }, 
-  <span class="hljs-comment">// error happened when dealing requests</span>
-  *onError(requestDetail, error) { <span class="hljs-comment">/* ... */</span> }, 
-  <span class="hljs-comment">// error happened when connect to https server</span>
-  *onConnectError(requestDetail, error) { <span class="hljs-comment">/* ... */</span> } 
-};</code></pre><blockquote>
-<p>All functions in your rule file, except summary, are all driven by <a href="https://www.npmjs.com/package/co">co</a> . They should be yieldable, i.e. return a promise or be a generator function.</p>
-</blockquote>
-<h3 id="summary"><a class="header-link" href="#summary"></a>summary</h3>
-<h4 id="summary-1"><a class="header-link" href="#summary-1"></a>summary</h4>
-<ul class="list">
-<li>Introduction of this rule file. AnyProxy will read this field and give some tip to user.</li>
-</ul>
-<h3 id="beforesendrequest"><a class="header-link" href="#beforesendrequest"></a>beforeSendRequest</h3>
-<h4 id="beforesendrequest(requestdetail)"><a class="header-link" href="#beforesendrequest(requestdetail)"></a>beforeSendRequest(requestDetail)</h4>
-<ul class="list">
-<li>Before sending request to server, AnyProxy will call <code>beforeSendRequest</code> with param <code>requestDetail</code></li>
-<li><code>requestDetail</code> <ul class="list">
-<li><code>protocol</code> {string} the protocol to use, http or https</li>
-<li><code>requestOptions</code> {object} the options of the request-to-go, a param of require(&#39;http&#39;).request . ref: <a href="https://nodejs.org/api/http.html#http_http_request_options_callback">https://nodejs.org/api/http.html#http_http_request_options_callback</a></li>
-<li><code>requestData</code> {object} request body</li>
-<li><code>url</code> {string} request url</li>
-<li><code>_req</code> {object} the native node.js request object</li>
-</ul>
-</li>
-<li><p>e.g. When requesting  <em>anyproxy.io</em>, <code>requestDetail</code> is something like the following</p>
-<pre class="hljs"><code>{
-  <span class="hljs-attr">protocol</span>: <span class="hljs-string">'http'</span>,
-  <span class="hljs-attr">url</span>: <span class="hljs-string">'http://anyproxy.io/'</span>,
-  <span class="hljs-attr">requestOptions</span>: {
-    <span class="hljs-attr">hostname</span>: <span class="hljs-string">'anyproxy.io'</span>,
-    <span class="hljs-attr">port</span>: <span class="hljs-number">80</span>,
-    <span class="hljs-attr">path</span>: <span class="hljs-string">'/'</span>,
-    <span class="hljs-attr">method</span>: <span class="hljs-string">'GET'</span>,
-    <span class="hljs-attr">headers</span>: {
-      <span class="hljs-attr">Host</span>: <span class="hljs-string">'anyproxy.io'</span>,
-      <span class="hljs-string">'Proxy-Connection'</span>: <span class="hljs-string">'keep-alive'</span>,
-      <span class="hljs-string">'User-Agent'</span>: <span class="hljs-string">'...'</span>
-    }
-  },
-  <span class="hljs-attr">requestData</span>: <span class="hljs-string">'...'</span>,
-  <span class="hljs-attr">_req</span>: { <span class="hljs-comment">/* ... */</span>}
-}</code></pre></li>
-<li><p>Any of these return values are valid</p>
-<ul class="list">
-<li>do nothing, and return null</li>
-</ul>
-<pre class="hljs"><code><span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;</code></pre><ul class="list">
-<li>modify the request protocol,i.e. force use https</li>
-</ul>
-<pre class="hljs"><code><span class="hljs-keyword">return</span> {
-  <span class="hljs-attr">protocol</span>: <span class="hljs-string">'https'</span>
-};</code></pre><ul class="list">
-<li>modify request param</li>
-</ul>
-<pre class="hljs"><code><span class="hljs-keyword">var</span> newOption = <span class="hljs-built_in">Object</span>.assign({}, requestDetail.requestOptions);
-newOption.path = <span class="hljs-string">'/redirect/to/another/path'</span>;
-<span class="hljs-keyword">return</span> {
-  <span class="hljs-attr">requestOptions</span>: newOption
-};</code></pre><ul class="list">
-<li>modify request body</li>
-</ul>
-<pre class="hljs"><code><span class="hljs-keyword">return</span> {
-  <span class="hljs-attr">requestData</span>: <span class="hljs-string">'my new request data'</span>
-  <span class="hljs-comment">// requestOptions can also be used here</span>
-};</code></pre><ul class="list">
-<li>give response to the client, not sending request any longer. <code>statusCode</code> <code>headers</code>are required is this situation.</li>
-</ul>
-<pre class="hljs"><code><span class="hljs-keyword">return</span> {
-  <span class="hljs-attr">response</span>: {
-    <span class="hljs-attr">statusCode</span>: <span class="hljs-number">200</span>,
-    <span class="hljs-attr">header</span>: { <span class="hljs-string">'content-type'</span>: <span class="hljs-string">'text/html'</span> },
-    <span class="hljs-attr">body</span>: <span class="hljs-string">'this could be a &lt;string&gt; or &lt;buffer&gt;'</span>
-  }
-};</code></pre></li>
-</ul>
-<h3 id="beforesendresponse"><a class="header-link" href="#beforesendresponse"></a>beforeSendResponse</h3>
-<h4 id="beforesendresponse(requestdetail,-responsedetail)"><a class="header-link" href="#beforesendresponse(requestdetail,-responsedetail)"></a>beforeSendResponse(requestDetail, responseDetail)</h4>
-<ul class="list">
-<li>Before sending response to client, AnyProxy will call <code>beforeSendResponse</code> with param <code>requestDetail</code> <code>responseDetail</code></li>
-<li><code>requestDetail</code> is the same param as in <code>beforeSendRequest</code></li>
-<li><code>responseDetail</code> <ul class="list">
-<li><code>response</code> {object} the response from server, includes <code>statusCode</code> <code>header</code> <code>body</code></li>
-<li><code>_res</code> {object} the native node.js response object</li>
-</ul>
-</li>
-<li><p>e.g. When requesting <em>anyproxy.io</em>, <code>responseDetail</code> is something like the following</p>
-<pre class="hljs"><code>{ 
-  <span class="hljs-attr">response</span>: { 
-    <span class="hljs-attr">statusCode</span>: <span class="hljs-number">200</span>,
-    <span class="hljs-attr">header</span>: { 
-      <span class="hljs-string">'Content-Type'</span>: <span class="hljs-string">'image/gif'</span>,
-      <span class="hljs-attr">Connection</span>: <span class="hljs-string">'close'</span>,
-      <span class="hljs-string">'Cache-Control'</span>: <span class="hljs-string">'...'</span>
-    },
-    <span class="hljs-attr">body</span>: <span class="hljs-string">'...'</span>
-  },
-  <span class="hljs-attr">_res</span>: { <span class="hljs-comment">/* ... */</span> }
-}</code></pre></li>
-<li><p>Any of these return values are valid</p>
-<ul class="list">
-<li>do nothing, and return null</li>
-</ul>
-<pre class="hljs"><code><span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;</code></pre><ul class="list">
-<li>modify the response status code</li>
-</ul>
-<pre class="hljs"><code><span class="hljs-keyword">var</span> newResponse = <span class="hljs-built_in">Object</span>.assign({}, responseDetail.reponse);
-newResponse.statusCode = <span class="hljs-number">404</span>;
-<span class="hljs-keyword">return</span> {
-  <span class="hljs-attr">response</span>: newResponse
-};</code></pre><ul class="list">
-<li>modify the response content</li>
-</ul>
-<pre class="hljs"><code><span class="hljs-keyword">var</span> newResponse = <span class="hljs-built_in">Object</span>.assign({}, responseDetail.reponse);
-newResponse.body += <span class="hljs-string">'--from anyproxy--'</span>;
-<span class="hljs-keyword">return</span> {
-  <span class="hljs-attr">response</span>: newResponse
-};</code></pre></li>
-</ul>
-<h3 id="beforedealhttpsrequest"><a class="header-link" href="#beforedealhttpsrequest"></a>beforeDealHttpsRequest</h3>
-<h4 id="beforedealhttpsrequest(requestdetail)"><a class="header-link" href="#beforedealhttpsrequest(requestdetail)"></a>beforeDealHttpsRequest(requestDetail)</h4>
-<ul class="list">
-<li>When receiving https request, AnyProxy will call <code>beforeDealHttpsRequest</code> with param <code>requestDetail</code></li>
-<li>If configed with <code>forceProxyHttps</code> in launching, AnyProxy will skip calling this method</li>
-<li>Only by returning true, AnyProxy will try to replace the certificate and intercept the https request.</li>
-<li><code>requestDetail</code><ul class="list">
-<li><code>host</code> {string} the target host to request. Due to the request protocol, full url couldn&#39;t be got here</li>
-<li><code>_req</code> {object} the native node.js request object. The <code>_req</code> here refers to the CONNECT request.</li>
-</ul>
-</li>
-<li>return value<ul class="list">
-<li><code>true</code> or <code>false</code>, whether AnyProxy should intercept the https request</li>
-</ul>
-</li>
-</ul>
-<h3 id="onerror"><a class="header-link" href="#onerror"></a>onError</h3>
-<h4 id="onerror(requestdetail,-error)"><a class="header-link" href="#onerror(requestdetail,-error)"></a>onError(requestDetail, error)</h4>
-<ul class="list">
-<li>AnyProxy will call this method when an error happened in request handling.</li>
-<li>Errors usually are issued during requesting, e.g. DNS failure, request timeout</li>
-<li><code>requestDetail</code> is the same one as in <code>beforeSendRequest</code></li>
-<li><p>Any of these return values are valid</p>
-<ul class="list">
-<li>do nothing, and AnyProxy will response a default error page</li>
-</ul>
-<pre class="hljs"><code><span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;</code></pre><ul class="list">
-<li>return a customized error page</li>
-</ul>
-<pre class="hljs"><code><span class="hljs-keyword">return</span> {
-  <span class="hljs-attr">response</span>: {
-    <span class="hljs-attr">statusCode</span>: <span class="hljs-number">200</span>,
-    <span class="hljs-attr">header</span>: { <span class="hljs-string">'content-type'</span>: <span class="hljs-string">'text/html'</span> },
-    <span class="hljs-attr">body</span>: <span class="hljs-string">'this could be a &lt;string&gt; or &lt;buffer&gt;'</span>
-  }
-};</code></pre></li>
-</ul>
-<h3 id="onconnecterror"><a class="header-link" href="#onconnecterror"></a>onConnectError</h3>
-<h4 id="onconnecterror(requestdetail,-error)"><a class="header-link" href="#onconnecterror(requestdetail,-error)"></a>onConnectError(requestDetail, error)</h4>
-<ul class="list">
-<li>AnyProxy will call this method when failed to connect target server in https request</li>
-<li><code>requestDetail</code> is the same one as in <code>beforeDealHttpsRequest</code></li>
-<li>no return value is required </li>
-</ul>
-<h3 id="faq"><a class="header-link" href="#faq"></a>FAQ</h3>
-<ul class="list">
-<li>Q: can not deal https request in rule module.</li>
-<li><p>A: Any of these options could be used to change the way AnyProxy deall https requests </p>
-<ol class="list">
-<li>config <code>--intercept</code> when luanching AnyProxy via cli, or use <code>forceProxyHttps</code> when using as an npm module</li>
-<li>place a <code>beforeDealHttpsRequest</code> function in your rule file and determine which request to intercept by your own.</li>
-</ol>
-</li>
-<li><p>Q: get an error says <em>function is not yieldable</em></p>
-</li>
-<li>A: Rule module is driven by <a href="https://www.npmjs.com/package/co">co</a>. The functions inside should  be yieldable, i.e. return a promise or be a generator function.</li>
-</ul>
-<h2 id="rule-samples"><a class="header-link" href="#rule-samples"></a>Rule Samples</h2>
-<ul class="list">
-<li>here are some samples about frequently used rule file</li>
-<li>try these samples by <code>anyproxy --rule http://....js</code></li>
-<li>how to test with curl:<ul class="list">
-<li>request the server directly <code>curl http://httpbin.org/</code></li>
-<li>request the server via proxy <code>curl http://httpbin.org/ --proxy http://127.0.0.1:8001</code></li>
-</ul>
-</li>
-</ul>
-<h3 id="use-local-response"><a class="header-link" href="#use-local-response"></a>use local response</h3>
-<ul class="list">
-<li>intercept the request towards <a href="http://httpbin.org">http://httpbin.org</a> , return the local-defined response</li>
-</ul>
-<pre class="hljs"><code>anyproxy --rule https://raw.githubusercontent.com/alibaba/anyproxy/4.x/rule_sample/sample_use_local_response.js</code></pre><pre class="hljs"><code><span class="hljs-comment">/* 
-  sample: 
-    intercept all requests toward httpbin.org, use a local response
-  test:
-    curl http://httpbin.org/user-agent --proxy http://127.0.0.1:8001
-*/</span>
-<span class="hljs-built_in">module</span>.exports = {
-  *beforeSendRequest(requestDetail) {
-    <span class="hljs-keyword">const</span> localResponse = {
-      <span class="hljs-attr">statusCode</span>: <span class="hljs-number">200</span>,
-      <span class="hljs-attr">header</span>: { <span class="hljs-string">'Content-Type'</span>: <span class="hljs-string">'application/json'</span> },
-      <span class="hljs-attr">body</span>: <span class="hljs-string">'{"hello": "this is local response"}'</span>
-    };
-    <span class="hljs-keyword">if</span> (requestDetail.url.indexOf(<span class="hljs-string">'http://httpbin.org'</span>) === <span class="hljs-number">0</span>) {
-      <span class="hljs-keyword">return</span> {
-        <span class="hljs-attr">response</span>: localResponse
-      };
-    }
-  },
-};</code></pre><h3 id="modify-request-header"><a class="header-link" href="#modify-request-header"></a>modify request header</h3>
-<ul class="list">
-<li>modify the user-agent sent to httpbin.org</li>
-</ul>
-<pre class="hljs"><code>anyproxy --rule https://raw.githubusercontent.com/alibaba/anyproxy/4.x/rule_sample/sample_modify_request_header.js</code></pre><pre class="hljs"><code><span class="hljs-comment">/* 
-  sample: 
-    modify the user-agent in requests toward httpbin.org
-  test:
-    curl http://httpbin.org/user-agent --proxy http://127.0.0.1:8001
-*/</span>
-<span class="hljs-built_in">module</span>.exports = {
-  *beforeSendRequest(requestDetail) {
-    <span class="hljs-keyword">if</span> (requestDetail.url.indexOf(<span class="hljs-string">'http://httpbin.org'</span>) === <span class="hljs-number">0</span>) {
-      <span class="hljs-keyword">const</span> newRequestOptions = requestDetail.requestOptions;
-      newRequestOptions.headers[<span class="hljs-string">'User-Agent'</span>] = <span class="hljs-string">'AnyProxy/0.0.0'</span>;
-      <span class="hljs-keyword">return</span> {
-        <span class="hljs-attr">requestOptions</span>: newRequestOptions
-      };
-    }
-  },
-};</code></pre><h3 id="modify-request-body"><a class="header-link" href="#modify-request-body"></a>modify request body</h3>
-<ul class="list">
-<li>modify the post body of <a href="http://httpbin.org/post">http://httpbin.org/post</a></li>
-</ul>
-<pre class="hljs"><code>anyproxy --rule https://raw.githubusercontent.com/alibaba/anyproxy/4.x/rule_sample/sample_modify_request_data.js</code></pre><pre class="hljs"><code><span class="hljs-comment">/* 
-  sample: 
-    modify the post data towards http://httpbin.org/post
-  test:
-    curl -H "Content-Type: text/plain" -X POST -d 'original post data' http://httpbin.org/post --proxy http://127.0.0.1:8001
-  expected response:
-    { "data": "i-am-anyproxy-modified-post-data" }
-*/</span>
-<span class="hljs-built_in">module</span>.exports = {
-  *beforeSendRequest(requestDetail) {
-    <span class="hljs-keyword">if</span> (requestDetail.url.indexOf(<span class="hljs-string">'http://httpbin.org/post'</span>) === <span class="hljs-number">0</span>) {
-      <span class="hljs-keyword">return</span> {
-        <span class="hljs-attr">requestData</span>: <span class="hljs-string">'i-am-anyproxy-modified-post-data'</span>
-      };
-    }
-  },
-};</code></pre><h3 id="modify-the-request-target"><a class="header-link" href="#modify-the-request-target"></a>modify the request target</h3>
-<ul class="list">
-<li>send all the request towards <a href="http://httpbin.org/">http://httpbin.org/</a> to <a href="http://httpbin.org/user-agent">http://httpbin.org/user-agent</a></li>
-</ul>
-<pre class="hljs"><code>anyproxy --rule https://raw.githubusercontent.com/alibaba/anyproxy/4.x/rule_sample/sample_modify_request_path.js</code></pre><pre class="hljs"><code><span class="hljs-comment">/* 
-  sample: 
-    redirect all httpbin.org requests to http://httpbin.org/user-agent
-  test:
-    curl http://httpbin.org/any-path --proxy http://127.0.0.1:8001
-  expected response:
-    { "user-agent": "curl/7.43.0" }
-*/</span>
-<span class="hljs-built_in">module</span>.exports = {
-  *beforeSendRequest(requestDetail) {
-    <span class="hljs-keyword">if</span> (requestDetail.url.indexOf(<span class="hljs-string">'http://httpbin.org'</span>) === <span class="hljs-number">0</span>) {
-      <span class="hljs-keyword">const</span> newRequestOptions = requestDetail.requestOptions;
-      newRequestOptions.path = <span class="hljs-string">'/user-agent'</span>;
-      newRequestOptions.method = <span class="hljs-string">'GET'</span>;
-      <span class="hljs-keyword">return</span> {
-        <span class="hljs-attr">requestOptions</span>: newRequestOptions
-      };
-    }
-  },
-};</code></pre><h3 id="modify-request-protocol"><a class="header-link" href="#modify-request-protocol"></a>modify request protocol</h3>
-<ul class="list">
-<li>modify the http request towards <a href="http://httpbin.org">http://httpbin.org</a> to https</li>
-</ul>
-<pre class="hljs"><code>anyproxy --rule https://raw.githubusercontent.com/alibaba/anyproxy/4.x/rule_sample/sample_modify_request_protocol.js</code></pre><pre class="hljs"><code><span class="hljs-comment">/* 
-  sample: 
-    redirect all http requests of httpbin.org to https
-  test:
-    curl 'http://httpbin.org/get?show_env=1' --proxy http://127.0.0.1:8001
-  expected response:
-    { "X-Forwarded-Protocol": "https" }
-*/</span>
-<span class="hljs-built_in">module</span>.exports = {
-  *beforeSendRequest(requestDetail) {
-    <span class="hljs-keyword">if</span> (requestDetail.url.indexOf(<span class="hljs-string">'http://httpbin.org'</span>) === <span class="hljs-number">0</span>) {
-      <span class="hljs-keyword">const</span> newOption = requestDetail.requestOptions;
-      newOption.port = <span class="hljs-number">443</span>;
-      <span class="hljs-keyword">return</span> {
-        <span class="hljs-attr">protocol</span>: <span class="hljs-string">'https'</span>,
-        <span class="hljs-attr">requestOptions</span>: newOption
-      };
-    }
-  }
-};</code></pre><h3 id="modify-response-status-code"><a class="header-link" href="#modify-response-status-code"></a>modify response status code</h3>
-<ul class="list">
-<li>modify all status code from <a href="http://httpbin.org">http://httpbin.org</a> to 404</li>
-</ul>
-<pre class="hljs"><code>anyproxy --rule https://raw.githubusercontent.com/alibaba/anyproxy/4.x/rule_sample/sample_modify_response_statuscode.js</code></pre><pre class="hljs"><code><span class="hljs-comment">/* 
-  sample: 
-    modify all status code of http://httpbin.org/ to 404
-  test:
-    curl -I 'http://httpbin.org/user-agent' --proxy http://127.0.0.1:8001
-  expected response:
-    HTTP/1.1 404 Not Found
-*/</span>
-<span class="hljs-built_in">module</span>.exports = {
-  *beforeSendResponse(requestDetail, responseDetail) {
-    <span class="hljs-keyword">if</span> (requestDetail.url.indexOf(<span class="hljs-string">'http://httpbin.org'</span>) === <span class="hljs-number">0</span>) {
-      <span class="hljs-keyword">const</span> newResponse = responseDetail.response;
-      newResponse.statusCode = <span class="hljs-number">404</span>;
-      <span class="hljs-keyword">return</span> {
-        <span class="hljs-attr">response</span>: newResponse
-      };
-    }
-  }
-};</code></pre><h3 id="modify-the-response-header"><a class="header-link" href="#modify-the-response-header"></a>modify the response header</h3>
-<ul class="list">
-<li>add X-Proxy-By:AnyProxy to the response header from <a href="http://httpbin.org/user-agent">http://httpbin.org/user-agent</a></li>
-</ul>
-<pre class="hljs"><code>anyproxy --rule https://raw.githubusercontent.com/alibaba/anyproxy/4.x/rule_sample/sample_modify_response_header.js</code></pre><pre class="hljs"><code><span class="hljs-comment">/* 
-  sample: 
-    modify response header of http://httpbin.org/user-agent
-  test:
-    curl -I 'http://httpbin.org/user-agent' --proxy http://127.0.0.1:8001
-  expected response:
-    X-Proxy-By: AnyProxy
-*/</span>
-<span class="hljs-built_in">module</span>.exports = {
-  *beforeSendResponse(requestDetail, responseDetail) {
-    <span class="hljs-keyword">if</span> (requestDetail.url.indexOf(<span class="hljs-string">'http://httpbin.org/user-agent'</span>) === <span class="hljs-number">0</span>) {
-      <span class="hljs-keyword">const</span> newResponse = responseDetail.response;
-      newResponse.header[<span class="hljs-string">'X-Proxy-By'</span>] = <span class="hljs-string">'AnyProxy'</span>;
-      <span class="hljs-keyword">return</span> {
-        <span class="hljs-attr">response</span>: newResponse
-      };
-    }
-  }
-};</code></pre><h3 id="modify-response-data-and-delay"><a class="header-link" href="#modify-response-data-and-delay"></a>modify response data and delay</h3>
-<ul class="list">
-<li>append some info to the response of <a href="http://httpbin.org/user-agent">http://httpbin.org/user-agent</a>, then delay the response for 5 seconds.</li>
-</ul>
-<pre class="hljs"><code>anyproxy --rule https://raw.githubusercontent.com/alibaba/anyproxy/4.x/rule_sample/sample_modify_response_data.js</code></pre><pre class="hljs"><code><span class="hljs-comment">/* 
-  sample: 
-    modify response data of http://httpbin.org/user-agent
-  test:
-    curl 'http://httpbin.org/user-agent' --proxy http://127.0.0.1:8001
-  expected response:
-    { "user-agent": "curl/7.43.0" } -- AnyProxy Hacked! --
-*/</span>
-
-<span class="hljs-built_in">module</span>.exports = {
-  *beforeSendResponse(requestDetail, responseDetail) {
-    <span class="hljs-keyword">if</span> (requestDetail.url === <span class="hljs-string">'http://httpbin.org/user-agent'</span>) {
-      <span class="hljs-keyword">const</span> newResponse = responseDetail.response;
-      newResponse.body += <span class="hljs-string">'-- AnyProxy Hacked! --'</span>;
-      <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Promise</span>(<span class="hljs-function">(<span class="hljs-params">resolve, reject</span>) =&gt;</span> {
-        setTimeout(<span class="hljs-function"><span class="hljs-params">()</span> =&gt;</span> { <span class="hljs-comment">// delay the response for 5s</span>
-          resolve({ <span class="hljs-attr">response</span>: newResponse });
-        }, <span class="hljs-number">5000</span>);
-      });
-    }
-  },
-};</code></pre><h2 id="use-anyproxy-as-an-npm-module"><a class="header-link" href="#use-anyproxy-as-an-npm-module"></a>Use AnyProxy as an npm module</h2>
-<p>AnyProxy can be used as an npm module</p>
-<blockquote>
-<p>To enable https feature, please guide users to use <code>anyproxy-ca</code> in cli. Or use methods under <code>AnyProxy.utils.certMgr</code> to generate certificates.</p>
-</blockquote>
-<ul class="list">
-<li>install</li>
-</ul>
-<pre class="hljs"><code>npm i anyproxy@beta --save <span class="hljs-comment"># 4.0 is in beta now</span></code></pre><ul class="list">
-<li>sample</li>
-</ul>
-<pre class="hljs"><code><span class="hljs-keyword">const</span> AnyProxy = <span class="hljs-built_in">require</span>(<span class="hljs-string">'anyproxy'</span>);
-<span class="hljs-keyword">const</span> options = {
-  <span class="hljs-attr">port</span>: <span class="hljs-number">8001</span>,
-  <span class="hljs-attr">rule</span>: <span class="hljs-built_in">require</span>(<span class="hljs-string">'myRuleModule'</span>),
-  <span class="hljs-attr">webInterface</span>: {
-    <span class="hljs-attr">enable</span>: <span class="hljs-literal">true</span>,
-    <span class="hljs-attr">webPort</span>: <span class="hljs-number">8002</span>,
-    <span class="hljs-attr">wsPort</span>: <span class="hljs-number">8003</span>,
-  },
-  <span class="hljs-attr">throttle</span>: <span class="hljs-number">10000</span>,
-  <span class="hljs-attr">forceProxyHttps</span>: <span class="hljs-literal">false</span>,
-  <span class="hljs-attr">silent</span>: <span class="hljs-literal">false</span>
-};
-<span class="hljs-keyword">const</span> proxyServer = <span class="hljs-keyword">new</span> AnyProxy.ProxyServer(options);
-
-proxyServer.on(<span class="hljs-string">'ready'</span>, () =&gt; { <span class="hljs-comment">/* */</span> });
-proxyServer.on(<span class="hljs-string">'error'</span>, (e) =&gt; { <span class="hljs-comment">/* */</span> });
-proxyServer.start();
-
-<span class="hljs-comment">//when finished</span>
-proxyServer.close();</code></pre><ul class="list">
-<li><p>Class: AnyProxy.proxyServer</p>
-<ul class="list">
-<li><p>create a proxy server</p>
-<pre class="hljs"><code><span class="hljs-keyword">const</span> proxy = <span class="hljs-keyword">new</span> AnyProxy.proxyServer(options)</code></pre></li>
-<li><p><code>options</code></p>
-<ul class="list">
-<li><code>port</code> {number} required, port number of proxy server</li>
-<li><code>rule</code> {object} your rule module</li>
-<li><code>throttle</code> {number} throttle in kb/s, unlimited for default</li>
-<li><code>forceProxyHttps</code> {boolean} in force intercept all https request, false for default</li>
-<li><code>silent</code> {boolean} if keep silent in console, false for default<code>false</code></li>
-<li><code>dangerouslyIgnoreUnauthorized</code> {boolean} if ignore certificate error in request, false for default</li>
-<li><code>webInterface</code> {object} config for web interface<ul class="list">
-<li><code>enable</code> {boolean} if enable web interface, false for default</li>
-<li><code>webPort</code> {number} port number for web interface</li>
-</ul>
-</li>
-</ul>
-</li>
-<li><p>Event: <code>ready</code></p>
-<ul class="list">
-<li>emit when proxy server is ready</li>
-<li>sample</li>
-</ul>
-<pre class="hljs"><code>proxy.on(<span class="hljs-string">'ready'</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{ })</code></pre></li>
-<li><p>Event: <code>error</code></p>
-<ul class="list">
-<li>emit when error happened inside proxy server</li>
-<li>sample</li>
-</ul>
-<pre class="hljs"><code>proxy.on(<span class="hljs-string">'error'</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{ })</code></pre></li>
-<li><p>Method: <code>start</code></p>
-<ul class="list">
-<li>start proxy server</li>
-<li>sample</li>
-</ul>
-<pre class="hljs"><code>proxy.start();</code></pre></li>
-<li><p>Method: <code>close</code></p>
-<ul class="list">
-<li>close proxy server</li>
-<li>sample</li>
-</ul>
-<pre class="hljs"><code>proxy.close();</code></pre></li>
-</ul>
-</li>
-<li><p>AnyProxy.utils.systemProxyMgr</p>
-<ul class="list">
-<li>manage the system proxy config. sudo password may be required</li>
-<li>sample</li>
-</ul>
-<pre class="hljs"><code><span class="hljs-comment">// set 127.0.0.1:8001 as system http server</span>
-AnyProxy.utils.systemProxyMgr.enableGlobalProxy(<span class="hljs-string">'127.0.0.1'</span>, <span class="hljs-string">'8001'</span>);    
-
-<span class="hljs-comment">// disable global proxy server</span>
-AnyProxy.utils.systemProxyMgr.disableGlobalProxy();</code></pre></li>
-<li><p>AnyProxy.utils.certMgr</p>
-<ul class="list">
-<li>Manage certificates of AnyProxy</li>
-<li><code>AnyProxy.utils.certMgr.ifRootCAFileExists()</code><ul class="list">
-<li>detect if AnyProx rootCA exists</li>
-</ul>
-</li>
-<li><code>AnyProxy.utils.certMgr.generateRootCA(callback)</code><ul class="list">
-<li>generate a rootCA</li>
-</ul>
-</li>
-<li>Sample</li>
-</ul>
-<pre class="hljs"><code>  <span class="hljs-keyword">const</span> AnyProxy = <span class="hljs-built_in">require</span>(<span class="hljs-string">'AnyProxy'</span>);
-  <span class="hljs-keyword">const</span> exec = <span class="hljs-built_in">require</span>(<span class="hljs-string">'child_process'</span>).exec;
-
-  <span class="hljs-keyword">if</span> (!AnyProxy.utils.certMgr.ifRootCAFileExists()) {
-    AnyProxy.utils.certMgr.generateRootCA(<span class="hljs-function">(<span class="hljs-params">error, keyPath</span>) =&gt;</span> {
-      <span class="hljs-comment">// let users to trust this CA before using proxy</span>
-      <span class="hljs-keyword">if</span> (!error) {
-        <span class="hljs-keyword">const</span> certDir = <span class="hljs-built_in">require</span>(<span class="hljs-string">'path'</span>).dirname(keyPath);
-        <span class="hljs-built_in">console</span>.log(<span class="hljs-string">'The cert is generated at'</span>, certDir);
-        <span class="hljs-keyword">const</span> isWin = <span class="hljs-regexp">/^win/</span>.test(process.platform);
-        <span class="hljs-keyword">if</span> (isWin) {
-          exec(<span class="hljs-string">'start .'</span>, { <span class="hljs-attr">cwd</span>: certDir });
-        } <span class="hljs-keyword">else</span> {
-          exec(<span class="hljs-string">'open .'</span>, { <span class="hljs-attr">cwd</span>: certDir });
-        }
-      } <span class="hljs-keyword">else</span> {
-        <span class="hljs-built_in">console</span>.error(<span class="hljs-string">'error when generating rootCA'</span>, error);
-      }
-    });
-  }</code></pre></li>
-</ul>
-<h2 id="about-anyproxy"><a class="header-link" href="#about-anyproxy"></a>About AnyProxy</h2>
-<ul class="list">
-<li>Change Log: <a href="https://github.com/alibaba/anyproxy/blob/master/CHANGELOG">https://github.com/alibaba/anyproxy/blob/master/CHANGELOG</a></li>
-<li>Github:<a href="https://github.com/alibaba/anyproxy">https://github.com/alibaba/anyproxy</a></li>
-<li>issue:<a href="https://github.com/alibaba/anyproxy/issues">https://github.com/alibaba/anyproxy/issues</a></li>
-</ul>
-<h2 id="appendix"><a class="header-link" href="#appendix"></a>Appendix</h2>
-<h3 id="config-root-ca-in-osx"><a class="header-link" href="#config-root-ca-in-osx"></a>Config root CA in OSX</h3>
-<ul class="list">
-<li>this kind of errors is usually caused by untrusted root CA</li>
-</ul>
-<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/CBkLGYgvoHAYwNVAYkpk.png" width="450" /></p>
-<blockquote>
-<p>Warning: please keep your root CA safe since it may influence your system security.</p>
-</blockquote>
-<p>install :</p>
-<ul class="list">
-<li><p>double click <em>rootCA.crt</em></p>
-</li>
-<li><p>add cert into login or system</p>
-</li>
-</ul>
-<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/bCwNUFFpvsmVuljQKrIk.png" width="350" /></p>
-<ul class="list">
-<li>find the newly imported AnyProxy certificates, configured as <strong>Always Trust</strong></li>
-</ul>
-<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/HOmEElNGdoZEWFMLsTNT.png" width="700" /></p>
-<h3 id="trust-root-ca-in-windows"><a class="header-link" href="#trust-root-ca-in-windows"></a>trust root CA in windows</h3>
-<p class="img-container"><img src="https://t.alipayobjects.com/tfscom/T1D3hfXeFtXXXXXXXX.jpg" width="700" /></p>
-<h3 id="config-osx-system-proxy"><a class="header-link" href="#config-osx-system-proxy"></a>config OSX system proxy</h3>
-<ul class="list">
-<li>the config is in wifi - advanced</li>
-</ul>
-<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/vduwhobSTypTfgniBvoa.png" width="500" /></p>
-<h3 id="config-http-proxy-server"><a class="header-link" href="#config-http-proxy-server"></a>config http proxy server</h3>
-<ul class="list">
-<li>take Chrome extent [SwitchyOmega] as an example(<a href="https://chrome.google.com/webstore/detail/padekgcemlokbadohgkifijomclgjgif)为例">https://chrome.google.com/webstore/detail/padekgcemlokbadohgkifijomclgjgif)为例</a></li>
-</ul>
-<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/jIPZrKmqXRaSledQeJUJ.png" width="500" /></p>
-<h3 id="trust-root-ca-in-ios"><a class="header-link" href="#trust-root-ca-in-ios"></a>trust root CA in iOS</h3>
-<ul class="list">
-<li>Click <em>Root CA</em> in web ui, and follow the instruction to install</li>
-</ul>
-<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/BrugmMelGVysLDOIBblj.png" width="260" /></p>
-<h3 id="trust-root-ca-in-ios->=-10.3"><a class="header-link" href="#trust-root-ca-in-ios->=-10.3"></a>trust root CA in iOS &gt;= 10.3</h3>
-<ul class="list">
-<li>Besides installing root CA, you have to &quot;turn on&quot; the certificate for web manually in <em>settings - general - about - Certificate Trust Settings</em>. Otherwire, safari will not trust the root CA generated by AnyProxy.</li>
-</ul>
-<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/hVWkXHrzHmOKOtCKGUWx.png" width="500" /></p>
-<h3 id="config-ios/android-proxy-server"><a class="header-link" href="#config-ios/android-proxy-server"></a>config iOS/Android proxy server</h3>
-<ul class="list">
-<li><p>proxy settings are placed in wifi setting</p>
-</li>
-<li><p>iOS</p>
-</li>
-</ul>
-<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/tLGqIozhffTccUgPakuw.png" width="260" /></p>
-<ul class="list">
-<li>Android</li>
-</ul>
-<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/YQtbQYVNuOszZGdAOauU.png" width="260" /></p>
-    </div>
-  </article>
-
-  <script src="//cdn.bootcss.com/zepto/1.2.0/zepto.min.js"></script>
-  <script>
-  window.onload = function(){
-    var itemList = [];
-    var targetMap = {};
-    $("[id]", ".main-content").map(function (index, heading) {
-      targetMap[heading.getAttribute('id')] = heading;
-    });
-
-    $("#j_toc li").map(function (index, item) {
-      if (item.className.indexOf('sidebar-header-2') >= 0 || item.className.indexOf('sidebar-header-3') >= 0) {
-        var targetName = item.firstChild.getAttribute('href').replace('#', '');
-        var targetItem = targetMap[targetName];
-        itemList.push({ target: targetItem, tocItem: item, top: $(targetItem).position().top });
-      }
-    });
-
-    var updateTocActive = function (e) {
-      var windowHeight = window.innerHeight;
-      //find the first item to match
-      var scrollYThres = window.scrollY + 200;
-      var target;
-      if (scrollYThres < 100) {
-        target = itemList[0].tocItem;
-      } else {
-        itemList.forEach(function (item, index) {
-          if (target) return;
-          if (index > 0) {
-            if (item.top >= scrollYThres) {
-              target = itemList[index - 1].tocItem;
-            }
-          }
-        });
-      }
-
-      $('.toc-active').removeClass('toc-active');
-      $(target).addClass('toc-active');
-    };
-
-    window.onscroll = updateTocActive;
-    updateTocActive();
-  }
-  </script>
+ 
 </body>
 
 </html>
\ No newline at end of file
diff --git a/4.x/index.html b/4.x/index.html
index 3ee6ab7..5968c39 100644
--- a/4.x/index.html
+++ b/4.x/index.html
@@ -15,7 +15,7 @@
   <script>
     //redirect to Chinese version if in China
     if (new Date().getTimezoneOffset() == "-480" && !(/(cn|en)/i.test(location.href))) {
-      location.href = "./cn.html";
+      location.href = "/";
     } else {
       var _hmt = _hmt || []; (function () { var hm = document.createElement("script"); hm.src = "//hm.baidu.com/hm.js?4e51565b7d471fd6623c163a8fd79e07"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })();
     }
@@ -23,810 +23,7 @@
 </head>
 
 <body>
-  <a href="https://github.com/alibaba/anyproxy/tree/4.x" target="_blank">
-    <img style="position: fixed; top: 0; right: 0; border: 0;z-index: 1;" src="https://camo.githubusercontent.com/a6677b08c955af8400f44c6298f40e7d19cc5b2d/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f72696768745f677261795f3664366436642e706e67"
-      alt="Fork me on GitHub" data-canonical-src="https://s3.amazonaws.com/github/ribbons/forkme_right_gray_6d6d6d.png">
-  </a>
 
-  <article class="markdown-body">
-    <div class="toc-container" id="j_toc">
-      <div class="toc-content"><ul class="nav nav-list">
-    <li class="sidebar-header-1"><a href="#anyproxy">AnyProxy</a></li>
-    <li class="sidebar-header-2"><a href="#quick-start">Quick start</a></li>
-    <li class="sidebar-header-3"><a href="#install">install</a></li>
-    <li class="sidebar-header-3"><a href="#launch">launch</a></li>
-    <li class="sidebar-header-3"><a href="#other-commands">other commands</a></li>
-    <li class="sidebar-header-2"><a href="#proxy-https-request">Proxy https request</a></li>
-    <li class="sidebar-header-2"><a href="#use-rule-module">Use rule module</a></li>
-    <li class="sidebar-header-3"><a href="#sample">sample</a></li>
-    <li class="sidebar-header-3"><a href="#the-entire-process">the entire process</a></li>
-    <li class="sidebar-header-3"><a href="#how-to-load-rule-module">how to load rule module</a></li>
-    <li class="sidebar-header-2"><a href="#rule-module-interface">Rule module interface</a></li>
-    <li class="sidebar-header-3"><a href="#summary">summary</a></li>
-    <li class="sidebar-header-4"><a href="#summary-1">summary</a></li>
-    <li class="sidebar-header-3"><a href="#beforesendrequest">beforeSendRequest</a></li>
-    <li class="sidebar-header-4"><a href="#beforesendrequest(requestdetail)">beforeSendRequest(requestDetail)</a></li>
-    <li class="sidebar-header-3"><a href="#beforesendresponse">beforeSendResponse</a></li>
-    <li class="sidebar-header-4"><a href="#beforesendresponse(requestdetail,-responsedetail)">beforeSendResponse(requestDetail, responseDetail)</a></li>
-    <li class="sidebar-header-3"><a href="#beforedealhttpsrequest">beforeDealHttpsRequest</a></li>
-    <li class="sidebar-header-4"><a href="#beforedealhttpsrequest(requestdetail)">beforeDealHttpsRequest(requestDetail)</a></li>
-    <li class="sidebar-header-3"><a href="#onerror">onError</a></li>
-    <li class="sidebar-header-4"><a href="#onerror(requestdetail,-error)">onError(requestDetail, error)</a></li>
-    <li class="sidebar-header-3"><a href="#onconnecterror">onConnectError</a></li>
-    <li class="sidebar-header-4"><a href="#onconnecterror(requestdetail,-error)">onConnectError(requestDetail, error)</a></li>
-    <li class="sidebar-header-3"><a href="#faq">FAQ</a></li>
-    <li class="sidebar-header-2"><a href="#rule-samples">Rule Samples</a></li>
-    <li class="sidebar-header-3"><a href="#use-local-response">use local response</a></li>
-    <li class="sidebar-header-3"><a href="#modify-request-header">modify request header</a></li>
-    <li class="sidebar-header-3"><a href="#modify-request-body">modify request body</a></li>
-    <li class="sidebar-header-3"><a href="#modify-the-request-target">modify the request target</a></li>
-    <li class="sidebar-header-3"><a href="#modify-request-protocol">modify request protocol</a></li>
-    <li class="sidebar-header-3"><a href="#modify-response-status-code">modify response status code</a></li>
-    <li class="sidebar-header-3"><a href="#modify-the-response-header">modify the response header</a></li>
-    <li class="sidebar-header-3"><a href="#modify-response-data-and-delay">modify response data and delay</a></li>
-    <li class="sidebar-header-2"><a href="#use-anyproxy-as-an-npm-module">Use AnyProxy as an npm module</a></li>
-    <li class="sidebar-header-2"><a href="#about-anyproxy">About AnyProxy</a></li>
-    <li class="sidebar-header-2"><a href="#appendix">Appendix</a></li>
-    <li class="sidebar-header-3"><a href="#config-root-ca-in-osx">Config root CA in OSX</a></li>
-    <li class="sidebar-header-3"><a href="#trust-root-ca-in-windows">trust root CA in windows</a></li>
-    <li class="sidebar-header-3"><a href="#config-osx-system-proxy">config OSX system proxy</a></li>
-    <li class="sidebar-header-3"><a href="#config-http-proxy-server">config http proxy server</a></li>
-    <li class="sidebar-header-3"><a href="#trust-root-ca-in-ios">trust root CA in iOS</a></li>
-    <li class="sidebar-header-3"><a href="#trust-root-ca-in-ios-&gt;&#x3D;-10.3">trust root CA in iOS &gt;&#x3D; 10.3</a></li>
-    <li class="sidebar-header-3"><a href="#config-ios/android-proxy-server">config iOS/Android proxy server</a></li>
-</ul>
-      </div>
-    </div>
-    <div class="main-content"><h1 id="anyproxy"><a class="header-link" href="#anyproxy"></a>AnyProxy</h1>
-<p>AnyProxy is a fully configurable http/https proxy in NodeJS. Version 4.0 is in beta now.</p>
-<p>Ref: <a href="./cn.html">Chinese Doc 中文文档</a></p>
-<p>Github: </p>
-<ul class="list">
-<li><a href="https://github.com/alibaba/anyproxy/tree/4.x">https://github.com/alibaba/anyproxy/tree/4.x</a></li>
-</ul>
-<p>Features:</p>
-<ul class="list">
-<li>Offer you the ablity to handle http traffic by invoking a js module</li>
-<li>Intercept https</li>
-<li>GUI webinterface</li>
-</ul>
-<p>Change Logs since 3.x:</p>
-<ul class="list">
-<li>Support Promise and Generator in rule module</li>
-<li>Simplified interface in rule module</li>
-<li>A newly designed web interface</li>
-</ul>
-<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/SqVntpzmscXPbSzfcGcr.png" width="500" /></p>
-<h2 id="quick-start"><a class="header-link" href="#quick-start"></a>Quick start</h2>
-<h3 id="install"><a class="header-link" href="#install"></a>install</h3>
-<pre class="hljs"><code>npm install -g anyproxy@beta <span class="hljs-comment"># 4.x is in beta now</span></code></pre><h3 id="launch"><a class="header-link" href="#launch"></a>launch</h3>
-<ul class="list">
-<li>start AnyProxy in command line, with default port 8001</li>
-</ul>
-<pre class="hljs"><code>anyproxy</code></pre><ul class="list">
-<li>now you can use http proxy server by 127.0.0.1:8001</li>
-<li>visit <a href="http://127.0.0.1:8002">http://127.0.0.1:8002</a> to see the http requests</li>
-</ul>
-<h3 id="other-commands"><a class="header-link" href="#other-commands"></a>other commands</h3>
-<ul class="list">
-<li>specify the port of http proxy</li>
-</ul>
-<pre class="hljs"><code>anyproxy --port 1080</code></pre><h2 id="proxy-https-request"><a class="header-link" href="#proxy-https-request"></a>Proxy https request</h2>
-<ul class="list">
-<li>AnyProxy does NOT intercept https requests by default. To view decrypted info, you have to config the CA certificate.</li>
-</ul>
-<blockquote>
-<p>Under the hood, AnyProxy decryptes https requests by man-in-the-middle attack. Users have to trust the CA cert in advance. Otherwise, client side will issue errors about unsecure network.</p>
-</blockquote>
-<ul class="list">
-<li>generate certifycates and intercept</li>
-</ul>
-<pre class="hljs"><code>anyproxy-ca <span class="hljs-comment">#generate root CA. manually trust it after that.</span>
-anyproxy --intercept <span class="hljs-comment">#launch anyproxy and intercept all https traffic</span></code></pre><ul class="list">
-<li><a href="#osx系统信任ca证书">Appendix:how to trust CA</a></li>
-</ul>
-<h2 id="use-rule-module"><a class="header-link" href="#use-rule-module"></a>Use rule module</h2>
-<p>AnyProxy provides the ability to load your own rules written in javascript. With rule module, you could customize the logic to handle requests.</p>
-<blockquote>
-<p>Make sure your rule file is got from a trusted source. Otherwise, you may face some unknown security risk.</p>
-</blockquote>
-<p>Rule module could do the following stuff:</p>
-<ul class="list">
-<li>intercept and modify the request which is being sent<ul class="list">
-<li>editable fields include request header, body, target address</li>
-</ul>
-</li>
-<li>intercept and modify the response from server<ul class="list">
-<li>editable fields include response status code, header, body</li>
-</ul>
-</li>
-<li>intercept https requests, modify request and response</li>
-</ul>
-<h3 id="sample"><a class="header-link" href="#sample"></a>sample</h3>
-<ul class="list">
-<li><p>Target</p>
-<ul class="list">
-<li>write a rule module to append some text to the response of GET <a href="http://httpbin.org/user-agent">http://httpbin.org/user-agent</a>, and delay the response for 5 seconds</li>
-</ul>
-</li>
-<li><p>Step 1,Write the rule file, save as sample.js</p>
-<pre class="hljs"><code><span class="hljs-comment">// file: sample.js</span>
-<span class="hljs-built_in">module</span>.exports = {
-  <span class="hljs-attr">summary</span>: <span class="hljs-string">'a rule to modify response'</span>,
-  *beforeSendResponse(requestDetail, responseDetail) {
-    <span class="hljs-keyword">if</span> (requestDetail.url === <span class="hljs-string">'http://httpbin.org/user-agent'</span>) {
-      <span class="hljs-keyword">const</span> newResponse = responseDetail.response;
-      newResponse.body += <span class="hljs-string">'-- AnyProxy Hacked! --'</span>;
-      <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Promise</span>(<span class="hljs-function">(<span class="hljs-params">resolve, reject</span>) =&gt;</span> {
-        setTimeout(<span class="hljs-function"><span class="hljs-params">()</span> =&gt;</span> { <span class="hljs-comment">// delay</span>
-          resolve({ <span class="hljs-attr">response</span>: newResponse });
-        }, <span class="hljs-number">5000</span>);
-      });
-    }
-  },
-};</code></pre></li>
-<li><p>Step 2, start AnyProxy and load the rule file</p>
-<ul class="list">
-<li>run <code>anyproxy --rule sample.js</code></li>
-</ul>
-</li>
-<li><p>Step 3, test</p>
-<ul class="list">
-<li><p>use curl </p>
-<pre class="hljs"><code>curl http://httpbin.org/user-agent --proxy http://127.0.0.1:8001</code></pre></li>
-<li><p>use browser. Point the http proxy of browser to 127.0.0.1:8001, then visit <a href="http://httpbin.org/user-agent">http://httpbin.org/user-agent</a> </p>
-</li>
-<li><p>the expected response from proxy is </p>
-</li>
-</ul>
-<pre class="hljs"><code>{
-  <span class="hljs-string">"user-agent"</span>: <span class="hljs-string">"curl/7.43.0"</span>
-}
-- AnyProxy Hacked!</code></pre></li>
-<li><p>Step 4, view the request log</p>
-<ul class="list">
-<li>visit <a href="http://127.0.0.1:8002">http://127.0.0.1:8002</a>, the request just sent should be listed here</li>
-</ul>
-</li>
-</ul>
-<h3 id="the-entire-process"><a class="header-link" href="#the-entire-process"></a>the entire process</h3>
-<ul class="list">
-<li>The flow chart is as follows</li>
-</ul>
-<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/TWyNuSJtEZBdrdcOMRjE.png" width="550" /></p>
-<ul class="list">
-<li><p>When got an http request, the entire process of proxy server is</p>
-<ul class="list">
-<li>AnyProxy collects all the quest info, include method, header, body</li>
-<li>AnyProxy calls <code>beforeSendRequest</code> of the rule module. Rule module deal the request, return new request param or response content</li>
-<li>If <code>beforeSendRequest</code> returns the response content, AnyProxy will send the response to client without sending to target server. The process ends here.</li>
-<li>Send request to target server, collect response</li>
-<li>Call <code>beforeSendResponse</code> of the rule module. Rule module deal the response data</li>
-<li>Send response to client</li>
-</ul>
-</li>
-<li><p>When AnyProxy get https request, it could replace the certificate and decrypt the request data</p>
-<ul class="list">
-<li>AnyProxy calls <code>beforeDealHttpsRequest</code> of the rule module</li>
-<li>If the function returns <code>true</code>, AnyProxy will do the man-in-the-middle attack to it. Otherwise, the request will not be dealed.</li>
-</ul>
-</li>
-</ul>
-<h3 id="how-to-load-rule-module"><a class="header-link" href="#how-to-load-rule-module"></a>how to load rule module</h3>
-<ul class="list">
-<li><p>use local file</p>
-<pre class="hljs"><code>anyproxy --rule ./rule.js</code></pre></li>
-<li><p>use an online rule file</p>
-<pre class="hljs"><code>anyproxy --rule https://sample.com/rule.js</code></pre></li>
-<li><p>use an npm module</p>
-<ul class="list">
-<li>AnyProxy uses <code>require()</code> to load rule module. You could either load a local npm module or a global-installed one.</li>
-</ul>
-<pre class="hljs"><code>anyproxy --rule ./myRulePkg/ <span class="hljs-comment">#local module</span>
-npm i -g myRulePkg &amp;&amp; anyproxy --rule myRulePkg <span class="hljs-comment">#global-installed module</span></code></pre></li>
-</ul>
-<h2 id="rule-module-interface"><a class="header-link" href="#rule-module-interface"></a>Rule module interface</h2>
-<p>A typical rule module is as follows. All the functions are optional, just write the part you are interested in.</p>
-<pre class="hljs"><code><span class="hljs-built_in">module</span>.exports = {
-  <span class="hljs-comment">// introduction</span>
-  summary: <span class="hljs-string">'my customized rule for AnyProxy'</span>, 
-  <span class="hljs-comment">// intercept before send request to server</span>
-  *beforeSendRequest(requestDetail) { <span class="hljs-comment">/* ... */</span> }, 
-  <span class="hljs-comment">// deal response before send to client </span>
-  *beforeSendResponse(requestDetail, responseDetail) { <span class="hljs-comment">/* ... */</span> }, 
-  <span class="hljs-comment">// if deal https request</span>
-  *beforeDealHttpsRequest(requestDetail) { <span class="hljs-comment">/* ... */</span> }, 
-  <span class="hljs-comment">// error happened when dealing requests</span>
-  *onError(requestDetail, error) { <span class="hljs-comment">/* ... */</span> }, 
-  <span class="hljs-comment">// error happened when connect to https server</span>
-  *onConnectError(requestDetail, error) { <span class="hljs-comment">/* ... */</span> } 
-};</code></pre><blockquote>
-<p>All functions in your rule file, except summary, are all driven by <a href="https://www.npmjs.com/package/co">co</a> . They should be yieldable, i.e. return a promise or be a generator function.</p>
-</blockquote>
-<h3 id="summary"><a class="header-link" href="#summary"></a>summary</h3>
-<h4 id="summary-1"><a class="header-link" href="#summary-1"></a>summary</h4>
-<ul class="list">
-<li>Introduction of this rule file. AnyProxy will read this field and give some tip to user.</li>
-</ul>
-<h3 id="beforesendrequest"><a class="header-link" href="#beforesendrequest"></a>beforeSendRequest</h3>
-<h4 id="beforesendrequest(requestdetail)"><a class="header-link" href="#beforesendrequest(requestdetail)"></a>beforeSendRequest(requestDetail)</h4>
-<ul class="list">
-<li>Before sending request to server, AnyProxy will call <code>beforeSendRequest</code> with param <code>requestDetail</code></li>
-<li><code>requestDetail</code> <ul class="list">
-<li><code>protocol</code> {string} the protocol to use, http or https</li>
-<li><code>requestOptions</code> {object} the options of the request-to-go, a param of require(&#39;http&#39;).request . ref: <a href="https://nodejs.org/api/http.html#http_http_request_options_callback">https://nodejs.org/api/http.html#http_http_request_options_callback</a></li>
-<li><code>requestData</code> {object} request body</li>
-<li><code>url</code> {string} request url</li>
-<li><code>_req</code> {object} the native node.js request object</li>
-</ul>
-</li>
-<li><p>e.g. When requesting  <em>anyproxy.io</em>, <code>requestDetail</code> is something like the following</p>
-<pre class="hljs"><code>{
-  <span class="hljs-attr">protocol</span>: <span class="hljs-string">'http'</span>,
-  <span class="hljs-attr">url</span>: <span class="hljs-string">'http://anyproxy.io/'</span>,
-  <span class="hljs-attr">requestOptions</span>: {
-    <span class="hljs-attr">hostname</span>: <span class="hljs-string">'anyproxy.io'</span>,
-    <span class="hljs-attr">port</span>: <span class="hljs-number">80</span>,
-    <span class="hljs-attr">path</span>: <span class="hljs-string">'/'</span>,
-    <span class="hljs-attr">method</span>: <span class="hljs-string">'GET'</span>,
-    <span class="hljs-attr">headers</span>: {
-      <span class="hljs-attr">Host</span>: <span class="hljs-string">'anyproxy.io'</span>,
-      <span class="hljs-string">'Proxy-Connection'</span>: <span class="hljs-string">'keep-alive'</span>,
-      <span class="hljs-string">'User-Agent'</span>: <span class="hljs-string">'...'</span>
-    }
-  },
-  <span class="hljs-attr">requestData</span>: <span class="hljs-string">'...'</span>,
-  <span class="hljs-attr">_req</span>: { <span class="hljs-comment">/* ... */</span>}
-}</code></pre></li>
-<li><p>Any of these return values are valid</p>
-<ul class="list">
-<li>do nothing, and return null</li>
-</ul>
-<pre class="hljs"><code><span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;</code></pre><ul class="list">
-<li>modify the request protocol,i.e. force use https</li>
-</ul>
-<pre class="hljs"><code><span class="hljs-keyword">return</span> {
-  <span class="hljs-attr">protocol</span>: <span class="hljs-string">'https'</span>
-};</code></pre><ul class="list">
-<li>modify request param</li>
-</ul>
-<pre class="hljs"><code><span class="hljs-keyword">var</span> newOption = <span class="hljs-built_in">Object</span>.assign({}, requestDetail.requestOptions);
-newOption.path = <span class="hljs-string">'/redirect/to/another/path'</span>;
-<span class="hljs-keyword">return</span> {
-  <span class="hljs-attr">requestOptions</span>: newOption
-};</code></pre><ul class="list">
-<li>modify request body</li>
-</ul>
-<pre class="hljs"><code><span class="hljs-keyword">return</span> {
-  <span class="hljs-attr">requestData</span>: <span class="hljs-string">'my new request data'</span>
-  <span class="hljs-comment">// requestOptions can also be used here</span>
-};</code></pre><ul class="list">
-<li>give response to the client, not sending request any longer. <code>statusCode</code> <code>headers</code>are required is this situation.</li>
-</ul>
-<pre class="hljs"><code><span class="hljs-keyword">return</span> {
-  <span class="hljs-attr">response</span>: {
-    <span class="hljs-attr">statusCode</span>: <span class="hljs-number">200</span>,
-    <span class="hljs-attr">header</span>: { <span class="hljs-string">'content-type'</span>: <span class="hljs-string">'text/html'</span> },
-    <span class="hljs-attr">body</span>: <span class="hljs-string">'this could be a &lt;string&gt; or &lt;buffer&gt;'</span>
-  }
-};</code></pre></li>
-</ul>
-<h3 id="beforesendresponse"><a class="header-link" href="#beforesendresponse"></a>beforeSendResponse</h3>
-<h4 id="beforesendresponse(requestdetail,-responsedetail)"><a class="header-link" href="#beforesendresponse(requestdetail,-responsedetail)"></a>beforeSendResponse(requestDetail, responseDetail)</h4>
-<ul class="list">
-<li>Before sending response to client, AnyProxy will call <code>beforeSendResponse</code> with param <code>requestDetail</code> <code>responseDetail</code></li>
-<li><code>requestDetail</code> is the same param as in <code>beforeSendRequest</code></li>
-<li><code>responseDetail</code> <ul class="list">
-<li><code>response</code> {object} the response from server, includes <code>statusCode</code> <code>header</code> <code>body</code></li>
-<li><code>_res</code> {object} the native node.js response object</li>
-</ul>
-</li>
-<li><p>e.g. When requesting <em>anyproxy.io</em>, <code>responseDetail</code> is something like the following</p>
-<pre class="hljs"><code>{ 
-  <span class="hljs-attr">response</span>: { 
-    <span class="hljs-attr">statusCode</span>: <span class="hljs-number">200</span>,
-    <span class="hljs-attr">header</span>: { 
-      <span class="hljs-string">'Content-Type'</span>: <span class="hljs-string">'image/gif'</span>,
-      <span class="hljs-attr">Connection</span>: <span class="hljs-string">'close'</span>,
-      <span class="hljs-string">'Cache-Control'</span>: <span class="hljs-string">'...'</span>
-    },
-    <span class="hljs-attr">body</span>: <span class="hljs-string">'...'</span>
-  },
-  <span class="hljs-attr">_res</span>: { <span class="hljs-comment">/* ... */</span> }
-}</code></pre></li>
-<li><p>Any of these return values are valid</p>
-<ul class="list">
-<li>do nothing, and return null</li>
-</ul>
-<pre class="hljs"><code><span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;</code></pre><ul class="list">
-<li>modify the response status code</li>
-</ul>
-<pre class="hljs"><code><span class="hljs-keyword">var</span> newResponse = <span class="hljs-built_in">Object</span>.assign({}, responseDetail.reponse);
-newResponse.statusCode = <span class="hljs-number">404</span>;
-<span class="hljs-keyword">return</span> {
-  <span class="hljs-attr">response</span>: newResponse
-};</code></pre><ul class="list">
-<li>modify the response content</li>
-</ul>
-<pre class="hljs"><code><span class="hljs-keyword">var</span> newResponse = <span class="hljs-built_in">Object</span>.assign({}, responseDetail.reponse);
-newResponse.body += <span class="hljs-string">'--from anyproxy--'</span>;
-<span class="hljs-keyword">return</span> {
-  <span class="hljs-attr">response</span>: newResponse
-};</code></pre></li>
-</ul>
-<h3 id="beforedealhttpsrequest"><a class="header-link" href="#beforedealhttpsrequest"></a>beforeDealHttpsRequest</h3>
-<h4 id="beforedealhttpsrequest(requestdetail)"><a class="header-link" href="#beforedealhttpsrequest(requestdetail)"></a>beforeDealHttpsRequest(requestDetail)</h4>
-<ul class="list">
-<li>When receiving https request, AnyProxy will call <code>beforeDealHttpsRequest</code> with param <code>requestDetail</code></li>
-<li>If configed with <code>forceProxyHttps</code> in launching, AnyProxy will skip calling this method</li>
-<li>Only by returning true, AnyProxy will try to replace the certificate and intercept the https request.</li>
-<li><code>requestDetail</code><ul class="list">
-<li><code>host</code> {string} the target host to request. Due to the request protocol, full url couldn&#39;t be got here</li>
-<li><code>_req</code> {object} the native node.js request object. The <code>_req</code> here refers to the CONNECT request.</li>
-</ul>
-</li>
-<li>return value<ul class="list">
-<li><code>true</code> or <code>false</code>, whether AnyProxy should intercept the https request</li>
-</ul>
-</li>
-</ul>
-<h3 id="onerror"><a class="header-link" href="#onerror"></a>onError</h3>
-<h4 id="onerror(requestdetail,-error)"><a class="header-link" href="#onerror(requestdetail,-error)"></a>onError(requestDetail, error)</h4>
-<ul class="list">
-<li>AnyProxy will call this method when an error happened in request handling.</li>
-<li>Errors usually are issued during requesting, e.g. DNS failure, request timeout</li>
-<li><code>requestDetail</code> is the same one as in <code>beforeSendRequest</code></li>
-<li><p>Any of these return values are valid</p>
-<ul class="list">
-<li>do nothing, and AnyProxy will response a default error page</li>
-</ul>
-<pre class="hljs"><code><span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;</code></pre><ul class="list">
-<li>return a customized error page</li>
-</ul>
-<pre class="hljs"><code><span class="hljs-keyword">return</span> {
-  <span class="hljs-attr">response</span>: {
-    <span class="hljs-attr">statusCode</span>: <span class="hljs-number">200</span>,
-    <span class="hljs-attr">header</span>: { <span class="hljs-string">'content-type'</span>: <span class="hljs-string">'text/html'</span> },
-    <span class="hljs-attr">body</span>: <span class="hljs-string">'this could be a &lt;string&gt; or &lt;buffer&gt;'</span>
-  }
-};</code></pre></li>
-</ul>
-<h3 id="onconnecterror"><a class="header-link" href="#onconnecterror"></a>onConnectError</h3>
-<h4 id="onconnecterror(requestdetail,-error)"><a class="header-link" href="#onconnecterror(requestdetail,-error)"></a>onConnectError(requestDetail, error)</h4>
-<ul class="list">
-<li>AnyProxy will call this method when failed to connect target server in https request</li>
-<li><code>requestDetail</code> is the same one as in <code>beforeDealHttpsRequest</code></li>
-<li>no return value is required </li>
-</ul>
-<h3 id="faq"><a class="header-link" href="#faq"></a>FAQ</h3>
-<ul class="list">
-<li>Q: can not deal https request in rule module.</li>
-<li><p>A: Any of these options could be used to change the way AnyProxy deall https requests </p>
-<ol class="list">
-<li>config <code>--intercept</code> when luanching AnyProxy via cli, or use <code>forceProxyHttps</code> when using as an npm module</li>
-<li>place a <code>beforeDealHttpsRequest</code> function in your rule file and determine which request to intercept by your own.</li>
-</ol>
-</li>
-<li><p>Q: get an error says <em>function is not yieldable</em></p>
-</li>
-<li>A: Rule module is driven by <a href="https://www.npmjs.com/package/co">co</a>. The functions inside should  be yieldable, i.e. return a promise or be a generator function.</li>
-</ul>
-<h2 id="rule-samples"><a class="header-link" href="#rule-samples"></a>Rule Samples</h2>
-<ul class="list">
-<li>here are some samples about frequently used rule file</li>
-<li>try these samples by <code>anyproxy --rule http://....js</code></li>
-<li>how to test with curl:<ul class="list">
-<li>request the server directly <code>curl http://httpbin.org/</code></li>
-<li>request the server via proxy <code>curl http://httpbin.org/ --proxy http://127.0.0.1:8001</code></li>
-</ul>
-</li>
-</ul>
-<h3 id="use-local-response"><a class="header-link" href="#use-local-response"></a>use local response</h3>
-<ul class="list">
-<li>intercept the request towards <a href="http://httpbin.org">http://httpbin.org</a> , return the local-defined response</li>
-</ul>
-<pre class="hljs"><code>anyproxy --rule https://raw.githubusercontent.com/alibaba/anyproxy/4.x/rule_sample/sample_use_local_response.js</code></pre><pre class="hljs"><code><span class="hljs-comment">/* 
-  sample: 
-    intercept all requests toward httpbin.org, use a local response
-  test:
-    curl http://httpbin.org/user-agent --proxy http://127.0.0.1:8001
-*/</span>
-<span class="hljs-built_in">module</span>.exports = {
-  *beforeSendRequest(requestDetail) {
-    <span class="hljs-keyword">const</span> localResponse = {
-      <span class="hljs-attr">statusCode</span>: <span class="hljs-number">200</span>,
-      <span class="hljs-attr">header</span>: { <span class="hljs-string">'Content-Type'</span>: <span class="hljs-string">'application/json'</span> },
-      <span class="hljs-attr">body</span>: <span class="hljs-string">'{"hello": "this is local response"}'</span>
-    };
-    <span class="hljs-keyword">if</span> (requestDetail.url.indexOf(<span class="hljs-string">'http://httpbin.org'</span>) === <span class="hljs-number">0</span>) {
-      <span class="hljs-keyword">return</span> {
-        <span class="hljs-attr">response</span>: localResponse
-      };
-    }
-  },
-};</code></pre><h3 id="modify-request-header"><a class="header-link" href="#modify-request-header"></a>modify request header</h3>
-<ul class="list">
-<li>modify the user-agent sent to httpbin.org</li>
-</ul>
-<pre class="hljs"><code>anyproxy --rule https://raw.githubusercontent.com/alibaba/anyproxy/4.x/rule_sample/sample_modify_request_header.js</code></pre><pre class="hljs"><code><span class="hljs-comment">/* 
-  sample: 
-    modify the user-agent in requests toward httpbin.org
-  test:
-    curl http://httpbin.org/user-agent --proxy http://127.0.0.1:8001
-*/</span>
-<span class="hljs-built_in">module</span>.exports = {
-  *beforeSendRequest(requestDetail) {
-    <span class="hljs-keyword">if</span> (requestDetail.url.indexOf(<span class="hljs-string">'http://httpbin.org'</span>) === <span class="hljs-number">0</span>) {
-      <span class="hljs-keyword">const</span> newRequestOptions = requestDetail.requestOptions;
-      newRequestOptions.headers[<span class="hljs-string">'User-Agent'</span>] = <span class="hljs-string">'AnyProxy/0.0.0'</span>;
-      <span class="hljs-keyword">return</span> {
-        <span class="hljs-attr">requestOptions</span>: newRequestOptions
-      };
-    }
-  },
-};</code></pre><h3 id="modify-request-body"><a class="header-link" href="#modify-request-body"></a>modify request body</h3>
-<ul class="list">
-<li>modify the post body of <a href="http://httpbin.org/post">http://httpbin.org/post</a></li>
-</ul>
-<pre class="hljs"><code>anyproxy --rule https://raw.githubusercontent.com/alibaba/anyproxy/4.x/rule_sample/sample_modify_request_data.js</code></pre><pre class="hljs"><code><span class="hljs-comment">/* 
-  sample: 
-    modify the post data towards http://httpbin.org/post
-  test:
-    curl -H "Content-Type: text/plain" -X POST -d 'original post data' http://httpbin.org/post --proxy http://127.0.0.1:8001
-  expected response:
-    { "data": "i-am-anyproxy-modified-post-data" }
-*/</span>
-<span class="hljs-built_in">module</span>.exports = {
-  *beforeSendRequest(requestDetail) {
-    <span class="hljs-keyword">if</span> (requestDetail.url.indexOf(<span class="hljs-string">'http://httpbin.org/post'</span>) === <span class="hljs-number">0</span>) {
-      <span class="hljs-keyword">return</span> {
-        <span class="hljs-attr">requestData</span>: <span class="hljs-string">'i-am-anyproxy-modified-post-data'</span>
-      };
-    }
-  },
-};</code></pre><h3 id="modify-the-request-target"><a class="header-link" href="#modify-the-request-target"></a>modify the request target</h3>
-<ul class="list">
-<li>send all the request towards <a href="http://httpbin.org/">http://httpbin.org/</a> to <a href="http://httpbin.org/user-agent">http://httpbin.org/user-agent</a></li>
-</ul>
-<pre class="hljs"><code>anyproxy --rule https://raw.githubusercontent.com/alibaba/anyproxy/4.x/rule_sample/sample_modify_request_path.js</code></pre><pre class="hljs"><code><span class="hljs-comment">/* 
-  sample: 
-    redirect all httpbin.org requests to http://httpbin.org/user-agent
-  test:
-    curl http://httpbin.org/any-path --proxy http://127.0.0.1:8001
-  expected response:
-    { "user-agent": "curl/7.43.0" }
-*/</span>
-<span class="hljs-built_in">module</span>.exports = {
-  *beforeSendRequest(requestDetail) {
-    <span class="hljs-keyword">if</span> (requestDetail.url.indexOf(<span class="hljs-string">'http://httpbin.org'</span>) === <span class="hljs-number">0</span>) {
-      <span class="hljs-keyword">const</span> newRequestOptions = requestDetail.requestOptions;
-      newRequestOptions.path = <span class="hljs-string">'/user-agent'</span>;
-      newRequestOptions.method = <span class="hljs-string">'GET'</span>;
-      <span class="hljs-keyword">return</span> {
-        <span class="hljs-attr">requestOptions</span>: newRequestOptions
-      };
-    }
-  },
-};</code></pre><h3 id="modify-request-protocol"><a class="header-link" href="#modify-request-protocol"></a>modify request protocol</h3>
-<ul class="list">
-<li>modify the http request towards <a href="http://httpbin.org">http://httpbin.org</a> to https</li>
-</ul>
-<pre class="hljs"><code>anyproxy --rule https://raw.githubusercontent.com/alibaba/anyproxy/4.x/rule_sample/sample_modify_request_protocol.js</code></pre><pre class="hljs"><code><span class="hljs-comment">/* 
-  sample: 
-    redirect all http requests of httpbin.org to https
-  test:
-    curl 'http://httpbin.org/get?show_env=1' --proxy http://127.0.0.1:8001
-  expected response:
-    { "X-Forwarded-Protocol": "https" }
-*/</span>
-<span class="hljs-built_in">module</span>.exports = {
-  *beforeSendRequest(requestDetail) {
-    <span class="hljs-keyword">if</span> (requestDetail.url.indexOf(<span class="hljs-string">'http://httpbin.org'</span>) === <span class="hljs-number">0</span>) {
-      <span class="hljs-keyword">const</span> newOption = requestDetail.requestOptions;
-      newOption.port = <span class="hljs-number">443</span>;
-      <span class="hljs-keyword">return</span> {
-        <span class="hljs-attr">protocol</span>: <span class="hljs-string">'https'</span>,
-        <span class="hljs-attr">requestOptions</span>: newOption
-      };
-    }
-  }
-};</code></pre><h3 id="modify-response-status-code"><a class="header-link" href="#modify-response-status-code"></a>modify response status code</h3>
-<ul class="list">
-<li>modify all status code from <a href="http://httpbin.org">http://httpbin.org</a> to 404</li>
-</ul>
-<pre class="hljs"><code>anyproxy --rule https://raw.githubusercontent.com/alibaba/anyproxy/4.x/rule_sample/sample_modify_response_statuscode.js</code></pre><pre class="hljs"><code><span class="hljs-comment">/* 
-  sample: 
-    modify all status code of http://httpbin.org/ to 404
-  test:
-    curl -I 'http://httpbin.org/user-agent' --proxy http://127.0.0.1:8001
-  expected response:
-    HTTP/1.1 404 Not Found
-*/</span>
-<span class="hljs-built_in">module</span>.exports = {
-  *beforeSendResponse(requestDetail, responseDetail) {
-    <span class="hljs-keyword">if</span> (requestDetail.url.indexOf(<span class="hljs-string">'http://httpbin.org'</span>) === <span class="hljs-number">0</span>) {
-      <span class="hljs-keyword">const</span> newResponse = responseDetail.response;
-      newResponse.statusCode = <span class="hljs-number">404</span>;
-      <span class="hljs-keyword">return</span> {
-        <span class="hljs-attr">response</span>: newResponse
-      };
-    }
-  }
-};</code></pre><h3 id="modify-the-response-header"><a class="header-link" href="#modify-the-response-header"></a>modify the response header</h3>
-<ul class="list">
-<li>add X-Proxy-By:AnyProxy to the response header from <a href="http://httpbin.org/user-agent">http://httpbin.org/user-agent</a></li>
-</ul>
-<pre class="hljs"><code>anyproxy --rule https://raw.githubusercontent.com/alibaba/anyproxy/4.x/rule_sample/sample_modify_response_header.js</code></pre><pre class="hljs"><code><span class="hljs-comment">/* 
-  sample: 
-    modify response header of http://httpbin.org/user-agent
-  test:
-    curl -I 'http://httpbin.org/user-agent' --proxy http://127.0.0.1:8001
-  expected response:
-    X-Proxy-By: AnyProxy
-*/</span>
-<span class="hljs-built_in">module</span>.exports = {
-  *beforeSendResponse(requestDetail, responseDetail) {
-    <span class="hljs-keyword">if</span> (requestDetail.url.indexOf(<span class="hljs-string">'http://httpbin.org/user-agent'</span>) === <span class="hljs-number">0</span>) {
-      <span class="hljs-keyword">const</span> newResponse = responseDetail.response;
-      newResponse.header[<span class="hljs-string">'X-Proxy-By'</span>] = <span class="hljs-string">'AnyProxy'</span>;
-      <span class="hljs-keyword">return</span> {
-        <span class="hljs-attr">response</span>: newResponse
-      };
-    }
-  }
-};</code></pre><h3 id="modify-response-data-and-delay"><a class="header-link" href="#modify-response-data-and-delay"></a>modify response data and delay</h3>
-<ul class="list">
-<li>append some info to the response of <a href="http://httpbin.org/user-agent">http://httpbin.org/user-agent</a>, then delay the response for 5 seconds.</li>
-</ul>
-<pre class="hljs"><code>anyproxy --rule https://raw.githubusercontent.com/alibaba/anyproxy/4.x/rule_sample/sample_modify_response_data.js</code></pre><pre class="hljs"><code><span class="hljs-comment">/* 
-  sample: 
-    modify response data of http://httpbin.org/user-agent
-  test:
-    curl 'http://httpbin.org/user-agent' --proxy http://127.0.0.1:8001
-  expected response:
-    { "user-agent": "curl/7.43.0" } -- AnyProxy Hacked! --
-*/</span>
-
-<span class="hljs-built_in">module</span>.exports = {
-  *beforeSendResponse(requestDetail, responseDetail) {
-    <span class="hljs-keyword">if</span> (requestDetail.url === <span class="hljs-string">'http://httpbin.org/user-agent'</span>) {
-      <span class="hljs-keyword">const</span> newResponse = responseDetail.response;
-      newResponse.body += <span class="hljs-string">'-- AnyProxy Hacked! --'</span>;
-      <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Promise</span>(<span class="hljs-function">(<span class="hljs-params">resolve, reject</span>) =&gt;</span> {
-        setTimeout(<span class="hljs-function"><span class="hljs-params">()</span> =&gt;</span> { <span class="hljs-comment">// delay the response for 5s</span>
-          resolve({ <span class="hljs-attr">response</span>: newResponse });
-        }, <span class="hljs-number">5000</span>);
-      });
-    }
-  },
-};</code></pre><h2 id="use-anyproxy-as-an-npm-module"><a class="header-link" href="#use-anyproxy-as-an-npm-module"></a>Use AnyProxy as an npm module</h2>
-<p>AnyProxy can be used as an npm module</p>
-<blockquote>
-<p>To enable https feature, please guide users to use <code>anyproxy-ca</code> in cli. Or use methods under <code>AnyProxy.utils.certMgr</code> to generate certificates.</p>
-</blockquote>
-<ul class="list">
-<li>install</li>
-</ul>
-<pre class="hljs"><code>npm i anyproxy@beta --save <span class="hljs-comment"># 4.0 is in beta now</span></code></pre><ul class="list">
-<li>sample</li>
-</ul>
-<pre class="hljs"><code><span class="hljs-keyword">const</span> AnyProxy = <span class="hljs-built_in">require</span>(<span class="hljs-string">'anyproxy'</span>);
-<span class="hljs-keyword">const</span> options = {
-  <span class="hljs-attr">port</span>: <span class="hljs-number">8001</span>,
-  <span class="hljs-attr">rule</span>: <span class="hljs-built_in">require</span>(<span class="hljs-string">'myRuleModule'</span>),
-  <span class="hljs-attr">webInterface</span>: {
-    <span class="hljs-attr">enable</span>: <span class="hljs-literal">true</span>,
-    <span class="hljs-attr">webPort</span>: <span class="hljs-number">8002</span>,
-    <span class="hljs-attr">wsPort</span>: <span class="hljs-number">8003</span>,
-  },
-  <span class="hljs-attr">throttle</span>: <span class="hljs-number">10000</span>,
-  <span class="hljs-attr">forceProxyHttps</span>: <span class="hljs-literal">false</span>,
-  <span class="hljs-attr">silent</span>: <span class="hljs-literal">false</span>
-};
-<span class="hljs-keyword">const</span> proxyServer = <span class="hljs-keyword">new</span> AnyProxy.ProxyServer(options);
-
-proxyServer.on(<span class="hljs-string">'ready'</span>, () =&gt; { <span class="hljs-comment">/* */</span> });
-proxyServer.on(<span class="hljs-string">'error'</span>, (e) =&gt; { <span class="hljs-comment">/* */</span> });
-proxyServer.start();
-
-<span class="hljs-comment">//when finished</span>
-proxyServer.close();</code></pre><ul class="list">
-<li><p>Class: AnyProxy.proxyServer</p>
-<ul class="list">
-<li><p>create a proxy server</p>
-<pre class="hljs"><code><span class="hljs-keyword">const</span> proxy = <span class="hljs-keyword">new</span> AnyProxy.proxyServer(options)</code></pre></li>
-<li><p><code>options</code></p>
-<ul class="list">
-<li><code>port</code> {number} required, port number of proxy server</li>
-<li><code>rule</code> {object} your rule module</li>
-<li><code>throttle</code> {number} throttle in kb/s, unlimited for default</li>
-<li><code>forceProxyHttps</code> {boolean} in force intercept all https request, false for default</li>
-<li><code>silent</code> {boolean} if keep silent in console, false for default<code>false</code></li>
-<li><code>dangerouslyIgnoreUnauthorized</code> {boolean} if ignore certificate error in request, false for default</li>
-<li><code>webInterface</code> {object} config for web interface<ul class="list">
-<li><code>enable</code> {boolean} if enable web interface, false for default</li>
-<li><code>webPort</code> {number} port number for web interface</li>
-</ul>
-</li>
-</ul>
-</li>
-<li><p>Event: <code>ready</code></p>
-<ul class="list">
-<li>emit when proxy server is ready</li>
-<li>sample</li>
-</ul>
-<pre class="hljs"><code>proxy.on(<span class="hljs-string">'ready'</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{ })</code></pre></li>
-<li><p>Event: <code>error</code></p>
-<ul class="list">
-<li>emit when error happened inside proxy server</li>
-<li>sample</li>
-</ul>
-<pre class="hljs"><code>proxy.on(<span class="hljs-string">'error'</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{ })</code></pre></li>
-<li><p>Method: <code>start</code></p>
-<ul class="list">
-<li>start proxy server</li>
-<li>sample</li>
-</ul>
-<pre class="hljs"><code>proxy.start();</code></pre></li>
-<li><p>Method: <code>close</code></p>
-<ul class="list">
-<li>close proxy server</li>
-<li>sample</li>
-</ul>
-<pre class="hljs"><code>proxy.close();</code></pre></li>
-</ul>
-</li>
-<li><p>AnyProxy.utils.systemProxyMgr</p>
-<ul class="list">
-<li>manage the system proxy config. sudo password may be required</li>
-<li>sample</li>
-</ul>
-<pre class="hljs"><code><span class="hljs-comment">// set 127.0.0.1:8001 as system http server</span>
-AnyProxy.utils.systemProxyMgr.enableGlobalProxy(<span class="hljs-string">'127.0.0.1'</span>, <span class="hljs-string">'8001'</span>);    
-
-<span class="hljs-comment">// disable global proxy server</span>
-AnyProxy.utils.systemProxyMgr.disableGlobalProxy();</code></pre></li>
-<li><p>AnyProxy.utils.certMgr</p>
-<ul class="list">
-<li>Manage certificates of AnyProxy</li>
-<li><code>AnyProxy.utils.certMgr.ifRootCAFileExists()</code><ul class="list">
-<li>detect if AnyProx rootCA exists</li>
-</ul>
-</li>
-<li><code>AnyProxy.utils.certMgr.generateRootCA(callback)</code><ul class="list">
-<li>generate a rootCA</li>
-</ul>
-</li>
-<li>Sample</li>
-</ul>
-<pre class="hljs"><code>  <span class="hljs-keyword">const</span> AnyProxy = <span class="hljs-built_in">require</span>(<span class="hljs-string">'AnyProxy'</span>);
-  <span class="hljs-keyword">const</span> exec = <span class="hljs-built_in">require</span>(<span class="hljs-string">'child_process'</span>).exec;
-
-  <span class="hljs-keyword">if</span> (!AnyProxy.utils.certMgr.ifRootCAFileExists()) {
-    AnyProxy.utils.certMgr.generateRootCA(<span class="hljs-function">(<span class="hljs-params">error, keyPath</span>) =&gt;</span> {
-      <span class="hljs-comment">// let users to trust this CA before using proxy</span>
-      <span class="hljs-keyword">if</span> (!error) {
-        <span class="hljs-keyword">const</span> certDir = <span class="hljs-built_in">require</span>(<span class="hljs-string">'path'</span>).dirname(keyPath);
-        <span class="hljs-built_in">console</span>.log(<span class="hljs-string">'The cert is generated at'</span>, certDir);
-        <span class="hljs-keyword">const</span> isWin = <span class="hljs-regexp">/^win/</span>.test(process.platform);
-        <span class="hljs-keyword">if</span> (isWin) {
-          exec(<span class="hljs-string">'start .'</span>, { <span class="hljs-attr">cwd</span>: certDir });
-        } <span class="hljs-keyword">else</span> {
-          exec(<span class="hljs-string">'open .'</span>, { <span class="hljs-attr">cwd</span>: certDir });
-        }
-      } <span class="hljs-keyword">else</span> {
-        <span class="hljs-built_in">console</span>.error(<span class="hljs-string">'error when generating rootCA'</span>, error);
-      }
-    });
-  }</code></pre></li>
-</ul>
-<h2 id="about-anyproxy"><a class="header-link" href="#about-anyproxy"></a>About AnyProxy</h2>
-<ul class="list">
-<li>Change Log: <a href="https://github.com/alibaba/anyproxy/blob/master/CHANGELOG">https://github.com/alibaba/anyproxy/blob/master/CHANGELOG</a></li>
-<li>Github:<a href="https://github.com/alibaba/anyproxy">https://github.com/alibaba/anyproxy</a></li>
-<li>issue:<a href="https://github.com/alibaba/anyproxy/issues">https://github.com/alibaba/anyproxy/issues</a></li>
-</ul>
-<h2 id="appendix"><a class="header-link" href="#appendix"></a>Appendix</h2>
-<h3 id="config-root-ca-in-osx"><a class="header-link" href="#config-root-ca-in-osx"></a>Config root CA in OSX</h3>
-<ul class="list">
-<li>this kind of errors is usually caused by untrusted root CA</li>
-</ul>
-<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/CBkLGYgvoHAYwNVAYkpk.png" width="450" /></p>
-<blockquote>
-<p>Warning: please keep your root CA safe since it may influence your system security.</p>
-</blockquote>
-<p>install :</p>
-<ul class="list">
-<li><p>double click <em>rootCA.crt</em></p>
-</li>
-<li><p>add cert into login or system</p>
-</li>
-</ul>
-<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/bCwNUFFpvsmVuljQKrIk.png" width="350" /></p>
-<ul class="list">
-<li>find the newly imported AnyProxy certificates, configured as <strong>Always Trust</strong></li>
-</ul>
-<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/HOmEElNGdoZEWFMLsTNT.png" width="700" /></p>
-<h3 id="trust-root-ca-in-windows"><a class="header-link" href="#trust-root-ca-in-windows"></a>trust root CA in windows</h3>
-<p class="img-container"><img src="https://t.alipayobjects.com/tfscom/T1D3hfXeFtXXXXXXXX.jpg" width="700" /></p>
-<h3 id="config-osx-system-proxy"><a class="header-link" href="#config-osx-system-proxy"></a>config OSX system proxy</h3>
-<ul class="list">
-<li>the config is in wifi - advanced</li>
-</ul>
-<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/vduwhobSTypTfgniBvoa.png" width="500" /></p>
-<h3 id="config-http-proxy-server"><a class="header-link" href="#config-http-proxy-server"></a>config http proxy server</h3>
-<ul class="list">
-<li>take Chrome extent [SwitchyOmega] as an example(<a href="https://chrome.google.com/webstore/detail/padekgcemlokbadohgkifijomclgjgif)为例">https://chrome.google.com/webstore/detail/padekgcemlokbadohgkifijomclgjgif)为例</a></li>
-</ul>
-<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/jIPZrKmqXRaSledQeJUJ.png" width="500" /></p>
-<h3 id="trust-root-ca-in-ios"><a class="header-link" href="#trust-root-ca-in-ios"></a>trust root CA in iOS</h3>
-<ul class="list">
-<li>Click <em>Root CA</em> in web ui, and follow the instruction to install</li>
-</ul>
-<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/BrugmMelGVysLDOIBblj.png" width="260" /></p>
-<h3 id="trust-root-ca-in-ios->=-10.3"><a class="header-link" href="#trust-root-ca-in-ios->=-10.3"></a>trust root CA in iOS &gt;= 10.3</h3>
-<ul class="list">
-<li>Besides installing root CA, you have to &quot;turn on&quot; the certificate for web manually in <em>settings - general - about - Certificate Trust Settings</em>. Otherwire, safari will not trust the root CA generated by AnyProxy.</li>
-</ul>
-<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/hVWkXHrzHmOKOtCKGUWx.png" width="500" /></p>
-<h3 id="config-ios/android-proxy-server"><a class="header-link" href="#config-ios/android-proxy-server"></a>config iOS/Android proxy server</h3>
-<ul class="list">
-<li><p>proxy settings are placed in wifi setting</p>
-</li>
-<li><p>iOS</p>
-</li>
-</ul>
-<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/tLGqIozhffTccUgPakuw.png" width="260" /></p>
-<ul class="list">
-<li>Android</li>
-</ul>
-<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/YQtbQYVNuOszZGdAOauU.png" width="260" /></p>
-    </div>
-  </article>
-
-  <script src="//cdn.bootcss.com/zepto/1.2.0/zepto.min.js"></script>
-  <script>
-  window.onload = function(){
-    var itemList = [];
-    var targetMap = {};
-    $("[id]", ".main-content").map(function (index, heading) {
-      targetMap[heading.getAttribute('id')] = heading;
-    });
-
-    $("#j_toc li").map(function (index, item) {
-      if (item.className.indexOf('sidebar-header-2') >= 0 || item.className.indexOf('sidebar-header-3') >= 0) {
-        var targetName = item.firstChild.getAttribute('href').replace('#', '');
-        var targetItem = targetMap[targetName];
-        itemList.push({ target: targetItem, tocItem: item, top: $(targetItem).position().top });
-      }
-    });
-
-    var updateTocActive = function (e) {
-      var windowHeight = window.innerHeight;
-      //find the first item to match
-      var scrollYThres = window.scrollY + 200;
-      var target;
-      if (scrollYThres < 100) {
-        target = itemList[0].tocItem;
-      } else {
-        itemList.forEach(function (item, index) {
-          if (target) return;
-          if (index > 0) {
-            if (item.top >= scrollYThres) {
-              target = itemList[index - 1].tocItem;
-            }
-          }
-        });
-      }
-
-      $('.toc-active').removeClass('toc-active');
-      $(target).addClass('toc-active');
-    };
-
-    window.onscroll = updateTocActive;
-    updateTocActive();
-  }
-  </script>
 </body>
 
 </html>
\ No newline at end of file
diff --git a/4.x/assets/css/atom-one-light.css b/assets/css/atom-one-light.css
similarity index 100%
rename from 4.x/assets/css/atom-one-light.css
rename to assets/css/atom-one-light.css
diff --git a/4.x/assets/css/custom.css b/assets/css/custom.css
similarity index 100%
rename from 4.x/assets/css/custom.css
rename to assets/css/custom.css
diff --git a/4.x/assets/css/github-markdown.css b/assets/css/github-markdown.css
similarity index 100%
rename from 4.x/assets/css/github-markdown.css
rename to assets/css/github-markdown.css
diff --git a/4.x/assets/css/pilcrow.css b/assets/css/pilcrow.css
similarity index 100%
rename from 4.x/assets/css/pilcrow.css
rename to assets/css/pilcrow.css
diff --git a/cn.html b/cn.html
new file mode 100644
index 0000000..9e14363
--- /dev/null
+++ b/cn.html
@@ -0,0 +1,837 @@
+<!doctype html>
+<html>
+
+<head>
+  <meta charset="utf-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1, minimal-ui">
+  <title>AnyProxy</title>
+  <link type="text/css" rel="stylesheet" href="assets/css/github-markdown.css">
+  <link type="text/css" rel="stylesheet" href="assets/css/pilcrow.css">
+  <link type="text/css" rel="stylesheet" href="assets/css/atom-one-light.css" />
+  <link type="text/css" rel="stylesheet" href="assets/css/custom.css" />
+  <meta name="description" content="A fully configurable proxy in NodeJS, which can handle HTTPS requests perfectly.">
+  <meta name="description" content="AnyProxy - 开放式的HTTP/HTTPS代理,你可以灵活控制各种网络数据">
+  <meta name="keywords" content="代理服务器 Proxy HTTP HTTPS">
+  <script>
+    //redirect to Chinese version if in China
+    if (new Date().getTimezoneOffset() == "-480" && !(/(cn|en)/i.test(location.href))) {
+      location.href = "./cn.html";
+    } else {
+      var _hmt = _hmt || []; (function () { var hm = document.createElement("script"); hm.src = "//hm.baidu.com/hm.js?4e51565b7d471fd6623c163a8fd79e07"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })();
+    }
+  </script>
+</head>
+
+<body>
+  <a href="https://github.com/alibaba/anyproxy/tree/4.x" target="_blank">
+    <img style="position: fixed; top: 0; right: 0; border: 0;z-index: 1;" src="https://camo.githubusercontent.com/a6677b08c955af8400f44c6298f40e7d19cc5b2d/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f72696768745f677261795f3664366436642e706e67"
+      alt="Fork me on GitHub" data-canonical-src="https://s3.amazonaws.com/github/ribbons/forkme_right_gray_6d6d6d.png">
+  </a>
+
+  <article class="markdown-body">
+    <div class="toc-container" id="j_toc">
+      <div class="toc-content"><ul class="nav nav-list">
+    <li class="sidebar-header-1"><a href="#anyproxy">AnyProxy</a></li>
+    <li class="sidebar-header-2"><a href="#快速上手">快速上手</a></li>
+    <li class="sidebar-header-3"><a href="#安装">安装</a></li>
+    <li class="sidebar-header-3"><a href="#启动">启动</a></li>
+    <li class="sidebar-header-3"><a href="#其他命令">其他命令</a></li>
+    <li class="sidebar-header-2"><a href="#代理https请求">代理https请求</a></li>
+    <li class="sidebar-header-2"><a href="#规则模块(rule)">规则模块(Rule)</a></li>
+    <li class="sidebar-header-3"><a href="#开发示例">开发示例</a></li>
+    <li class="sidebar-header-3"><a href="#处理流程">处理流程</a></li>
+    <li class="sidebar-header-3"><a href="#如何引用">如何引用</a></li>
+    <li class="sidebar-header-2"><a href="#规则接口文档">规则接口文档</a></li>
+    <li class="sidebar-header-3"><a href="#summary">summary</a></li>
+    <li class="sidebar-header-4"><a href="#summary-1">summary</a></li>
+    <li class="sidebar-header-3"><a href="#beforesendrequest">beforeSendRequest</a></li>
+    <li class="sidebar-header-4"><a href="#beforesendrequest(requestdetail)">beforeSendRequest(requestDetail)</a></li>
+    <li class="sidebar-header-3"><a href="#beforesendresponse">beforeSendResponse</a></li>
+    <li class="sidebar-header-4"><a href="#beforesendresponse(requestdetail,-responsedetail)">beforeSendResponse(requestDetail, responseDetail)</a></li>
+    <li class="sidebar-header-3"><a href="#beforedealhttpsrequest">beforeDealHttpsRequest</a></li>
+    <li class="sidebar-header-4"><a href="#beforedealhttpsrequest(requestdetail)">beforeDealHttpsRequest(requestDetail)</a></li>
+    <li class="sidebar-header-3"><a href="#onerror">onError</a></li>
+    <li class="sidebar-header-4"><a href="#onerror(requestdetail,-error)">onError(requestDetail, error)</a></li>
+    <li class="sidebar-header-3"><a href="#onconnecterror">onConnectError</a></li>
+    <li class="sidebar-header-4"><a href="#onconnecterror(requestdetail,-error)">onConnectError(requestDetail, error)</a></li>
+    <li class="sidebar-header-3"><a href="#faq">FAQ</a></li>
+    <li class="sidebar-header-2"><a href="#规则模块样例">规则模块样例</a></li>
+    <li class="sidebar-header-3"><a href="#使用本地数据">使用本地数据</a></li>
+    <li class="sidebar-header-3"><a href="#修改请求头">修改请求头</a></li>
+    <li class="sidebar-header-3"><a href="#修改请求数据">修改请求数据</a></li>
+    <li class="sidebar-header-3"><a href="#修改请求的目标地址">修改请求的目标地址</a></li>
+    <li class="sidebar-header-3"><a href="#修改请求协议">修改请求协议</a></li>
+    <li class="sidebar-header-3"><a href="#修改返回状态码">修改返回状态码</a></li>
+    <li class="sidebar-header-3"><a href="#修改返回头">修改返回头</a></li>
+    <li class="sidebar-header-3"><a href="#修改返回内容并延迟">修改返回内容并延迟</a></li>
+    <li class="sidebar-header-2"><a href="#作为npm模块使用">作为npm模块使用</a></li>
+    <li class="sidebar-header-2"><a href="#关于anyproxy">关于AnyProxy</a></li>
+    <li class="sidebar-header-2"><a href="#配置帮助">配置帮助</a></li>
+    <li class="sidebar-header-3"><a href="#osx系统信任ca证书">OSX系统信任CA证书</a></li>
+    <li class="sidebar-header-3"><a href="#windows系统信任ca证书">Windows系统信任CA证书</a></li>
+    <li class="sidebar-header-3"><a href="#配置osx系统代理">配置OSX系统代理</a></li>
+    <li class="sidebar-header-3"><a href="#配置浏览器http代理">配置浏览器HTTP代理</a></li>
+    <li class="sidebar-header-3"><a href="#ios系统信任ca证书">iOS系统信任CA证书</a></li>
+    <li class="sidebar-header-3"><a href="#ios-&gt;&#x3D;-10.3信任ca证书">iOS &gt;&#x3D; 10.3信任CA证书</a></li>
+    <li class="sidebar-header-3"><a href="#配置ios/android系统代理">配置iOS/Android系统代理</a></li>
+</ul>
+      </div>
+    </div>
+    <div class="main-content"><h1 id="anyproxy"><a class="header-link" href="#anyproxy"></a>AnyProxy</h1>
+<blockquote>
+<p>本文档的适用范围是AnyProxy 4.0,此版本当前正在beta中,欢迎提供反馈</p>
+</blockquote>
+<p>Ref: <a href="./en.html">English Doc</a></p>
+<p>AnyProxy是一个开放式的HTTP代理服务器。</p>
+<p>Github主页:<a href="https://github.com/alibaba/anyproxy/tree/4.x">https://github.com/alibaba/anyproxy/tree/4.x</a></p>
+<p>主要特性包括:</p>
+<ul class="list">
+<li>基于Node.js,开放二次开发能力,允许自定义请求处理逻辑</li>
+<li>支持Https的解析</li>
+<li>提供GUI界面,用以观察请求</li>
+</ul>
+<p>相比3.x版本,AnyProxy 4.0的主要变化:</p>
+<ul class="list">
+<li>规则文件(Rule)全面支持Promise和Generator</li>
+<li>简化了规则文件内的接口</li>
+<li>Web版界面重构</li>
+</ul>
+<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/SqVntpzmscXPbSzfcGcr.png" width="500" /></p>
+<h2 id="快速上手"><a class="header-link" href="#快速上手"></a>快速上手</h2>
+<h3 id="安装"><a class="header-link" href="#安装"></a>安装</h3>
+<pre class="hljs"><code>npm install -g anyproxy@beta <span class="hljs-comment">#本文档对应的AnyProxy为4.0Beta版</span></code></pre><h3 id="启动"><a class="header-link" href="#启动"></a>启动</h3>
+<ul class="list">
+<li>命令行启动AnyProxy,默认端口号8001</li>
+</ul>
+<pre class="hljs"><code>anyproxy</code></pre><ul class="list">
+<li>启动后将终端http代理服务器配置为127.0.0.1:8001即可</li>
+<li>访问<a href="http://127.0.0.1:8002">http://127.0.0.1:8002</a> ,web界面上能看到所有的请求信息</li>
+</ul>
+<h3 id="其他命令"><a class="header-link" href="#其他命令"></a>其他命令</h3>
+<ul class="list">
+<li>配置启动端口,如1080端口启动</li>
+</ul>
+<pre class="hljs"><code>anyproxy --port 1080</code></pre><h2 id="代理https请求"><a class="header-link" href="#代理https请求"></a>代理https请求</h2>
+<ul class="list">
+<li>AnyProxy默认不对https请求做处理,如需看到明文信息,需要配置CA证书</li>
+</ul>
+<blockquote>
+<p>解析https请求的原理是中间人攻击(man-in-the-middle),用户必须信任AnyProxy生成的CA证书,才能进行后续流程</p>
+</blockquote>
+<ul class="list">
+<li>生成证书并解析所有https请求</li>
+</ul>
+<pre class="hljs"><code>anyproxy-ca <span class="hljs-comment">#生成rootCA证书,生成后需要手动信任</span>
+anyproxy --intercept <span class="hljs-comment">#启动AnyProxy,并解析所有https请求</span></code></pre><ul class="list">
+<li><a href="#osx系统信任ca证书">附录:如何信任CA证书</a></li>
+</ul>
+<h2 id="规则模块(rule)"><a class="header-link" href="#规则模块(rule)"></a>规则模块(Rule)</h2>
+<p>AnyProxy提供了二次开发的能力,你可以用js编写自己的规则模块(rule),来自定义网络请求的处理逻辑。</p>
+<blockquote>
+<p>注意:引用规则前,请务必确保文件来源可靠,以免发生安全问题</p>
+</blockquote>
+<p>规则模块的能力范围包括:</p>
+<ul class="list">
+<li>拦截并修改正在发送的请求<ul class="list">
+<li>可修改内容包括请求头(request header),请求体(request body),甚至是请求的目标地址等</li>
+</ul>
+</li>
+<li>拦截并修改服务端响应<ul class="list">
+<li>可修改的内容包括http状态码(status code)、响应头(response header)、响应内容等</li>
+</ul>
+</li>
+<li>拦截https请求,对内容做修改<ul class="list">
+<li>本质是中间人攻击(man-in-the-middle attack),需要客户端提前信任AnyProxy生成的CA</li>
+</ul>
+</li>
+</ul>
+<h3 id="开发示例"><a class="header-link" href="#开发示例"></a>开发示例</h3>
+<ul class="list">
+<li><p>举例</p>
+<ul class="list">
+<li>需要编写一个规则模块,在 GET <a href="http://httpbin.org/user-agent">http://httpbin.org/user-agent</a> 的返回值里加上测试信息,并延迟5秒返回</li>
+</ul>
+</li>
+<li><p>Step 1,编写规则</p>
+<pre class="hljs"><code><span class="hljs-comment">// file: sample.js</span>
+<span class="hljs-built_in">module</span>.exports = {
+  <span class="hljs-attr">summary</span>: <span class="hljs-string">'a rule to modify response'</span>,
+  *beforeSendResponse(requestDetail, responseDetail) {
+    <span class="hljs-keyword">if</span> (requestDetail.url === <span class="hljs-string">'http://httpbin.org/user-agent'</span>) {
+      <span class="hljs-keyword">const</span> newResponse = responseDetail.response;
+      newResponse.body += <span class="hljs-string">'-- AnyProxy Hacked! --'</span>;
+      <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Promise</span>(<span class="hljs-function">(<span class="hljs-params">resolve, reject</span>) =&gt;</span> {
+        setTimeout(<span class="hljs-function"><span class="hljs-params">()</span> =&gt;</span> { <span class="hljs-comment">// delay</span>
+          resolve({ <span class="hljs-attr">response</span>: newResponse });
+        }, <span class="hljs-number">5000</span>);
+      });
+    }
+  },
+};</code></pre></li>
+<li><p>Step 2, 启动AnyProxy,加载规则</p>
+<ul class="list">
+<li>运行 <code>anyproxy --rule sample.js</code></li>
+</ul>
+</li>
+<li><p>Step 3, 测试规则</p>
+<ul class="list">
+<li><p>用curl测试 </p>
+<pre class="hljs"><code>curl http://httpbin.org/user-agent --proxy http://127.0.0.1:8001</code></pre></li>
+<li><p>用浏览器测试:配置浏览器http代理为 127.0.0.1:8001,访问 <a href="http://httpbin.org/user-agent">http://httpbin.org/user-agent</a> </p>
+</li>
+<li><p>经过代理服务器后,期望的返回如下</p>
+</li>
+</ul>
+<pre class="hljs"><code>{
+  <span class="hljs-string">"user-agent"</span>: <span class="hljs-string">"curl/7.43.0"</span>
+}
+- AnyProxy Hacked!</code></pre></li>
+<li><p>Step 4, 查看请求信息</p>
+<ul class="list">
+<li>浏览器访问<a href="http://127.0.0.1:8002">http://127.0.0.1:8002</a> ,界面上能看到刚才的请求信息</li>
+</ul>
+</li>
+</ul>
+<h3 id="处理流程"><a class="header-link" href="#处理流程"></a>处理流程</h3>
+<ul class="list">
+<li>处理流程图如下</li>
+</ul>
+<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/TWyNuSJtEZBdrdcOMRjE.png" width="550" /></p>
+<ul class="list">
+<li><p>当http请求经过代理服务器时,具体处理过程是:</p>
+<ul class="list">
+<li>收集请求所有请求参数,包括method, header, body等</li>
+<li>AnyProxy调用规则模块<code>beforeSendRequest</code>方法,由模块做处理,返回新的请求参数,或返回响应内容</li>
+<li>如果<code>beforeSendRequest</code>返回了响应内容,则立即把此响应返回到客户端(而不再发送到真正的服务端),流程结束。</li>
+<li>根据请求参数,向服务端发出请求,接收服务端响应。</li>
+<li>调用规则模块<code>beforeSendResponse</code>方法,由模块对响应内容进行处理</li>
+<li>把响应信息返回给客户端</li>
+</ul>
+</li>
+<li><p>当代理服务器收到https请求时,AnyProxy可以替换证书,对请求做明文解析。</p>
+<ul class="list">
+<li>调用规则模块<code>beforeDealHttpsRequest</code>方法,如果返回<code>true</code>,会明文解析这个请求,其他请求不处理</li>
+<li>被明文解析后的https请求,处理流程同http一致。未明文解析请求不会再进入规则模块做处理。</li>
+</ul>
+</li>
+</ul>
+<h3 id="如何引用"><a class="header-link" href="#如何引用"></a>如何引用</h3>
+<p>如下几种方案都可以用来引用规则模块:</p>
+<ul class="list">
+<li>使用本地路径<pre class="hljs"><code>anyproxy --rule ./rule.js</code></pre></li>
+<li><p>使用在线地址</p>
+<pre class="hljs"><code>anyproxy --rule https://sample.com/rule.js</code></pre></li>
+<li><p>使用npm包</p>
+<ul class="list">
+<li>AnyProxy使用<code>require()</code>加载本地规则,你可以在参数里传入一个本地的npm包路径,或是某个全局安装的npm包</li>
+</ul>
+<pre class="hljs"><code>anyproxy --rule ./myRulePkg/ <span class="hljs-comment">#本地包</span>
+npm i -g myRulePkg &amp;&amp; anyproxy --rule myRulePkg <span class="hljs-comment">#全局包</span></code></pre></li>
+</ul>
+<h2 id="规则接口文档"><a class="header-link" href="#规则接口文档"></a>规则接口文档</h2>
+<p>规则模块应该符合cmd规范,一个典型的规则模块代码结构如下。模块中所有方法都是可选的,只需实现业务感兴趣的部分即可。</p>
+<pre class="hljs"><code><span class="hljs-built_in">module</span>.exports = {
+  <span class="hljs-comment">// 模块介绍</span>
+  summary: <span class="hljs-string">'my customized rule for AnyProxy'</span>, 
+  <span class="hljs-comment">// 发送请求前拦截处理</span>
+  *beforeSendRequest(requestDetail) { <span class="hljs-comment">/* ... */</span> }, 
+  <span class="hljs-comment">// 发送响应前处理</span>
+  *beforeSendResponse(requestDetail, responseDetail) { <span class="hljs-comment">/* ... */</span> }, 
+  <span class="hljs-comment">// 是否处理https请求</span>
+  *beforeDealHttpsRequest(requestDetail) { <span class="hljs-comment">/* ... */</span> }, 
+  <span class="hljs-comment">// 请求出错的事件</span>
+  *onError(requestDetail, error) { <span class="hljs-comment">/* ... */</span> }, 
+  <span class="hljs-comment">// https连接服务器出错</span>
+  *onConnectError(requestDetail, error) { <span class="hljs-comment">/* ... */</span> } 
+};</code></pre><blockquote>
+<p>规则文件中,除了summary,都是由 <a href="https://www.npmjs.com/package/co">co</a> 驱动的,函数需要满足yieldable。可以返回promise或使用generator函数。</p>
+</blockquote>
+<h3 id="summary"><a class="header-link" href="#summary"></a>summary</h3>
+<h4 id="summary-1"><a class="header-link" href="#summary-1"></a>summary</h4>
+<ul class="list">
+<li>规则模块的介绍文案,用于AnyProxy提示用户</li>
+</ul>
+<h3 id="beforesendrequest"><a class="header-link" href="#beforesendrequest"></a>beforeSendRequest</h3>
+<h4 id="beforesendrequest(requestdetail)"><a class="header-link" href="#beforesendrequest(requestdetail)"></a>beforeSendRequest(requestDetail)</h4>
+<ul class="list">
+<li>AnyProxy向服务端发送请求前,会调用<code>beforeSendRequest</code>,并带上参数<code>requestDetail</code></li>
+<li><code>requestDetail</code> <ul class="list">
+<li><code>protocol</code> {string} 请求使用的协议,http或者https</li>
+<li><code>requestOptions</code> {object} 即将发送的请求配置,供require(&#39;http&#39;).request作为使用。详见:<a href="https://nodejs.org/api/http.html#http_http_request_options_callback">https://nodejs.org/api/http.html#http_http_request_options_callback</a></li>
+<li><code>requestData</code> {object} 请求Body</li>
+<li><code>url</code> {string} 请求url</li>
+<li><code>_req</code> {object} 请求的原始request</li>
+</ul>
+</li>
+<li><p>举例:请求 <em>anyproxy.io</em> 时,<code>requestDetail</code>参数内容大致如下</p>
+<pre class="hljs"><code>{
+  <span class="hljs-attr">protocol</span>: <span class="hljs-string">'http'</span>,
+  <span class="hljs-attr">url</span>: <span class="hljs-string">'http://anyproxy.io/'</span>,
+  <span class="hljs-attr">requestOptions</span>: {
+    <span class="hljs-attr">hostname</span>: <span class="hljs-string">'anyproxy.io'</span>,
+    <span class="hljs-attr">port</span>: <span class="hljs-number">80</span>,
+    <span class="hljs-attr">path</span>: <span class="hljs-string">'/'</span>,
+    <span class="hljs-attr">method</span>: <span class="hljs-string">'GET'</span>,
+    <span class="hljs-attr">headers</span>: {
+      <span class="hljs-attr">Host</span>: <span class="hljs-string">'anyproxy.io'</span>,
+      <span class="hljs-string">'Proxy-Connection'</span>: <span class="hljs-string">'keep-alive'</span>,
+      <span class="hljs-string">'User-Agent'</span>: <span class="hljs-string">'...'</span>
+    }
+  },
+  <span class="hljs-attr">requestData</span>: <span class="hljs-string">'...'</span>,
+  <span class="hljs-attr">_req</span>: { <span class="hljs-comment">/* ... */</span>}
+}</code></pre></li>
+<li><p>以下几种返回都是合法的</p>
+<ul class="list">
+<li>不做任何处理,返回null</li>
+</ul>
+<pre class="hljs"><code><span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;</code></pre><ul class="list">
+<li>修改请求协议,如强制改用https发起请求</li>
+</ul>
+<pre class="hljs"><code><span class="hljs-keyword">return</span> {
+  <span class="hljs-attr">protocol</span>: <span class="hljs-string">'https'</span>
+};</code></pre><ul class="list">
+<li>修改请求参数</li>
+</ul>
+<pre class="hljs"><code><span class="hljs-keyword">var</span> newOption = <span class="hljs-built_in">Object</span>.assign({}, requestDetail.requestOptions);
+newOption.path = <span class="hljs-string">'/redirect/to/another/path'</span>;
+<span class="hljs-keyword">return</span> {
+  <span class="hljs-attr">requestOptions</span>: newOption
+};</code></pre><ul class="list">
+<li>修改请求body</li>
+</ul>
+<pre class="hljs"><code><span class="hljs-keyword">return</span> {
+  <span class="hljs-attr">requestData</span>: <span class="hljs-string">'my new request data'</span>
+  <span class="hljs-comment">//这里也可以同时加上requestOptions</span>
+};</code></pre><ul class="list">
+<li>直接返回客户端,不再发起请求,其中<code>statusCode</code> <code>header</code> 是必选字段</li>
+</ul>
+<pre class="hljs"><code><span class="hljs-keyword">return</span> {
+  <span class="hljs-attr">response</span>: {
+    <span class="hljs-attr">statusCode</span>: <span class="hljs-number">200</span>,
+    <span class="hljs-attr">header</span>: { <span class="hljs-string">'content-type'</span>: <span class="hljs-string">'text/html'</span> },
+    <span class="hljs-attr">body</span>: <span class="hljs-string">'this could be a &lt;string&gt; or &lt;buffer&gt;'</span>
+  }
+};</code></pre></li>
+</ul>
+<h3 id="beforesendresponse"><a class="header-link" href="#beforesendresponse"></a>beforeSendResponse</h3>
+<h4 id="beforesendresponse(requestdetail,-responsedetail)"><a class="header-link" href="#beforesendresponse(requestdetail,-responsedetail)"></a>beforeSendResponse(requestDetail, responseDetail)</h4>
+<ul class="list">
+<li>AnyProxy向客户端发送请求前,会调用<code>beforeSendResponse</code>,并带上参数<code>requestDetail</code> <code>responseDetail</code></li>
+<li><code>requestDetail</code> 同<code>beforeSendRequest</code>中的参数</li>
+<li><code>responseDetail</code> <ul class="list">
+<li><code>response</code> {object} 服务端的返回信息,包括<code>statusCode</code> <code>header</code> <code>body</code>三个字段</li>
+<li><code>_res</code> {object} 原始的服务端返回对象</li>
+</ul>
+</li>
+<li><p>举例,请求 <em>anyproxy.io</em> 时,<code>responseDetail</code>参数内容大致如下</p>
+<pre class="hljs"><code>{ 
+  <span class="hljs-attr">response</span>: { 
+    <span class="hljs-attr">statusCode</span>: <span class="hljs-number">200</span>,
+    <span class="hljs-attr">header</span>: { 
+      <span class="hljs-string">'Content-Type'</span>: <span class="hljs-string">'image/gif'</span>,
+      <span class="hljs-attr">Connection</span>: <span class="hljs-string">'close'</span>,
+      <span class="hljs-string">'Cache-Control'</span>: <span class="hljs-string">'...'</span>
+    },
+    <span class="hljs-attr">body</span>: <span class="hljs-string">'...'</span>
+  },
+  <span class="hljs-attr">_res</span>: { <span class="hljs-comment">/* ... */</span> }
+}</code></pre></li>
+<li><p>以下几种返回都是合法的</p>
+<ul class="list">
+<li>不做任何处理,返回null</li>
+</ul>
+<pre class="hljs"><code><span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;</code></pre><ul class="list">
+<li>修改返回的状态码</li>
+</ul>
+<pre class="hljs"><code><span class="hljs-keyword">var</span> newResponse = <span class="hljs-built_in">Object</span>.assign({}, responseDetail.reponse);
+newResponse.statusCode = <span class="hljs-number">404</span>;
+<span class="hljs-keyword">return</span> {
+  <span class="hljs-attr">response</span>: newResponse
+};</code></pre><ul class="list">
+<li>修改返回的内容</li>
+</ul>
+<pre class="hljs"><code><span class="hljs-keyword">var</span> newResponse = <span class="hljs-built_in">Object</span>.assign({}, responseDetail.reponse);
+newResponse.body += <span class="hljs-string">'--from anyproxy--'</span>;
+<span class="hljs-keyword">return</span> {
+  <span class="hljs-attr">response</span>: newResponse
+};</code></pre></li>
+</ul>
+<h3 id="beforedealhttpsrequest"><a class="header-link" href="#beforedealhttpsrequest"></a>beforeDealHttpsRequest</h3>
+<h4 id="beforedealhttpsrequest(requestdetail)"><a class="header-link" href="#beforedealhttpsrequest(requestdetail)"></a>beforeDealHttpsRequest(requestDetail)</h4>
+<ul class="list">
+<li>AnyProxy收到https请求时,会调用<code>beforeDealHttpsRequest</code>,并带上参数<code>requestDetail</code></li>
+<li>如果配置了全局解析https的参数,则AnyProxy会略过这个调用</li>
+<li>只有返回<code>true</code>时,AnyProxy才会尝试替换证书、解析https。否则只做数据流转发,无法看到明文数据。</li>
+<li>注意:https over http的代理模式中,这里的request是CONNECT请求</li>
+<li><code>requestDetail</code><ul class="list">
+<li><code>host</code> {string} 请求目标的Host,受制于协议,这里无法获取完整url</li>
+<li><code>_req</code> {object} 请求的原始request</li>
+</ul>
+</li>
+<li>返回值<ul class="list">
+<li><code>true</code>或者<code>false</code>,表示是否需要AnyProxy替换证书并解析https</li>
+</ul>
+</li>
+</ul>
+<h3 id="onerror"><a class="header-link" href="#onerror"></a>onError</h3>
+<h4 id="onerror(requestdetail,-error)"><a class="header-link" href="#onerror(requestdetail,-error)"></a>onError(requestDetail, error)</h4>
+<ul class="list">
+<li>在请求处理过程中发生错误时,AnyProxy会调用<code>onError</code>方法,并提供对应的错误信息</li>
+<li>多数场景下,错误会在请求目标服务器的时候发生,比如DNS解析失败、请求超时等</li>
+<li><code>requestDetail</code> 同<code>beforeSendRequest</code>中的参数</li>
+<li><p>以下几种返回都是合法的</p>
+<ul class="list">
+<li>不做任何处理。此时AnyProxy会返回一个默认的错误页。</li>
+</ul>
+<pre class="hljs"><code><span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;</code></pre><ul class="list">
+<li>返回自定义错误页</li>
+</ul>
+<pre class="hljs"><code><span class="hljs-keyword">return</span> {
+  <span class="hljs-attr">response</span>: {
+    <span class="hljs-attr">statusCode</span>: <span class="hljs-number">200</span>,
+    <span class="hljs-attr">header</span>: { <span class="hljs-string">'content-type'</span>: <span class="hljs-string">'text/html'</span> },
+    <span class="hljs-attr">body</span>: <span class="hljs-string">'this could be a &lt;string&gt; or &lt;buffer&gt;'</span>
+  }
+};</code></pre></li>
+</ul>
+<h3 id="onconnecterror"><a class="header-link" href="#onconnecterror"></a>onConnectError</h3>
+<h4 id="onconnecterror(requestdetail,-error)"><a class="header-link" href="#onconnecterror(requestdetail,-error)"></a>onConnectError(requestDetail, error)</h4>
+<ul class="list">
+<li>AnyProxy在与目标HTTPS服务器建立连接的过程中,如果发生错误,AnyProxy会调用这个方法</li>
+<li><code>requestDetail</code> 同<code>beforeDealHttpsRequest</code>中的参数</li>
+<li>此处无法控制向客户端的返回信息,无需返回值。</li>
+</ul>
+<h3 id="faq"><a class="header-link" href="#faq"></a>FAQ</h3>
+<ul class="list">
+<li>Q: 为什么https请求不能进入处理函数?</li>
+<li><p>A: 以下任意一项都能用来改变https的处理特性:</p>
+<ol class="list">
+<li>命令行启动AnyProxy时配置<code>--intercept</code>参数,按npm模块启动时配置<code>forceProxyHttps</code>参数,所有Https请求都会被替换证书并解析</li>
+<li>规则文件内提供<code>beforeDealHttpsRequest</code>方法,返回 <em>true</em> 的https请求会被解析</li>
+</ol>
+</li>
+<li><p>Q: 提示 <em>function is not yieldable</em></p>
+</li>
+<li>A: 规则模块是用 <a href="https://www.npmjs.com/package/co">co</a> 驱动的,函数需要满足yieldable。可以使用generator方法或是返回Promise。</li>
+</ul>
+<h2 id="规则模块样例"><a class="header-link" href="#规则模块样例"></a>规则模块样例</h2>
+<ul class="list">
+<li>这里提供一些样例,来讲解规则模块的常见用法</li>
+<li>你可以通过 <code>anyproxy --rule http://....js</code> 来加载模块并体验</li>
+<li>用curl发请求测试的方法如下<ul class="list">
+<li>直接请求服务器:<code>curl http://httpbin.org/</code></li>
+<li>通过代理服务器请求:<code>curl http://httpbin.org/ --proxy http://127.0.0.1:8001</code></li>
+</ul>
+</li>
+</ul>
+<h3 id="使用本地数据"><a class="header-link" href="#使用本地数据"></a>使用本地数据</h3>
+<ul class="list">
+<li>拦截发送到 <a href="http://httpbin.org">http://httpbin.org</a> 的请求,使用本地数据代替服务端返回</li>
+</ul>
+<pre class="hljs"><code>anyproxy --rule https://raw.githubusercontent.com/alibaba/anyproxy/4.x/rule_sample/sample_use_local_response.js</code></pre><pre class="hljs"><code><span class="hljs-comment">/* 
+  sample: 
+    intercept all requests toward httpbin.org, use a local response
+  test:
+    curl http://httpbin.org/user-agent --proxy http://127.0.0.1:8001
+*/</span>
+<span class="hljs-built_in">module</span>.exports = {
+  *beforeSendRequest(requestDetail) {
+    <span class="hljs-keyword">const</span> localResponse = {
+      <span class="hljs-attr">statusCode</span>: <span class="hljs-number">200</span>,
+      <span class="hljs-attr">header</span>: { <span class="hljs-string">'Content-Type'</span>: <span class="hljs-string">'application/json'</span> },
+      <span class="hljs-attr">body</span>: <span class="hljs-string">'{"hello": "this is local response"}'</span>
+    };
+    <span class="hljs-keyword">if</span> (requestDetail.url.indexOf(<span class="hljs-string">'http://httpbin.org'</span>) === <span class="hljs-number">0</span>) {
+      <span class="hljs-keyword">return</span> {
+        <span class="hljs-attr">response</span>: localResponse
+      };
+    }
+  },
+};</code></pre><h3 id="修改请求头"><a class="header-link" href="#修改请求头"></a>修改请求头</h3>
+<ul class="list">
+<li>修改发送到 httpbin.org 的user-agent</li>
+</ul>
+<pre class="hljs"><code>anyproxy --rule https://raw.githubusercontent.com/alibaba/anyproxy/4.x/rule_sample/sample_modify_request_header.js</code></pre><pre class="hljs"><code><span class="hljs-comment">/* 
+  sample: 
+    modify the user-agent in requests toward httpbin.org
+  test:
+    curl http://httpbin.org/user-agent --proxy http://127.0.0.1:8001
+*/</span>
+<span class="hljs-built_in">module</span>.exports = {
+  *beforeSendRequest(requestDetail) {
+    <span class="hljs-keyword">if</span> (requestDetail.url.indexOf(<span class="hljs-string">'http://httpbin.org'</span>) === <span class="hljs-number">0</span>) {
+      <span class="hljs-keyword">const</span> newRequestOptions = requestDetail.requestOptions;
+      newRequestOptions.headers[<span class="hljs-string">'User-Agent'</span>] = <span class="hljs-string">'AnyProxy/0.0.0'</span>;
+      <span class="hljs-keyword">return</span> {
+        <span class="hljs-attr">requestOptions</span>: newRequestOptions
+      };
+    }
+  },
+};</code></pre><h3 id="修改请求数据"><a class="header-link" href="#修改请求数据"></a>修改请求数据</h3>
+<ul class="list">
+<li>修改发送到 <a href="http://httpbin.org/post">http://httpbin.org/post</a> 的post数据</li>
+</ul>
+<pre class="hljs"><code>anyproxy --rule https://raw.githubusercontent.com/alibaba/anyproxy/4.x/rule_sample/sample_modify_request_data.js</code></pre><pre class="hljs"><code><span class="hljs-comment">/* 
+  sample: 
+    modify the post data towards http://httpbin.org/post
+  test:
+    curl -H "Content-Type: text/plain" -X POST -d 'original post data' http://httpbin.org/post --proxy http://127.0.0.1:8001
+  expected response:
+    { "data": "i-am-anyproxy-modified-post-data" }
+*/</span>
+<span class="hljs-built_in">module</span>.exports = {
+  *beforeSendRequest(requestDetail) {
+    <span class="hljs-keyword">if</span> (requestDetail.url.indexOf(<span class="hljs-string">'http://httpbin.org/post'</span>) === <span class="hljs-number">0</span>) {
+      <span class="hljs-keyword">return</span> {
+        <span class="hljs-attr">requestData</span>: <span class="hljs-string">'i-am-anyproxy-modified-post-data'</span>
+      };
+    }
+  },
+};</code></pre><h3 id="修改请求的目标地址"><a class="header-link" href="#修改请求的目标地址"></a>修改请求的目标地址</h3>
+<ul class="list">
+<li>把所有发送到 <a href="http://httpbin.org/">http://httpbin.org/</a> 的请求全部改到 <a href="http://httpbin.org/user-agent">http://httpbin.org/user-agent</a></li>
+</ul>
+<pre class="hljs"><code>anyproxy --rule https://raw.githubusercontent.com/alibaba/anyproxy/4.x/rule_sample/sample_modify_request_path.js</code></pre><pre class="hljs"><code><span class="hljs-comment">/* 
+  sample: 
+    redirect all httpbin.org requests to http://httpbin.org/user-agent
+  test:
+    curl http://httpbin.org/any-path --proxy http://127.0.0.1:8001
+  expected response:
+    { "user-agent": "curl/7.43.0" }
+*/</span>
+<span class="hljs-built_in">module</span>.exports = {
+  *beforeSendRequest(requestDetail) {
+    <span class="hljs-keyword">if</span> (requestDetail.url.indexOf(<span class="hljs-string">'http://httpbin.org'</span>) === <span class="hljs-number">0</span>) {
+      <span class="hljs-keyword">const</span> newRequestOptions = requestDetail.requestOptions;
+      newRequestOptions.path = <span class="hljs-string">'/user-agent'</span>;
+      newRequestOptions.method = <span class="hljs-string">'GET'</span>;
+      <span class="hljs-keyword">return</span> {
+        <span class="hljs-attr">requestOptions</span>: newRequestOptions
+      };
+    }
+  },
+};</code></pre><h3 id="修改请求协议"><a class="header-link" href="#修改请求协议"></a>修改请求协议</h3>
+<ul class="list">
+<li>把用http协议请求的 <a href="http://httpbin.org">http://httpbin.org</a> 改成https并发送</li>
+</ul>
+<pre class="hljs"><code>anyproxy --rule https://raw.githubusercontent.com/alibaba/anyproxy/4.x/rule_sample/sample_modify_request_protocol.js</code></pre><pre class="hljs"><code><span class="hljs-comment">/* 
+  sample: 
+    redirect all http requests of httpbin.org to https
+  test:
+    curl 'http://httpbin.org/get?show_env=1' --proxy http://127.0.0.1:8001
+  expected response:
+    { "X-Forwarded-Protocol": "https" }
+*/</span>
+<span class="hljs-built_in">module</span>.exports = {
+  *beforeSendRequest(requestDetail) {
+    <span class="hljs-keyword">if</span> (requestDetail.url.indexOf(<span class="hljs-string">'http://httpbin.org'</span>) === <span class="hljs-number">0</span>) {
+      <span class="hljs-keyword">const</span> newOption = requestDetail.requestOptions;
+      newOption.port = <span class="hljs-number">443</span>;
+      <span class="hljs-keyword">return</span> {
+        <span class="hljs-attr">protocol</span>: <span class="hljs-string">'https'</span>,
+        <span class="hljs-attr">requestOptions</span>: newOption
+      };
+    }
+  }
+};</code></pre><h3 id="修改返回状态码"><a class="header-link" href="#修改返回状态码"></a>修改返回状态码</h3>
+<ul class="list">
+<li>把 所有<a href="http://httpbin.org">http://httpbin.org</a> 的返回状态码都改成404</li>
+</ul>
+<pre class="hljs"><code>anyproxy --rule https://raw.githubusercontent.com/alibaba/anyproxy/4.x/rule_sample/sample_modify_response_statuscode.js</code></pre><pre class="hljs"><code><span class="hljs-comment">/* 
+  sample: 
+    modify all status code of http://httpbin.org/ to 404
+  test:
+    curl -I 'http://httpbin.org/user-agent' --proxy http://127.0.0.1:8001
+  expected response:
+    HTTP/1.1 404 Not Found
+*/</span>
+<span class="hljs-built_in">module</span>.exports = {
+  *beforeSendResponse(requestDetail, responseDetail) {
+    <span class="hljs-keyword">if</span> (requestDetail.url.indexOf(<span class="hljs-string">'http://httpbin.org'</span>) === <span class="hljs-number">0</span>) {
+      <span class="hljs-keyword">const</span> newResponse = responseDetail.response;
+      newResponse.statusCode = <span class="hljs-number">404</span>;
+      <span class="hljs-keyword">return</span> {
+        <span class="hljs-attr">response</span>: newResponse
+      };
+    }
+  }
+};</code></pre><h3 id="修改返回头"><a class="header-link" href="#修改返回头"></a>修改返回头</h3>
+<ul class="list">
+<li>在 <a href="http://httpbin.org/user-agent">http://httpbin.org/user-agent</a> 的返回头里加上 X-Proxy-By:AnyProxy</li>
+</ul>
+<pre class="hljs"><code>anyproxy --rule https://raw.githubusercontent.com/alibaba/anyproxy/4.x/rule_sample/sample_modify_response_header.js</code></pre><pre class="hljs"><code><span class="hljs-comment">/* 
+  sample: 
+    modify response header of http://httpbin.org/user-agent
+  test:
+    curl -I 'http://httpbin.org/user-agent' --proxy http://127.0.0.1:8001
+  expected response:
+    X-Proxy-By: AnyProxy
+*/</span>
+<span class="hljs-built_in">module</span>.exports = {
+  *beforeSendResponse(requestDetail, responseDetail) {
+    <span class="hljs-keyword">if</span> (requestDetail.url.indexOf(<span class="hljs-string">'http://httpbin.org/user-agent'</span>) === <span class="hljs-number">0</span>) {
+      <span class="hljs-keyword">const</span> newResponse = responseDetail.response;
+      newResponse.header[<span class="hljs-string">'X-Proxy-By'</span>] = <span class="hljs-string">'AnyProxy'</span>;
+      <span class="hljs-keyword">return</span> {
+        <span class="hljs-attr">response</span>: newResponse
+      };
+    }
+  }
+};</code></pre><h3 id="修改返回内容并延迟"><a class="header-link" href="#修改返回内容并延迟"></a>修改返回内容并延迟</h3>
+<ul class="list">
+<li>在 <a href="http://httpbin.org/user-agent">http://httpbin.org/user-agent</a> 的返回最后追加AnyProxy的签名,并延迟5秒</li>
+</ul>
+<pre class="hljs"><code>anyproxy --rule https://raw.githubusercontent.com/alibaba/anyproxy/4.x/rule_sample/sample_modify_response_data.js</code></pre><pre class="hljs"><code><span class="hljs-comment">/* 
+  sample: 
+    modify response data of http://httpbin.org/user-agent
+  test:
+    curl 'http://httpbin.org/user-agent' --proxy http://127.0.0.1:8001
+  expected response:
+    { "user-agent": "curl/7.43.0" } -- AnyProxy Hacked! --
+*/</span>
+
+<span class="hljs-built_in">module</span>.exports = {
+  *beforeSendResponse(requestDetail, responseDetail) {
+    <span class="hljs-keyword">if</span> (requestDetail.url === <span class="hljs-string">'http://httpbin.org/user-agent'</span>) {
+      <span class="hljs-keyword">const</span> newResponse = responseDetail.response;
+      newResponse.body += <span class="hljs-string">'-- AnyProxy Hacked! --'</span>;
+      <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Promise</span>(<span class="hljs-function">(<span class="hljs-params">resolve, reject</span>) =&gt;</span> {
+        setTimeout(<span class="hljs-function"><span class="hljs-params">()</span> =&gt;</span> { <span class="hljs-comment">// delay the response for 5s</span>
+          resolve({ <span class="hljs-attr">response</span>: newResponse });
+        }, <span class="hljs-number">5000</span>);
+      });
+    }
+  },
+};</code></pre><h2 id="作为npm模块使用"><a class="header-link" href="#作为npm模块使用"></a>作为npm模块使用</h2>
+<p>AnyProxy可以作为一个npm模块使用,整合进其他工具。</p>
+<blockquote>
+<p>如要启用https解析,请在代理服务器启动前自行调用<code>AnyProxy.utils.certMgr</code>相关方法生成证书,并引导用户信任安装。或引导用户使用<code>anyproxy-ca</code>方法。</p>
+</blockquote>
+<ul class="list">
+<li>引入</li>
+</ul>
+<pre class="hljs"><code>npm i anyproxy@beta --save <span class="hljs-comment"># 4.0版正在beta中</span></code></pre><ul class="list">
+<li>使用举例</li>
+</ul>
+<pre class="hljs"><code><span class="hljs-keyword">const</span> AnyProxy = <span class="hljs-built_in">require</span>(<span class="hljs-string">'anyproxy'</span>);
+<span class="hljs-keyword">const</span> options = {
+  <span class="hljs-attr">port</span>: <span class="hljs-number">8001</span>,
+  <span class="hljs-attr">rule</span>: <span class="hljs-built_in">require</span>(<span class="hljs-string">'myRuleModule'</span>),
+  <span class="hljs-attr">webInterface</span>: {
+    <span class="hljs-attr">enable</span>: <span class="hljs-literal">true</span>,
+    <span class="hljs-attr">webPort</span>: <span class="hljs-number">8002</span>,
+    <span class="hljs-attr">wsPort</span>: <span class="hljs-number">8003</span>,
+  },
+  <span class="hljs-attr">throttle</span>: <span class="hljs-number">10000</span>,
+  <span class="hljs-attr">forceProxyHttps</span>: <span class="hljs-literal">false</span>,
+  <span class="hljs-attr">silent</span>: <span class="hljs-literal">false</span>
+};
+<span class="hljs-keyword">const</span> proxyServer = <span class="hljs-keyword">new</span> AnyProxy.ProxyServer(options);
+
+proxyServer.on(<span class="hljs-string">'ready'</span>, () =&gt; { <span class="hljs-comment">/* */</span> });
+proxyServer.on(<span class="hljs-string">'error'</span>, (e) =&gt; { <span class="hljs-comment">/* */</span> });
+proxyServer.start();
+
+<span class="hljs-comment">//when finished</span>
+proxyServer.close();</code></pre><ul class="list">
+<li><p>Class: AnyProxy.proxyServer</p>
+<ul class="list">
+<li><p>创建代理服务器</p>
+<pre class="hljs"><code><span class="hljs-keyword">const</span> proxy = <span class="hljs-keyword">new</span> AnyProxy.proxyServer(options)</code></pre></li>
+<li><p><code>options</code></p>
+<ul class="list">
+<li><code>port</code> {number} 必选,代理服务器端口</li>
+<li><code>rule</code> {object} 自定义规则模块</li>
+<li><code>throttle</code> {number} 限速值,单位kb/s,默认不限速</li>
+<li><code>forceProxyHttps</code> {boolean} 是否强制拦截所有的https,忽略规则模块的返回,默认<code>false</code></li>
+<li><code>silent</code> {boolean} 是否屏蔽所有console输出,默认<code>false</code></li>
+<li><code>dangerouslyIgnoreUnauthorized</code> {boolean} 是否忽略请求中的证书错误,默认<code>false</code></li>
+<li><code>webInterface</code> {object} web版界面配置<ul class="list">
+<li><code>enable</code> {boolean} 是否启用web版界面,默认<code>false</code></li>
+<li><code>webPort</code> {number} web版界面端口号,默认<code>8002</code></li>
+</ul>
+</li>
+</ul>
+</li>
+<li><p>Event: <code>ready</code></p>
+<ul class="list">
+<li>代理服务器启动完成</li>
+<li>示例</li>
+</ul>
+<pre class="hljs"><code>proxy.on(<span class="hljs-string">'ready'</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{ })</code></pre></li>
+<li><p>Event: <code>error</code></p>
+<ul class="list">
+<li>代理服务器发生错误</li>
+<li>示例</li>
+</ul>
+<pre class="hljs"><code>proxy.on(<span class="hljs-string">'error'</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{ })</code></pre></li>
+<li><p>Method: <code>start</code></p>
+<ul class="list">
+<li>启动代理服务器</li>
+<li>示例</li>
+</ul>
+<pre class="hljs"><code>proxy.start();</code></pre></li>
+<li><p>Method: <code>close</code></p>
+<ul class="list">
+<li>关闭代理服务器</li>
+<li>示例</li>
+</ul>
+<pre class="hljs"><code>proxy.close();</code></pre></li>
+</ul>
+</li>
+<li><p>AnyProxy.utils.systemProxyMgr</p>
+<ul class="list">
+<li>管理系统的全局代理配置,方法调用时可能会弹出密码框</li>
+<li>使用示例</li>
+</ul>
+<pre class="hljs"><code><span class="hljs-comment">// 配置127.0.0.1:8001为全局http代理服务器</span>
+AnyProxy.utils.systemProxyMgr.enableGlobalProxy(<span class="hljs-string">'127.0.0.1'</span>, <span class="hljs-string">'8001'</span>);    
+
+<span class="hljs-comment">// 关闭全局代理服务器</span>
+AnyProxy.utils.systemProxyMgr.disableGlobalProxy();</code></pre></li>
+<li><p>AnyProxy.utils.certMgr</p>
+<ul class="list">
+<li>管理AnyProxy的证书</li>
+<li><code>AnyProxy.utils.certMgr.ifRootCAFileExists()</code><ul class="list">
+<li>校验系统内是否存在AnyProxy的根证书</li>
+</ul>
+</li>
+<li><code>AnyProxy.utils.certMgr.generateRootCA(callback)</code><ul class="list">
+<li>生成AnyProxy的rootCA,完成后请引导用户信任.crt文件</li>
+</ul>
+</li>
+<li>样例</li>
+</ul>
+<pre class="hljs"><code>  <span class="hljs-keyword">const</span> AnyProxy = <span class="hljs-built_in">require</span>(<span class="hljs-string">'AnyProxy'</span>);
+  <span class="hljs-keyword">const</span> exec = <span class="hljs-built_in">require</span>(<span class="hljs-string">'child_process'</span>).exec;
+
+  <span class="hljs-keyword">if</span> (!AnyProxy.utils.certMgr.ifRootCAFileExists()) {
+    AnyProxy.utils.certMgr.generateRootCA(<span class="hljs-function">(<span class="hljs-params">error, keyPath</span>) =&gt;</span> {
+      <span class="hljs-comment">// let users to trust this CA before using proxy</span>
+      <span class="hljs-keyword">if</span> (!error) {
+        <span class="hljs-keyword">const</span> certDir = <span class="hljs-built_in">require</span>(<span class="hljs-string">'path'</span>).dirname(keyPath);
+        <span class="hljs-built_in">console</span>.log(<span class="hljs-string">'The cert is generated at'</span>, certDir);
+        <span class="hljs-keyword">const</span> isWin = <span class="hljs-regexp">/^win/</span>.test(process.platform);
+        <span class="hljs-keyword">if</span> (isWin) {
+          exec(<span class="hljs-string">'start .'</span>, { <span class="hljs-attr">cwd</span>: certDir });
+        } <span class="hljs-keyword">else</span> {
+          exec(<span class="hljs-string">'open .'</span>, { <span class="hljs-attr">cwd</span>: certDir });
+        }
+      } <span class="hljs-keyword">else</span> {
+        <span class="hljs-built_in">console</span>.error(<span class="hljs-string">'error when generating rootCA'</span>, error);
+      }
+    });
+  }</code></pre></li>
+</ul>
+<h2 id="关于anyproxy"><a class="header-link" href="#关于anyproxy"></a>关于AnyProxy</h2>
+<ul class="list">
+<li>AnyProxy是支付宝前端团队推出的开源产品</li>
+<li>Change Log: <a href="https://github.com/alibaba/anyproxy/blob/master/CHANGELOG">https://github.com/alibaba/anyproxy/blob/master/CHANGELOG</a></li>
+<li>代码库:<a href="https://github.com/alibaba/anyproxy">https://github.com/alibaba/anyproxy</a></li>
+<li>issue反馈:<a href="https://github.com/alibaba/anyproxy/issues">https://github.com/alibaba/anyproxy/issues</a></li>
+</ul>
+<h2 id="配置帮助"><a class="header-link" href="#配置帮助"></a>配置帮助</h2>
+<h3 id="osx系统信任ca证书"><a class="header-link" href="#osx系统信任ca证书"></a>OSX系统信任CA证书</h3>
+<ul class="list">
+<li>类似这种报错都是因为系统没有信任AnyProxy生成的CA所造成的</li>
+</ul>
+<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/CBkLGYgvoHAYwNVAYkpk.png" width="450" /></p>
+<blockquote>
+<p>警告:CA证书和系统安全息息相关,建议亲自生成,并妥善保管</p>
+</blockquote>
+<p>安装CA:</p>
+<ul class="list">
+<li><p>双击打开<em>rootCA.crt</em></p>
+</li>
+<li><p>确认将证书添加到login或system</p>
+</li>
+</ul>
+<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/bCwNUFFpvsmVuljQKrIk.png" width="350" /></p>
+<ul class="list">
+<li>找到刚刚导入的AnyProxy证书,配置为信任(Always Trust)</li>
+</ul>
+<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/HOmEElNGdoZEWFMLsTNT.png" width="700" /></p>
+<h3 id="windows系统信任ca证书"><a class="header-link" href="#windows系统信任ca证书"></a>Windows系统信任CA证书</h3>
+<p class="img-container"><img src="https://t.alipayobjects.com/tfscom/T1D3hfXeFtXXXXXXXX.jpg" width="700" /></p>
+<h3 id="配置osx系统代理"><a class="header-link" href="#配置osx系统代理"></a>配置OSX系统代理</h3>
+<ul class="list">
+<li>在wifi高级设置中,配置http代理即可</li>
+</ul>
+<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/vduwhobSTypTfgniBvoa.png" width="500" /></p>
+<h3 id="配置浏览器http代理"><a class="header-link" href="#配置浏览器http代理"></a>配置浏览器HTTP代理</h3>
+<ul class="list">
+<li>以Chrome的<a href="https://chrome.google.com/webstore/detail/padekgcemlokbadohgkifijomclgjgif">SwitchyOmega插件</a>为例</li>
+</ul>
+<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/jIPZrKmqXRaSledQeJUJ.png" width="500" /></p>
+<h3 id="ios系统信任ca证书"><a class="header-link" href="#ios系统信任ca证书"></a>iOS系统信任CA证书</h3>
+<ul class="list">
+<li>点击web ui中的 <em>Root CA</em>,按提示扫描二维码即可安装</li>
+</ul>
+<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/BrugmMelGVysLDOIBblj.png" width="260" /></p>
+<h3 id="ios->=-10.3信任ca证书"><a class="header-link" href="#ios->=-10.3信任ca证书"></a>iOS &gt;= 10.3信任CA证书</h3>
+<ul class="list">
+<li>除了上述证书安装过程,还需要在 <em>设置-&gt;通用-&gt;证书信任设置</em> 中把AnyProxy证书的开关打开,否则safari将报错。</li>
+</ul>
+<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/hVWkXHrzHmOKOtCKGUWx.png" width="500" /></p>
+<h3 id="配置ios/android系统代理"><a class="header-link" href="#配置ios/android系统代理"></a>配置iOS/Android系统代理</h3>
+<ul class="list">
+<li><p>代理服务器都在wifi设置中配置</p>
+</li>
+<li><p>iOS HTTP代理配置</p>
+</li>
+</ul>
+<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/tLGqIozhffTccUgPakuw.png" width="260" /></p>
+<ul class="list">
+<li>Android HTTP代理配置</li>
+</ul>
+<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/YQtbQYVNuOszZGdAOauU.png" width="260" /></p>
+    </div>
+  </article>
+
+  <script src="//cdn.bootcss.com/zepto/1.2.0/zepto.min.js"></script>
+  <script>
+  window.onload = function(){
+    var itemList = [];
+    var targetMap = {};
+    $("[id]", ".main-content").map(function (index, heading) {
+      targetMap[heading.getAttribute('id')] = heading;
+    });
+
+    $("#j_toc li").map(function (index, item) {
+      if (item.className.indexOf('sidebar-header-2') >= 0 || item.className.indexOf('sidebar-header-3') >= 0) {
+        var targetName = item.firstChild.getAttribute('href').replace('#', '');
+        var targetItem = targetMap[targetName];
+        itemList.push({ target: targetItem, tocItem: item, top: $(targetItem).position().top });
+      }
+    });
+
+    var updateTocActive = function (e) {
+      var windowHeight = window.innerHeight;
+      //find the first item to match
+      var scrollYThres = window.scrollY + 200;
+      var target;
+      if (scrollYThres < 100) {
+        target = itemList[0].tocItem;
+      } else {
+        itemList.forEach(function (item, index) {
+          if (target) return;
+          if (index > 0) {
+            if (item.top >= scrollYThres) {
+              target = itemList[index - 1].tocItem;
+            }
+          }
+        });
+      }
+
+      $('.toc-active').removeClass('toc-active');
+      $(target).addClass('toc-active');
+    };
+
+    window.onscroll = updateTocActive;
+    updateTocActive();
+  }
+  </script>
+</body>
+
+</html>
\ No newline at end of file
diff --git a/cn/index.html b/cn/index.html
deleted file mode 100644
index 2676988..0000000
--- a/cn/index.html
+++ /dev/null
@@ -1,248 +0,0 @@
-<html>
-<head>
-    <title>AnyProxy</title>
-    <link rel="stylesheet" type="text/css" href="/dest/index.css">
-    <link rel="shortcut icon" type="image/png" href="/favico.png?t=2" />
-    <meta name="description" content="A fully configurable proxy in NodeJS, which can handle HTTPS requests perfectly.">
-    <meta name="description" content="AnyProxy - 开放式的HTTP/HTTPS代理,你可以灵活控制各种网络数据">
-    <meta name="keywords" content="代理服务器 Proxy HTTP HTTPS">
-    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
-    <script> 
-        //redirect to Chinese version if in China
-        if(new Date().getTimezoneOffset() == "-480" && !(/(cn|en)/i.test(location.href))){
-            location.href = "/cn";
-        }else{
-            var _hmt = _hmt || []; (function() {var hm = document.createElement("script"); hm.src = "//hm.baidu.com/hm.js?4e51565b7d471fd6623c163a8fd79e07"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })();
-        }
-    </script>
-
-</head>
-<body>
-
-    <div class="wrapper">
-        <div class="cornerBtnWrapper">
-            <a href="/cn">中文</a>|
-            <a href="/en">English</a>|
-            <a href="https://github.com/alibaba/anyproxy" target="_blank">View on Github</a>
-        </div>
-
-        <div class="brief">
-            <div class="logo">
-                <img src="http://gtms04.alicdn.com/tps/i4/TB1XfxDHpXXXXXpapXX20ySQVXX-512-512.png" width="250" height="250" alt="anyproxy logo" />
-            </div>
-            <h2 class="slogan">AnyProxy 4.x版正在Beta中,欢迎试用 Ref:<a href="/4.x/">AnyProxy 4.x 文档</a></h2>
-            <div class="action">
-                <iframe src="https://ghbtns.com/github-btn.html?user=alibaba&repo=anyproxy&type=star&count=true" frameborder="0" scrolling="0" width="100px" height="20px"></iframe>&nbsp;&nbsp;&nbsp;
-                <iframe src="https://ghbtns.com/github-btn.html?user=alibaba&repo=anyproxy&type=fork&count=true" frameborder="0" scrolling="0" width="100px" height="20px"></iframe>
-            </div>
-        </div>
-
-        <div class="feature">
-            <div class="featureContent">
-                <div class="item">
-                    <span class="iconWrapper">
-                        <i class="iconfont">&#xe602;</i>
-                    </span>
-                    <h4>基于Node.js</h4>
-                    <h5>全程JavaScript,学习无压力</h5>
-                </div>
-                <div class="item">
-                    <span class="iconWrapper">
-                        <i class="iconfont">&#xe601;</i>
-                    </span>
-                    <h4>支持Https</h4>
-                    <h5>明文解析Https请求数据<a href="https://github.com/alibaba/anyproxy/wiki/HTTPS%E7%9B%B8%E5%85%B3%E6%95%99%E7%A8%8B" target="_blank"><br>如何配置&nbsp;&gt;&gt;</a></h5>
-                </div>
-                <div class="item">
-                    <span class="iconWrapper">
-                        <i class="iconfont bigger">&#xe600;</i>
-                    </span>
-                    <h4>Web界面</h4>
-                    <h5>多终端共享,可视化观察每个请求</h5>
-                </div>
-                <div class="item">
-                    <span class="iconWrapper">
-                        <i class="iconfont">&#xe604;</i>
-                    </span>
-                    <h4>规则逻辑(Rule)</h4>
-                    <h5>个性化处理规则,定制专属调试工具</h5>
-                </div>
-                <div style="clear:both"></div>
-            </div>
-        </div>
-
-        <div class="quickstart listSection">
-            <div class="quickstartContent listContent">
-                <h4 class="subtitle" id="install">安装</h4>
-                <ul>
-                    <li>安装 <a href="http://nodejs.org/" target="_blank">Node.js</a> &gt;= v0.12</li>
-                    <li><code class="simpleBash">npm install -g anyproxy</code>, 可能需要<code class="simpleBash">sudo</code></li>
-                    <li><a href="https://github.com/alibaba/anyproxy#quick-start" target="_blank">More&gt;&gt;</a></li>
-                </ul>
-                <h4 class="subtitle" id="quickstart">使用</h4>
-                <ul>
-                    <li>运行&nbsp;&nbsp;<code class="simpleBash">anyproxy</code></li>
-                    <li>把浏览器http代理指向 127.0.0.1:8001</li>
-                    <li>访问界面:http://127.0.0.1:8002</li>
-                    <li><a href="https://github.com/alibaba/anyproxy#quick-start" target="_blank">更多用法&nbsp;&gt;&gt;</a></li>
-                </ul>
-                <a href="https://github.com/alibaba/anyproxy#step-4---launch-web-interface" target="_blank"><img class="screenshot" src="http://gtms01.alicdn.com/tps/i1/TB1IdgqGXXXXXa9apXXLExM2pXX-854-480.gif" width="350"/></a>
-            </div>
-        </div>
-
-        <div class="sample">
-
-            <div class="sampleContent">
-                <h4 class="subtitle" id="sample ">规则文件(rule)样例</h4>
-
-                <div class="item">
-                    <h5 class="itemTitle">在HTML响应末尾加上&quot;hello world&quot;</h5>
-                    <pre>
-<code class="javascript">
-//append "hello world" to all web pages
-//file : rule_replace_response_data.js
-//run  : anyproxy --rule rule_replace_response_data.js
-module.exports = {
-    replaceServerResDataAsync: function(req,res,serverRes,cb){
-
-        if(/html/i.test(res.headers['content-type'])){
-            var newDataStr = serverRes.toString();
-            newDataStr += "hello world!";
-            cb(newDataStr);
-        }
-    }
-};
-</code>
-                    </pre>
-                    <span class="figure">
-                        <img src="https://t.alipayobjects.com/images/rmsweb/T1LcphXf0eXXXXXXXX.png" width="350"/>
-                    </span>
-                    <hr />
-                </div>              
-                <div class="item">
-                    <h5 class="itemTitle">去除请求头的if-modified-since字段</h5>
-                    <pre>
-<code class="javascript">
-//remove cache related header
-//file : rule_remove_cache_header.js
-//run  : anyproxy --rule rule_remove_cache_header.js
-module.exports = {
-    replaceRequestOption : function(req,option){
-        var newOption = option;
-        delete newOption.headers['if-modified-since'];
-
-        return newOption;
-    }
-};
-</code>
-                    </pre>
-                    <span class="figure">
-                        <img src="https://t.alipayobjects.com/images/rmsweb/T1ecFhXjxcXXXXXXXX.png" width="350"/>
-                    </span>
-                    <hr />
-                </div>
-
-                <div class="item">
-                    <h5 class="itemTitle">为某个请求指定目标IP地址</h5>
-                    <pre>
-<code class="javascript">
-//assign a specific IP adress for some request
-//file : rule_reverse_proxy.js
-//run  : anyproxy --rule anyproxy --rule rule_reverse_proxy.js
-module.exports = {
-    replaceRequestOption : function(req,option){
-        var newOption = option;
-        if(newOption.headers.host == "www.taobao.com"){
-            newOption.hostname = "192.168.1.3";
-            newOption.port     = "80";
-        }
-
-        return newOption;
-    }
-};
-</code>
-                    </pre>
-                    <span class="figure">
-                        <img src="https://t.alipayobjects.com/images/rmsweb/T1hsxhXeddXXXXXXXX.png" width="350"/>
-                    </span>
-                    <hr />
-                </div>
-
-                <div class="item">
-                    <h5 class="itemTitle">把所有图片响应替换成本地图片</h5>
-                    <pre>
-<code class="javascript">
-//replace all the images with local one
-//file : rule_use_local_data.js
-//run  : anyproxy --rule anyproxy --rule rule_use_local_data.js
-var fs  = require("fs"),
-    img = fs.readFileSync("sample.jpg");
-
-module.exports = {
-    shouldUseLocalResponse : function(req,reqBody){
-        if(/\.(png|gif|jpg|jpeg)$/.test(req.url)){
-            req.replaceLocalFile = true;
-            return true;
-        }else{
-            return false;
-        }
-    },
-
-    dealLocalResponse : function(req,reqBody,callback){
-        if(req.replaceLocalFile){
-            callback(200, {"content-type":"image/png"},img );
-        }
-    }
-};
-</code>
-                    </pre>
-                    <span class="figure">
-                        <img src="https://t.alipayobjects.com/images/rmsweb/T1Zr4hXeXhXXXXXXXX.png" width="350"/>
-                    </span>
-                </div>
-
-                <div class="readmoreBtn">
-                    <a href="https://github.com/alibaba/anyproxy/wiki/%E4%BB%A3%E7%90%86%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9A%84%E6%96%B0%E8%BD%AE%E5%AD%90%EF%BC%9Aanyproxy#%E5%BC%80%E6%94%BE%E5%BC%8F%E4%BB%A3%E7%90%86%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%AE%BE%E8%AE%A1" target="_blank">&gt;&gt;&nbsp;阅读:规则文件(Rule)API</a>
-                </div>
-
-            </div>
-        </div>
-
-        <div class="readMore listSection">
-            <div class="listContent">
-                <h4 class="subtitle" id="otherfeature">其他特性</h4>
-                <ul>
-                    <li>Map Local,Log Filter等常规功能</li>
-                    <li><a href="https://github.com/alibaba/anyproxy#throttling">低网速网速模拟</a>,调试应用在2G/3G下的表现</li>
-                    <li><a href="https://github.com/alibaba/anyproxy#work-as-a-module-for-nodejs" target="_blank">把AnyProxy作为npm模块</a>,基于它做二次开发</li>
-                </ul>
-                <h4 class="subtitle" id="ref">相关阅读</h4>
-                <ul>
-                    <li><a href="https://github.com/alibaba/anyproxy/wiki/%E4%BB%A3%E7%90%86%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9A%84%E6%96%B0%E8%BD%AE%E5%AD%90%EF%BC%9Aanyproxy" target="_blank">代理服务器的新轮子</a>,介绍AnyProxy的设计初衷,以及它的开放式设计可以解决什么问题。</li>
-                    <li><a href="http://www.infoq.com/cn/presentations/alipay-hybrid-application-quality-assurance-practice" target="_blank">QCon - 《支付宝hybrid应用质量保证实践》</a>,涉及到AnyProxy在测试工程中的应用(By 陈晔)</li>
-                </ul>
-            </div>
-        </div>
-
-        <div class="learnMore listSection">
-            <div class="btnWrapper">
-                <h4 class="subtitle white" id="readmore">Read More</h4>
-                <a class="actionBtn actionBtnWhite" href="https://github.com/alibaba/anyproxy" target="_blank">https://github.com/alibaba/anyproxy</a>
-            </div>
-        </div>
-
-        <div class="footer"></div>
-
-    </div>
-
-    <link rel="stylesheet" type="text/css" href="/dest/github.css" />
-    <script src="/dest/lib.js"></script>
-    <script type="text/javascript">
-        Zepto(document).ready(function() {
-            Zepto('.sample code').each(function(i, block) {
-                hljs.highlightBlock(block);
-            });
-        });
-    </script>
-</body>
-</html>
\ No newline at end of file
diff --git a/dest/github.css b/dest/github.css
deleted file mode 100644
index 791537e..0000000
--- a/dest/github.css
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
-
-github.com style (c) Vasily Polovnyov <vast@whiteants.net>
-
-*/
-
-.hljs {
-  display: block;
-  overflow-x: auto;
-  padding: 0.5em;
-  color: #333;
-  background: #f8f8f8;
-  -webkit-text-size-adjust: none;
-}
-
-.hljs-comment,
-.diff .hljs-header {
-  color: #998;
-  font-style: italic;
-}
-
-.hljs-keyword,
-.css .rule .hljs-keyword,
-.hljs-winutils,
-.nginx .hljs-title,
-.hljs-subst,
-.hljs-request,
-.hljs-status {
-  color: #333;
-  font-weight: bold;
-}
-
-.hljs-number,
-.hljs-hexcolor,
-.ruby .hljs-constant {
-  color: #008080;
-}
-
-.hljs-string,
-.hljs-tag .hljs-value,
-.hljs-doctag,
-.tex .hljs-formula {
-  color: #d14;
-}
-
-.hljs-title,
-.hljs-id,
-.scss .hljs-preprocessor {
-  color: #900;
-  font-weight: bold;
-}
-
-.hljs-list .hljs-keyword,
-.hljs-subst {
-  font-weight: normal;
-}
-
-.hljs-class .hljs-title,
-.hljs-type,
-.vhdl .hljs-literal,
-.tex .hljs-command {
-  color: #458;
-  font-weight: bold;
-}
-
-.hljs-tag,
-.hljs-tag .hljs-title,
-.hljs-rule .hljs-property,
-.django .hljs-tag .hljs-keyword {
-  color: #000080;
-  font-weight: normal;
-}
-
-.hljs-attribute,
-.hljs-variable,
-.lisp .hljs-body,
-.hljs-name {
-  color: #008080;
-}
-
-.hljs-regexp {
-  color: #009926;
-}
-
-.hljs-symbol,
-.ruby .hljs-symbol .hljs-string,
-.lisp .hljs-keyword,
-.clojure .hljs-keyword,
-.scheme .hljs-keyword,
-.tex .hljs-special,
-.hljs-prompt {
-  color: #990073;
-}
-
-.hljs-built_in {
-  color: #0086b3;
-}
-
-.hljs-preprocessor,
-.hljs-pragma,
-.hljs-pi,
-.hljs-doctype,
-.hljs-shebang,
-.hljs-cdata {
-  color: #999;
-  font-weight: bold;
-}
-
-.hljs-deletion {
-  background: #fdd;
-}
-
-.hljs-addition {
-  background: #dfd;
-}
-
-.diff .hljs-change {
-  background: #0086b3;
-}
-
-.hljs-chunk {
-  color: #aaa;
-}
diff --git a/dest/index.css b/dest/index.css
deleted file mode 100644
index fb8d4e1..0000000
--- a/dest/index.css
+++ /dev/null
@@ -1,308 +0,0 @@
-@font-face {
-  font-family: 'iconfont';
-  src: url('//at.alicdn.com/t/font_1440130445_6601267.eot');
-  /* IE9*/
-  src: url('//at.alicdn.com/t/font_1440130445_6601267.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ url('//at.alicdn.com/t/font_1440130445_6601267.woff') format('woff'), /* chrome、firefox */ url('//at.alicdn.com/t/font_1440130445_6601267.ttf') format('truetype'), /* chrome、firefox、opera、Safari, Android, iOS 4.2+*/ url('//at.alicdn.com/t/font_1440130445_6601267.svg#iconfont') format('svg');
-  /* iOS 4.1- */
-}
-i.iconfont {
-  font-family: "iconfont";
-  font-style: normal;
-}
-body {
-  margin: 0;
-  padding: 0;
-  font-family: 'Source Sans Pro', 'Helvetica Neue', Arial, sans-serif;
-  -webkit-font-smoothing: antialiased;
-  -moz-osx-font-smoothing: grayscale;
-}
-.wrapper .cornerBtnWrapper {
-  position: absolute;
-  right: 10px;
-  top: 10px;
-  z-index: 1;
-  width: 100%;
-  text-align: right;
-  color: #5A5A5A;
-}
-.wrapper .cornerBtnWrapper a {
-  display: inline-block;
-  margin-right: 10px;
-  margin-left: 10px;
-}
-.wrapper a,
-.wrapper a:hover {
-  text-decoration: none;
-}
-.wrapper a {
-  font-size: 16px;
-  color: #00AAEE;
-}
-.wrapper h4.subTitle {
-  font-size: 30px;
-  margin: 0;
-  padding: 50px 0 10px 0;
-  width: 100%;
-  text-align: center;
-  color: #5A5A5A;
-}
-.wrapper h4.subTitle.white {
-  color: #FFF;
-}
-.wrapper code {
-  display: inline-block;
-}
-.wrapper .actionBtn.actionBtnWhite {
-  color: #FFF;
-  border: 1px solid #FFF;
-}
-.wrapper .actionBtn.actionBtnWhite:hover {
-  background: #F9F9F9;
-  color: #326EEB;
-}
-.wrapper .actionBtn {
-  color: #326EEB;
-  border: 1px solid #326EEB;
-  line-height: 30px;
-  font-size: 30px;
-  padding: 20px 45px;
-  border-radius: 30px;
-  display: inline-block;
-  transition: 0.3s;
-}
-@media only screen and (min-device-width: 320px) and (max-device-width: 600px) and (-webkit-min-device-pixel-ratio: 2) {
-  .wrapper .actionBtn {
-    font-size: 16px;
-    padding: 10px 20px;
-  }
-}
-.wrapper .actionBtn:hover {
-  background: #326EEB;
-  color: #F9F9F9;
-}
-.wrapper > div {
-  width: 100%;
-  min-width: 890px;
-}
-@media only screen and (min-device-width: 320px) and (max-device-width: 600px) and (-webkit-min-device-pixel-ratio: 2) {
-  .wrapper > div {
-    min-width: 100%;
-  }
-}
-.brief {
-  height: 300px;
-  text-align: center;
-  padding: 100px 0;
-  position: relative;
-  margin-top: 20px;
-}
-@media only screen and (min-device-width: 320px) and (max-device-width: 600px) and (-webkit-min-device-pixel-ratio: 2) {
-  .brief {
-    padding: 60px 0 90px;
-  }
-}
-.brief .slogan {
-  font-size: 16px;
-  color: #5A5A5A;
-  padding: 0 20px;
-}
-.feature {
-  background: #DEDEDE;
-}
-.feature .featureContent {
-  width: 1200px;
-  margin: 0 auto;
-}
-@media only screen and (min-device-width: 320px) and (max-device-width: 600px) and (-webkit-min-device-pixel-ratio: 2) {
-  .feature .featureContent {
-    width: 100%;
-  }
-}
-.feature .featureContent .item {
-  padding: 30px 0 20px;
-  width: 280px;
-  /*border: 1px solid #AAA;*/
-  margin: 0 10px;
-  float: left;
-  box-sizing: border-box;
-  -webkit-box-sizing: border-box;
-  font-size: 30px;
-  text-align: center;
-}
-.feature .featureContent .iconWrapper {
-  display: inline-block;
-  line-height: 40px;
-  width: 70px;
-  text-align: center;
-  font-size: 40px;
-  color: #5A5A5A;
-}
-.feature .featureContent .iconWrapper .bigger {
-  font-size: 44px;
-}
-.feature .featureContent h4 {
-  color: #5A5A5A;
-  margin: 12px auto 2px;
-  font-size: 20px;
-}
-.feature .featureContent h5 {
-  color: #777;
-  margin: 0;
-}
-.feature .featureContent h5,
-.feature .featureContent a {
-  font-size: 14px;
-  line-height: 20px;
-}
-@media only screen and (min-device-width: 320px) and (max-device-width: 600px) and (-webkit-min-device-pixel-ratio: 2) {
-  .feature .featureContent .item {
-    padding: 20px 0;
-    float: none;
-    margin: 0 auto;
-    font-size: 24px;
-  }
-  .feature .featureContent .iconWrapper {
-    font-size: 25px;
-    line-height: 25px;
-  }
-  .feature .featureContent .iconWrapper .bigger {
-    font-size: 30px;
-  }
-  .feature .featureContent h4 {
-    font-size: 16px;
-    margin: 4px;
-  }
-}
-.quickstart {
-  background: #F9F9F9;
-}
-.quickstart .quickstartContent {
-  position: relative;
-}
-.quickstart .screenshot {
-  position: absolute;
-  right: 0;
-  bottom: 0;
-}
-@media only screen and (min-device-width: 320px) and (max-device-width: 600px) and (-webkit-min-device-pixel-ratio: 2) {
-  .quickstart .screenshot {
-    display: none;
-  }
-}
-.quickstart code.simpleBash {
-  font-family: monospace;
-  font-weight: bold;
-  color: #333;
-  padding: 0;
-}
-.listSection .listContent {
-  width: 890px;
-  margin: 0 auto;
-}
-@media only screen and (min-device-width: 320px) and (max-device-width: 600px) and (-webkit-min-device-pixel-ratio: 2) {
-  .listSection .listContent {
-    width: 100%;
-  }
-}
-.listSection ul {
-  margin: 0 auto;
-}
-@media only screen and (min-device-width: 320px) and (max-device-width: 600px) and (-webkit-min-device-pixel-ratio: 2) {
-  .listSection ul {
-    padding: 0 20px 0 30px;
-  }
-}
-.listSection li {
-  color: #5A5A5A;
-  font-size: 16px;
-  line-height: 40px;
-}
-.sample {
-  background: #F9F9F9;
-}
-.sample .sampleContent {
-  width: 890px;
-  margin: 0 auto;
-}
-@media only screen and (min-device-width: 320px) and (max-device-width: 600px) and (-webkit-min-device-pixel-ratio: 2) {
-  .sample .sampleContent {
-    width: 100%;
-  }
-}
-.sample .item {
-  margin: 10px;
-}
-.sample .itemTitle {
-  font-size: 16px;
-  margin: 0px 10px;
-  color: #5A5A5A;
-}
-@media only screen and (min-device-width: 320px) and (max-device-width: 600px) and (-webkit-min-device-pixel-ratio: 2) {
-  .sample .itemTitle {
-    margin: 0;
-  }
-}
-.sample .figure {
-  vertical-align: top;
-}
-@media only screen and (min-device-width: 320px) and (max-device-width: 600px) and (-webkit-min-device-pixel-ratio: 2) {
-  .sample .figure {
-    display: block;
-    margin: 0 auto;
-    text-align: center;
-  }
-}
-.sample pre {
-  margin: 0;
-  display: inline-block;
-  vertical-align: top;
-}
-@media only screen and (min-device-width: 320px) and (max-device-width: 600px) and (-webkit-min-device-pixel-ratio: 2) {
-  .sample pre {
-    width: 100%;
-  }
-}
-.sample code {
-  width: 495px;
-}
-@media only screen and (min-device-width: 320px) and (max-device-width: 600px) and (-webkit-min-device-pixel-ratio: 2) {
-  .sample code {
-    width: 100%;
-    margin: 0 auto;
-    word-wrap: break-word;
-    padding: 0;
-  }
-}
-.sample hr {
-  border: none;
-  border-top: 1px solid #777;
-  width: 80%;
-  margin: 0 auto;
-  padding: 15px 0;
-}
-.sample .readmoreBtn {
-  margin-left: 10px;
-  padding-bottom: 20px;
-}
-.readMore {
-  background: #F9F9F9;
-  padding-bottom: 50px;
-}
-.learnMore {
-  background: #326EEB;
-  text-align: center;
-  position: relative;
-  padding: 120px 0;
-}
-@media only screen and (min-device-width: 320px) and (max-device-width: 600px) and (-webkit-min-device-pixel-ratio: 2) {
-  .learnMore {
-    padding: 70px 0;
-  }
-}
-.learnMore h4.subtitle {
-  padding: 0;
-  margin-bottom: 30px;
-}
-.learnMore .btnWrapper {
-  text-align: center;
-}
diff --git a/dest/lib.js b/dest/lib.js
deleted file mode 100644
index edbc256..0000000
--- a/dest/lib.js
+++ /dev/null
@@ -1,5 +0,0 @@
-/* Zepto v1.1.6 - zepto event ajax form ie - zeptojs.com/license */
-var Zepto=function(){function L(t){return null==t?String(t):j[S.call(t)]||"object"}function Z(t){return"function"==L(t)}function _(t){return null!=t&&t==t.window}function $(t){return null!=t&&t.nodeType==t.DOCUMENT_NODE}function D(t){return"object"==L(t)}function M(t){return D(t)&&!_(t)&&Object.getPrototypeOf(t)==Object.prototype}function R(t){return"number"==typeof t.length}function k(t){return s.call(t,function(t){return null!=t})}function z(t){return t.length>0?n.fn.concat.apply([],t):t}function F(t){return t.replace(/::/g,"/").replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/_/g,"-").toLowerCase()}function q(t){return t in f?f[t]:f[t]=new RegExp("(^|\\s)"+t+"(\\s|$)")}function H(t,e){return"number"!=typeof e||c[F(t)]?e:e+"px"}function I(t){var e,n;return u[t]||(e=a.createElement(t),a.body.appendChild(e),n=getComputedStyle(e,"").getPropertyValue("display"),e.parentNode.removeChild(e),"none"==n&&(n="block"),u[t]=n),u[t]}function V(t){return"children"in t?o.call(t.children):n.map(t.childNodes,function(t){return 1==t.nodeType?t:void 0})}function B(n,i,r){for(e in i)r&&(M(i[e])||A(i[e]))?(M(i[e])&&!M(n[e])&&(n[e]={}),A(i[e])&&!A(n[e])&&(n[e]=[]),B(n[e],i[e],r)):i[e]!==t&&(n[e]=i[e])}function U(t,e){return null==e?n(t):n(t).filter(e)}function J(t,e,n,i){return Z(e)?e.call(t,n,i):e}function X(t,e,n){null==n?t.removeAttribute(e):t.setAttribute(e,n)}function W(e,n){var i=e.className||"",r=i&&i.baseVal!==t;return n===t?r?i.baseVal:i:void(r?i.baseVal=n:e.className=n)}function Y(t){try{return t?"true"==t||("false"==t?!1:"null"==t?null:+t+""==t?+t:/^[\[\{]/.test(t)?n.parseJSON(t):t):t}catch(e){return t}}function G(t,e){e(t);for(var n=0,i=t.childNodes.length;i>n;n++)G(t.childNodes[n],e)}var t,e,n,i,C,N,r=[],o=r.slice,s=r.filter,a=window.document,u={},f={},c={"column-count":1,columns:1,"font-weight":1,"line-height":1,opacity:1,"z-index":1,zoom:1},l=/^\s*<(\w+|!)[^>]*>/,h=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,p=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,d=/^(?:body|html)$/i,m=/([A-Z])/g,g=["val","css","html","text","data","width","height","offset"],v=["after","prepend","before","append"],y=a.createElement("table"),x=a.createElement("tr"),b={tr:a.createElement("tbody"),tbody:y,thead:y,tfoot:y,td:x,th:x,"*":a.createElement("div")},w=/complete|loaded|interactive/,E=/^[\w-]*$/,j={},S=j.toString,T={},O=a.createElement("div"),P={tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},A=Array.isArray||function(t){return t instanceof Array};return T.matches=function(t,e){if(!e||!t||1!==t.nodeType)return!1;var n=t.webkitMatchesSelector||t.mozMatchesSelector||t.oMatchesSelector||t.matchesSelector;if(n)return n.call(t,e);var i,r=t.parentNode,o=!r;return o&&(r=O).appendChild(t),i=~T.qsa(r,e).indexOf(t),o&&O.removeChild(t),i},C=function(t){return t.replace(/-+(.)?/g,function(t,e){return e?e.toUpperCase():""})},N=function(t){return s.call(t,function(e,n){return t.indexOf(e)==n})},T.fragment=function(e,i,r){var s,u,f;return h.test(e)&&(s=n(a.createElement(RegExp.$1))),s||(e.replace&&(e=e.replace(p,"<$1></$2>")),i===t&&(i=l.test(e)&&RegExp.$1),i in b||(i="*"),f=b[i],f.innerHTML=""+e,s=n.each(o.call(f.childNodes),function(){f.removeChild(this)})),M(r)&&(u=n(s),n.each(r,function(t,e){g.indexOf(t)>-1?u[t](e):u.attr(t,e)})),s},T.Z=function(t,e){return t=t||[],t.__proto__=n.fn,t.selector=e||"",t},T.isZ=function(t){return t instanceof T.Z},T.init=function(e,i){var r;if(!e)return T.Z();if("string"==typeof e)if(e=e.trim(),"<"==e[0]&&l.test(e))r=T.fragment(e,RegExp.$1,i),e=null;else{if(i!==t)return n(i).find(e);r=T.qsa(a,e)}else{if(Z(e))return n(a).ready(e);if(T.isZ(e))return e;if(A(e))r=k(e);else if(D(e))r=[e],e=null;else if(l.test(e))r=T.fragment(e.trim(),RegExp.$1,i),e=null;else{if(i!==t)return n(i).find(e);r=T.qsa(a,e)}}return T.Z(r,e)},n=function(t,e){return T.init(t,e)},n.extend=function(t){var e,n=o.call(arguments,1);return"boolean"==typeof t&&(e=t,t=n.shift()),n.forEach(function(n){B(t,n,e)}),t},T.qsa=function(t,e){var n,i="#"==e[0],r=!i&&"."==e[0],s=i||r?e.slice(1):e,a=E.test(s);return $(t)&&a&&i?(n=t.getElementById(s))?[n]:[]:1!==t.nodeType&&9!==t.nodeType?[]:o.call(a&&!i?r?t.getElementsByClassName(s):t.getElementsByTagName(e):t.querySelectorAll(e))},n.contains=a.documentElement.contains?function(t,e){return t!==e&&t.contains(e)}:function(t,e){for(;e&&(e=e.parentNode);)if(e===t)return!0;return!1},n.type=L,n.isFunction=Z,n.isWindow=_,n.isArray=A,n.isPlainObject=M,n.isEmptyObject=function(t){var e;for(e in t)return!1;return!0},n.inArray=function(t,e,n){return r.indexOf.call(e,t,n)},n.camelCase=C,n.trim=function(t){return null==t?"":String.prototype.trim.call(t)},n.uuid=0,n.support={},n.expr={},n.map=function(t,e){var n,r,o,i=[];if(R(t))for(r=0;r<t.length;r++)n=e(t[r],r),null!=n&&i.push(n);else for(o in t)n=e(t[o],o),null!=n&&i.push(n);return z(i)},n.each=function(t,e){var n,i;if(R(t)){for(n=0;n<t.length;n++)if(e.call(t[n],n,t[n])===!1)return t}else for(i in t)if(e.call(t[i],i,t[i])===!1)return t;return t},n.grep=function(t,e){return s.call(t,e)},window.JSON&&(n.parseJSON=JSON.parse),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(t,e){j["[object "+e+"]"]=e.toLowerCase()}),n.fn={forEach:r.forEach,reduce:r.reduce,push:r.push,sort:r.sort,indexOf:r.indexOf,concat:r.concat,map:function(t){return n(n.map(this,function(e,n){return t.call(e,n,e)}))},slice:function(){return n(o.apply(this,arguments))},ready:function(t){return w.test(a.readyState)&&a.body?t(n):a.addEventListener("DOMContentLoaded",function(){t(n)},!1),this},get:function(e){return e===t?o.call(this):this[e>=0?e:e+this.length]},toArray:function(){return this.get()},size:function(){return this.length},remove:function(){return this.each(function(){null!=this.parentNode&&this.parentNode.removeChild(this)})},each:function(t){return r.every.call(this,function(e,n){return t.call(e,n,e)!==!1}),this},filter:function(t){return Z(t)?this.not(this.not(t)):n(s.call(this,function(e){return T.matches(e,t)}))},add:function(t,e){return n(N(this.concat(n(t,e))))},is:function(t){return this.length>0&&T.matches(this[0],t)},not:function(e){var i=[];if(Z(e)&&e.call!==t)this.each(function(t){e.call(this,t)||i.push(this)});else{var r="string"==typeof e?this.filter(e):R(e)&&Z(e.item)?o.call(e):n(e);this.forEach(function(t){r.indexOf(t)<0&&i.push(t)})}return n(i)},has:function(t){return this.filter(function(){return D(t)?n.contains(this,t):n(this).find(t).size()})},eq:function(t){return-1===t?this.slice(t):this.slice(t,+t+1)},first:function(){var t=this[0];return t&&!D(t)?t:n(t)},last:function(){var t=this[this.length-1];return t&&!D(t)?t:n(t)},find:function(t){var e,i=this;return e=t?"object"==typeof t?n(t).filter(function(){var t=this;return r.some.call(i,function(e){return n.contains(e,t)})}):1==this.length?n(T.qsa(this[0],t)):this.map(function(){return T.qsa(this,t)}):n()},closest:function(t,e){var i=this[0],r=!1;for("object"==typeof t&&(r=n(t));i&&!(r?r.indexOf(i)>=0:T.matches(i,t));)i=i!==e&&!$(i)&&i.parentNode;return n(i)},parents:function(t){for(var e=[],i=this;i.length>0;)i=n.map(i,function(t){return(t=t.parentNode)&&!$(t)&&e.indexOf(t)<0?(e.push(t),t):void 0});return U(e,t)},parent:function(t){return U(N(this.pluck("parentNode")),t)},children:function(t){return U(this.map(function(){return V(this)}),t)},contents:function(){return this.map(function(){return o.call(this.childNodes)})},siblings:function(t){return U(this.map(function(t,e){return s.call(V(e.parentNode),function(t){return t!==e})}),t)},empty:function(){return this.each(function(){this.innerHTML=""})},pluck:function(t){return n.map(this,function(e){return e[t]})},show:function(){return this.each(function(){"none"==this.style.display&&(this.style.display=""),"none"==getComputedStyle(this,"").getPropertyValue("display")&&(this.style.display=I(this.nodeName))})},replaceWith:function(t){return this.before(t).remove()},wrap:function(t){var e=Z(t);if(this[0]&&!e)var i=n(t).get(0),r=i.parentNode||this.length>1;return this.each(function(o){n(this).wrapAll(e?t.call(this,o):r?i.cloneNode(!0):i)})},wrapAll:function(t){if(this[0]){n(this[0]).before(t=n(t));for(var e;(e=t.children()).length;)t=e.first();n(t).append(this)}return this},wrapInner:function(t){var e=Z(t);return this.each(function(i){var r=n(this),o=r.contents(),s=e?t.call(this,i):t;o.length?o.wrapAll(s):r.append(s)})},unwrap:function(){return this.parent().each(function(){n(this).replaceWith(n(this).children())}),this},clone:function(){return this.map(function(){return this.cloneNode(!0)})},hide:function(){return this.css("display","none")},toggle:function(e){return this.each(function(){var i=n(this);(e===t?"none"==i.css("display"):e)?i.show():i.hide()})},prev:function(t){return n(this.pluck("previousElementSibling")).filter(t||"*")},next:function(t){return n(this.pluck("nextElementSibling")).filter(t||"*")},html:function(t){return 0 in arguments?this.each(function(e){var i=this.innerHTML;n(this).empty().append(J(this,t,e,i))}):0 in this?this[0].innerHTML:null},text:function(t){return 0 in arguments?this.each(function(e){var n=J(this,t,e,this.textContent);this.textContent=null==n?"":""+n}):0 in this?this[0].textContent:null},attr:function(n,i){var r;return"string"!=typeof n||1 in arguments?this.each(function(t){if(1===this.nodeType)if(D(n))for(e in n)X(this,e,n[e]);else X(this,n,J(this,i,t,this.getAttribute(n)))}):this.length&&1===this[0].nodeType?!(r=this[0].getAttribute(n))&&n in this[0]?this[0][n]:r:t},removeAttr:function(t){return this.each(function(){1===this.nodeType&&t.split(" ").forEach(function(t){X(this,t)},this)})},prop:function(t,e){return t=P[t]||t,1 in arguments?this.each(function(n){this[t]=J(this,e,n,this[t])}):this[0]&&this[0][t]},data:function(e,n){var i="data-"+e.replace(m,"-$1").toLowerCase(),r=1 in arguments?this.attr(i,n):this.attr(i);return null!==r?Y(r):t},val:function(t){return 0 in arguments?this.each(function(e){this.value=J(this,t,e,this.value)}):this[0]&&(this[0].multiple?n(this[0]).find("option").filter(function(){return this.selected}).pluck("value"):this[0].value)},offset:function(t){if(t)return this.each(function(e){var i=n(this),r=J(this,t,e,i.offset()),o=i.offsetParent().offset(),s={top:r.top-o.top,left:r.left-o.left};"static"==i.css("position")&&(s.position="relative"),i.css(s)});if(!this.length)return null;var e=this[0].getBoundingClientRect();return{left:e.left+window.pageXOffset,top:e.top+window.pageYOffset,width:Math.round(e.width),height:Math.round(e.height)}},css:function(t,i){if(arguments.length<2){var r,o=this[0];if(!o)return;if(r=getComputedStyle(o,""),"string"==typeof t)return o.style[C(t)]||r.getPropertyValue(t);if(A(t)){var s={};return n.each(t,function(t,e){s[e]=o.style[C(e)]||r.getPropertyValue(e)}),s}}var a="";if("string"==L(t))i||0===i?a=F(t)+":"+H(t,i):this.each(function(){this.style.removeProperty(F(t))});else for(e in t)t[e]||0===t[e]?a+=F(e)+":"+H(e,t[e])+";":this.each(function(){this.style.removeProperty(F(e))});return this.each(function(){this.style.cssText+=";"+a})},index:function(t){return t?this.indexOf(n(t)[0]):this.parent().children().indexOf(this[0])},hasClass:function(t){return t?r.some.call(this,function(t){return this.test(W(t))},q(t)):!1},addClass:function(t){return t?this.each(function(e){if("className"in this){i=[];var r=W(this),o=J(this,t,e,r);o.split(/\s+/g).forEach(function(t){n(this).hasClass(t)||i.push(t)},this),i.length&&W(this,r+(r?" ":"")+i.join(" "))}}):this},removeClass:function(e){return this.each(function(n){if("className"in this){if(e===t)return W(this,"");i=W(this),J(this,e,n,i).split(/\s+/g).forEach(function(t){i=i.replace(q(t)," ")}),W(this,i.trim())}})},toggleClass:function(e,i){return e?this.each(function(r){var o=n(this),s=J(this,e,r,W(this));s.split(/\s+/g).forEach(function(e){(i===t?!o.hasClass(e):i)?o.addClass(e):o.removeClass(e)})}):this},scrollTop:function(e){if(this.length){var n="scrollTop"in this[0];return e===t?n?this[0].scrollTop:this[0].pageYOffset:this.each(n?function(){this.scrollTop=e}:function(){this.scrollTo(this.scrollX,e)})}},scrollLeft:function(e){if(this.length){var n="scrollLeft"in this[0];return e===t?n?this[0].scrollLeft:this[0].pageXOffset:this.each(n?function(){this.scrollLeft=e}:function(){this.scrollTo(e,this.scrollY)})}},position:function(){if(this.length){var t=this[0],e=this.offsetParent(),i=this.offset(),r=d.test(e[0].nodeName)?{top:0,left:0}:e.offset();return i.top-=parseFloat(n(t).css("margin-top"))||0,i.left-=parseFloat(n(t).css("margin-left"))||0,r.top+=parseFloat(n(e[0]).css("border-top-width"))||0,r.left+=parseFloat(n(e[0]).css("border-left-width"))||0,{top:i.top-r.top,left:i.left-r.left}}},offsetParent:function(){return this.map(function(){for(var t=this.offsetParent||a.body;t&&!d.test(t.nodeName)&&"static"==n(t).css("position");)t=t.offsetParent;return t})}},n.fn.detach=n.fn.remove,["width","height"].forEach(function(e){var i=e.replace(/./,function(t){return t[0].toUpperCase()});n.fn[e]=function(r){var o,s=this[0];return r===t?_(s)?s["inner"+i]:$(s)?s.documentElement["scroll"+i]:(o=this.offset())&&o[e]:this.each(function(t){s=n(this),s.css(e,J(this,r,t,s[e]()))})}}),v.forEach(function(t,e){var i=e%2;n.fn[t]=function(){var t,o,r=n.map(arguments,function(e){return t=L(e),"object"==t||"array"==t||null==e?e:T.fragment(e)}),s=this.length>1;return r.length<1?this:this.each(function(t,u){o=i?u:u.parentNode,u=0==e?u.nextSibling:1==e?u.firstChild:2==e?u:null;var f=n.contains(a.documentElement,o);r.forEach(function(t){if(s)t=t.cloneNode(!0);else if(!o)return n(t).remove();o.insertBefore(t,u),f&&G(t,function(t){null==t.nodeName||"SCRIPT"!==t.nodeName.toUpperCase()||t.type&&"text/javascript"!==t.type||t.src||window.eval.call(window,t.innerHTML)})})})},n.fn[i?t+"To":"insert"+(e?"Before":"After")]=function(e){return n(e)[t](this),this}}),T.Z.prototype=n.fn,T.uniq=N,T.deserializeValue=Y,n.zepto=T,n}();window.Zepto=Zepto,void 0===window.$&&(window.$=Zepto),function(t){function l(t){return t._zid||(t._zid=e++)}function h(t,e,n,i){if(e=p(e),e.ns)var r=d(e.ns);return(s[l(t)]||[]).filter(function(t){return!(!t||e.e&&t.e!=e.e||e.ns&&!r.test(t.ns)||n&&l(t.fn)!==l(n)||i&&t.sel!=i)})}function p(t){var e=(""+t).split(".");return{e:e[0],ns:e.slice(1).sort().join(" ")}}function d(t){return new RegExp("(?:^| )"+t.replace(" "," .* ?")+"(?: |$)")}function m(t,e){return t.del&&!u&&t.e in f||!!e}function g(t){return c[t]||u&&f[t]||t}function v(e,i,r,o,a,u,f){var h=l(e),d=s[h]||(s[h]=[]);i.split(/\s/).forEach(function(i){if("ready"==i)return t(document).ready(r);var s=p(i);s.fn=r,s.sel=a,s.e in c&&(r=function(e){var n=e.relatedTarget;return!n||n!==this&&!t.contains(this,n)?s.fn.apply(this,arguments):void 0}),s.del=u;var l=u||r;s.proxy=function(t){if(t=j(t),!t.isImmediatePropagationStopped()){t.data=o;var i=l.apply(e,t._args==n?[t]:[t].concat(t._args));return i===!1&&(t.preventDefault(),t.stopPropagation()),i}},s.i=d.length,d.push(s),"addEventListener"in e&&e.addEventListener(g(s.e),s.proxy,m(s,f))})}function y(t,e,n,i,r){var o=l(t);(e||"").split(/\s/).forEach(function(e){h(t,e,n,i).forEach(function(e){delete s[o][e.i],"removeEventListener"in t&&t.removeEventListener(g(e.e),e.proxy,m(e,r))})})}function j(e,i){return(i||!e.isDefaultPrevented)&&(i||(i=e),t.each(E,function(t,n){var r=i[t];e[t]=function(){return this[n]=x,r&&r.apply(i,arguments)},e[n]=b}),(i.defaultPrevented!==n?i.defaultPrevented:"returnValue"in i?i.returnValue===!1:i.getPreventDefault&&i.getPreventDefault())&&(e.isDefaultPrevented=x)),e}function S(t){var e,i={originalEvent:t};for(e in t)w.test(e)||t[e]===n||(i[e]=t[e]);return j(i,t)}var n,e=1,i=Array.prototype.slice,r=t.isFunction,o=function(t){return"string"==typeof t},s={},a={},u="onfocusin"in window,f={focus:"focusin",blur:"focusout"},c={mouseenter:"mouseover",mouseleave:"mouseout"};a.click=a.mousedown=a.mouseup=a.mousemove="MouseEvents",t.event={add:v,remove:y},t.proxy=function(e,n){var s=2 in arguments&&i.call(arguments,2);if(r(e)){var a=function(){return e.apply(n,s?s.concat(i.call(arguments)):arguments)};return a._zid=l(e),a}if(o(n))return s?(s.unshift(e[n],e),t.proxy.apply(null,s)):t.proxy(e[n],e);throw new TypeError("expected function")},t.fn.bind=function(t,e,n){return this.on(t,e,n)},t.fn.unbind=function(t,e){return this.off(t,e)},t.fn.one=function(t,e,n,i){return this.on(t,e,n,i,1)};var x=function(){return!0},b=function(){return!1},w=/^([A-Z]|returnValue$|layer[XY]$)/,E={preventDefault:"isDefaultPrevented",stopImmediatePropagation:"isImmediatePropagationStopped",stopPropagation:"isPropagationStopped"};t.fn.delegate=function(t,e,n){return this.on(e,t,n)},t.fn.undelegate=function(t,e,n){return this.off(e,t,n)},t.fn.live=function(e,n){return t(document.body).delegate(this.selector,e,n),this},t.fn.die=function(e,n){return t(document.body).undelegate(this.selector,e,n),this},t.fn.on=function(e,s,a,u,f){var c,l,h=this;return e&&!o(e)?(t.each(e,function(t,e){h.on(t,s,a,e,f)}),h):(o(s)||r(u)||u===!1||(u=a,a=s,s=n),(r(a)||a===!1)&&(u=a,a=n),u===!1&&(u=b),h.each(function(n,r){f&&(c=function(t){return y(r,t.type,u),u.apply(this,arguments)}),s&&(l=function(e){var n,o=t(e.target).closest(s,r).get(0);return o&&o!==r?(n=t.extend(S(e),{currentTarget:o,liveFired:r}),(c||u).apply(o,[n].concat(i.call(arguments,1)))):void 0}),v(r,e,u,a,s,l||c)}))},t.fn.off=function(e,i,s){var a=this;return e&&!o(e)?(t.each(e,function(t,e){a.off(t,i,e)}),a):(o(i)||r(s)||s===!1||(s=i,i=n),s===!1&&(s=b),a.each(function(){y(this,e,s,i)}))},t.fn.trigger=function(e,n){return e=o(e)||t.isPlainObject(e)?t.Event(e):j(e),e._args=n,this.each(function(){e.type in f&&"function"==typeof this[e.type]?this[e.type]():"dispatchEvent"in this?this.dispatchEvent(e):t(this).triggerHandler(e,n)})},t.fn.triggerHandler=function(e,n){var i,r;return this.each(function(s,a){i=S(o(e)?t.Event(e):e),i._args=n,i.target=a,t.each(h(a,e.type||e),function(t,e){return r=e.proxy(i),i.isImmediatePropagationStopped()?!1:void 0})}),r},"focusin focusout focus blur load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select keydown keypress keyup error".split(" ").forEach(function(e){t.fn[e]=function(t){return 0 in arguments?this.bind(e,t):this.trigger(e)}}),t.Event=function(t,e){o(t)||(e=t,t=e.type);var n=document.createEvent(a[t]||"Events"),i=!0;if(e)for(var r in e)"bubbles"==r?i=!!e[r]:n[r]=e[r];return n.initEvent(t,i,!0),j(n)}}(Zepto),function(t){function h(e,n,i){var r=t.Event(n);return t(e).trigger(r,i),!r.isDefaultPrevented()}function p(t,e,i,r){return t.global?h(e||n,i,r):void 0}function d(e){e.global&&0===t.active++&&p(e,null,"ajaxStart")}function m(e){e.global&&!--t.active&&p(e,null,"ajaxStop")}function g(t,e){var n=e.context;return e.beforeSend.call(n,t,e)===!1||p(e,n,"ajaxBeforeSend",[t,e])===!1?!1:void p(e,n,"ajaxSend",[t,e])}function v(t,e,n,i){var r=n.context,o="success";n.success.call(r,t,o,e),i&&i.resolveWith(r,[t,o,e]),p(n,r,"ajaxSuccess",[e,n,t]),x(o,e,n)}function y(t,e,n,i,r){var o=i.context;i.error.call(o,n,e,t),r&&r.rejectWith(o,[n,e,t]),p(i,o,"ajaxError",[n,i,t||e]),x(e,n,i)}function x(t,e,n){var i=n.context;n.complete.call(i,e,t),p(n,i,"ajaxComplete",[e,n]),m(n)}function b(){}function w(t){return t&&(t=t.split(";",2)[0]),t&&(t==f?"html":t==u?"json":s.test(t)?"script":a.test(t)&&"xml")||"text"}function E(t,e){return""==e?t:(t+"&"+e).replace(/[&?]{1,2}/,"?")}function j(e){e.processData&&e.data&&"string"!=t.type(e.data)&&(e.data=t.param(e.data,e.traditional)),!e.data||e.type&&"GET"!=e.type.toUpperCase()||(e.url=E(e.url,e.data),e.data=void 0)}function S(e,n,i,r){return t.isFunction(n)&&(r=i,i=n,n=void 0),t.isFunction(i)||(r=i,i=void 0),{url:e,data:n,success:i,dataType:r}}function C(e,n,i,r){var o,s=t.isArray(n),a=t.isPlainObject(n);t.each(n,function(n,u){o=t.type(u),r&&(n=i?r:r+"["+(a||"object"==o||"array"==o?n:"")+"]"),!r&&s?e.add(u.name,u.value):"array"==o||!i&&"object"==o?C(e,u,i,n):e.add(n,u)})}var i,r,e=0,n=window.document,o=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,s=/^(?:text|application)\/javascript/i,a=/^(?:text|application)\/xml/i,u="application/json",f="text/html",c=/^\s*$/,l=n.createElement("a");l.href=window.location.href,t.active=0,t.ajaxJSONP=function(i,r){if(!("type"in i))return t.ajax(i);var f,h,o=i.jsonpCallback,s=(t.isFunction(o)?o():o)||"jsonp"+ ++e,a=n.createElement("script"),u=window[s],c=function(e){t(a).triggerHandler("error",e||"abort")},l={abort:c};return r&&r.promise(l),t(a).on("load error",function(e,n){clearTimeout(h),t(a).off().remove(),"error"!=e.type&&f?v(f[0],l,i,r):y(null,n||"error",l,i,r),window[s]=u,f&&t.isFunction(u)&&u(f[0]),u=f=void 0}),g(l,i)===!1?(c("abort"),l):(window[s]=function(){f=arguments},a.src=i.url.replace(/\?(.+)=\?/,"?$1="+s),n.head.appendChild(a),i.timeout>0&&(h=setTimeout(function(){c("timeout")},i.timeout)),l)},t.ajaxSettings={type:"GET",beforeSend:b,success:b,error:b,complete:b,context:null,global:!0,xhr:function(){return new window.XMLHttpRequest},accepts:{script:"text/javascript, application/javascript, application/x-javascript",json:u,xml:"application/xml, text/xml",html:f,text:"text/plain"},crossDomain:!1,timeout:0,processData:!0,cache:!0},t.ajax=function(e){var a,o=t.extend({},e||{}),s=t.Deferred&&t.Deferred();for(i in t.ajaxSettings)void 0===o[i]&&(o[i]=t.ajaxSettings[i]);d(o),o.crossDomain||(a=n.createElement("a"),a.href=o.url,a.href=a.href,o.crossDomain=l.protocol+"//"+l.host!=a.protocol+"//"+a.host),o.url||(o.url=window.location.toString()),j(o);var u=o.dataType,f=/\?.+=\?/.test(o.url);if(f&&(u="jsonp"),o.cache!==!1&&(e&&e.cache===!0||"script"!=u&&"jsonp"!=u)||(o.url=E(o.url,"_="+Date.now())),"jsonp"==u)return f||(o.url=E(o.url,o.jsonp?o.jsonp+"=?":o.jsonp===!1?"":"callback=?")),t.ajaxJSONP(o,s);var C,h=o.accepts[u],p={},m=function(t,e){p[t.toLowerCase()]=[t,e]},x=/^([\w-]+:)\/\//.test(o.url)?RegExp.$1:window.location.protocol,S=o.xhr(),T=S.setRequestHeader;if(s&&s.promise(S),o.crossDomain||m("X-Requested-With","XMLHttpRequest"),m("Accept",h||"*/*"),(h=o.mimeType||h)&&(h.indexOf(",")>-1&&(h=h.split(",",2)[0]),S.overrideMimeType&&S.overrideMimeType(h)),(o.contentType||o.contentType!==!1&&o.data&&"GET"!=o.type.toUpperCase())&&m("Content-Type",o.contentType||"application/x-www-form-urlencoded"),o.headers)for(r in o.headers)m(r,o.headers[r]);if(S.setRequestHeader=m,S.onreadystatechange=function(){if(4==S.readyState){S.onreadystatechange=b,clearTimeout(C);var e,n=!1;if(S.status>=200&&S.status<300||304==S.status||0==S.status&&"file:"==x){u=u||w(o.mimeType||S.getResponseHeader("content-type")),e=S.responseText;try{"script"==u?(1,eval)(e):"xml"==u?e=S.responseXML:"json"==u&&(e=c.test(e)?null:t.parseJSON(e))}catch(i){n=i}n?y(n,"parsererror",S,o,s):v(e,S,o,s)}else y(S.statusText||null,S.status?"error":"abort",S,o,s)}},g(S,o)===!1)return S.abort(),y(null,"abort",S,o,s),S;if(o.xhrFields)for(r in o.xhrFields)S[r]=o.xhrFields[r];var N="async"in o?o.async:!0;S.open(o.type,o.url,N,o.username,o.password);for(r in p)T.apply(S,p[r]);return o.timeout>0&&(C=setTimeout(function(){S.onreadystatechange=b,S.abort(),y(null,"timeout",S,o,s)},o.timeout)),S.send(o.data?o.data:null),S},t.get=function(){return t.ajax(S.apply(null,arguments))},t.post=function(){var e=S.apply(null,arguments);return e.type="POST",t.ajax(e)},t.getJSON=function(){var e=S.apply(null,arguments);return e.dataType="json",t.ajax(e)},t.fn.load=function(e,n,i){if(!this.length)return this;var a,r=this,s=e.split(/\s/),u=S(e,n,i),f=u.success;return s.length>1&&(u.url=s[0],a=s[1]),u.success=function(e){r.html(a?t("<div>").html(e.replace(o,"")).find(a):e),f&&f.apply(r,arguments)},t.ajax(u),this};var T=encodeURIComponent;t.param=function(e,n){var i=[];return i.add=function(e,n){t.isFunction(n)&&(n=n()),null==n&&(n=""),this.push(T(e)+"="+T(n))},C(i,e,n),i.join("&").replace(/%20/g,"+")}}(Zepto),function(t){t.fn.serializeArray=function(){var e,n,i=[],r=function(t){return t.forEach?t.forEach(r):void i.push({name:e,value:t})};return this[0]&&t.each(this[0].elements,function(i,o){n=o.type,e=o.name,e&&"fieldset"!=o.nodeName.toLowerCase()&&!o.disabled&&"submit"!=n&&"reset"!=n&&"button"!=n&&"file"!=n&&("radio"!=n&&"checkbox"!=n||o.checked)&&r(t(o).val())}),i},t.fn.serialize=function(){var t=[];return this.serializeArray().forEach(function(e){t.push(encodeURIComponent(e.name)+"="+encodeURIComponent(e.value))}),t.join("&")},t.fn.submit=function(e){if(0 in arguments)this.bind("submit",e);else if(this.length){var n=t.Event("submit");this.eq(0).trigger(n),n.isDefaultPrevented()||this.get(0).submit()}return this}}(Zepto),function(t){"__proto__"in{}||t.extend(t.zepto,{Z:function(e,n){return e=e||[],t.extend(e,t.fn),e.selector=n||"",e.__Z=!0,e},isZ:function(e){return"array"===t.type(e)&&"__Z"in e}});try{getComputedStyle(void 0)}catch(e){var n=getComputedStyle;window.getComputedStyle=function(t){try{return n(t)}catch(e){return null}}}}(Zepto);
-
-/* https://highlightjs.org/ */
-!function(e){"undefined"!=typeof exports?e(exports):(window.hljs=e({}),"function"==typeof define&&define.amd&&define("hljs",[],function(){return window.hljs}))}(function(e){function n(e){return e.replace(/&/gm,"&amp;").replace(/</gm,"&lt;").replace(/>/gm,"&gt;")}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0==t.index}function a(e){return/no-?highlight|plain|text/.test(e)}function i(e){var n,t,r,i=e.className+" ";if(i+=e.parentNode?e.parentNode.className:"",t=/\blang(?:uage)?-([\w-]+)\b/.exec(i))return E(t[1])?t[1]:"no-highlight";for(i=i.split(/\s+/),n=0,r=i.length;r>n;n++)if(E(i[n])||a(i[n]))return i[n]}function o(e,n){var t,r={};for(t in e)r[t]=e[t];if(n)for(t in n)r[t]=n[t];return r}function u(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i=i.nextSibling)3==i.nodeType?a+=i.nodeValue.length:1==i.nodeType&&(n.push({event:"start",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:"stop",offset:a,node:i}));return a}(e,0),n}function c(e,r,a){function i(){return e.length&&r.length?e[0].offset!=r[0].offset?e[0].offset<r[0].offset?e:r:"start"==r[0].event?e:r:e.length?e:r}function o(e){function r(e){return" "+e.nodeName+'="'+n(e.value)+'"'}f+="<"+t(e)+Array.prototype.map.call(e.attributes,r).join("")+">"}function u(e){f+="</"+t(e)+">"}function c(e){("start"==e.event?o:u)(e.node)}for(var s=0,f="",l=[];e.length||r.length;){var g=i();if(f+=n(a.substr(s,g[0].offset-s)),s=g[0].offset,g==e){l.reverse().forEach(u);do c(g.splice(0,1)[0]),g=i();while(g==e&&g.length&&g[0].offset==s);l.reverse().forEach(o)}else"start"==g[0].event?l.push(g[0].node):l.pop(),c(g.splice(0,1)[0])}return f+n(a.substr(s))}function s(e){function n(e){return e&&e.source||e}function t(t,r){return new RegExp(n(t),"m"+(e.cI?"i":"")+(r?"g":""))}function r(a,i){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var u={},c=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(" ").forEach(function(e){var t=e.split("|");u[t[0]]=[n,t[1]?Number(t[1]):1]})};"string"==typeof a.k?c("keyword",a.k):Object.keys(a.k).forEach(function(e){c(e,a.k[e])}),a.k=u}a.lR=t(a.l||/\b\w+\b/,!0),i&&(a.bK&&(a.b="\\b("+a.bK.split(" ").join("|")+")\\b"),a.b||(a.b=/\B|\b/),a.bR=t(a.b),a.e||a.eW||(a.e=/\B|\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||"",a.eW&&i.tE&&(a.tE+=(a.e?"|":"")+i.tE)),a.i&&(a.iR=t(a.i)),void 0===a.r&&(a.r=1),a.c||(a.c=[]);var s=[];a.c.forEach(function(e){e.v?e.v.forEach(function(n){s.push(o(e,n))}):s.push("self"==e?a:e)}),a.c=s,a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,i);var f=a.c.map(function(e){return e.bK?"\\.?("+e.b+")\\.?":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=f.length?t(f.join("|"),!0):{exec:function(){return null}}}}r(e)}function f(e,t,a,i){function o(e,n){for(var t=0;t<n.c.length;t++)if(r(n.c[t].bR,e))return n.c[t]}function u(e,n){if(r(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?u(e.parent,n):void 0}function c(e,n){return!a&&r(n.iR,e)}function g(e,n){var t=N.cI?n[0].toLowerCase():n[0];return e.k.hasOwnProperty(t)&&e.k[t]}function h(e,n,t,r){var a=r?"":w.classPrefix,i='<span class="'+a,o=t?"":"</span>";return i+=e+'">',i+n+o}function p(){if(!L.k)return n(y);var e="",t=0;L.lR.lastIndex=0;for(var r=L.lR.exec(y);r;){e+=n(y.substr(t,r.index-t));var a=g(L,r);a?(B+=a[1],e+=h(a[0],n(r[0]))):e+=n(r[0]),t=L.lR.lastIndex,r=L.lR.exec(y)}return e+n(y.substr(t))}function d(){var e="string"==typeof L.sL;if(e&&!x[L.sL])return n(y);var t=e?f(L.sL,y,!0,M[L.sL]):l(y,L.sL.length?L.sL:void 0);return L.r>0&&(B+=t.r),e&&(M[L.sL]=t.top),h(t.language,t.value,!1,!0)}function b(){return void 0!==L.sL?d():p()}function v(e,t){var r=e.cN?h(e.cN,"",!0):"";e.rB?(k+=r,y=""):e.eB?(k+=n(t)+r,y=""):(k+=r,y=t),L=Object.create(e,{parent:{value:L}})}function m(e,t){if(y+=e,void 0===t)return k+=b(),0;var r=o(t,L);if(r)return k+=b(),v(r,t),r.rB?0:t.length;var a=u(L,t);if(a){var i=L;i.rE||i.eE||(y+=t),k+=b();do L.cN&&(k+="</span>"),B+=L.r,L=L.parent;while(L!=a.parent);return i.eE&&(k+=n(t)),y="",a.starts&&v(a.starts,""),i.rE?0:t.length}if(c(t,L))throw new Error('Illegal lexeme "'+t+'" for mode "'+(L.cN||"<unnamed>")+'"');return y+=t,t.length||1}var N=E(e);if(!N)throw new Error('Unknown language: "'+e+'"');s(N);var R,L=i||N,M={},k="";for(R=L;R!=N;R=R.parent)R.cN&&(k=h(R.cN,"",!0)+k);var y="",B=0;try{for(var C,j,I=0;;){if(L.t.lastIndex=I,C=L.t.exec(t),!C)break;j=m(t.substr(I,C.index-I),C[0]),I=C.index+j}for(m(t.substr(I)),R=L;R.parent;R=R.parent)R.cN&&(k+="</span>");return{r:B,value:k,language:e,top:L}}catch(O){if(-1!=O.message.indexOf("Illegal"))return{r:0,value:n(t)};throw O}}function l(e,t){t=t||w.languages||Object.keys(x);var r={r:0,value:n(e)},a=r;return t.forEach(function(n){if(E(n)){var t=f(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}}),a.language&&(r.second_best=a),r}function g(e){return w.tabReplace&&(e=e.replace(/^((<[^>]+>|\t)+)/gm,function(e,n){return n.replace(/\t/g,w.tabReplace)})),w.useBR&&(e=e.replace(/\n/g,"<br>")),e}function h(e,n,t){var r=n?R[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),-1===e.indexOf(r)&&a.push(r),a.join(" ").trim()}function p(e){var n=i(e);if(!a(n)){var t;w.useBR?(t=document.createElementNS("http://www.w3.org/1999/xhtml","div"),t.innerHTML=e.innerHTML.replace(/\n/g,"").replace(/<br[ \/]*>/g,"\n")):t=e;var r=t.textContent,o=n?f(n,r,!0):l(r),s=u(t);if(s.length){var p=document.createElementNS("http://www.w3.org/1999/xhtml","div");p.innerHTML=o.value,o.value=c(s,u(p),r)}o.value=g(o.value),e.innerHTML=o.value,e.className=h(e.className,n,o.language),e.result={language:o.language,re:o.r},o.second_best&&(e.second_best={language:o.second_best.language,re:o.second_best.r})}}function d(e){w=o(w,e)}function b(){if(!b.called){b.called=!0;var e=document.querySelectorAll("pre code");Array.prototype.forEach.call(e,p)}}function v(){addEventListener("DOMContentLoaded",b,!1),addEventListener("load",b,!1)}function m(n,t){var r=x[n]=t(e);r.aliases&&r.aliases.forEach(function(e){R[e]=n})}function N(){return Object.keys(x)}function E(e){return x[e]||x[R[e]]}var w={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0},x={},R={};return e.highlight=f,e.highlightAuto=l,e.fixMarkup=g,e.highlightBlock=p,e.configure=d,e.initHighlighting=b,e.initHighlightingOnLoad=v,e.registerLanguage=m,e.listLanguages=N,e.getLanguage=E,e.inherit=o,e.IR="[a-zA-Z]\\w*",e.UIR="[a-zA-Z_]\\w*",e.NR="\\b\\d+(\\.\\d+)?",e.CNR="(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",e.BNR="\\b(0b[01]+)",e.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",e.BE={b:"\\\\[\\s\\S]",r:0},e.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[e.BE]},e.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[e.BE]},e.PWM={b:/\b(a|an|the|are|I|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such)\b/},e.C=function(n,t,r){var a=e.inherit({cN:"comment",b:n,e:t,c:[]},r||{});return a.c.push(e.PWM),a.c.push({cN:"doctag",b:"(?:TODO|FIXME|NOTE|BUG|XXX):",r:0}),a},e.CLCM=e.C("//","$"),e.CBCM=e.C("/\\*","\\*/"),e.HCM=e.C("#","$"),e.NM={cN:"number",b:e.NR,r:0},e.CNM={cN:"number",b:e.CNR,r:0},e.BNM={cN:"number",b:e.BNR,r:0},e.CSSNM={cN:"number",b:e.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},e.RM={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[e.BE,{b:/\[/,e:/\]/,r:0,c:[e.BE]}]},e.TM={cN:"title",b:e.IR,r:0},e.UTM={cN:"title",b:e.UIR,r:0},e});hljs.registerLanguage("javascript",function(e){return{aliases:["js"],k:{keyword:"in of if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const export super debugger as async await",literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document Symbol Set Map WeakSet WeakMap Proxy Reflect Promise"},c:[{cN:"pi",r:10,b:/^\s*['"]use (strict|asm)['"]/},e.ASM,e.QSM,{cN:"string",b:"`",e:"`",c:[e.BE,{cN:"subst",b:"\\$\\{",e:"\\}"}]},e.CLCM,e.CBCM,{cN:"number",v:[{b:"\\b(0[bB][01]+)"},{b:"\\b(0[oO][0-7]+)"},{b:e.CNR}],r:0},{b:"("+e.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[e.CLCM,e.CBCM,e.RM,{b:/</,e:/>\s*[);\]]/,r:0,sL:"xml"}],r:0},{cN:"function",bK:"function",e:/\{/,eE:!0,c:[e.inherit(e.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/}),{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,c:[e.CLCM,e.CBCM],i:/["'\(]/}],i:/\[|%/},{b:/\$[(.]/},{b:"\\."+e.IR,r:0},{bK:"import",e:"[;$]",k:"import from as",c:[e.ASM,e.QSM]},{cN:"class",bK:"class",e:/[{;=]/,eE:!0,i:/[:"\[\]]/,c:[{bK:"extends"},e.UTM]}],i:/#/}});hljs.registerLanguage("xml",function(t){var s="[A-Za-z0-9\\._:-]+",c={b:/<\?(php)?(?!\w)/,e:/\?>/,sL:"php"},e={eW:!0,i:/</,r:0,c:[c,{cN:"attribute",b:s,r:0},{b:"=",r:0,c:[{cN:"value",c:[c],v:[{b:/"/,e:/"/},{b:/'/,e:/'/},{b:/[^\s\/>]+/}]}]}]};return{aliases:["html","xhtml","rss","atom","xsl","plist"],cI:!0,c:[{cN:"doctype",b:"<!DOCTYPE",e:">",r:10,c:[{b:"\\[",e:"\\]"}]},t.C("<!--","-->",{r:10}),{cN:"cdata",b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"tag",b:"<style(?=\\s|>|$)",e:">",k:{title:"style"},c:[e],starts:{e:"</style>",rE:!0,sL:"css"}},{cN:"tag",b:"<script(?=\\s|>|$)",e:">",k:{title:"script"},c:[e],starts:{e:"</script>",rE:!0,sL:["actionscript","javascript","handlebars"]}},c,{cN:"pi",b:/<\?\w+/,e:/\?>/,r:10},{cN:"tag",b:"</?",e:"/?>",c:[{cN:"title",b:/[^ \/><\n\t]+/,r:0},e]}]}});
\ No newline at end of file
diff --git a/en.html b/en.html
new file mode 100644
index 0000000..3ee6ab7
--- /dev/null
+++ b/en.html
@@ -0,0 +1,832 @@
+<!doctype html>
+<html>
+
+<head>
+  <meta charset="utf-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1, minimal-ui">
+  <title>AnyProxy</title>
+  <link type="text/css" rel="stylesheet" href="assets/css/github-markdown.css">
+  <link type="text/css" rel="stylesheet" href="assets/css/pilcrow.css">
+  <link type="text/css" rel="stylesheet" href="assets/css/atom-one-light.css" />
+  <link type="text/css" rel="stylesheet" href="assets/css/custom.css" />
+  <meta name="description" content="A fully configurable proxy in NodeJS, which can handle HTTPS requests perfectly.">
+  <meta name="description" content="AnyProxy - 开放式的HTTP/HTTPS代理,你可以灵活控制各种网络数据">
+  <meta name="keywords" content="代理服务器 Proxy HTTP HTTPS">
+  <script>
+    //redirect to Chinese version if in China
+    if (new Date().getTimezoneOffset() == "-480" && !(/(cn|en)/i.test(location.href))) {
+      location.href = "./cn.html";
+    } else {
+      var _hmt = _hmt || []; (function () { var hm = document.createElement("script"); hm.src = "//hm.baidu.com/hm.js?4e51565b7d471fd6623c163a8fd79e07"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })();
+    }
+  </script>
+</head>
+
+<body>
+  <a href="https://github.com/alibaba/anyproxy/tree/4.x" target="_blank">
+    <img style="position: fixed; top: 0; right: 0; border: 0;z-index: 1;" src="https://camo.githubusercontent.com/a6677b08c955af8400f44c6298f40e7d19cc5b2d/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f72696768745f677261795f3664366436642e706e67"
+      alt="Fork me on GitHub" data-canonical-src="https://s3.amazonaws.com/github/ribbons/forkme_right_gray_6d6d6d.png">
+  </a>
+
+  <article class="markdown-body">
+    <div class="toc-container" id="j_toc">
+      <div class="toc-content"><ul class="nav nav-list">
+    <li class="sidebar-header-1"><a href="#anyproxy">AnyProxy</a></li>
+    <li class="sidebar-header-2"><a href="#quick-start">Quick start</a></li>
+    <li class="sidebar-header-3"><a href="#install">install</a></li>
+    <li class="sidebar-header-3"><a href="#launch">launch</a></li>
+    <li class="sidebar-header-3"><a href="#other-commands">other commands</a></li>
+    <li class="sidebar-header-2"><a href="#proxy-https-request">Proxy https request</a></li>
+    <li class="sidebar-header-2"><a href="#use-rule-module">Use rule module</a></li>
+    <li class="sidebar-header-3"><a href="#sample">sample</a></li>
+    <li class="sidebar-header-3"><a href="#the-entire-process">the entire process</a></li>
+    <li class="sidebar-header-3"><a href="#how-to-load-rule-module">how to load rule module</a></li>
+    <li class="sidebar-header-2"><a href="#rule-module-interface">Rule module interface</a></li>
+    <li class="sidebar-header-3"><a href="#summary">summary</a></li>
+    <li class="sidebar-header-4"><a href="#summary-1">summary</a></li>
+    <li class="sidebar-header-3"><a href="#beforesendrequest">beforeSendRequest</a></li>
+    <li class="sidebar-header-4"><a href="#beforesendrequest(requestdetail)">beforeSendRequest(requestDetail)</a></li>
+    <li class="sidebar-header-3"><a href="#beforesendresponse">beforeSendResponse</a></li>
+    <li class="sidebar-header-4"><a href="#beforesendresponse(requestdetail,-responsedetail)">beforeSendResponse(requestDetail, responseDetail)</a></li>
+    <li class="sidebar-header-3"><a href="#beforedealhttpsrequest">beforeDealHttpsRequest</a></li>
+    <li class="sidebar-header-4"><a href="#beforedealhttpsrequest(requestdetail)">beforeDealHttpsRequest(requestDetail)</a></li>
+    <li class="sidebar-header-3"><a href="#onerror">onError</a></li>
+    <li class="sidebar-header-4"><a href="#onerror(requestdetail,-error)">onError(requestDetail, error)</a></li>
+    <li class="sidebar-header-3"><a href="#onconnecterror">onConnectError</a></li>
+    <li class="sidebar-header-4"><a href="#onconnecterror(requestdetail,-error)">onConnectError(requestDetail, error)</a></li>
+    <li class="sidebar-header-3"><a href="#faq">FAQ</a></li>
+    <li class="sidebar-header-2"><a href="#rule-samples">Rule Samples</a></li>
+    <li class="sidebar-header-3"><a href="#use-local-response">use local response</a></li>
+    <li class="sidebar-header-3"><a href="#modify-request-header">modify request header</a></li>
+    <li class="sidebar-header-3"><a href="#modify-request-body">modify request body</a></li>
+    <li class="sidebar-header-3"><a href="#modify-the-request-target">modify the request target</a></li>
+    <li class="sidebar-header-3"><a href="#modify-request-protocol">modify request protocol</a></li>
+    <li class="sidebar-header-3"><a href="#modify-response-status-code">modify response status code</a></li>
+    <li class="sidebar-header-3"><a href="#modify-the-response-header">modify the response header</a></li>
+    <li class="sidebar-header-3"><a href="#modify-response-data-and-delay">modify response data and delay</a></li>
+    <li class="sidebar-header-2"><a href="#use-anyproxy-as-an-npm-module">Use AnyProxy as an npm module</a></li>
+    <li class="sidebar-header-2"><a href="#about-anyproxy">About AnyProxy</a></li>
+    <li class="sidebar-header-2"><a href="#appendix">Appendix</a></li>
+    <li class="sidebar-header-3"><a href="#config-root-ca-in-osx">Config root CA in OSX</a></li>
+    <li class="sidebar-header-3"><a href="#trust-root-ca-in-windows">trust root CA in windows</a></li>
+    <li class="sidebar-header-3"><a href="#config-osx-system-proxy">config OSX system proxy</a></li>
+    <li class="sidebar-header-3"><a href="#config-http-proxy-server">config http proxy server</a></li>
+    <li class="sidebar-header-3"><a href="#trust-root-ca-in-ios">trust root CA in iOS</a></li>
+    <li class="sidebar-header-3"><a href="#trust-root-ca-in-ios-&gt;&#x3D;-10.3">trust root CA in iOS &gt;&#x3D; 10.3</a></li>
+    <li class="sidebar-header-3"><a href="#config-ios/android-proxy-server">config iOS/Android proxy server</a></li>
+</ul>
+      </div>
+    </div>
+    <div class="main-content"><h1 id="anyproxy"><a class="header-link" href="#anyproxy"></a>AnyProxy</h1>
+<p>AnyProxy is a fully configurable http/https proxy in NodeJS. Version 4.0 is in beta now.</p>
+<p>Ref: <a href="./cn.html">Chinese Doc 中文文档</a></p>
+<p>Github: </p>
+<ul class="list">
+<li><a href="https://github.com/alibaba/anyproxy/tree/4.x">https://github.com/alibaba/anyproxy/tree/4.x</a></li>
+</ul>
+<p>Features:</p>
+<ul class="list">
+<li>Offer you the ablity to handle http traffic by invoking a js module</li>
+<li>Intercept https</li>
+<li>GUI webinterface</li>
+</ul>
+<p>Change Logs since 3.x:</p>
+<ul class="list">
+<li>Support Promise and Generator in rule module</li>
+<li>Simplified interface in rule module</li>
+<li>A newly designed web interface</li>
+</ul>
+<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/SqVntpzmscXPbSzfcGcr.png" width="500" /></p>
+<h2 id="quick-start"><a class="header-link" href="#quick-start"></a>Quick start</h2>
+<h3 id="install"><a class="header-link" href="#install"></a>install</h3>
+<pre class="hljs"><code>npm install -g anyproxy@beta <span class="hljs-comment"># 4.x is in beta now</span></code></pre><h3 id="launch"><a class="header-link" href="#launch"></a>launch</h3>
+<ul class="list">
+<li>start AnyProxy in command line, with default port 8001</li>
+</ul>
+<pre class="hljs"><code>anyproxy</code></pre><ul class="list">
+<li>now you can use http proxy server by 127.0.0.1:8001</li>
+<li>visit <a href="http://127.0.0.1:8002">http://127.0.0.1:8002</a> to see the http requests</li>
+</ul>
+<h3 id="other-commands"><a class="header-link" href="#other-commands"></a>other commands</h3>
+<ul class="list">
+<li>specify the port of http proxy</li>
+</ul>
+<pre class="hljs"><code>anyproxy --port 1080</code></pre><h2 id="proxy-https-request"><a class="header-link" href="#proxy-https-request"></a>Proxy https request</h2>
+<ul class="list">
+<li>AnyProxy does NOT intercept https requests by default. To view decrypted info, you have to config the CA certificate.</li>
+</ul>
+<blockquote>
+<p>Under the hood, AnyProxy decryptes https requests by man-in-the-middle attack. Users have to trust the CA cert in advance. Otherwise, client side will issue errors about unsecure network.</p>
+</blockquote>
+<ul class="list">
+<li>generate certifycates and intercept</li>
+</ul>
+<pre class="hljs"><code>anyproxy-ca <span class="hljs-comment">#generate root CA. manually trust it after that.</span>
+anyproxy --intercept <span class="hljs-comment">#launch anyproxy and intercept all https traffic</span></code></pre><ul class="list">
+<li><a href="#osx系统信任ca证书">Appendix:how to trust CA</a></li>
+</ul>
+<h2 id="use-rule-module"><a class="header-link" href="#use-rule-module"></a>Use rule module</h2>
+<p>AnyProxy provides the ability to load your own rules written in javascript. With rule module, you could customize the logic to handle requests.</p>
+<blockquote>
+<p>Make sure your rule file is got from a trusted source. Otherwise, you may face some unknown security risk.</p>
+</blockquote>
+<p>Rule module could do the following stuff:</p>
+<ul class="list">
+<li>intercept and modify the request which is being sent<ul class="list">
+<li>editable fields include request header, body, target address</li>
+</ul>
+</li>
+<li>intercept and modify the response from server<ul class="list">
+<li>editable fields include response status code, header, body</li>
+</ul>
+</li>
+<li>intercept https requests, modify request and response</li>
+</ul>
+<h3 id="sample"><a class="header-link" href="#sample"></a>sample</h3>
+<ul class="list">
+<li><p>Target</p>
+<ul class="list">
+<li>write a rule module to append some text to the response of GET <a href="http://httpbin.org/user-agent">http://httpbin.org/user-agent</a>, and delay the response for 5 seconds</li>
+</ul>
+</li>
+<li><p>Step 1,Write the rule file, save as sample.js</p>
+<pre class="hljs"><code><span class="hljs-comment">// file: sample.js</span>
+<span class="hljs-built_in">module</span>.exports = {
+  <span class="hljs-attr">summary</span>: <span class="hljs-string">'a rule to modify response'</span>,
+  *beforeSendResponse(requestDetail, responseDetail) {
+    <span class="hljs-keyword">if</span> (requestDetail.url === <span class="hljs-string">'http://httpbin.org/user-agent'</span>) {
+      <span class="hljs-keyword">const</span> newResponse = responseDetail.response;
+      newResponse.body += <span class="hljs-string">'-- AnyProxy Hacked! --'</span>;
+      <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Promise</span>(<span class="hljs-function">(<span class="hljs-params">resolve, reject</span>) =&gt;</span> {
+        setTimeout(<span class="hljs-function"><span class="hljs-params">()</span> =&gt;</span> { <span class="hljs-comment">// delay</span>
+          resolve({ <span class="hljs-attr">response</span>: newResponse });
+        }, <span class="hljs-number">5000</span>);
+      });
+    }
+  },
+};</code></pre></li>
+<li><p>Step 2, start AnyProxy and load the rule file</p>
+<ul class="list">
+<li>run <code>anyproxy --rule sample.js</code></li>
+</ul>
+</li>
+<li><p>Step 3, test</p>
+<ul class="list">
+<li><p>use curl </p>
+<pre class="hljs"><code>curl http://httpbin.org/user-agent --proxy http://127.0.0.1:8001</code></pre></li>
+<li><p>use browser. Point the http proxy of browser to 127.0.0.1:8001, then visit <a href="http://httpbin.org/user-agent">http://httpbin.org/user-agent</a> </p>
+</li>
+<li><p>the expected response from proxy is </p>
+</li>
+</ul>
+<pre class="hljs"><code>{
+  <span class="hljs-string">"user-agent"</span>: <span class="hljs-string">"curl/7.43.0"</span>
+}
+- AnyProxy Hacked!</code></pre></li>
+<li><p>Step 4, view the request log</p>
+<ul class="list">
+<li>visit <a href="http://127.0.0.1:8002">http://127.0.0.1:8002</a>, the request just sent should be listed here</li>
+</ul>
+</li>
+</ul>
+<h3 id="the-entire-process"><a class="header-link" href="#the-entire-process"></a>the entire process</h3>
+<ul class="list">
+<li>The flow chart is as follows</li>
+</ul>
+<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/TWyNuSJtEZBdrdcOMRjE.png" width="550" /></p>
+<ul class="list">
+<li><p>When got an http request, the entire process of proxy server is</p>
+<ul class="list">
+<li>AnyProxy collects all the quest info, include method, header, body</li>
+<li>AnyProxy calls <code>beforeSendRequest</code> of the rule module. Rule module deal the request, return new request param or response content</li>
+<li>If <code>beforeSendRequest</code> returns the response content, AnyProxy will send the response to client without sending to target server. The process ends here.</li>
+<li>Send request to target server, collect response</li>
+<li>Call <code>beforeSendResponse</code> of the rule module. Rule module deal the response data</li>
+<li>Send response to client</li>
+</ul>
+</li>
+<li><p>When AnyProxy get https request, it could replace the certificate and decrypt the request data</p>
+<ul class="list">
+<li>AnyProxy calls <code>beforeDealHttpsRequest</code> of the rule module</li>
+<li>If the function returns <code>true</code>, AnyProxy will do the man-in-the-middle attack to it. Otherwise, the request will not be dealed.</li>
+</ul>
+</li>
+</ul>
+<h3 id="how-to-load-rule-module"><a class="header-link" href="#how-to-load-rule-module"></a>how to load rule module</h3>
+<ul class="list">
+<li><p>use local file</p>
+<pre class="hljs"><code>anyproxy --rule ./rule.js</code></pre></li>
+<li><p>use an online rule file</p>
+<pre class="hljs"><code>anyproxy --rule https://sample.com/rule.js</code></pre></li>
+<li><p>use an npm module</p>
+<ul class="list">
+<li>AnyProxy uses <code>require()</code> to load rule module. You could either load a local npm module or a global-installed one.</li>
+</ul>
+<pre class="hljs"><code>anyproxy --rule ./myRulePkg/ <span class="hljs-comment">#local module</span>
+npm i -g myRulePkg &amp;&amp; anyproxy --rule myRulePkg <span class="hljs-comment">#global-installed module</span></code></pre></li>
+</ul>
+<h2 id="rule-module-interface"><a class="header-link" href="#rule-module-interface"></a>Rule module interface</h2>
+<p>A typical rule module is as follows. All the functions are optional, just write the part you are interested in.</p>
+<pre class="hljs"><code><span class="hljs-built_in">module</span>.exports = {
+  <span class="hljs-comment">// introduction</span>
+  summary: <span class="hljs-string">'my customized rule for AnyProxy'</span>, 
+  <span class="hljs-comment">// intercept before send request to server</span>
+  *beforeSendRequest(requestDetail) { <span class="hljs-comment">/* ... */</span> }, 
+  <span class="hljs-comment">// deal response before send to client </span>
+  *beforeSendResponse(requestDetail, responseDetail) { <span class="hljs-comment">/* ... */</span> }, 
+  <span class="hljs-comment">// if deal https request</span>
+  *beforeDealHttpsRequest(requestDetail) { <span class="hljs-comment">/* ... */</span> }, 
+  <span class="hljs-comment">// error happened when dealing requests</span>
+  *onError(requestDetail, error) { <span class="hljs-comment">/* ... */</span> }, 
+  <span class="hljs-comment">// error happened when connect to https server</span>
+  *onConnectError(requestDetail, error) { <span class="hljs-comment">/* ... */</span> } 
+};</code></pre><blockquote>
+<p>All functions in your rule file, except summary, are all driven by <a href="https://www.npmjs.com/package/co">co</a> . They should be yieldable, i.e. return a promise or be a generator function.</p>
+</blockquote>
+<h3 id="summary"><a class="header-link" href="#summary"></a>summary</h3>
+<h4 id="summary-1"><a class="header-link" href="#summary-1"></a>summary</h4>
+<ul class="list">
+<li>Introduction of this rule file. AnyProxy will read this field and give some tip to user.</li>
+</ul>
+<h3 id="beforesendrequest"><a class="header-link" href="#beforesendrequest"></a>beforeSendRequest</h3>
+<h4 id="beforesendrequest(requestdetail)"><a class="header-link" href="#beforesendrequest(requestdetail)"></a>beforeSendRequest(requestDetail)</h4>
+<ul class="list">
+<li>Before sending request to server, AnyProxy will call <code>beforeSendRequest</code> with param <code>requestDetail</code></li>
+<li><code>requestDetail</code> <ul class="list">
+<li><code>protocol</code> {string} the protocol to use, http or https</li>
+<li><code>requestOptions</code> {object} the options of the request-to-go, a param of require(&#39;http&#39;).request . ref: <a href="https://nodejs.org/api/http.html#http_http_request_options_callback">https://nodejs.org/api/http.html#http_http_request_options_callback</a></li>
+<li><code>requestData</code> {object} request body</li>
+<li><code>url</code> {string} request url</li>
+<li><code>_req</code> {object} the native node.js request object</li>
+</ul>
+</li>
+<li><p>e.g. When requesting  <em>anyproxy.io</em>, <code>requestDetail</code> is something like the following</p>
+<pre class="hljs"><code>{
+  <span class="hljs-attr">protocol</span>: <span class="hljs-string">'http'</span>,
+  <span class="hljs-attr">url</span>: <span class="hljs-string">'http://anyproxy.io/'</span>,
+  <span class="hljs-attr">requestOptions</span>: {
+    <span class="hljs-attr">hostname</span>: <span class="hljs-string">'anyproxy.io'</span>,
+    <span class="hljs-attr">port</span>: <span class="hljs-number">80</span>,
+    <span class="hljs-attr">path</span>: <span class="hljs-string">'/'</span>,
+    <span class="hljs-attr">method</span>: <span class="hljs-string">'GET'</span>,
+    <span class="hljs-attr">headers</span>: {
+      <span class="hljs-attr">Host</span>: <span class="hljs-string">'anyproxy.io'</span>,
+      <span class="hljs-string">'Proxy-Connection'</span>: <span class="hljs-string">'keep-alive'</span>,
+      <span class="hljs-string">'User-Agent'</span>: <span class="hljs-string">'...'</span>
+    }
+  },
+  <span class="hljs-attr">requestData</span>: <span class="hljs-string">'...'</span>,
+  <span class="hljs-attr">_req</span>: { <span class="hljs-comment">/* ... */</span>}
+}</code></pre></li>
+<li><p>Any of these return values are valid</p>
+<ul class="list">
+<li>do nothing, and return null</li>
+</ul>
+<pre class="hljs"><code><span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;</code></pre><ul class="list">
+<li>modify the request protocol,i.e. force use https</li>
+</ul>
+<pre class="hljs"><code><span class="hljs-keyword">return</span> {
+  <span class="hljs-attr">protocol</span>: <span class="hljs-string">'https'</span>
+};</code></pre><ul class="list">
+<li>modify request param</li>
+</ul>
+<pre class="hljs"><code><span class="hljs-keyword">var</span> newOption = <span class="hljs-built_in">Object</span>.assign({}, requestDetail.requestOptions);
+newOption.path = <span class="hljs-string">'/redirect/to/another/path'</span>;
+<span class="hljs-keyword">return</span> {
+  <span class="hljs-attr">requestOptions</span>: newOption
+};</code></pre><ul class="list">
+<li>modify request body</li>
+</ul>
+<pre class="hljs"><code><span class="hljs-keyword">return</span> {
+  <span class="hljs-attr">requestData</span>: <span class="hljs-string">'my new request data'</span>
+  <span class="hljs-comment">// requestOptions can also be used here</span>
+};</code></pre><ul class="list">
+<li>give response to the client, not sending request any longer. <code>statusCode</code> <code>headers</code>are required is this situation.</li>
+</ul>
+<pre class="hljs"><code><span class="hljs-keyword">return</span> {
+  <span class="hljs-attr">response</span>: {
+    <span class="hljs-attr">statusCode</span>: <span class="hljs-number">200</span>,
+    <span class="hljs-attr">header</span>: { <span class="hljs-string">'content-type'</span>: <span class="hljs-string">'text/html'</span> },
+    <span class="hljs-attr">body</span>: <span class="hljs-string">'this could be a &lt;string&gt; or &lt;buffer&gt;'</span>
+  }
+};</code></pre></li>
+</ul>
+<h3 id="beforesendresponse"><a class="header-link" href="#beforesendresponse"></a>beforeSendResponse</h3>
+<h4 id="beforesendresponse(requestdetail,-responsedetail)"><a class="header-link" href="#beforesendresponse(requestdetail,-responsedetail)"></a>beforeSendResponse(requestDetail, responseDetail)</h4>
+<ul class="list">
+<li>Before sending response to client, AnyProxy will call <code>beforeSendResponse</code> with param <code>requestDetail</code> <code>responseDetail</code></li>
+<li><code>requestDetail</code> is the same param as in <code>beforeSendRequest</code></li>
+<li><code>responseDetail</code> <ul class="list">
+<li><code>response</code> {object} the response from server, includes <code>statusCode</code> <code>header</code> <code>body</code></li>
+<li><code>_res</code> {object} the native node.js response object</li>
+</ul>
+</li>
+<li><p>e.g. When requesting <em>anyproxy.io</em>, <code>responseDetail</code> is something like the following</p>
+<pre class="hljs"><code>{ 
+  <span class="hljs-attr">response</span>: { 
+    <span class="hljs-attr">statusCode</span>: <span class="hljs-number">200</span>,
+    <span class="hljs-attr">header</span>: { 
+      <span class="hljs-string">'Content-Type'</span>: <span class="hljs-string">'image/gif'</span>,
+      <span class="hljs-attr">Connection</span>: <span class="hljs-string">'close'</span>,
+      <span class="hljs-string">'Cache-Control'</span>: <span class="hljs-string">'...'</span>
+    },
+    <span class="hljs-attr">body</span>: <span class="hljs-string">'...'</span>
+  },
+  <span class="hljs-attr">_res</span>: { <span class="hljs-comment">/* ... */</span> }
+}</code></pre></li>
+<li><p>Any of these return values are valid</p>
+<ul class="list">
+<li>do nothing, and return null</li>
+</ul>
+<pre class="hljs"><code><span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;</code></pre><ul class="list">
+<li>modify the response status code</li>
+</ul>
+<pre class="hljs"><code><span class="hljs-keyword">var</span> newResponse = <span class="hljs-built_in">Object</span>.assign({}, responseDetail.reponse);
+newResponse.statusCode = <span class="hljs-number">404</span>;
+<span class="hljs-keyword">return</span> {
+  <span class="hljs-attr">response</span>: newResponse
+};</code></pre><ul class="list">
+<li>modify the response content</li>
+</ul>
+<pre class="hljs"><code><span class="hljs-keyword">var</span> newResponse = <span class="hljs-built_in">Object</span>.assign({}, responseDetail.reponse);
+newResponse.body += <span class="hljs-string">'--from anyproxy--'</span>;
+<span class="hljs-keyword">return</span> {
+  <span class="hljs-attr">response</span>: newResponse
+};</code></pre></li>
+</ul>
+<h3 id="beforedealhttpsrequest"><a class="header-link" href="#beforedealhttpsrequest"></a>beforeDealHttpsRequest</h3>
+<h4 id="beforedealhttpsrequest(requestdetail)"><a class="header-link" href="#beforedealhttpsrequest(requestdetail)"></a>beforeDealHttpsRequest(requestDetail)</h4>
+<ul class="list">
+<li>When receiving https request, AnyProxy will call <code>beforeDealHttpsRequest</code> with param <code>requestDetail</code></li>
+<li>If configed with <code>forceProxyHttps</code> in launching, AnyProxy will skip calling this method</li>
+<li>Only by returning true, AnyProxy will try to replace the certificate and intercept the https request.</li>
+<li><code>requestDetail</code><ul class="list">
+<li><code>host</code> {string} the target host to request. Due to the request protocol, full url couldn&#39;t be got here</li>
+<li><code>_req</code> {object} the native node.js request object. The <code>_req</code> here refers to the CONNECT request.</li>
+</ul>
+</li>
+<li>return value<ul class="list">
+<li><code>true</code> or <code>false</code>, whether AnyProxy should intercept the https request</li>
+</ul>
+</li>
+</ul>
+<h3 id="onerror"><a class="header-link" href="#onerror"></a>onError</h3>
+<h4 id="onerror(requestdetail,-error)"><a class="header-link" href="#onerror(requestdetail,-error)"></a>onError(requestDetail, error)</h4>
+<ul class="list">
+<li>AnyProxy will call this method when an error happened in request handling.</li>
+<li>Errors usually are issued during requesting, e.g. DNS failure, request timeout</li>
+<li><code>requestDetail</code> is the same one as in <code>beforeSendRequest</code></li>
+<li><p>Any of these return values are valid</p>
+<ul class="list">
+<li>do nothing, and AnyProxy will response a default error page</li>
+</ul>
+<pre class="hljs"><code><span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;</code></pre><ul class="list">
+<li>return a customized error page</li>
+</ul>
+<pre class="hljs"><code><span class="hljs-keyword">return</span> {
+  <span class="hljs-attr">response</span>: {
+    <span class="hljs-attr">statusCode</span>: <span class="hljs-number">200</span>,
+    <span class="hljs-attr">header</span>: { <span class="hljs-string">'content-type'</span>: <span class="hljs-string">'text/html'</span> },
+    <span class="hljs-attr">body</span>: <span class="hljs-string">'this could be a &lt;string&gt; or &lt;buffer&gt;'</span>
+  }
+};</code></pre></li>
+</ul>
+<h3 id="onconnecterror"><a class="header-link" href="#onconnecterror"></a>onConnectError</h3>
+<h4 id="onconnecterror(requestdetail,-error)"><a class="header-link" href="#onconnecterror(requestdetail,-error)"></a>onConnectError(requestDetail, error)</h4>
+<ul class="list">
+<li>AnyProxy will call this method when failed to connect target server in https request</li>
+<li><code>requestDetail</code> is the same one as in <code>beforeDealHttpsRequest</code></li>
+<li>no return value is required </li>
+</ul>
+<h3 id="faq"><a class="header-link" href="#faq"></a>FAQ</h3>
+<ul class="list">
+<li>Q: can not deal https request in rule module.</li>
+<li><p>A: Any of these options could be used to change the way AnyProxy deall https requests </p>
+<ol class="list">
+<li>config <code>--intercept</code> when luanching AnyProxy via cli, or use <code>forceProxyHttps</code> when using as an npm module</li>
+<li>place a <code>beforeDealHttpsRequest</code> function in your rule file and determine which request to intercept by your own.</li>
+</ol>
+</li>
+<li><p>Q: get an error says <em>function is not yieldable</em></p>
+</li>
+<li>A: Rule module is driven by <a href="https://www.npmjs.com/package/co">co</a>. The functions inside should  be yieldable, i.e. return a promise or be a generator function.</li>
+</ul>
+<h2 id="rule-samples"><a class="header-link" href="#rule-samples"></a>Rule Samples</h2>
+<ul class="list">
+<li>here are some samples about frequently used rule file</li>
+<li>try these samples by <code>anyproxy --rule http://....js</code></li>
+<li>how to test with curl:<ul class="list">
+<li>request the server directly <code>curl http://httpbin.org/</code></li>
+<li>request the server via proxy <code>curl http://httpbin.org/ --proxy http://127.0.0.1:8001</code></li>
+</ul>
+</li>
+</ul>
+<h3 id="use-local-response"><a class="header-link" href="#use-local-response"></a>use local response</h3>
+<ul class="list">
+<li>intercept the request towards <a href="http://httpbin.org">http://httpbin.org</a> , return the local-defined response</li>
+</ul>
+<pre class="hljs"><code>anyproxy --rule https://raw.githubusercontent.com/alibaba/anyproxy/4.x/rule_sample/sample_use_local_response.js</code></pre><pre class="hljs"><code><span class="hljs-comment">/* 
+  sample: 
+    intercept all requests toward httpbin.org, use a local response
+  test:
+    curl http://httpbin.org/user-agent --proxy http://127.0.0.1:8001
+*/</span>
+<span class="hljs-built_in">module</span>.exports = {
+  *beforeSendRequest(requestDetail) {
+    <span class="hljs-keyword">const</span> localResponse = {
+      <span class="hljs-attr">statusCode</span>: <span class="hljs-number">200</span>,
+      <span class="hljs-attr">header</span>: { <span class="hljs-string">'Content-Type'</span>: <span class="hljs-string">'application/json'</span> },
+      <span class="hljs-attr">body</span>: <span class="hljs-string">'{"hello": "this is local response"}'</span>
+    };
+    <span class="hljs-keyword">if</span> (requestDetail.url.indexOf(<span class="hljs-string">'http://httpbin.org'</span>) === <span class="hljs-number">0</span>) {
+      <span class="hljs-keyword">return</span> {
+        <span class="hljs-attr">response</span>: localResponse
+      };
+    }
+  },
+};</code></pre><h3 id="modify-request-header"><a class="header-link" href="#modify-request-header"></a>modify request header</h3>
+<ul class="list">
+<li>modify the user-agent sent to httpbin.org</li>
+</ul>
+<pre class="hljs"><code>anyproxy --rule https://raw.githubusercontent.com/alibaba/anyproxy/4.x/rule_sample/sample_modify_request_header.js</code></pre><pre class="hljs"><code><span class="hljs-comment">/* 
+  sample: 
+    modify the user-agent in requests toward httpbin.org
+  test:
+    curl http://httpbin.org/user-agent --proxy http://127.0.0.1:8001
+*/</span>
+<span class="hljs-built_in">module</span>.exports = {
+  *beforeSendRequest(requestDetail) {
+    <span class="hljs-keyword">if</span> (requestDetail.url.indexOf(<span class="hljs-string">'http://httpbin.org'</span>) === <span class="hljs-number">0</span>) {
+      <span class="hljs-keyword">const</span> newRequestOptions = requestDetail.requestOptions;
+      newRequestOptions.headers[<span class="hljs-string">'User-Agent'</span>] = <span class="hljs-string">'AnyProxy/0.0.0'</span>;
+      <span class="hljs-keyword">return</span> {
+        <span class="hljs-attr">requestOptions</span>: newRequestOptions
+      };
+    }
+  },
+};</code></pre><h3 id="modify-request-body"><a class="header-link" href="#modify-request-body"></a>modify request body</h3>
+<ul class="list">
+<li>modify the post body of <a href="http://httpbin.org/post">http://httpbin.org/post</a></li>
+</ul>
+<pre class="hljs"><code>anyproxy --rule https://raw.githubusercontent.com/alibaba/anyproxy/4.x/rule_sample/sample_modify_request_data.js</code></pre><pre class="hljs"><code><span class="hljs-comment">/* 
+  sample: 
+    modify the post data towards http://httpbin.org/post
+  test:
+    curl -H "Content-Type: text/plain" -X POST -d 'original post data' http://httpbin.org/post --proxy http://127.0.0.1:8001
+  expected response:
+    { "data": "i-am-anyproxy-modified-post-data" }
+*/</span>
+<span class="hljs-built_in">module</span>.exports = {
+  *beforeSendRequest(requestDetail) {
+    <span class="hljs-keyword">if</span> (requestDetail.url.indexOf(<span class="hljs-string">'http://httpbin.org/post'</span>) === <span class="hljs-number">0</span>) {
+      <span class="hljs-keyword">return</span> {
+        <span class="hljs-attr">requestData</span>: <span class="hljs-string">'i-am-anyproxy-modified-post-data'</span>
+      };
+    }
+  },
+};</code></pre><h3 id="modify-the-request-target"><a class="header-link" href="#modify-the-request-target"></a>modify the request target</h3>
+<ul class="list">
+<li>send all the request towards <a href="http://httpbin.org/">http://httpbin.org/</a> to <a href="http://httpbin.org/user-agent">http://httpbin.org/user-agent</a></li>
+</ul>
+<pre class="hljs"><code>anyproxy --rule https://raw.githubusercontent.com/alibaba/anyproxy/4.x/rule_sample/sample_modify_request_path.js</code></pre><pre class="hljs"><code><span class="hljs-comment">/* 
+  sample: 
+    redirect all httpbin.org requests to http://httpbin.org/user-agent
+  test:
+    curl http://httpbin.org/any-path --proxy http://127.0.0.1:8001
+  expected response:
+    { "user-agent": "curl/7.43.0" }
+*/</span>
+<span class="hljs-built_in">module</span>.exports = {
+  *beforeSendRequest(requestDetail) {
+    <span class="hljs-keyword">if</span> (requestDetail.url.indexOf(<span class="hljs-string">'http://httpbin.org'</span>) === <span class="hljs-number">0</span>) {
+      <span class="hljs-keyword">const</span> newRequestOptions = requestDetail.requestOptions;
+      newRequestOptions.path = <span class="hljs-string">'/user-agent'</span>;
+      newRequestOptions.method = <span class="hljs-string">'GET'</span>;
+      <span class="hljs-keyword">return</span> {
+        <span class="hljs-attr">requestOptions</span>: newRequestOptions
+      };
+    }
+  },
+};</code></pre><h3 id="modify-request-protocol"><a class="header-link" href="#modify-request-protocol"></a>modify request protocol</h3>
+<ul class="list">
+<li>modify the http request towards <a href="http://httpbin.org">http://httpbin.org</a> to https</li>
+</ul>
+<pre class="hljs"><code>anyproxy --rule https://raw.githubusercontent.com/alibaba/anyproxy/4.x/rule_sample/sample_modify_request_protocol.js</code></pre><pre class="hljs"><code><span class="hljs-comment">/* 
+  sample: 
+    redirect all http requests of httpbin.org to https
+  test:
+    curl 'http://httpbin.org/get?show_env=1' --proxy http://127.0.0.1:8001
+  expected response:
+    { "X-Forwarded-Protocol": "https" }
+*/</span>
+<span class="hljs-built_in">module</span>.exports = {
+  *beforeSendRequest(requestDetail) {
+    <span class="hljs-keyword">if</span> (requestDetail.url.indexOf(<span class="hljs-string">'http://httpbin.org'</span>) === <span class="hljs-number">0</span>) {
+      <span class="hljs-keyword">const</span> newOption = requestDetail.requestOptions;
+      newOption.port = <span class="hljs-number">443</span>;
+      <span class="hljs-keyword">return</span> {
+        <span class="hljs-attr">protocol</span>: <span class="hljs-string">'https'</span>,
+        <span class="hljs-attr">requestOptions</span>: newOption
+      };
+    }
+  }
+};</code></pre><h3 id="modify-response-status-code"><a class="header-link" href="#modify-response-status-code"></a>modify response status code</h3>
+<ul class="list">
+<li>modify all status code from <a href="http://httpbin.org">http://httpbin.org</a> to 404</li>
+</ul>
+<pre class="hljs"><code>anyproxy --rule https://raw.githubusercontent.com/alibaba/anyproxy/4.x/rule_sample/sample_modify_response_statuscode.js</code></pre><pre class="hljs"><code><span class="hljs-comment">/* 
+  sample: 
+    modify all status code of http://httpbin.org/ to 404
+  test:
+    curl -I 'http://httpbin.org/user-agent' --proxy http://127.0.0.1:8001
+  expected response:
+    HTTP/1.1 404 Not Found
+*/</span>
+<span class="hljs-built_in">module</span>.exports = {
+  *beforeSendResponse(requestDetail, responseDetail) {
+    <span class="hljs-keyword">if</span> (requestDetail.url.indexOf(<span class="hljs-string">'http://httpbin.org'</span>) === <span class="hljs-number">0</span>) {
+      <span class="hljs-keyword">const</span> newResponse = responseDetail.response;
+      newResponse.statusCode = <span class="hljs-number">404</span>;
+      <span class="hljs-keyword">return</span> {
+        <span class="hljs-attr">response</span>: newResponse
+      };
+    }
+  }
+};</code></pre><h3 id="modify-the-response-header"><a class="header-link" href="#modify-the-response-header"></a>modify the response header</h3>
+<ul class="list">
+<li>add X-Proxy-By:AnyProxy to the response header from <a href="http://httpbin.org/user-agent">http://httpbin.org/user-agent</a></li>
+</ul>
+<pre class="hljs"><code>anyproxy --rule https://raw.githubusercontent.com/alibaba/anyproxy/4.x/rule_sample/sample_modify_response_header.js</code></pre><pre class="hljs"><code><span class="hljs-comment">/* 
+  sample: 
+    modify response header of http://httpbin.org/user-agent
+  test:
+    curl -I 'http://httpbin.org/user-agent' --proxy http://127.0.0.1:8001
+  expected response:
+    X-Proxy-By: AnyProxy
+*/</span>
+<span class="hljs-built_in">module</span>.exports = {
+  *beforeSendResponse(requestDetail, responseDetail) {
+    <span class="hljs-keyword">if</span> (requestDetail.url.indexOf(<span class="hljs-string">'http://httpbin.org/user-agent'</span>) === <span class="hljs-number">0</span>) {
+      <span class="hljs-keyword">const</span> newResponse = responseDetail.response;
+      newResponse.header[<span class="hljs-string">'X-Proxy-By'</span>] = <span class="hljs-string">'AnyProxy'</span>;
+      <span class="hljs-keyword">return</span> {
+        <span class="hljs-attr">response</span>: newResponse
+      };
+    }
+  }
+};</code></pre><h3 id="modify-response-data-and-delay"><a class="header-link" href="#modify-response-data-and-delay"></a>modify response data and delay</h3>
+<ul class="list">
+<li>append some info to the response of <a href="http://httpbin.org/user-agent">http://httpbin.org/user-agent</a>, then delay the response for 5 seconds.</li>
+</ul>
+<pre class="hljs"><code>anyproxy --rule https://raw.githubusercontent.com/alibaba/anyproxy/4.x/rule_sample/sample_modify_response_data.js</code></pre><pre class="hljs"><code><span class="hljs-comment">/* 
+  sample: 
+    modify response data of http://httpbin.org/user-agent
+  test:
+    curl 'http://httpbin.org/user-agent' --proxy http://127.0.0.1:8001
+  expected response:
+    { "user-agent": "curl/7.43.0" } -- AnyProxy Hacked! --
+*/</span>
+
+<span class="hljs-built_in">module</span>.exports = {
+  *beforeSendResponse(requestDetail, responseDetail) {
+    <span class="hljs-keyword">if</span> (requestDetail.url === <span class="hljs-string">'http://httpbin.org/user-agent'</span>) {
+      <span class="hljs-keyword">const</span> newResponse = responseDetail.response;
+      newResponse.body += <span class="hljs-string">'-- AnyProxy Hacked! --'</span>;
+      <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Promise</span>(<span class="hljs-function">(<span class="hljs-params">resolve, reject</span>) =&gt;</span> {
+        setTimeout(<span class="hljs-function"><span class="hljs-params">()</span> =&gt;</span> { <span class="hljs-comment">// delay the response for 5s</span>
+          resolve({ <span class="hljs-attr">response</span>: newResponse });
+        }, <span class="hljs-number">5000</span>);
+      });
+    }
+  },
+};</code></pre><h2 id="use-anyproxy-as-an-npm-module"><a class="header-link" href="#use-anyproxy-as-an-npm-module"></a>Use AnyProxy as an npm module</h2>
+<p>AnyProxy can be used as an npm module</p>
+<blockquote>
+<p>To enable https feature, please guide users to use <code>anyproxy-ca</code> in cli. Or use methods under <code>AnyProxy.utils.certMgr</code> to generate certificates.</p>
+</blockquote>
+<ul class="list">
+<li>install</li>
+</ul>
+<pre class="hljs"><code>npm i anyproxy@beta --save <span class="hljs-comment"># 4.0 is in beta now</span></code></pre><ul class="list">
+<li>sample</li>
+</ul>
+<pre class="hljs"><code><span class="hljs-keyword">const</span> AnyProxy = <span class="hljs-built_in">require</span>(<span class="hljs-string">'anyproxy'</span>);
+<span class="hljs-keyword">const</span> options = {
+  <span class="hljs-attr">port</span>: <span class="hljs-number">8001</span>,
+  <span class="hljs-attr">rule</span>: <span class="hljs-built_in">require</span>(<span class="hljs-string">'myRuleModule'</span>),
+  <span class="hljs-attr">webInterface</span>: {
+    <span class="hljs-attr">enable</span>: <span class="hljs-literal">true</span>,
+    <span class="hljs-attr">webPort</span>: <span class="hljs-number">8002</span>,
+    <span class="hljs-attr">wsPort</span>: <span class="hljs-number">8003</span>,
+  },
+  <span class="hljs-attr">throttle</span>: <span class="hljs-number">10000</span>,
+  <span class="hljs-attr">forceProxyHttps</span>: <span class="hljs-literal">false</span>,
+  <span class="hljs-attr">silent</span>: <span class="hljs-literal">false</span>
+};
+<span class="hljs-keyword">const</span> proxyServer = <span class="hljs-keyword">new</span> AnyProxy.ProxyServer(options);
+
+proxyServer.on(<span class="hljs-string">'ready'</span>, () =&gt; { <span class="hljs-comment">/* */</span> });
+proxyServer.on(<span class="hljs-string">'error'</span>, (e) =&gt; { <span class="hljs-comment">/* */</span> });
+proxyServer.start();
+
+<span class="hljs-comment">//when finished</span>
+proxyServer.close();</code></pre><ul class="list">
+<li><p>Class: AnyProxy.proxyServer</p>
+<ul class="list">
+<li><p>create a proxy server</p>
+<pre class="hljs"><code><span class="hljs-keyword">const</span> proxy = <span class="hljs-keyword">new</span> AnyProxy.proxyServer(options)</code></pre></li>
+<li><p><code>options</code></p>
+<ul class="list">
+<li><code>port</code> {number} required, port number of proxy server</li>
+<li><code>rule</code> {object} your rule module</li>
+<li><code>throttle</code> {number} throttle in kb/s, unlimited for default</li>
+<li><code>forceProxyHttps</code> {boolean} in force intercept all https request, false for default</li>
+<li><code>silent</code> {boolean} if keep silent in console, false for default<code>false</code></li>
+<li><code>dangerouslyIgnoreUnauthorized</code> {boolean} if ignore certificate error in request, false for default</li>
+<li><code>webInterface</code> {object} config for web interface<ul class="list">
+<li><code>enable</code> {boolean} if enable web interface, false for default</li>
+<li><code>webPort</code> {number} port number for web interface</li>
+</ul>
+</li>
+</ul>
+</li>
+<li><p>Event: <code>ready</code></p>
+<ul class="list">
+<li>emit when proxy server is ready</li>
+<li>sample</li>
+</ul>
+<pre class="hljs"><code>proxy.on(<span class="hljs-string">'ready'</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{ })</code></pre></li>
+<li><p>Event: <code>error</code></p>
+<ul class="list">
+<li>emit when error happened inside proxy server</li>
+<li>sample</li>
+</ul>
+<pre class="hljs"><code>proxy.on(<span class="hljs-string">'error'</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{ })</code></pre></li>
+<li><p>Method: <code>start</code></p>
+<ul class="list">
+<li>start proxy server</li>
+<li>sample</li>
+</ul>
+<pre class="hljs"><code>proxy.start();</code></pre></li>
+<li><p>Method: <code>close</code></p>
+<ul class="list">
+<li>close proxy server</li>
+<li>sample</li>
+</ul>
+<pre class="hljs"><code>proxy.close();</code></pre></li>
+</ul>
+</li>
+<li><p>AnyProxy.utils.systemProxyMgr</p>
+<ul class="list">
+<li>manage the system proxy config. sudo password may be required</li>
+<li>sample</li>
+</ul>
+<pre class="hljs"><code><span class="hljs-comment">// set 127.0.0.1:8001 as system http server</span>
+AnyProxy.utils.systemProxyMgr.enableGlobalProxy(<span class="hljs-string">'127.0.0.1'</span>, <span class="hljs-string">'8001'</span>);    
+
+<span class="hljs-comment">// disable global proxy server</span>
+AnyProxy.utils.systemProxyMgr.disableGlobalProxy();</code></pre></li>
+<li><p>AnyProxy.utils.certMgr</p>
+<ul class="list">
+<li>Manage certificates of AnyProxy</li>
+<li><code>AnyProxy.utils.certMgr.ifRootCAFileExists()</code><ul class="list">
+<li>detect if AnyProx rootCA exists</li>
+</ul>
+</li>
+<li><code>AnyProxy.utils.certMgr.generateRootCA(callback)</code><ul class="list">
+<li>generate a rootCA</li>
+</ul>
+</li>
+<li>Sample</li>
+</ul>
+<pre class="hljs"><code>  <span class="hljs-keyword">const</span> AnyProxy = <span class="hljs-built_in">require</span>(<span class="hljs-string">'AnyProxy'</span>);
+  <span class="hljs-keyword">const</span> exec = <span class="hljs-built_in">require</span>(<span class="hljs-string">'child_process'</span>).exec;
+
+  <span class="hljs-keyword">if</span> (!AnyProxy.utils.certMgr.ifRootCAFileExists()) {
+    AnyProxy.utils.certMgr.generateRootCA(<span class="hljs-function">(<span class="hljs-params">error, keyPath</span>) =&gt;</span> {
+      <span class="hljs-comment">// let users to trust this CA before using proxy</span>
+      <span class="hljs-keyword">if</span> (!error) {
+        <span class="hljs-keyword">const</span> certDir = <span class="hljs-built_in">require</span>(<span class="hljs-string">'path'</span>).dirname(keyPath);
+        <span class="hljs-built_in">console</span>.log(<span class="hljs-string">'The cert is generated at'</span>, certDir);
+        <span class="hljs-keyword">const</span> isWin = <span class="hljs-regexp">/^win/</span>.test(process.platform);
+        <span class="hljs-keyword">if</span> (isWin) {
+          exec(<span class="hljs-string">'start .'</span>, { <span class="hljs-attr">cwd</span>: certDir });
+        } <span class="hljs-keyword">else</span> {
+          exec(<span class="hljs-string">'open .'</span>, { <span class="hljs-attr">cwd</span>: certDir });
+        }
+      } <span class="hljs-keyword">else</span> {
+        <span class="hljs-built_in">console</span>.error(<span class="hljs-string">'error when generating rootCA'</span>, error);
+      }
+    });
+  }</code></pre></li>
+</ul>
+<h2 id="about-anyproxy"><a class="header-link" href="#about-anyproxy"></a>About AnyProxy</h2>
+<ul class="list">
+<li>Change Log: <a href="https://github.com/alibaba/anyproxy/blob/master/CHANGELOG">https://github.com/alibaba/anyproxy/blob/master/CHANGELOG</a></li>
+<li>Github:<a href="https://github.com/alibaba/anyproxy">https://github.com/alibaba/anyproxy</a></li>
+<li>issue:<a href="https://github.com/alibaba/anyproxy/issues">https://github.com/alibaba/anyproxy/issues</a></li>
+</ul>
+<h2 id="appendix"><a class="header-link" href="#appendix"></a>Appendix</h2>
+<h3 id="config-root-ca-in-osx"><a class="header-link" href="#config-root-ca-in-osx"></a>Config root CA in OSX</h3>
+<ul class="list">
+<li>this kind of errors is usually caused by untrusted root CA</li>
+</ul>
+<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/CBkLGYgvoHAYwNVAYkpk.png" width="450" /></p>
+<blockquote>
+<p>Warning: please keep your root CA safe since it may influence your system security.</p>
+</blockquote>
+<p>install :</p>
+<ul class="list">
+<li><p>double click <em>rootCA.crt</em></p>
+</li>
+<li><p>add cert into login or system</p>
+</li>
+</ul>
+<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/bCwNUFFpvsmVuljQKrIk.png" width="350" /></p>
+<ul class="list">
+<li>find the newly imported AnyProxy certificates, configured as <strong>Always Trust</strong></li>
+</ul>
+<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/HOmEElNGdoZEWFMLsTNT.png" width="700" /></p>
+<h3 id="trust-root-ca-in-windows"><a class="header-link" href="#trust-root-ca-in-windows"></a>trust root CA in windows</h3>
+<p class="img-container"><img src="https://t.alipayobjects.com/tfscom/T1D3hfXeFtXXXXXXXX.jpg" width="700" /></p>
+<h3 id="config-osx-system-proxy"><a class="header-link" href="#config-osx-system-proxy"></a>config OSX system proxy</h3>
+<ul class="list">
+<li>the config is in wifi - advanced</li>
+</ul>
+<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/vduwhobSTypTfgniBvoa.png" width="500" /></p>
+<h3 id="config-http-proxy-server"><a class="header-link" href="#config-http-proxy-server"></a>config http proxy server</h3>
+<ul class="list">
+<li>take Chrome extent [SwitchyOmega] as an example(<a href="https://chrome.google.com/webstore/detail/padekgcemlokbadohgkifijomclgjgif)为例">https://chrome.google.com/webstore/detail/padekgcemlokbadohgkifijomclgjgif)为例</a></li>
+</ul>
+<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/jIPZrKmqXRaSledQeJUJ.png" width="500" /></p>
+<h3 id="trust-root-ca-in-ios"><a class="header-link" href="#trust-root-ca-in-ios"></a>trust root CA in iOS</h3>
+<ul class="list">
+<li>Click <em>Root CA</em> in web ui, and follow the instruction to install</li>
+</ul>
+<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/BrugmMelGVysLDOIBblj.png" width="260" /></p>
+<h3 id="trust-root-ca-in-ios->=-10.3"><a class="header-link" href="#trust-root-ca-in-ios->=-10.3"></a>trust root CA in iOS &gt;= 10.3</h3>
+<ul class="list">
+<li>Besides installing root CA, you have to &quot;turn on&quot; the certificate for web manually in <em>settings - general - about - Certificate Trust Settings</em>. Otherwire, safari will not trust the root CA generated by AnyProxy.</li>
+</ul>
+<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/hVWkXHrzHmOKOtCKGUWx.png" width="500" /></p>
+<h3 id="config-ios/android-proxy-server"><a class="header-link" href="#config-ios/android-proxy-server"></a>config iOS/Android proxy server</h3>
+<ul class="list">
+<li><p>proxy settings are placed in wifi setting</p>
+</li>
+<li><p>iOS</p>
+</li>
+</ul>
+<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/tLGqIozhffTccUgPakuw.png" width="260" /></p>
+<ul class="list">
+<li>Android</li>
+</ul>
+<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/YQtbQYVNuOszZGdAOauU.png" width="260" /></p>
+    </div>
+  </article>
+
+  <script src="//cdn.bootcss.com/zepto/1.2.0/zepto.min.js"></script>
+  <script>
+  window.onload = function(){
+    var itemList = [];
+    var targetMap = {};
+    $("[id]", ".main-content").map(function (index, heading) {
+      targetMap[heading.getAttribute('id')] = heading;
+    });
+
+    $("#j_toc li").map(function (index, item) {
+      if (item.className.indexOf('sidebar-header-2') >= 0 || item.className.indexOf('sidebar-header-3') >= 0) {
+        var targetName = item.firstChild.getAttribute('href').replace('#', '');
+        var targetItem = targetMap[targetName];
+        itemList.push({ target: targetItem, tocItem: item, top: $(targetItem).position().top });
+      }
+    });
+
+    var updateTocActive = function (e) {
+      var windowHeight = window.innerHeight;
+      //find the first item to match
+      var scrollYThres = window.scrollY + 200;
+      var target;
+      if (scrollYThres < 100) {
+        target = itemList[0].tocItem;
+      } else {
+        itemList.forEach(function (item, index) {
+          if (target) return;
+          if (index > 0) {
+            if (item.top >= scrollYThres) {
+              target = itemList[index - 1].tocItem;
+            }
+          }
+        });
+      }
+
+      $('.toc-active').removeClass('toc-active');
+      $(target).addClass('toc-active');
+    };
+
+    window.onscroll = updateTocActive;
+    updateTocActive();
+  }
+  </script>
+</body>
+
+</html>
\ No newline at end of file
diff --git a/en/index.html b/en/index.html
deleted file mode 100644
index 5b6dad1..0000000
--- a/en/index.html
+++ /dev/null
@@ -1,243 +0,0 @@
-<html>
-<head>
-    <title>AnyProxy</title>
-    <link rel="stylesheet" type="text/css" href="/dest/index.css">
-    <link rel="shortcut icon" type="image/png" href="/favico.png?t=2" />
-    <meta name="description" content="A fully configurable proxy in NodeJS, which can handle HTTPS requests perfectly.">
-    <meta name="description" content="AnyProxy - 开放式的HTTP/HTTPS代理,你可以灵活控制各种网络数据">
-    <meta name="keywords" content="代理服务器 Proxy HTTP HTTPS">
-    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
-    <script> 
-        //redirect to Chinese version if in China
-        if(new Date().getTimezoneOffset() == "-480" && !(/(cn|en)/i.test(location.href))){
-            location.href = "/cn";
-        }else{
-            var _hmt = _hmt || []; (function() {var hm = document.createElement("script"); hm.src = "//hm.baidu.com/hm.js?4e51565b7d471fd6623c163a8fd79e07"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })();
-        }
-    </script>
-
-</head>
-<body>
-
-    <div class="wrapper">
-        <div class="cornerBtnWrapper">
-            <a href="/cn">中文</a>|
-            <a href="/en">English</a>|
-            <a href="https://github.com/alibaba/anyproxy" target="_blank">View on Github</a>
-        </div>
-
-        <div class="brief">
-            <div class="logo">
-                <img src="http://gtms04.alicdn.com/tps/i4/TB1XfxDHpXXXXXpapXX20ySQVXX-512-512.png" width="250" height="250" alt="anyproxy logo" />
-            </div>
-            <h2 class="slogan">AnyProxy 4.x is in beta release. <a href="/4.x/">Have a try.</a></h2>
-            <div class="action">
-                <iframe src="https://ghbtns.com/github-btn.html?user=alibaba&repo=anyproxy&type=star&count=true" frameborder="0" scrolling="0" width="100px" height="20px"></iframe>&nbsp;&nbsp;&nbsp;
-                <iframe src="https://ghbtns.com/github-btn.html?user=alibaba&repo=anyproxy&type=fork&count=true" frameborder="0" scrolling="0" width="100px" height="20px"></iframe>
-            </div>
-        </div>
-
-        <div class="feature">
-            <div class="featureContent">
-                <div class="item">
-                    <span class="iconWrapper">
-                        <i class="iconfont">&#xe602;</i>
-                    </span>
-                    <h4>Based on Node.js</h4>
-                    <h5>It&#x27;s all javascript and easy to learn.</h5>
-                </div>
-                <div class="item">
-                    <span class="iconWrapper">
-                        <i class="iconfont">&#xe601;</i>
-                    </span>
-                    <h4>HTTPS supported</h4>
-                    <h5>help to decrypted HTTPS data<a href="https://github.com/alibaba/anyproxy/wiki/HTTPS%E7%9B%B8%E5%85%B3%E6%95%99%E7%A8%8B" target="_blank"><br>How to config&nbsp;&gt;&gt;</a></h5>
-                </div>
-                <div class="item">
-                    <span class="iconWrapper">
-                        <i class="iconfont bigger">&#xe600;</i>
-                    </span>
-                    <h4>Web UI</h4>
-                    <h5>Web based interface to view requests</h5>
-                </div>
-                <div class="item">
-                    <span class="iconWrapper">
-                        <i class="iconfont">&#xe604;</i>
-                    </span>
-                    <h4>Customed Rule File</h4>
-                    <h5>Make your own debugging tool by writing rule files</h5>
-                </div>
-                <div style="clear:both"></div>
-            </div>
-        </div>
-
-        <div class="quickstart listSection">
-            <div class="quickstartContent listContent">
-                <h4 class="subtitle" id="install">Installation</h4>
-                <ul>
-                    <li>install <a href="http://nodejs.org/" target="_blank">Node.js</a> &gt;= v0.12</li>
-                    <li><code class="simpleBash">npm install -g anyproxy</code>, may require<code class="simpleBash">sudo</code></li>
-                    <li><a href="https://github.com/alibaba/anyproxy#quick-start" target="_blank">More&gt;&gt;</a></li>
-                </ul>
-                <h4 class="subtitle" id="quickstart">Quick Start</h4>
-                <ul>
-                    <li>run&nbsp;&nbsp;<code class="simpleBash">anyproxy</code></li>
-                    <li>set proxy to 127.0.0.1:8001 on your browser or device</li>
-                    <li>view web interface at http://127.0.0.1:8002</li>
-                    <li><a href="https://github.com/alibaba/anyproxy#quick-start" target="_blank">More Usage&nbsp;&gt;&gt;</a></li>
-                </ul>
-                <a href="https://github.com/alibaba/anyproxy#step-4---launch-web-interface" target="_blank"><img class="screenshot" src="http://gtms01.alicdn.com/tps/i1/TB1IdgqGXXXXXa9apXXLExM2pXX-854-480.gif" width="350"/></a>
-            </div>
-        </div>
-
-        <div class="sample">
-
-            <div class="sampleContent">
-                <h4 class="subtitle" id="sample ">Sample of Rule Files</h4>
-
-                <div class="item">
-                    <h5 class="itemTitle">Append &quot;hello world&quot; on HTML response</h5>
-                    <pre>
-<code class="javascript">
-//append "hello world" to all web pages
-//file : rule_replace_response_data.js
-//run  : anyproxy --rule rule_replace_response_data.js
-module.exports = {
-    replaceServerResDataAsync: function(req,res,serverRes,cb){
-
-        if(/html/i.test(res.headers['content-type'])){
-            var newDataStr = serverRes.toString();
-            newDataStr += "hello world!";
-            cb(newDataStr);
-        }
-    }
-};
-</code>
-                    </pre>
-                    <span class="figure">
-                        <img src="https://t.alipayobjects.com/images/rmsweb/T1LcphXf0eXXXXXXXX.png" width="350"/>
-                    </span>
-                    <hr />
-                </div>              
-                <div class="item">
-                    <h5 class="itemTitle">remove if-modified-since from http request header</h5>
-                    <pre>
-<code class="javascript">
-//remove cache related header
-//file : rule_remove_cache_header.js
-//run  : anyproxy --rule rule_remove_cache_header.js
-module.exports = {
-    replaceRequestOption : function(req,option){
-        var newOption = option;
-        delete newOption.headers['if-modified-since'];
-
-        return newOption;
-    }
-};
-</code>
-                    </pre>
-                    <span class="figure">
-                        <img src="https://t.alipayobjects.com/images/rmsweb/T1ecFhXjxcXXXXXXXX.png" width="350"/>
-                    </span>
-                    <hr />
-                </div>
-
-                <div class="item">
-                    <h5 class="itemTitle">assign a specified ip address for some requests</h5>
-                    <pre>
-<code class="javascript">
-//assign a specific IP adress for some request
-//file : rule_reverse_proxy.js
-//run  : anyproxy --rule anyproxy --rule rule_reverse_proxy.js
-module.exports = {
-    replaceRequestOption : function(req,option){
-        var newOption = option;
-        if(newOption.headers.host == "www.taobao.com"){
-            newOption.hostname = "192.168.1.3";
-            newOption.port     = "80";
-        }
-
-        return newOption;
-    }
-};
-</code>
-                    </pre>
-                    <span class="figure">
-                        <img src="https://t.alipayobjects.com/images/rmsweb/T1hsxhXeddXXXXXXXX.png" width="350"/>
-                    </span>
-                    <hr />
-                </div>
-
-                <div class="item">
-                    <h5 class="itemTitle">replace all image response by local one</h5>
-                    <pre>
-<code class="javascript">
-//replace all the images with local one
-//file : rule_use_local_data.js
-//run  : anyproxy --rule anyproxy --rule rule_use_local_data.js
-var fs  = require("fs"),
-    img = fs.readFileSync("sample.jpg");
-
-module.exports = {
-    shouldUseLocalResponse : function(req,reqBody){
-        if(/\.(png|gif|jpg|jpeg)$/.test(req.url)){
-            req.replaceLocalFile = true;
-            return true;
-        }else{
-            return false;
-        }
-    },
-
-    dealLocalResponse : function(req,reqBody,callback){
-        if(req.replaceLocalFile){
-            callback(200, {"content-type":"image/png"},img );
-        }
-    }
-};
-</code>
-                    </pre>
-                    <span class="figure">
-                        <img src="https://t.alipayobjects.com/images/rmsweb/T1Zr4hXeXhXXXXXXXX.png" width="350"/>
-                    </span>
-                </div>
-
-                <div class="readmoreBtn">
-                    <a href="https://github.com/alibaba/anyproxy/wiki/What-is-rule-file-and-how-to-write-one" target="_blank">&gt;&gt;&nbsp;Ref : Guide of Rule file</a>
-                </div>
-
-            </div>
-        </div>
-
-        <div class="readMore listSection">
-            <div class="listContent">
-                <h4 class="subtitle" id="otherfeature">Other Features</h4>
-                <ul>
-                    <li>Map file to local , filter your logs</li>
-                    <li><a href="https://github.com/alibaba/anyproxy#throttling">Simulate a low-speed network</a> , help to test the performance of your app on poor network</li>
-                    <li><a href="https://github.com/alibaba/anyproxy#work-as-a-module-for-nodejs" target="_blank">Using AnyProxy as an npm module</a> , to deploy your own debugging tools</li>
-                </ul>
-            </div>
-        </div>
-
-        <div class="learnMore listSection">
-            <div class="btnWrapper">
-                <h4 class="subtitle white" id="readmore">Read More</h4>
-                <a class="actionBtn actionBtnWhite" href="https://github.com/alibaba/anyproxy" target="_blank">https://github.com/alibaba/anyproxy</a>
-            </div>
-        </div>
-
-        <div class="footer"></div>
-
-    </div>
-
-    <link rel="stylesheet" type="text/css" href="/dest/github.css" />
-    <script src="/dest/lib.js"></script>
-    <script type="text/javascript">
-        Zepto(document).ready(function() {
-            Zepto('.sample code').each(function(i, block) {
-                hljs.highlightBlock(block);
-            });
-        });
-    </script>
-</body>
-</html>
\ No newline at end of file
diff --git a/gulpfile.js b/gulpfile.js
deleted file mode 100644
index 407ea12..0000000
--- a/gulpfile.js
+++ /dev/null
@@ -1,35 +0,0 @@
-var fs     = require("fs"),
-	Juicer = require("juicer"),
-	gulp   = require("gulp"),
-	less   = require("gulp-less"),
-	path   = require('path');
- 
-Juicer.set('strip',false);
-
-gulp.task('less', function(){
- 	return gulp.src('./src/*.less')
-	    .pipe(less())
-	    .pipe(gulp.dest('./dest/'));
-});
-
-gulp.task("page",function(){
-	var i18nConfig = JSON.parse(fs.readFileSync("./src/i18n.json",{encoding :"utf8"})),
-		pageTpl    = Juicer(fs.readFileSync("./src/index.html",{encoding : "utf8"}) );
-
-	// console.log(pageTpl);
-	var pageCN = pageTpl.render(i18nConfig.cn),
-		pageEN = pageTpl.render(i18nConfig.en);
-
-	fs.writeFileSync("./cn/index.html",pageCN);
-	fs.writeFileSync("./en/index.html",pageEN);
-
-	fs.writeFileSync("./index.html",pageEN);
-});
-
-gulp.task("watch",function(){
-	gulp.watch('./src/*', ['less','page']);
-});
-
-gulp.task("default",["less","page"],function(){
-
-});
\ No newline at end of file
diff --git a/index.html b/index.html
index 5b6dad1..3ee6ab7 100644
--- a/index.html
+++ b/index.html
@@ -1,243 +1,832 @@
+<!doctype html>
 <html>
+
 <head>
-    <title>AnyProxy</title>
-    <link rel="stylesheet" type="text/css" href="/dest/index.css">
-    <link rel="shortcut icon" type="image/png" href="/favico.png?t=2" />
-    <meta name="description" content="A fully configurable proxy in NodeJS, which can handle HTTPS requests perfectly.">
-    <meta name="description" content="AnyProxy - 开放式的HTTP/HTTPS代理,你可以灵活控制各种网络数据">
-    <meta name="keywords" content="代理服务器 Proxy HTTP HTTPS">
-    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
-    <script> 
-        //redirect to Chinese version if in China
-        if(new Date().getTimezoneOffset() == "-480" && !(/(cn|en)/i.test(location.href))){
-            location.href = "/cn";
-        }else{
-            var _hmt = _hmt || []; (function() {var hm = document.createElement("script"); hm.src = "//hm.baidu.com/hm.js?4e51565b7d471fd6623c163a8fd79e07"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })();
-        }
-    </script>
-
+  <meta charset="utf-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1, minimal-ui">
+  <title>AnyProxy</title>
+  <link type="text/css" rel="stylesheet" href="assets/css/github-markdown.css">
+  <link type="text/css" rel="stylesheet" href="assets/css/pilcrow.css">
+  <link type="text/css" rel="stylesheet" href="assets/css/atom-one-light.css" />
+  <link type="text/css" rel="stylesheet" href="assets/css/custom.css" />
+  <meta name="description" content="A fully configurable proxy in NodeJS, which can handle HTTPS requests perfectly.">
+  <meta name="description" content="AnyProxy - 开放式的HTTP/HTTPS代理,你可以灵活控制各种网络数据">
+  <meta name="keywords" content="代理服务器 Proxy HTTP HTTPS">
+  <script>
+    //redirect to Chinese version if in China
+    if (new Date().getTimezoneOffset() == "-480" && !(/(cn|en)/i.test(location.href))) {
+      location.href = "./cn.html";
+    } else {
+      var _hmt = _hmt || []; (function () { var hm = document.createElement("script"); hm.src = "//hm.baidu.com/hm.js?4e51565b7d471fd6623c163a8fd79e07"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })();
+    }
+  </script>
 </head>
+
 <body>
+  <a href="https://github.com/alibaba/anyproxy/tree/4.x" target="_blank">
+    <img style="position: fixed; top: 0; right: 0; border: 0;z-index: 1;" src="https://camo.githubusercontent.com/a6677b08c955af8400f44c6298f40e7d19cc5b2d/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f72696768745f677261795f3664366436642e706e67"
+      alt="Fork me on GitHub" data-canonical-src="https://s3.amazonaws.com/github/ribbons/forkme_right_gray_6d6d6d.png">
+  </a>
 
-    <div class="wrapper">
-        <div class="cornerBtnWrapper">
-            <a href="/cn">中文</a>|
-            <a href="/en">English</a>|
-            <a href="https://github.com/alibaba/anyproxy" target="_blank">View on Github</a>
-        </div>
-
-        <div class="brief">
-            <div class="logo">
-                <img src="http://gtms04.alicdn.com/tps/i4/TB1XfxDHpXXXXXpapXX20ySQVXX-512-512.png" width="250" height="250" alt="anyproxy logo" />
-            </div>
-            <h2 class="slogan">AnyProxy 4.x is in beta release. <a href="/4.x/">Have a try.</a></h2>
-            <div class="action">
-                <iframe src="https://ghbtns.com/github-btn.html?user=alibaba&repo=anyproxy&type=star&count=true" frameborder="0" scrolling="0" width="100px" height="20px"></iframe>&nbsp;&nbsp;&nbsp;
-                <iframe src="https://ghbtns.com/github-btn.html?user=alibaba&repo=anyproxy&type=fork&count=true" frameborder="0" scrolling="0" width="100px" height="20px"></iframe>
-            </div>
-        </div>
-
-        <div class="feature">
-            <div class="featureContent">
-                <div class="item">
-                    <span class="iconWrapper">
-                        <i class="iconfont">&#xe602;</i>
-                    </span>
-                    <h4>Based on Node.js</h4>
-                    <h5>It&#x27;s all javascript and easy to learn.</h5>
-                </div>
-                <div class="item">
-                    <span class="iconWrapper">
-                        <i class="iconfont">&#xe601;</i>
-                    </span>
-                    <h4>HTTPS supported</h4>
-                    <h5>help to decrypted HTTPS data<a href="https://github.com/alibaba/anyproxy/wiki/HTTPS%E7%9B%B8%E5%85%B3%E6%95%99%E7%A8%8B" target="_blank"><br>How to config&nbsp;&gt;&gt;</a></h5>
-                </div>
-                <div class="item">
-                    <span class="iconWrapper">
-                        <i class="iconfont bigger">&#xe600;</i>
-                    </span>
-                    <h4>Web UI</h4>
-                    <h5>Web based interface to view requests</h5>
-                </div>
-                <div class="item">
-                    <span class="iconWrapper">
-                        <i class="iconfont">&#xe604;</i>
-                    </span>
-                    <h4>Customed Rule File</h4>
-                    <h5>Make your own debugging tool by writing rule files</h5>
-                </div>
-                <div style="clear:both"></div>
-            </div>
-        </div>
-
-        <div class="quickstart listSection">
-            <div class="quickstartContent listContent">
-                <h4 class="subtitle" id="install">Installation</h4>
-                <ul>
-                    <li>install <a href="http://nodejs.org/" target="_blank">Node.js</a> &gt;= v0.12</li>
-                    <li><code class="simpleBash">npm install -g anyproxy</code>, may require<code class="simpleBash">sudo</code></li>
-                    <li><a href="https://github.com/alibaba/anyproxy#quick-start" target="_blank">More&gt;&gt;</a></li>
-                </ul>
-                <h4 class="subtitle" id="quickstart">Quick Start</h4>
-                <ul>
-                    <li>run&nbsp;&nbsp;<code class="simpleBash">anyproxy</code></li>
-                    <li>set proxy to 127.0.0.1:8001 on your browser or device</li>
-                    <li>view web interface at http://127.0.0.1:8002</li>
-                    <li><a href="https://github.com/alibaba/anyproxy#quick-start" target="_blank">More Usage&nbsp;&gt;&gt;</a></li>
-                </ul>
-                <a href="https://github.com/alibaba/anyproxy#step-4---launch-web-interface" target="_blank"><img class="screenshot" src="http://gtms01.alicdn.com/tps/i1/TB1IdgqGXXXXXa9apXXLExM2pXX-854-480.gif" width="350"/></a>
-            </div>
-        </div>
-
-        <div class="sample">
-
-            <div class="sampleContent">
-                <h4 class="subtitle" id="sample ">Sample of Rule Files</h4>
-
-                <div class="item">
-                    <h5 class="itemTitle">Append &quot;hello world&quot; on HTML response</h5>
-                    <pre>
-<code class="javascript">
-//append "hello world" to all web pages
-//file : rule_replace_response_data.js
-//run  : anyproxy --rule rule_replace_response_data.js
-module.exports = {
-    replaceServerResDataAsync: function(req,res,serverRes,cb){
-
-        if(/html/i.test(res.headers['content-type'])){
-            var newDataStr = serverRes.toString();
-            newDataStr += "hello world!";
-            cb(newDataStr);
-        }
-    }
-};
-</code>
-                    </pre>
-                    <span class="figure">
-                        <img src="https://t.alipayobjects.com/images/rmsweb/T1LcphXf0eXXXXXXXX.png" width="350"/>
-                    </span>
-                    <hr />
-                </div>              
-                <div class="item">
-                    <h5 class="itemTitle">remove if-modified-since from http request header</h5>
-                    <pre>
-<code class="javascript">
-//remove cache related header
-//file : rule_remove_cache_header.js
-//run  : anyproxy --rule rule_remove_cache_header.js
-module.exports = {
-    replaceRequestOption : function(req,option){
-        var newOption = option;
-        delete newOption.headers['if-modified-since'];
-
-        return newOption;
-    }
-};
-</code>
-                    </pre>
-                    <span class="figure">
-                        <img src="https://t.alipayobjects.com/images/rmsweb/T1ecFhXjxcXXXXXXXX.png" width="350"/>
-                    </span>
-                    <hr />
-                </div>
-
-                <div class="item">
-                    <h5 class="itemTitle">assign a specified ip address for some requests</h5>
-                    <pre>
-<code class="javascript">
-//assign a specific IP adress for some request
-//file : rule_reverse_proxy.js
-//run  : anyproxy --rule anyproxy --rule rule_reverse_proxy.js
-module.exports = {
-    replaceRequestOption : function(req,option){
-        var newOption = option;
-        if(newOption.headers.host == "www.taobao.com"){
-            newOption.hostname = "192.168.1.3";
-            newOption.port     = "80";
-        }
-
-        return newOption;
-    }
-};
-</code>
-                    </pre>
-                    <span class="figure">
-                        <img src="https://t.alipayobjects.com/images/rmsweb/T1hsxhXeddXXXXXXXX.png" width="350"/>
-                    </span>
-                    <hr />
-                </div>
-
-                <div class="item">
-                    <h5 class="itemTitle">replace all image response by local one</h5>
-                    <pre>
-<code class="javascript">
-//replace all the images with local one
-//file : rule_use_local_data.js
-//run  : anyproxy --rule anyproxy --rule rule_use_local_data.js
-var fs  = require("fs"),
-    img = fs.readFileSync("sample.jpg");
-
-module.exports = {
-    shouldUseLocalResponse : function(req,reqBody){
-        if(/\.(png|gif|jpg|jpeg)$/.test(req.url)){
-            req.replaceLocalFile = true;
-            return true;
-        }else{
-            return false;
-        }
-    },
-
-    dealLocalResponse : function(req,reqBody,callback){
-        if(req.replaceLocalFile){
-            callback(200, {"content-type":"image/png"},img );
-        }
-    }
-};
-</code>
-                    </pre>
-                    <span class="figure">
-                        <img src="https://t.alipayobjects.com/images/rmsweb/T1Zr4hXeXhXXXXXXXX.png" width="350"/>
-                    </span>
-                </div>
-
-                <div class="readmoreBtn">
-                    <a href="https://github.com/alibaba/anyproxy/wiki/What-is-rule-file-and-how-to-write-one" target="_blank">&gt;&gt;&nbsp;Ref : Guide of Rule file</a>
-                </div>
-
-            </div>
-        </div>
-
-        <div class="readMore listSection">
-            <div class="listContent">
-                <h4 class="subtitle" id="otherfeature">Other Features</h4>
-                <ul>
-                    <li>Map file to local , filter your logs</li>
-                    <li><a href="https://github.com/alibaba/anyproxy#throttling">Simulate a low-speed network</a> , help to test the performance of your app on poor network</li>
-                    <li><a href="https://github.com/alibaba/anyproxy#work-as-a-module-for-nodejs" target="_blank">Using AnyProxy as an npm module</a> , to deploy your own debugging tools</li>
-                </ul>
-            </div>
-        </div>
-
-        <div class="learnMore listSection">
-            <div class="btnWrapper">
-                <h4 class="subtitle white" id="readmore">Read More</h4>
-                <a class="actionBtn actionBtnWhite" href="https://github.com/alibaba/anyproxy" target="_blank">https://github.com/alibaba/anyproxy</a>
-            </div>
-        </div>
-
-        <div class="footer"></div>
-
+  <article class="markdown-body">
+    <div class="toc-container" id="j_toc">
+      <div class="toc-content"><ul class="nav nav-list">
+    <li class="sidebar-header-1"><a href="#anyproxy">AnyProxy</a></li>
+    <li class="sidebar-header-2"><a href="#quick-start">Quick start</a></li>
+    <li class="sidebar-header-3"><a href="#install">install</a></li>
+    <li class="sidebar-header-3"><a href="#launch">launch</a></li>
+    <li class="sidebar-header-3"><a href="#other-commands">other commands</a></li>
+    <li class="sidebar-header-2"><a href="#proxy-https-request">Proxy https request</a></li>
+    <li class="sidebar-header-2"><a href="#use-rule-module">Use rule module</a></li>
+    <li class="sidebar-header-3"><a href="#sample">sample</a></li>
+    <li class="sidebar-header-3"><a href="#the-entire-process">the entire process</a></li>
+    <li class="sidebar-header-3"><a href="#how-to-load-rule-module">how to load rule module</a></li>
+    <li class="sidebar-header-2"><a href="#rule-module-interface">Rule module interface</a></li>
+    <li class="sidebar-header-3"><a href="#summary">summary</a></li>
+    <li class="sidebar-header-4"><a href="#summary-1">summary</a></li>
+    <li class="sidebar-header-3"><a href="#beforesendrequest">beforeSendRequest</a></li>
+    <li class="sidebar-header-4"><a href="#beforesendrequest(requestdetail)">beforeSendRequest(requestDetail)</a></li>
+    <li class="sidebar-header-3"><a href="#beforesendresponse">beforeSendResponse</a></li>
+    <li class="sidebar-header-4"><a href="#beforesendresponse(requestdetail,-responsedetail)">beforeSendResponse(requestDetail, responseDetail)</a></li>
+    <li class="sidebar-header-3"><a href="#beforedealhttpsrequest">beforeDealHttpsRequest</a></li>
+    <li class="sidebar-header-4"><a href="#beforedealhttpsrequest(requestdetail)">beforeDealHttpsRequest(requestDetail)</a></li>
+    <li class="sidebar-header-3"><a href="#onerror">onError</a></li>
+    <li class="sidebar-header-4"><a href="#onerror(requestdetail,-error)">onError(requestDetail, error)</a></li>
+    <li class="sidebar-header-3"><a href="#onconnecterror">onConnectError</a></li>
+    <li class="sidebar-header-4"><a href="#onconnecterror(requestdetail,-error)">onConnectError(requestDetail, error)</a></li>
+    <li class="sidebar-header-3"><a href="#faq">FAQ</a></li>
+    <li class="sidebar-header-2"><a href="#rule-samples">Rule Samples</a></li>
+    <li class="sidebar-header-3"><a href="#use-local-response">use local response</a></li>
+    <li class="sidebar-header-3"><a href="#modify-request-header">modify request header</a></li>
+    <li class="sidebar-header-3"><a href="#modify-request-body">modify request body</a></li>
+    <li class="sidebar-header-3"><a href="#modify-the-request-target">modify the request target</a></li>
+    <li class="sidebar-header-3"><a href="#modify-request-protocol">modify request protocol</a></li>
+    <li class="sidebar-header-3"><a href="#modify-response-status-code">modify response status code</a></li>
+    <li class="sidebar-header-3"><a href="#modify-the-response-header">modify the response header</a></li>
+    <li class="sidebar-header-3"><a href="#modify-response-data-and-delay">modify response data and delay</a></li>
+    <li class="sidebar-header-2"><a href="#use-anyproxy-as-an-npm-module">Use AnyProxy as an npm module</a></li>
+    <li class="sidebar-header-2"><a href="#about-anyproxy">About AnyProxy</a></li>
+    <li class="sidebar-header-2"><a href="#appendix">Appendix</a></li>
+    <li class="sidebar-header-3"><a href="#config-root-ca-in-osx">Config root CA in OSX</a></li>
+    <li class="sidebar-header-3"><a href="#trust-root-ca-in-windows">trust root CA in windows</a></li>
+    <li class="sidebar-header-3"><a href="#config-osx-system-proxy">config OSX system proxy</a></li>
+    <li class="sidebar-header-3"><a href="#config-http-proxy-server">config http proxy server</a></li>
+    <li class="sidebar-header-3"><a href="#trust-root-ca-in-ios">trust root CA in iOS</a></li>
+    <li class="sidebar-header-3"><a href="#trust-root-ca-in-ios-&gt;&#x3D;-10.3">trust root CA in iOS &gt;&#x3D; 10.3</a></li>
+    <li class="sidebar-header-3"><a href="#config-ios/android-proxy-server">config iOS/Android proxy server</a></li>
+</ul>
+      </div>
     </div>
+    <div class="main-content"><h1 id="anyproxy"><a class="header-link" href="#anyproxy"></a>AnyProxy</h1>
+<p>AnyProxy is a fully configurable http/https proxy in NodeJS. Version 4.0 is in beta now.</p>
+<p>Ref: <a href="./cn.html">Chinese Doc 中文文档</a></p>
+<p>Github: </p>
+<ul class="list">
+<li><a href="https://github.com/alibaba/anyproxy/tree/4.x">https://github.com/alibaba/anyproxy/tree/4.x</a></li>
+</ul>
+<p>Features:</p>
+<ul class="list">
+<li>Offer you the ablity to handle http traffic by invoking a js module</li>
+<li>Intercept https</li>
+<li>GUI webinterface</li>
+</ul>
+<p>Change Logs since 3.x:</p>
+<ul class="list">
+<li>Support Promise and Generator in rule module</li>
+<li>Simplified interface in rule module</li>
+<li>A newly designed web interface</li>
+</ul>
+<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/SqVntpzmscXPbSzfcGcr.png" width="500" /></p>
+<h2 id="quick-start"><a class="header-link" href="#quick-start"></a>Quick start</h2>
+<h3 id="install"><a class="header-link" href="#install"></a>install</h3>
+<pre class="hljs"><code>npm install -g anyproxy@beta <span class="hljs-comment"># 4.x is in beta now</span></code></pre><h3 id="launch"><a class="header-link" href="#launch"></a>launch</h3>
+<ul class="list">
+<li>start AnyProxy in command line, with default port 8001</li>
+</ul>
+<pre class="hljs"><code>anyproxy</code></pre><ul class="list">
+<li>now you can use http proxy server by 127.0.0.1:8001</li>
+<li>visit <a href="http://127.0.0.1:8002">http://127.0.0.1:8002</a> to see the http requests</li>
+</ul>
+<h3 id="other-commands"><a class="header-link" href="#other-commands"></a>other commands</h3>
+<ul class="list">
+<li>specify the port of http proxy</li>
+</ul>
+<pre class="hljs"><code>anyproxy --port 1080</code></pre><h2 id="proxy-https-request"><a class="header-link" href="#proxy-https-request"></a>Proxy https request</h2>
+<ul class="list">
+<li>AnyProxy does NOT intercept https requests by default. To view decrypted info, you have to config the CA certificate.</li>
+</ul>
+<blockquote>
+<p>Under the hood, AnyProxy decryptes https requests by man-in-the-middle attack. Users have to trust the CA cert in advance. Otherwise, client side will issue errors about unsecure network.</p>
+</blockquote>
+<ul class="list">
+<li>generate certifycates and intercept</li>
+</ul>
+<pre class="hljs"><code>anyproxy-ca <span class="hljs-comment">#generate root CA. manually trust it after that.</span>
+anyproxy --intercept <span class="hljs-comment">#launch anyproxy and intercept all https traffic</span></code></pre><ul class="list">
+<li><a href="#osx系统信任ca证书">Appendix:how to trust CA</a></li>
+</ul>
+<h2 id="use-rule-module"><a class="header-link" href="#use-rule-module"></a>Use rule module</h2>
+<p>AnyProxy provides the ability to load your own rules written in javascript. With rule module, you could customize the logic to handle requests.</p>
+<blockquote>
+<p>Make sure your rule file is got from a trusted source. Otherwise, you may face some unknown security risk.</p>
+</blockquote>
+<p>Rule module could do the following stuff:</p>
+<ul class="list">
+<li>intercept and modify the request which is being sent<ul class="list">
+<li>editable fields include request header, body, target address</li>
+</ul>
+</li>
+<li>intercept and modify the response from server<ul class="list">
+<li>editable fields include response status code, header, body</li>
+</ul>
+</li>
+<li>intercept https requests, modify request and response</li>
+</ul>
+<h3 id="sample"><a class="header-link" href="#sample"></a>sample</h3>
+<ul class="list">
+<li><p>Target</p>
+<ul class="list">
+<li>write a rule module to append some text to the response of GET <a href="http://httpbin.org/user-agent">http://httpbin.org/user-agent</a>, and delay the response for 5 seconds</li>
+</ul>
+</li>
+<li><p>Step 1,Write the rule file, save as sample.js</p>
+<pre class="hljs"><code><span class="hljs-comment">// file: sample.js</span>
+<span class="hljs-built_in">module</span>.exports = {
+  <span class="hljs-attr">summary</span>: <span class="hljs-string">'a rule to modify response'</span>,
+  *beforeSendResponse(requestDetail, responseDetail) {
+    <span class="hljs-keyword">if</span> (requestDetail.url === <span class="hljs-string">'http://httpbin.org/user-agent'</span>) {
+      <span class="hljs-keyword">const</span> newResponse = responseDetail.response;
+      newResponse.body += <span class="hljs-string">'-- AnyProxy Hacked! --'</span>;
+      <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Promise</span>(<span class="hljs-function">(<span class="hljs-params">resolve, reject</span>) =&gt;</span> {
+        setTimeout(<span class="hljs-function"><span class="hljs-params">()</span> =&gt;</span> { <span class="hljs-comment">// delay</span>
+          resolve({ <span class="hljs-attr">response</span>: newResponse });
+        }, <span class="hljs-number">5000</span>);
+      });
+    }
+  },
+};</code></pre></li>
+<li><p>Step 2, start AnyProxy and load the rule file</p>
+<ul class="list">
+<li>run <code>anyproxy --rule sample.js</code></li>
+</ul>
+</li>
+<li><p>Step 3, test</p>
+<ul class="list">
+<li><p>use curl </p>
+<pre class="hljs"><code>curl http://httpbin.org/user-agent --proxy http://127.0.0.1:8001</code></pre></li>
+<li><p>use browser. Point the http proxy of browser to 127.0.0.1:8001, then visit <a href="http://httpbin.org/user-agent">http://httpbin.org/user-agent</a> </p>
+</li>
+<li><p>the expected response from proxy is </p>
+</li>
+</ul>
+<pre class="hljs"><code>{
+  <span class="hljs-string">"user-agent"</span>: <span class="hljs-string">"curl/7.43.0"</span>
+}
+- AnyProxy Hacked!</code></pre></li>
+<li><p>Step 4, view the request log</p>
+<ul class="list">
+<li>visit <a href="http://127.0.0.1:8002">http://127.0.0.1:8002</a>, the request just sent should be listed here</li>
+</ul>
+</li>
+</ul>
+<h3 id="the-entire-process"><a class="header-link" href="#the-entire-process"></a>the entire process</h3>
+<ul class="list">
+<li>The flow chart is as follows</li>
+</ul>
+<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/TWyNuSJtEZBdrdcOMRjE.png" width="550" /></p>
+<ul class="list">
+<li><p>When got an http request, the entire process of proxy server is</p>
+<ul class="list">
+<li>AnyProxy collects all the quest info, include method, header, body</li>
+<li>AnyProxy calls <code>beforeSendRequest</code> of the rule module. Rule module deal the request, return new request param or response content</li>
+<li>If <code>beforeSendRequest</code> returns the response content, AnyProxy will send the response to client without sending to target server. The process ends here.</li>
+<li>Send request to target server, collect response</li>
+<li>Call <code>beforeSendResponse</code> of the rule module. Rule module deal the response data</li>
+<li>Send response to client</li>
+</ul>
+</li>
+<li><p>When AnyProxy get https request, it could replace the certificate and decrypt the request data</p>
+<ul class="list">
+<li>AnyProxy calls <code>beforeDealHttpsRequest</code> of the rule module</li>
+<li>If the function returns <code>true</code>, AnyProxy will do the man-in-the-middle attack to it. Otherwise, the request will not be dealed.</li>
+</ul>
+</li>
+</ul>
+<h3 id="how-to-load-rule-module"><a class="header-link" href="#how-to-load-rule-module"></a>how to load rule module</h3>
+<ul class="list">
+<li><p>use local file</p>
+<pre class="hljs"><code>anyproxy --rule ./rule.js</code></pre></li>
+<li><p>use an online rule file</p>
+<pre class="hljs"><code>anyproxy --rule https://sample.com/rule.js</code></pre></li>
+<li><p>use an npm module</p>
+<ul class="list">
+<li>AnyProxy uses <code>require()</code> to load rule module. You could either load a local npm module or a global-installed one.</li>
+</ul>
+<pre class="hljs"><code>anyproxy --rule ./myRulePkg/ <span class="hljs-comment">#local module</span>
+npm i -g myRulePkg &amp;&amp; anyproxy --rule myRulePkg <span class="hljs-comment">#global-installed module</span></code></pre></li>
+</ul>
+<h2 id="rule-module-interface"><a class="header-link" href="#rule-module-interface"></a>Rule module interface</h2>
+<p>A typical rule module is as follows. All the functions are optional, just write the part you are interested in.</p>
+<pre class="hljs"><code><span class="hljs-built_in">module</span>.exports = {
+  <span class="hljs-comment">// introduction</span>
+  summary: <span class="hljs-string">'my customized rule for AnyProxy'</span>, 
+  <span class="hljs-comment">// intercept before send request to server</span>
+  *beforeSendRequest(requestDetail) { <span class="hljs-comment">/* ... */</span> }, 
+  <span class="hljs-comment">// deal response before send to client </span>
+  *beforeSendResponse(requestDetail, responseDetail) { <span class="hljs-comment">/* ... */</span> }, 
+  <span class="hljs-comment">// if deal https request</span>
+  *beforeDealHttpsRequest(requestDetail) { <span class="hljs-comment">/* ... */</span> }, 
+  <span class="hljs-comment">// error happened when dealing requests</span>
+  *onError(requestDetail, error) { <span class="hljs-comment">/* ... */</span> }, 
+  <span class="hljs-comment">// error happened when connect to https server</span>
+  *onConnectError(requestDetail, error) { <span class="hljs-comment">/* ... */</span> } 
+};</code></pre><blockquote>
+<p>All functions in your rule file, except summary, are all driven by <a href="https://www.npmjs.com/package/co">co</a> . They should be yieldable, i.e. return a promise or be a generator function.</p>
+</blockquote>
+<h3 id="summary"><a class="header-link" href="#summary"></a>summary</h3>
+<h4 id="summary-1"><a class="header-link" href="#summary-1"></a>summary</h4>
+<ul class="list">
+<li>Introduction of this rule file. AnyProxy will read this field and give some tip to user.</li>
+</ul>
+<h3 id="beforesendrequest"><a class="header-link" href="#beforesendrequest"></a>beforeSendRequest</h3>
+<h4 id="beforesendrequest(requestdetail)"><a class="header-link" href="#beforesendrequest(requestdetail)"></a>beforeSendRequest(requestDetail)</h4>
+<ul class="list">
+<li>Before sending request to server, AnyProxy will call <code>beforeSendRequest</code> with param <code>requestDetail</code></li>
+<li><code>requestDetail</code> <ul class="list">
+<li><code>protocol</code> {string} the protocol to use, http or https</li>
+<li><code>requestOptions</code> {object} the options of the request-to-go, a param of require(&#39;http&#39;).request . ref: <a href="https://nodejs.org/api/http.html#http_http_request_options_callback">https://nodejs.org/api/http.html#http_http_request_options_callback</a></li>
+<li><code>requestData</code> {object} request body</li>
+<li><code>url</code> {string} request url</li>
+<li><code>_req</code> {object} the native node.js request object</li>
+</ul>
+</li>
+<li><p>e.g. When requesting  <em>anyproxy.io</em>, <code>requestDetail</code> is something like the following</p>
+<pre class="hljs"><code>{
+  <span class="hljs-attr">protocol</span>: <span class="hljs-string">'http'</span>,
+  <span class="hljs-attr">url</span>: <span class="hljs-string">'http://anyproxy.io/'</span>,
+  <span class="hljs-attr">requestOptions</span>: {
+    <span class="hljs-attr">hostname</span>: <span class="hljs-string">'anyproxy.io'</span>,
+    <span class="hljs-attr">port</span>: <span class="hljs-number">80</span>,
+    <span class="hljs-attr">path</span>: <span class="hljs-string">'/'</span>,
+    <span class="hljs-attr">method</span>: <span class="hljs-string">'GET'</span>,
+    <span class="hljs-attr">headers</span>: {
+      <span class="hljs-attr">Host</span>: <span class="hljs-string">'anyproxy.io'</span>,
+      <span class="hljs-string">'Proxy-Connection'</span>: <span class="hljs-string">'keep-alive'</span>,
+      <span class="hljs-string">'User-Agent'</span>: <span class="hljs-string">'...'</span>
+    }
+  },
+  <span class="hljs-attr">requestData</span>: <span class="hljs-string">'...'</span>,
+  <span class="hljs-attr">_req</span>: { <span class="hljs-comment">/* ... */</span>}
+}</code></pre></li>
+<li><p>Any of these return values are valid</p>
+<ul class="list">
+<li>do nothing, and return null</li>
+</ul>
+<pre class="hljs"><code><span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;</code></pre><ul class="list">
+<li>modify the request protocol,i.e. force use https</li>
+</ul>
+<pre class="hljs"><code><span class="hljs-keyword">return</span> {
+  <span class="hljs-attr">protocol</span>: <span class="hljs-string">'https'</span>
+};</code></pre><ul class="list">
+<li>modify request param</li>
+</ul>
+<pre class="hljs"><code><span class="hljs-keyword">var</span> newOption = <span class="hljs-built_in">Object</span>.assign({}, requestDetail.requestOptions);
+newOption.path = <span class="hljs-string">'/redirect/to/another/path'</span>;
+<span class="hljs-keyword">return</span> {
+  <span class="hljs-attr">requestOptions</span>: newOption
+};</code></pre><ul class="list">
+<li>modify request body</li>
+</ul>
+<pre class="hljs"><code><span class="hljs-keyword">return</span> {
+  <span class="hljs-attr">requestData</span>: <span class="hljs-string">'my new request data'</span>
+  <span class="hljs-comment">// requestOptions can also be used here</span>
+};</code></pre><ul class="list">
+<li>give response to the client, not sending request any longer. <code>statusCode</code> <code>headers</code>are required is this situation.</li>
+</ul>
+<pre class="hljs"><code><span class="hljs-keyword">return</span> {
+  <span class="hljs-attr">response</span>: {
+    <span class="hljs-attr">statusCode</span>: <span class="hljs-number">200</span>,
+    <span class="hljs-attr">header</span>: { <span class="hljs-string">'content-type'</span>: <span class="hljs-string">'text/html'</span> },
+    <span class="hljs-attr">body</span>: <span class="hljs-string">'this could be a &lt;string&gt; or &lt;buffer&gt;'</span>
+  }
+};</code></pre></li>
+</ul>
+<h3 id="beforesendresponse"><a class="header-link" href="#beforesendresponse"></a>beforeSendResponse</h3>
+<h4 id="beforesendresponse(requestdetail,-responsedetail)"><a class="header-link" href="#beforesendresponse(requestdetail,-responsedetail)"></a>beforeSendResponse(requestDetail, responseDetail)</h4>
+<ul class="list">
+<li>Before sending response to client, AnyProxy will call <code>beforeSendResponse</code> with param <code>requestDetail</code> <code>responseDetail</code></li>
+<li><code>requestDetail</code> is the same param as in <code>beforeSendRequest</code></li>
+<li><code>responseDetail</code> <ul class="list">
+<li><code>response</code> {object} the response from server, includes <code>statusCode</code> <code>header</code> <code>body</code></li>
+<li><code>_res</code> {object} the native node.js response object</li>
+</ul>
+</li>
+<li><p>e.g. When requesting <em>anyproxy.io</em>, <code>responseDetail</code> is something like the following</p>
+<pre class="hljs"><code>{ 
+  <span class="hljs-attr">response</span>: { 
+    <span class="hljs-attr">statusCode</span>: <span class="hljs-number">200</span>,
+    <span class="hljs-attr">header</span>: { 
+      <span class="hljs-string">'Content-Type'</span>: <span class="hljs-string">'image/gif'</span>,
+      <span class="hljs-attr">Connection</span>: <span class="hljs-string">'close'</span>,
+      <span class="hljs-string">'Cache-Control'</span>: <span class="hljs-string">'...'</span>
+    },
+    <span class="hljs-attr">body</span>: <span class="hljs-string">'...'</span>
+  },
+  <span class="hljs-attr">_res</span>: { <span class="hljs-comment">/* ... */</span> }
+}</code></pre></li>
+<li><p>Any of these return values are valid</p>
+<ul class="list">
+<li>do nothing, and return null</li>
+</ul>
+<pre class="hljs"><code><span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;</code></pre><ul class="list">
+<li>modify the response status code</li>
+</ul>
+<pre class="hljs"><code><span class="hljs-keyword">var</span> newResponse = <span class="hljs-built_in">Object</span>.assign({}, responseDetail.reponse);
+newResponse.statusCode = <span class="hljs-number">404</span>;
+<span class="hljs-keyword">return</span> {
+  <span class="hljs-attr">response</span>: newResponse
+};</code></pre><ul class="list">
+<li>modify the response content</li>
+</ul>
+<pre class="hljs"><code><span class="hljs-keyword">var</span> newResponse = <span class="hljs-built_in">Object</span>.assign({}, responseDetail.reponse);
+newResponse.body += <span class="hljs-string">'--from anyproxy--'</span>;
+<span class="hljs-keyword">return</span> {
+  <span class="hljs-attr">response</span>: newResponse
+};</code></pre></li>
+</ul>
+<h3 id="beforedealhttpsrequest"><a class="header-link" href="#beforedealhttpsrequest"></a>beforeDealHttpsRequest</h3>
+<h4 id="beforedealhttpsrequest(requestdetail)"><a class="header-link" href="#beforedealhttpsrequest(requestdetail)"></a>beforeDealHttpsRequest(requestDetail)</h4>
+<ul class="list">
+<li>When receiving https request, AnyProxy will call <code>beforeDealHttpsRequest</code> with param <code>requestDetail</code></li>
+<li>If configed with <code>forceProxyHttps</code> in launching, AnyProxy will skip calling this method</li>
+<li>Only by returning true, AnyProxy will try to replace the certificate and intercept the https request.</li>
+<li><code>requestDetail</code><ul class="list">
+<li><code>host</code> {string} the target host to request. Due to the request protocol, full url couldn&#39;t be got here</li>
+<li><code>_req</code> {object} the native node.js request object. The <code>_req</code> here refers to the CONNECT request.</li>
+</ul>
+</li>
+<li>return value<ul class="list">
+<li><code>true</code> or <code>false</code>, whether AnyProxy should intercept the https request</li>
+</ul>
+</li>
+</ul>
+<h3 id="onerror"><a class="header-link" href="#onerror"></a>onError</h3>
+<h4 id="onerror(requestdetail,-error)"><a class="header-link" href="#onerror(requestdetail,-error)"></a>onError(requestDetail, error)</h4>
+<ul class="list">
+<li>AnyProxy will call this method when an error happened in request handling.</li>
+<li>Errors usually are issued during requesting, e.g. DNS failure, request timeout</li>
+<li><code>requestDetail</code> is the same one as in <code>beforeSendRequest</code></li>
+<li><p>Any of these return values are valid</p>
+<ul class="list">
+<li>do nothing, and AnyProxy will response a default error page</li>
+</ul>
+<pre class="hljs"><code><span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;</code></pre><ul class="list">
+<li>return a customized error page</li>
+</ul>
+<pre class="hljs"><code><span class="hljs-keyword">return</span> {
+  <span class="hljs-attr">response</span>: {
+    <span class="hljs-attr">statusCode</span>: <span class="hljs-number">200</span>,
+    <span class="hljs-attr">header</span>: { <span class="hljs-string">'content-type'</span>: <span class="hljs-string">'text/html'</span> },
+    <span class="hljs-attr">body</span>: <span class="hljs-string">'this could be a &lt;string&gt; or &lt;buffer&gt;'</span>
+  }
+};</code></pre></li>
+</ul>
+<h3 id="onconnecterror"><a class="header-link" href="#onconnecterror"></a>onConnectError</h3>
+<h4 id="onconnecterror(requestdetail,-error)"><a class="header-link" href="#onconnecterror(requestdetail,-error)"></a>onConnectError(requestDetail, error)</h4>
+<ul class="list">
+<li>AnyProxy will call this method when failed to connect target server in https request</li>
+<li><code>requestDetail</code> is the same one as in <code>beforeDealHttpsRequest</code></li>
+<li>no return value is required </li>
+</ul>
+<h3 id="faq"><a class="header-link" href="#faq"></a>FAQ</h3>
+<ul class="list">
+<li>Q: can not deal https request in rule module.</li>
+<li><p>A: Any of these options could be used to change the way AnyProxy deall https requests </p>
+<ol class="list">
+<li>config <code>--intercept</code> when luanching AnyProxy via cli, or use <code>forceProxyHttps</code> when using as an npm module</li>
+<li>place a <code>beforeDealHttpsRequest</code> function in your rule file and determine which request to intercept by your own.</li>
+</ol>
+</li>
+<li><p>Q: get an error says <em>function is not yieldable</em></p>
+</li>
+<li>A: Rule module is driven by <a href="https://www.npmjs.com/package/co">co</a>. The functions inside should  be yieldable, i.e. return a promise or be a generator function.</li>
+</ul>
+<h2 id="rule-samples"><a class="header-link" href="#rule-samples"></a>Rule Samples</h2>
+<ul class="list">
+<li>here are some samples about frequently used rule file</li>
+<li>try these samples by <code>anyproxy --rule http://....js</code></li>
+<li>how to test with curl:<ul class="list">
+<li>request the server directly <code>curl http://httpbin.org/</code></li>
+<li>request the server via proxy <code>curl http://httpbin.org/ --proxy http://127.0.0.1:8001</code></li>
+</ul>
+</li>
+</ul>
+<h3 id="use-local-response"><a class="header-link" href="#use-local-response"></a>use local response</h3>
+<ul class="list">
+<li>intercept the request towards <a href="http://httpbin.org">http://httpbin.org</a> , return the local-defined response</li>
+</ul>
+<pre class="hljs"><code>anyproxy --rule https://raw.githubusercontent.com/alibaba/anyproxy/4.x/rule_sample/sample_use_local_response.js</code></pre><pre class="hljs"><code><span class="hljs-comment">/* 
+  sample: 
+    intercept all requests toward httpbin.org, use a local response
+  test:
+    curl http://httpbin.org/user-agent --proxy http://127.0.0.1:8001
+*/</span>
+<span class="hljs-built_in">module</span>.exports = {
+  *beforeSendRequest(requestDetail) {
+    <span class="hljs-keyword">const</span> localResponse = {
+      <span class="hljs-attr">statusCode</span>: <span class="hljs-number">200</span>,
+      <span class="hljs-attr">header</span>: { <span class="hljs-string">'Content-Type'</span>: <span class="hljs-string">'application/json'</span> },
+      <span class="hljs-attr">body</span>: <span class="hljs-string">'{"hello": "this is local response"}'</span>
+    };
+    <span class="hljs-keyword">if</span> (requestDetail.url.indexOf(<span class="hljs-string">'http://httpbin.org'</span>) === <span class="hljs-number">0</span>) {
+      <span class="hljs-keyword">return</span> {
+        <span class="hljs-attr">response</span>: localResponse
+      };
+    }
+  },
+};</code></pre><h3 id="modify-request-header"><a class="header-link" href="#modify-request-header"></a>modify request header</h3>
+<ul class="list">
+<li>modify the user-agent sent to httpbin.org</li>
+</ul>
+<pre class="hljs"><code>anyproxy --rule https://raw.githubusercontent.com/alibaba/anyproxy/4.x/rule_sample/sample_modify_request_header.js</code></pre><pre class="hljs"><code><span class="hljs-comment">/* 
+  sample: 
+    modify the user-agent in requests toward httpbin.org
+  test:
+    curl http://httpbin.org/user-agent --proxy http://127.0.0.1:8001
+*/</span>
+<span class="hljs-built_in">module</span>.exports = {
+  *beforeSendRequest(requestDetail) {
+    <span class="hljs-keyword">if</span> (requestDetail.url.indexOf(<span class="hljs-string">'http://httpbin.org'</span>) === <span class="hljs-number">0</span>) {
+      <span class="hljs-keyword">const</span> newRequestOptions = requestDetail.requestOptions;
+      newRequestOptions.headers[<span class="hljs-string">'User-Agent'</span>] = <span class="hljs-string">'AnyProxy/0.0.0'</span>;
+      <span class="hljs-keyword">return</span> {
+        <span class="hljs-attr">requestOptions</span>: newRequestOptions
+      };
+    }
+  },
+};</code></pre><h3 id="modify-request-body"><a class="header-link" href="#modify-request-body"></a>modify request body</h3>
+<ul class="list">
+<li>modify the post body of <a href="http://httpbin.org/post">http://httpbin.org/post</a></li>
+</ul>
+<pre class="hljs"><code>anyproxy --rule https://raw.githubusercontent.com/alibaba/anyproxy/4.x/rule_sample/sample_modify_request_data.js</code></pre><pre class="hljs"><code><span class="hljs-comment">/* 
+  sample: 
+    modify the post data towards http://httpbin.org/post
+  test:
+    curl -H "Content-Type: text/plain" -X POST -d 'original post data' http://httpbin.org/post --proxy http://127.0.0.1:8001
+  expected response:
+    { "data": "i-am-anyproxy-modified-post-data" }
+*/</span>
+<span class="hljs-built_in">module</span>.exports = {
+  *beforeSendRequest(requestDetail) {
+    <span class="hljs-keyword">if</span> (requestDetail.url.indexOf(<span class="hljs-string">'http://httpbin.org/post'</span>) === <span class="hljs-number">0</span>) {
+      <span class="hljs-keyword">return</span> {
+        <span class="hljs-attr">requestData</span>: <span class="hljs-string">'i-am-anyproxy-modified-post-data'</span>
+      };
+    }
+  },
+};</code></pre><h3 id="modify-the-request-target"><a class="header-link" href="#modify-the-request-target"></a>modify the request target</h3>
+<ul class="list">
+<li>send all the request towards <a href="http://httpbin.org/">http://httpbin.org/</a> to <a href="http://httpbin.org/user-agent">http://httpbin.org/user-agent</a></li>
+</ul>
+<pre class="hljs"><code>anyproxy --rule https://raw.githubusercontent.com/alibaba/anyproxy/4.x/rule_sample/sample_modify_request_path.js</code></pre><pre class="hljs"><code><span class="hljs-comment">/* 
+  sample: 
+    redirect all httpbin.org requests to http://httpbin.org/user-agent
+  test:
+    curl http://httpbin.org/any-path --proxy http://127.0.0.1:8001
+  expected response:
+    { "user-agent": "curl/7.43.0" }
+*/</span>
+<span class="hljs-built_in">module</span>.exports = {
+  *beforeSendRequest(requestDetail) {
+    <span class="hljs-keyword">if</span> (requestDetail.url.indexOf(<span class="hljs-string">'http://httpbin.org'</span>) === <span class="hljs-number">0</span>) {
+      <span class="hljs-keyword">const</span> newRequestOptions = requestDetail.requestOptions;
+      newRequestOptions.path = <span class="hljs-string">'/user-agent'</span>;
+      newRequestOptions.method = <span class="hljs-string">'GET'</span>;
+      <span class="hljs-keyword">return</span> {
+        <span class="hljs-attr">requestOptions</span>: newRequestOptions
+      };
+    }
+  },
+};</code></pre><h3 id="modify-request-protocol"><a class="header-link" href="#modify-request-protocol"></a>modify request protocol</h3>
+<ul class="list">
+<li>modify the http request towards <a href="http://httpbin.org">http://httpbin.org</a> to https</li>
+</ul>
+<pre class="hljs"><code>anyproxy --rule https://raw.githubusercontent.com/alibaba/anyproxy/4.x/rule_sample/sample_modify_request_protocol.js</code></pre><pre class="hljs"><code><span class="hljs-comment">/* 
+  sample: 
+    redirect all http requests of httpbin.org to https
+  test:
+    curl 'http://httpbin.org/get?show_env=1' --proxy http://127.0.0.1:8001
+  expected response:
+    { "X-Forwarded-Protocol": "https" }
+*/</span>
+<span class="hljs-built_in">module</span>.exports = {
+  *beforeSendRequest(requestDetail) {
+    <span class="hljs-keyword">if</span> (requestDetail.url.indexOf(<span class="hljs-string">'http://httpbin.org'</span>) === <span class="hljs-number">0</span>) {
+      <span class="hljs-keyword">const</span> newOption = requestDetail.requestOptions;
+      newOption.port = <span class="hljs-number">443</span>;
+      <span class="hljs-keyword">return</span> {
+        <span class="hljs-attr">protocol</span>: <span class="hljs-string">'https'</span>,
+        <span class="hljs-attr">requestOptions</span>: newOption
+      };
+    }
+  }
+};</code></pre><h3 id="modify-response-status-code"><a class="header-link" href="#modify-response-status-code"></a>modify response status code</h3>
+<ul class="list">
+<li>modify all status code from <a href="http://httpbin.org">http://httpbin.org</a> to 404</li>
+</ul>
+<pre class="hljs"><code>anyproxy --rule https://raw.githubusercontent.com/alibaba/anyproxy/4.x/rule_sample/sample_modify_response_statuscode.js</code></pre><pre class="hljs"><code><span class="hljs-comment">/* 
+  sample: 
+    modify all status code of http://httpbin.org/ to 404
+  test:
+    curl -I 'http://httpbin.org/user-agent' --proxy http://127.0.0.1:8001
+  expected response:
+    HTTP/1.1 404 Not Found
+*/</span>
+<span class="hljs-built_in">module</span>.exports = {
+  *beforeSendResponse(requestDetail, responseDetail) {
+    <span class="hljs-keyword">if</span> (requestDetail.url.indexOf(<span class="hljs-string">'http://httpbin.org'</span>) === <span class="hljs-number">0</span>) {
+      <span class="hljs-keyword">const</span> newResponse = responseDetail.response;
+      newResponse.statusCode = <span class="hljs-number">404</span>;
+      <span class="hljs-keyword">return</span> {
+        <span class="hljs-attr">response</span>: newResponse
+      };
+    }
+  }
+};</code></pre><h3 id="modify-the-response-header"><a class="header-link" href="#modify-the-response-header"></a>modify the response header</h3>
+<ul class="list">
+<li>add X-Proxy-By:AnyProxy to the response header from <a href="http://httpbin.org/user-agent">http://httpbin.org/user-agent</a></li>
+</ul>
+<pre class="hljs"><code>anyproxy --rule https://raw.githubusercontent.com/alibaba/anyproxy/4.x/rule_sample/sample_modify_response_header.js</code></pre><pre class="hljs"><code><span class="hljs-comment">/* 
+  sample: 
+    modify response header of http://httpbin.org/user-agent
+  test:
+    curl -I 'http://httpbin.org/user-agent' --proxy http://127.0.0.1:8001
+  expected response:
+    X-Proxy-By: AnyProxy
+*/</span>
+<span class="hljs-built_in">module</span>.exports = {
+  *beforeSendResponse(requestDetail, responseDetail) {
+    <span class="hljs-keyword">if</span> (requestDetail.url.indexOf(<span class="hljs-string">'http://httpbin.org/user-agent'</span>) === <span class="hljs-number">0</span>) {
+      <span class="hljs-keyword">const</span> newResponse = responseDetail.response;
+      newResponse.header[<span class="hljs-string">'X-Proxy-By'</span>] = <span class="hljs-string">'AnyProxy'</span>;
+      <span class="hljs-keyword">return</span> {
+        <span class="hljs-attr">response</span>: newResponse
+      };
+    }
+  }
+};</code></pre><h3 id="modify-response-data-and-delay"><a class="header-link" href="#modify-response-data-and-delay"></a>modify response data and delay</h3>
+<ul class="list">
+<li>append some info to the response of <a href="http://httpbin.org/user-agent">http://httpbin.org/user-agent</a>, then delay the response for 5 seconds.</li>
+</ul>
+<pre class="hljs"><code>anyproxy --rule https://raw.githubusercontent.com/alibaba/anyproxy/4.x/rule_sample/sample_modify_response_data.js</code></pre><pre class="hljs"><code><span class="hljs-comment">/* 
+  sample: 
+    modify response data of http://httpbin.org/user-agent
+  test:
+    curl 'http://httpbin.org/user-agent' --proxy http://127.0.0.1:8001
+  expected response:
+    { "user-agent": "curl/7.43.0" } -- AnyProxy Hacked! --
+*/</span>
 
-    <link rel="stylesheet" type="text/css" href="/dest/github.css" />
-    <script src="/dest/lib.js"></script>
-    <script type="text/javascript">
-        Zepto(document).ready(function() {
-            Zepto('.sample code').each(function(i, block) {
-                hljs.highlightBlock(block);
-            });
+<span class="hljs-built_in">module</span>.exports = {
+  *beforeSendResponse(requestDetail, responseDetail) {
+    <span class="hljs-keyword">if</span> (requestDetail.url === <span class="hljs-string">'http://httpbin.org/user-agent'</span>) {
+      <span class="hljs-keyword">const</span> newResponse = responseDetail.response;
+      newResponse.body += <span class="hljs-string">'-- AnyProxy Hacked! --'</span>;
+      <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Promise</span>(<span class="hljs-function">(<span class="hljs-params">resolve, reject</span>) =&gt;</span> {
+        setTimeout(<span class="hljs-function"><span class="hljs-params">()</span> =&gt;</span> { <span class="hljs-comment">// delay the response for 5s</span>
+          resolve({ <span class="hljs-attr">response</span>: newResponse });
+        }, <span class="hljs-number">5000</span>);
+      });
+    }
+  },
+};</code></pre><h2 id="use-anyproxy-as-an-npm-module"><a class="header-link" href="#use-anyproxy-as-an-npm-module"></a>Use AnyProxy as an npm module</h2>
+<p>AnyProxy can be used as an npm module</p>
+<blockquote>
+<p>To enable https feature, please guide users to use <code>anyproxy-ca</code> in cli. Or use methods under <code>AnyProxy.utils.certMgr</code> to generate certificates.</p>
+</blockquote>
+<ul class="list">
+<li>install</li>
+</ul>
+<pre class="hljs"><code>npm i anyproxy@beta --save <span class="hljs-comment"># 4.0 is in beta now</span></code></pre><ul class="list">
+<li>sample</li>
+</ul>
+<pre class="hljs"><code><span class="hljs-keyword">const</span> AnyProxy = <span class="hljs-built_in">require</span>(<span class="hljs-string">'anyproxy'</span>);
+<span class="hljs-keyword">const</span> options = {
+  <span class="hljs-attr">port</span>: <span class="hljs-number">8001</span>,
+  <span class="hljs-attr">rule</span>: <span class="hljs-built_in">require</span>(<span class="hljs-string">'myRuleModule'</span>),
+  <span class="hljs-attr">webInterface</span>: {
+    <span class="hljs-attr">enable</span>: <span class="hljs-literal">true</span>,
+    <span class="hljs-attr">webPort</span>: <span class="hljs-number">8002</span>,
+    <span class="hljs-attr">wsPort</span>: <span class="hljs-number">8003</span>,
+  },
+  <span class="hljs-attr">throttle</span>: <span class="hljs-number">10000</span>,
+  <span class="hljs-attr">forceProxyHttps</span>: <span class="hljs-literal">false</span>,
+  <span class="hljs-attr">silent</span>: <span class="hljs-literal">false</span>
+};
+<span class="hljs-keyword">const</span> proxyServer = <span class="hljs-keyword">new</span> AnyProxy.ProxyServer(options);
+
+proxyServer.on(<span class="hljs-string">'ready'</span>, () =&gt; { <span class="hljs-comment">/* */</span> });
+proxyServer.on(<span class="hljs-string">'error'</span>, (e) =&gt; { <span class="hljs-comment">/* */</span> });
+proxyServer.start();
+
+<span class="hljs-comment">//when finished</span>
+proxyServer.close();</code></pre><ul class="list">
+<li><p>Class: AnyProxy.proxyServer</p>
+<ul class="list">
+<li><p>create a proxy server</p>
+<pre class="hljs"><code><span class="hljs-keyword">const</span> proxy = <span class="hljs-keyword">new</span> AnyProxy.proxyServer(options)</code></pre></li>
+<li><p><code>options</code></p>
+<ul class="list">
+<li><code>port</code> {number} required, port number of proxy server</li>
+<li><code>rule</code> {object} your rule module</li>
+<li><code>throttle</code> {number} throttle in kb/s, unlimited for default</li>
+<li><code>forceProxyHttps</code> {boolean} in force intercept all https request, false for default</li>
+<li><code>silent</code> {boolean} if keep silent in console, false for default<code>false</code></li>
+<li><code>dangerouslyIgnoreUnauthorized</code> {boolean} if ignore certificate error in request, false for default</li>
+<li><code>webInterface</code> {object} config for web interface<ul class="list">
+<li><code>enable</code> {boolean} if enable web interface, false for default</li>
+<li><code>webPort</code> {number} port number for web interface</li>
+</ul>
+</li>
+</ul>
+</li>
+<li><p>Event: <code>ready</code></p>
+<ul class="list">
+<li>emit when proxy server is ready</li>
+<li>sample</li>
+</ul>
+<pre class="hljs"><code>proxy.on(<span class="hljs-string">'ready'</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{ })</code></pre></li>
+<li><p>Event: <code>error</code></p>
+<ul class="list">
+<li>emit when error happened inside proxy server</li>
+<li>sample</li>
+</ul>
+<pre class="hljs"><code>proxy.on(<span class="hljs-string">'error'</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) </span>{ })</code></pre></li>
+<li><p>Method: <code>start</code></p>
+<ul class="list">
+<li>start proxy server</li>
+<li>sample</li>
+</ul>
+<pre class="hljs"><code>proxy.start();</code></pre></li>
+<li><p>Method: <code>close</code></p>
+<ul class="list">
+<li>close proxy server</li>
+<li>sample</li>
+</ul>
+<pre class="hljs"><code>proxy.close();</code></pre></li>
+</ul>
+</li>
+<li><p>AnyProxy.utils.systemProxyMgr</p>
+<ul class="list">
+<li>manage the system proxy config. sudo password may be required</li>
+<li>sample</li>
+</ul>
+<pre class="hljs"><code><span class="hljs-comment">// set 127.0.0.1:8001 as system http server</span>
+AnyProxy.utils.systemProxyMgr.enableGlobalProxy(<span class="hljs-string">'127.0.0.1'</span>, <span class="hljs-string">'8001'</span>);    
+
+<span class="hljs-comment">// disable global proxy server</span>
+AnyProxy.utils.systemProxyMgr.disableGlobalProxy();</code></pre></li>
+<li><p>AnyProxy.utils.certMgr</p>
+<ul class="list">
+<li>Manage certificates of AnyProxy</li>
+<li><code>AnyProxy.utils.certMgr.ifRootCAFileExists()</code><ul class="list">
+<li>detect if AnyProx rootCA exists</li>
+</ul>
+</li>
+<li><code>AnyProxy.utils.certMgr.generateRootCA(callback)</code><ul class="list">
+<li>generate a rootCA</li>
+</ul>
+</li>
+<li>Sample</li>
+</ul>
+<pre class="hljs"><code>  <span class="hljs-keyword">const</span> AnyProxy = <span class="hljs-built_in">require</span>(<span class="hljs-string">'AnyProxy'</span>);
+  <span class="hljs-keyword">const</span> exec = <span class="hljs-built_in">require</span>(<span class="hljs-string">'child_process'</span>).exec;
+
+  <span class="hljs-keyword">if</span> (!AnyProxy.utils.certMgr.ifRootCAFileExists()) {
+    AnyProxy.utils.certMgr.generateRootCA(<span class="hljs-function">(<span class="hljs-params">error, keyPath</span>) =&gt;</span> {
+      <span class="hljs-comment">// let users to trust this CA before using proxy</span>
+      <span class="hljs-keyword">if</span> (!error) {
+        <span class="hljs-keyword">const</span> certDir = <span class="hljs-built_in">require</span>(<span class="hljs-string">'path'</span>).dirname(keyPath);
+        <span class="hljs-built_in">console</span>.log(<span class="hljs-string">'The cert is generated at'</span>, certDir);
+        <span class="hljs-keyword">const</span> isWin = <span class="hljs-regexp">/^win/</span>.test(process.platform);
+        <span class="hljs-keyword">if</span> (isWin) {
+          exec(<span class="hljs-string">'start .'</span>, { <span class="hljs-attr">cwd</span>: certDir });
+        } <span class="hljs-keyword">else</span> {
+          exec(<span class="hljs-string">'open .'</span>, { <span class="hljs-attr">cwd</span>: certDir });
+        }
+      } <span class="hljs-keyword">else</span> {
+        <span class="hljs-built_in">console</span>.error(<span class="hljs-string">'error when generating rootCA'</span>, error);
+      }
+    });
+  }</code></pre></li>
+</ul>
+<h2 id="about-anyproxy"><a class="header-link" href="#about-anyproxy"></a>About AnyProxy</h2>
+<ul class="list">
+<li>Change Log: <a href="https://github.com/alibaba/anyproxy/blob/master/CHANGELOG">https://github.com/alibaba/anyproxy/blob/master/CHANGELOG</a></li>
+<li>Github:<a href="https://github.com/alibaba/anyproxy">https://github.com/alibaba/anyproxy</a></li>
+<li>issue:<a href="https://github.com/alibaba/anyproxy/issues">https://github.com/alibaba/anyproxy/issues</a></li>
+</ul>
+<h2 id="appendix"><a class="header-link" href="#appendix"></a>Appendix</h2>
+<h3 id="config-root-ca-in-osx"><a class="header-link" href="#config-root-ca-in-osx"></a>Config root CA in OSX</h3>
+<ul class="list">
+<li>this kind of errors is usually caused by untrusted root CA</li>
+</ul>
+<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/CBkLGYgvoHAYwNVAYkpk.png" width="450" /></p>
+<blockquote>
+<p>Warning: please keep your root CA safe since it may influence your system security.</p>
+</blockquote>
+<p>install :</p>
+<ul class="list">
+<li><p>double click <em>rootCA.crt</em></p>
+</li>
+<li><p>add cert into login or system</p>
+</li>
+</ul>
+<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/bCwNUFFpvsmVuljQKrIk.png" width="350" /></p>
+<ul class="list">
+<li>find the newly imported AnyProxy certificates, configured as <strong>Always Trust</strong></li>
+</ul>
+<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/HOmEElNGdoZEWFMLsTNT.png" width="700" /></p>
+<h3 id="trust-root-ca-in-windows"><a class="header-link" href="#trust-root-ca-in-windows"></a>trust root CA in windows</h3>
+<p class="img-container"><img src="https://t.alipayobjects.com/tfscom/T1D3hfXeFtXXXXXXXX.jpg" width="700" /></p>
+<h3 id="config-osx-system-proxy"><a class="header-link" href="#config-osx-system-proxy"></a>config OSX system proxy</h3>
+<ul class="list">
+<li>the config is in wifi - advanced</li>
+</ul>
+<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/vduwhobSTypTfgniBvoa.png" width="500" /></p>
+<h3 id="config-http-proxy-server"><a class="header-link" href="#config-http-proxy-server"></a>config http proxy server</h3>
+<ul class="list">
+<li>take Chrome extent [SwitchyOmega] as an example(<a href="https://chrome.google.com/webstore/detail/padekgcemlokbadohgkifijomclgjgif)为例">https://chrome.google.com/webstore/detail/padekgcemlokbadohgkifijomclgjgif)为例</a></li>
+</ul>
+<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/jIPZrKmqXRaSledQeJUJ.png" width="500" /></p>
+<h3 id="trust-root-ca-in-ios"><a class="header-link" href="#trust-root-ca-in-ios"></a>trust root CA in iOS</h3>
+<ul class="list">
+<li>Click <em>Root CA</em> in web ui, and follow the instruction to install</li>
+</ul>
+<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/BrugmMelGVysLDOIBblj.png" width="260" /></p>
+<h3 id="trust-root-ca-in-ios->=-10.3"><a class="header-link" href="#trust-root-ca-in-ios->=-10.3"></a>trust root CA in iOS &gt;= 10.3</h3>
+<ul class="list">
+<li>Besides installing root CA, you have to &quot;turn on&quot; the certificate for web manually in <em>settings - general - about - Certificate Trust Settings</em>. Otherwire, safari will not trust the root CA generated by AnyProxy.</li>
+</ul>
+<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/hVWkXHrzHmOKOtCKGUWx.png" width="500" /></p>
+<h3 id="config-ios/android-proxy-server"><a class="header-link" href="#config-ios/android-proxy-server"></a>config iOS/Android proxy server</h3>
+<ul class="list">
+<li><p>proxy settings are placed in wifi setting</p>
+</li>
+<li><p>iOS</p>
+</li>
+</ul>
+<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/tLGqIozhffTccUgPakuw.png" width="260" /></p>
+<ul class="list">
+<li>Android</li>
+</ul>
+<p class="img-container"><img src="https://zos.alipayobjects.com/rmsportal/YQtbQYVNuOszZGdAOauU.png" width="260" /></p>
+    </div>
+  </article>
+
+  <script src="//cdn.bootcss.com/zepto/1.2.0/zepto.min.js"></script>
+  <script>
+  window.onload = function(){
+    var itemList = [];
+    var targetMap = {};
+    $("[id]", ".main-content").map(function (index, heading) {
+      targetMap[heading.getAttribute('id')] = heading;
+    });
+
+    $("#j_toc li").map(function (index, item) {
+      if (item.className.indexOf('sidebar-header-2') >= 0 || item.className.indexOf('sidebar-header-3') >= 0) {
+        var targetName = item.firstChild.getAttribute('href').replace('#', '');
+        var targetItem = targetMap[targetName];
+        itemList.push({ target: targetItem, tocItem: item, top: $(targetItem).position().top });
+      }
+    });
+
+    var updateTocActive = function (e) {
+      var windowHeight = window.innerHeight;
+      //find the first item to match
+      var scrollYThres = window.scrollY + 200;
+      var target;
+      if (scrollYThres < 100) {
+        target = itemList[0].tocItem;
+      } else {
+        itemList.forEach(function (item, index) {
+          if (target) return;
+          if (index > 0) {
+            if (item.top >= scrollYThres) {
+              target = itemList[index - 1].tocItem;
+            }
+          }
         });
-    </script>
+      }
+
+      $('.toc-active').removeClass('toc-active');
+      $(target).addClass('toc-active');
+    };
+
+    window.onscroll = updateTocActive;
+    updateTocActive();
+  }
+  </script>
 </body>
+
 </html>
\ No newline at end of file
diff --git a/package.json b/package.json
index 815511a..5c5a6a0 100644
--- a/package.json
+++ b/package.json
@@ -30,7 +30,6 @@
   "scripts": {
     "test": "exit 0"
   },
-  "pre-commit": "test",
   "repository": {
     "type": "git",
     "url": "https://github.com/alibaba/anyproxy.git"
diff --git a/sampleA.png b/sampleA.png
deleted file mode 100644
index 0c4c3794159d9c4724aef518456289a446c5d1c4..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 17215
zcmeHu_g9lm@b7~tsEDWts5C2xARs76w^xv!1ZhD8L`o=z5(r=~2&hPt5)~9lAPGf6
z3kd=uH7bS{AX1~Dmk<a9?i28P&;0}LFZbN{IVUGM&(7}7&d$z!W@hu$;@U;=&3iTj
z03d$((m5*t5RnCdbrBmyz&F^s{5J4wliww~Kmd?FB=`tjwmLWo0GrJ`&z`lgxP`cb
z2)u>x+k5%!*}Z-N2zO6!HvkCfO1BP%#dD>NnOrvs$eE7G{3P$Y!2Scd8^3L{d%x`!
z;PPPGj#IS{pKONgl-izl$+qSmee<RCC;e{^mw23h_T+lBt;5N2#qR9SXw<~m*kb!)
z1uKoU)DlXQh}ynG>E-bI+kl?cLqq)z#W?dzHTC4EbyAmpuiv|Exbcg}hFSoa6b=oE
zxI;8q5+Wdgb$}mT{oszezLooB7D`ZH?@QqK{v9kap%+%bH+7qDJArSz0HSr_&CS4T
z0PqeCKeHdeiUXswmyI_79XavcGC;?Bxtxtaj1Z7=_~OBJr^*4i?OiLib<{7w+uT$8
z)z?$;LQ!_bS{K(vkv9NAv9K2sr{F+T${DpLVDHIwz*z;!X5qc2!f!QyQhw(+`#mhV
zBm__!6PlB*{?y)ClJI>`@bu*G{(b#lyz|ev$f#^{-!!;CEh+VY<RzA{Y0DM>*t77X
zYWbwe3)b*p->^H&dt$cs{j%32V!!deDduv;^L6WiZP#cMUCu*8ZNh$aLPR9RE5{z_
zf&jOe3y#{1O>eJn{*GFR4n4VaN+IK&#WzEFxy@o?V~1|MBWn&s8?R{hA$~_k%z>@T
z4Admx|K?Om9yRkm-`~YI2yYe3YFvNjm@k)gV7cyLBtKT=NB{AB2Q{f@Q?REc7W>WW
zLQAb)p4(TS(7)qvq}G&TB7akSusD$W$eenuSoCwFH#K5hXkGMH*v}x~RK(2D=X=Cn
z0^2-}YlU(FAfB=icS=<VXimx+0Dy`=yBt2fmNEUh5dhA;y?casT69a*&Rpu&v?}=u
zs?0hUk#ncE9Hbg<J0mg}CAazAuEf*3ZK(Pk>pv5P_q^Tyrf*wO)v=S}tlv8v?vD7$
zh`@JceA!j;Xw&-B-!@9R?9+d;{YGrZ{+5k0DY5JKyIeZ{Dk^L5-zPgQ_t$<4$Xb_k
z=Jrd+O9!Tp2JF;}aX7_$!T7dU>)Fz?ii^iy-z~5d{<RKys`QiMo@Za*2L8BnT*5Ib
z@x9lNJw*yeQN{1Ge_Z{8yaS-0#kxlQIJVXOd8doR^T+4mPhoqM>ZDzVU?(7PCtT%W
zx<OL1)C`x2jR)67M@f!ubb7Gui}$@3FD}ANVP`)b8a+_7qiiE|)BOj>z9{dH|72ct
z2(@FOCgg^G{tMWJT&3}S3i~n+IVo?IbdJAtaBKam!E2lM9eSa4S?sdcCB~(rS=L#`
zKeu_NnJSIE@Tu<|+*lBmyEo}2>4n4#^H+=Y)q|v+`n6B`O*g$iXqEMP$CVRqCPV8#
zV6@Jpyv15J=Vbiah<&1uxqjK_ZIFeA_2V4L<H$FMnp36EHf9~oq<??o>EX$}rSbPp
z*`}WR3g?r)C;jyLBl?&1_x^0~7V$^o_v<d*IK10yci8UiU8LO_DW)Gcv?ir|v(aqV
zl1=eQmPkg}!j8-x372}=up>b~0g@1rz{1+t2HKj?L$P8uI9myv69oP7f^DJ2K+dLL
z(l~mKylr`o4!*@I*ecF~X6c++>CC^!a}_Um^zg#lN0%~fTuEPd$Ly2-s^vBXJJS{b
z5gt+VN;bP;U$8K08nj_iHb^7P)cR~7);-t#rF;6Yf3wimulc_x^*Yn8wCrmUZwWgp
zeAMJ<e%tLl_q>Qa-7ZvDW!H_dfHCQ@k**1(U;3$ZwRDcYk3JW<sZ6KLvg~0Q14&~W
zx4Mpm{@uiB;B5Wd^W!4NXEu`~!=7lH_@St)d3>YJi{0MGPP$Guy>R{GmF!vaWAZ`Y
zr|pfm%3jvo%KULTQ@KQG{ISQti4YlM_gsYBjojnCZrxsnE;l^27+E!0wS$!^&9A-Q
zxR?DXYQ59c^i8chw<EWHG**wE=9S@6*;&C@ih20qd|K_5Xr1V~#ID5f#tn&PiQL>|
zh%qD-!hy8sUT$+3Q5*4TgL+%YLQ}V->Zdjqf67bEs|iZ=VeahT8K?47g=6j8b!>EL
zbo1z&QIRpdIhVOZb3Su4`6js?@@)op48jBMAe(}`{VGPX`i@uU)Z|qEg?h+(ybDa9
zIU)1$>Wju5NkK_6);`(KvVAeA#)P3g<7GcTw{kL5%Tv4aI(>fiG#S;Raf@c^sj~Hs
z)kYJiXD7L^e*dO{^z78^FEcM#8csn@c20|A1@po*rHnRBpKpvB``_foFu1<4ksGh&
zudwk~<8>Gm=5gi6%Kc2E$^#K?5h)R(OBss>yheW9Jf$ymT6*f*2Dng_(2x-M?w-4a
z!d}9P>r>W$5IwOWW<$A%#uj6#Gg~%^+bIUbBd9XdvJ0---5zRhen>TJOqaSY%hPO9
zGF52X9{Y&4k-04b@o~ZQZ&UHcC%-RxKPgf4+?^t`fZnNcL<_6Vwk)!~<9~;%)|NYH
zx9CBRor=qOUTVO&T^tbPk$c<Q%G-4`wIr$pTXHw#@%;Izq#bu84{jQJI#|<DWAt<&
za2?D0jdt4L8=J&CuK1zu_oXt!e_I+ef(`9X*u4lp`7n7$Qh~|P{k>-_G<KN}W&4`R
zOHMyXeQ18Z@_o#E%Y0JF6~kA<>5zoElRXCLv%Fi6%r79nYHu>PQVo5%`&H?I88gVa
zw%%M?r+?>Bz1L~4(=x5ZJrj#m+cimtN#^dVs`283p~F56vhj}_xPu240%sUf-VaTG
zWENTBEw)OVYJ5@+vEOAMQgVrW>H05iru#B`;egmZ>2UH3qD2X@u%jfzZtC}b%K38X
z1JTwp!Rp5xt;%kOcuxLAH{NP2NaS1e!>nwlZ-;hI$6DS0`QgJ^)qBw62|2Ip8-4M!
z*GpZcToP{DPTWqS+e0Fc$Rs%D`sIGY&l4|{4EIB?In%>Ap*~$*y;n#LV<VSFvPOJ!
zxpox774q%V^zV-*#q(sRVuoa$eXjK0d55~qiES=wZfF)h;c{ZkzNt8uG5t;_a}Jdr
z>DUP2=ix||ol0G8l%C+QnXUKbr3`u}UXNCMRt<rAk<X(!zCXwB^~CMDAzMZnj_4`5
z7;Ijf5f}C$Omy!2#K`SC2=8tJg;KD|$4Vzg;gY`JP-+ySD|PHm@Mpj4N49=BJyfO4
z{1_fKVDaZ&OLcd3GczTU#MwA<DOB~RJ_VV3G}Gs;(L3_QpXZtB@=o#>D@iL66UPQz
zk##5Hpc!w|4;xJ_4Bm?$$iA7Kk$%m@=vPX2DA#l;#mmvsk?e7nmSG}uXWW$J%&nj4
zWyLv8R`|{C=iXo(B3;ch!W&(T@Z<MgBG@BF+_;TnP(%EkS+fy?9}}&SyxUZIVEcT#
zx+5l(Jn?l@mgK9{BUf^$j58lJHzpIjdEB(y5fv9gSgP#evqgCl?8u_!d^f7k?|C>C
zPOG+)nAp1MamMoNmDb07KQA_2q#w9&ASNzdQBhWW4|)1#OMG8;LAE5VAp)`zIueLu
zG5P(AS81@Nj!ChFXc`3{nllqHfy*K2*Bz)+tY`@}n)<ku*TO(gluVQ{>&S{JhnG$*
zTg?36xz=TWH|H9&!k3pcxDRF)5B<bwgJ^TF>m@5Q06>9gGwMD7EUbXve*plg2>@(3
z0O%(JfDGc5bL|BHIO%=)+-aMTuF;;*WVg`M%$49{)mo!5@86!wKV7zceSU(7?s|8N
ze(BoN;`ct?wAhhwOTpv4(v6yL2Y+na@x0alsn~_xk}}WFWgqB&lvgCSeH3zQ+jg5o
zcc%Lz9^W4q**e>e#bYP(%D51+6D<&Pmu=7b#Sf?HIr8~wZf;2A36Niqy|J<w5UdD(
zZEq0ZW&nUcDG*xyvFp9}>NoJ{Fo>(cCu-k+B%m1nlgod~@ZTX3=)ixLVO0wMDZ~HU
z%8>L-z<*Spe)yk1-$=|4`VMF-<O<u^%enk4^64Fyv$~K8La!yclGn&ip#NpxXE^@J
zX;nVhxXn#i(6hX+fPIWEV;h%e95m)dEeW>uz&aD0Z1}#Mefh-H*Wv=A(X4VC^Slg*
z(K$Jy>tg5Gb|+?AmiK%go2LXlLyetjTJ^p`4bbB$v*Aw9L^_U=a*WGSr;!!)Qs;@P
zvI>Ghnton{m^kshIraTfr3-0nD0TwptGqSn)vC*mveWOr88DOcKI);L9Y>xnh6{Uk
zKYh)M!yyV*{0a7_!|=ZF%N&Z;N#fZxzM8%$>!f@$JiHkO!_Wuc{Ro!YQ224x@xy;P
z;uLY?%9~*!ao7w@sf&A)$Oe!J>Zb|cfUn1ia+PJMH@lKQTs;o}3}Qh6!^_Y@-i}4P
z2JsNzyy(7o-O;g_A6#r=0;pwNgsj+XA>OIX=6z-p&Q+-$mW3U8EFn*Jjel&0zRsbt
zU9sghBpl>mjq%)Fwh>(x*J`FDx-$6dujIsz=B+S0Ju4&DJwiq<zVq&9M<++}95W^@
zH#U#lflh+znli2zm!$P{7YCshyT)h*hOU%?>`1pxje$yLx8~4E|6CL=bY+FD;u_gk
z=|@C0zvenv$}>Ic7WtPu%b-0Uc~JV;d7-N;C%OqCLuIr3=}xNENl+WkraJU;Hqc!t
zP1PSOc$4okHSkV;?AfQ1{mD7Pj^P18(ru|FDZ`hLZVe)gwtjEt@&&sN3`27U>DS<Y
zgFH}IkE|5!kTuTc86KnlL|x%vu<g(8S!Q%n&lrHiD=Qe^nXSVyam(l9al3bl6ZN=+
z${gNU_2by(?!L1Z75BgT5a5=I*(k!0A;w?x?KcuFp6BGLE5aO{(-#iG+(og<Pwv`H
zCJBj+fXvZ8MP#FHBQHLs7WWjRZg75r<3uci<46TH_LU(kBZ}+ulwzYdf`eWCXha(N
zq6*U~E9kp1G1a{f=EQBX6(`Ds+aaIs+V#O3-X{n0Rv_Ty7H5f_d2pR}AeY_6W^Gl}
zM@jgr6{)61DE&D>H+s{};5}1<q8wk^E4wVN3u;R-t6))elE$ziFkej9pxrZSK$sur
z=?(a64;`X~pgWhnfo}3zWHeb77pDh`AtC!3CM5o3@lbasla)Gjv%V<oI>y^d+VM}f
z-5+yZwc@-DjLM*aLZS)DWmp?OB5&SOG!>|?ZZa_+;3w87l2~0GxL-AGrj4CWkMUZp
zmB+>9`jXb0EIMKz+hlJ!aNxDL+H-Ivz4^RSw*Sv4d2R}Q#SolWCPN?H@6+G$o=%U?
z%XP?a^ddV=E`F(3f=U*N7863z(sL}Grk1#o<E(~9G5Fgj{i+sq%e~=xayx_;I~K7?
zwiF2eH0P1hA)aVz_p3iGbTUrVHqKXziPTus4ofMxdwzNe+}2bDJN`Vl4;X>&q}B)l
zxdS(#igMk*X|Y?>WntdF?`k4um)Y64mA0&#Fd8Fu=e9@~pUXC;Lv5HAJ&{5t?RB!(
zFO>d@c}Seo{F8lUT~LpVZmGEeK)vwM=;X4)OTT>9iL}KTPm+Cro3I+m;As?kn49WQ
zyI|f`aw~aQoGxJ#hh1)67g1~=>vTayHo06N4+^UIAl$cd2Gku1NnwC!c2Q(S4(1fR
zO=$6(IRpdcxBL$1g&7s{cx-vG*#&j&n&$zshoq|t%jP>Rs4dIFeT(3J@-~3`2a^)j
z4jR1Yx>Tg?s$tm5xoJ<y`+E1Ixw|~(2dgB!VVY*Nk^9^wBQqhv)8h)p6Ulj=Pf56M
zM(JrzImC>OGhJ{Dkj8kD2O5H6EoB&AgHWcixigD%kl2@X*-N>i8uJqn5_wE6J6K<%
zF05mZa(;nxID*qdS6gXba;1A=F^K8Ce@j=~eUf*B+KU(P^@81aNGOoIKxf%#NY%PW
zY_Kn_DC@gNP(X}GobPGSz|!o(@>tK@b@MBwM%?_p$5>>)fWO}H_QCQvd@kOLx4z>9
z{c|d8#ny`u)AEKK;e%$>v)G@95XWBz<#s0SDeNegc3FHg<WcIUSaI8D0qQ%Mq3z`w
zm`kS@Ue%m482a7CDw*Do85-@X4DfN4#1_hNaoOHUtVE>W7>(e~kB3~tqcif10kn2q
zf_*VzOiDtA`KYelzt1>gVXNs8?_%$h#HZXQ0|L2#Caf7&hm9nkZH(~b6tN%D$Idku
zw4TyNINSF)ZP5%?HB;|<V0W@$u5r3(Q>w7p=0~{p-ooC4eSvMgg&FtFl#UZd`bn&k
zfHAUc9-@mDdbU+8Ud-|HTp)3#MUktjJJk!y3E}3ZO7iQx>KbXwnf{FS)Q+!W^+wX~
zAw*d#X`(v*YGo*~I(!mhx+K7N5oOk@Jmpa?uJP69$u-{>4EKWc;rVrgLm?8>3r<$(
zk*$P*B<#e_6Jd7??v@Hpx+7NO)q1t(G!yXm#iw_7cQid%4%C^-;3yf=%r-hz)?!8+
z{t{C}Q+kQDL*??nTNvXd=1Qu%(37Jd@|k}c-bJG`Mv7m~`1*?4^BriNH7vaXow<v}
zFWbc(!}o`W%Q`i&6dWpBU~;LiT3<T$uyjerbzy+c^tciY5<*kY9We<S!JT#aTN1Nl
zX7&X;;zra%e;WH1XTRm>8&1ogv>?PtbWa?r>*#?X_HMaUa_x^#_ea9VZal2&6klHI
ze$X$K7nvG^V}!h7cb7O;(ny4!JHPi2L`+xsn-sKgDSnca;L*X3iQ(lCyk<vJael8y
zsqg7X^VDMTv~qMysr`jK-Qqfp0Edo0B>^8}Xef%WkAa~!%O^yk?)8C@LHY(p=hRWP
zK#kEEK#ii9=aheSq^y*uOV8AHZro8grDZOGsnY6o<fAw|`K617YWKr*Qw;e}s)i2B
z2DPKOnwTKWwCh;Q`V}>Kgw}S{cqO|v%^{5T@}u*ZUzP*~S$DzXI3`TGrqeg&P6aC6
z%{Uvydu?LS!6P~76&J@AvdG+rM~6GVhWRXBM|3MQXl(XT$;5aMtf5CkiJZ6F5EcTB
z%PWi}AD<gZ_le+l1w}@L-hm$_;64ue_brodwcve7?M|AIR;3)8TR@N)qrG$pv$7>B
zur5I?`mwN=b0n|0xX)hZR4b{ko)_nH05`%Y^$?d!3m7#ieaiKT#9+*v!aOme@Hudq
zlj?+-VC;%LI%D1r(jYSY_xo=y<vofG!mnl6YYPxU7{T}<@uEhEcI7LtcI$N>jqhpK
zA$y->9EI+ZL!dhSmT$HWnVFQ&b_cXzy7gOczW-y|N}H_2{+0ORIFb9uwFk9hs;LVl
z!<kbGt9^+q#?<Qs^;Kh_&^S`Tbd3_pSx?g~ygfCf8$1$z>HNVj@B5Yr&b_mnX3wAS
zp_q^y9SU0_BD3txO9<S(e>jPex%D-CuQyJ&ywS3ioMbsdaiKV3u;Y1viSbaN(}_dn
zg{j?j*IJH&Rt(h3pX^z=w#9p(gF5CWJTsdw%v_9R*9-jN!(A@@Ao}qT7_uz(InFVL
zLsQ+Q0Q1hALYQvg)pW0xMW(WD2o2&(E9|ZLE~yKv%lFj_4C|W4m;Uw|N!Z`+{i3!t
z)ifYq8}AU@t)aH3#m>>FwV@&37u`1f@+jUT(ba^;pXy%JK}~S1r}fIIjM@`2ofEo?
z+nAiq_f&OY%blN*4kc*$?rEKhh_4=Pc6C~&cQD?g&ysr@8mAPZVwRZ0fub=?FD({Q
z_bgS*N=MT?SYf_5>F}Q4ZP(I`rydF5!wt@Jz0oAK4AtSH-azOPhbE4_!+6otcLS-g
z_RnU|9^SW33|`Lq3Hl0YC+639ymD$pu}0ysqwU)CguGnuS#&F{0n_dNcm6eZd{%I>
zPL7odv3z$I_Kp?c?cV$Jhsc;%M-~nQ4CxO<1V}cTXjO<KMyVo=2F7)x8i^yFGsXi|
zW@-q9P`zGZzhjZdvpJP6V-w`ZyVoVYEVvt5#;0;Cox+KDN=9qMCYJZy^R~RS6Xf2k
zUU#wRk@9)FZzFlG+VLnQOi)Xazh1{I&Q@oDDqT!)lV9XSjI)lX5RG(GB8qDxl&Vp&
zW50_(C-|FGo?=Yy*9+{8l;~m!!Ol#4ax%z9M!v02ODeegA<G+{0XYZEHP-TGRk?ZN
z<xhi+?=-Y;wZRx<Vg`TfJ1=%`F!ebYP3sw)M%?B<eOK-spf};n8iCqI=2v;-@Jh^b
z2R`1Vm83G-e0`nEr|gOcrrFJ@^LD{uqaI_CHqIx8MlOCFHCJw*yU#R4M8Y2UV~X=C
zy?mC`iz|d><;+`XHwH@zE-@y3OFbngO1+O#qWRC2gH>4k0-8qS#Pyl$Gnk?>UXU>0
z{j*a^;z>r5uI#$RIRcMPw^h-U0goNpj`PGPVsS>W%}1>s<Se$GpmPy34D)mlQr%sg
zSESOgl?=#wfS7GqMyE4(R>v+e23Bk(64!?{;c(`JUgK=eiUlVo5H=Al7^L<QW;<#7
zYUc5jZLoJGX;)?RKDeEVEbu#xPWSj+Ru=H1eO8pLfC!Mq+Esis`owv&TRk$7(CmJ!
z*}XTgR%AqPg{Cow>epwkc*-oOr8?G0r7k@$YzW+4Ot3>IdS+DSppkrZNZ|k})s@mp
zShO{FmK_-|i+nPBVX@AzxX()@5g9HypoenMOJXe$vJoiIpSbeeon(y=EZ$5n*Hfmm
z65sjLm@-qBO)jQs40{cB7|rp_D1X-3Pj2@jgu-%+ziuPu8WsuxFp&{6UwO|!iCKq<
z-qF<1ljBu)hYGc~s((i%x{cEAG~Q1j7){JL_73*_Z8aXTHB$=ZGW^{N8SM!@ywg>6
z(%!PYo0RQWgzA+^e&I#}gLt~95(VdA^>P<arG~}sRXYgP0f5HeH(QlO2;GBR=h7A}
z8p+Ai|7L2VhfXZQU?L%*y{Mo7RW-sk!@H)`Ewfb!o-I<_Fm1D{@>})s-hZZ%TIoGH
z4ul+tMu?*ktGlJ;581<`l7=uAm?!n&LRL}lS$bVG#_a<b5+>GitSf`E>O0$I?Iv=^
zJmbw;TZ+io7-dI7QwrX|vnv^N5N-pTC<zITjINstPJ0$vrlIm3zxf`FrQHi*%|!#$
zp}ff9<po!hVsYp2-S$0?Sf%E8u7@%yKkc7QF~pa(f+jHzd$opEU?o^!KMxFD97klf
zLQkaJN+0f!Zkzh@(Y#H;&fdg;)loKJtg_SB$8CrzG7u3S&1lz(<#!_I9>&P!qkC?5
zx2wu+_0^nfM|jFQManZeAIVguL@%wx6#wXHS+!w?MBb946U*rOid`UaCm0h`3r_Za
zeOQg`(Q-j$)j#-wl04gf9KB<d_tE^Ge2(v*L~SpL<E1zHAL$sorulo64eb_Y8Cdju
zZ)iZ~<(hs)yA7RERfXDWAb5idQxIsoK`KfkhF?@q4}_kSOM5jC_$H!lz7rkbpjSCQ
z$LXs}xbNk<GL8JY+@W8W5JT#daIU+nRQsLBm~6{H`n8Dn@aE3o7)_&t=jYmEmRH=9
z@?}HE+KeL?^gEr6tH(kJxvl}WU3rK|Qkie*7Ghy#UJtr=tbHg{Tuo2ni3pHb4|;)l
zvs9ZhY&3@K82>cet9_v`Fy5iH<%JOxPF%$MXubQqTtdk8cGqk7p7aRw9F03cHay8)
zdQ|AOSanyY@_paDu|7T*y4QQIBp~SiK*MlxUvsIu(6oMeRX(yS;&X!AsJl}v7jS4g
zfb+1SF&-j~-tvN87LGb}0)Se4AzjL6qN%s7a^hKZ1*>arf<MA#mq3ls_i=mXx;hjQ
z15YP}^GsfbEo;p+M)<k=Eb1GSpfftBd_qPSJ%$EFF#g)kUXmDB(sV$D=<geq1k^7O
zTl&)DY`8mh8?Ol_Nezs*Xh%$etC^8}W{&Xk*oHZwCT1`m|8$T}Z@zYTJRzUrKK3~s
zGto82<li%gaJ@#LfpUnM_<mQ$<PEcD7)Ryk=5U|jxrJudDuNw%;NL`sJWh<f3<ki3
z=bN2=>s$edNRM*P`i6RWr{&H=v>V!z*Xr8smQf?<8}WsO1cxxQ@(m3szIu&|P0}We
z&t^)c_+I#ea;oXAbZ`FSc=eyfpHms_*TNIU>iE;X{4MupNZBJK3$3QG(cmwog~f#H
zjkhzyGB6BitaxmzS{?eP9eDf=LCZ$ysPP~2CK;X`=E*Z3d01;T@lFO5G&6B4qp#)6
z)nQHsr8G=WKNC^d1x@sqFE3Sy%9}4?vv7ozDP~SEF2mmFa?PleDh`LUf~yNqMFD#|
zV`+{hFxd848?Cu{Uf2odFbSiN<kbj&C`qB5hTbHGs8_5k)w>($`4c5DgZk>zdZm-x
zc8N&8Kb_IN>YgKu6W}TLq<IpL(k4m*S{@^+qy5XXV&ptgcm0AU$<eQp2Kc`6luogg
zx%mOM^}#A*|6*PuJKLR@dzOwITRQrtxL-zK|J@#?Y{!E}W(C%Jm9jK3_~3g=aRhRG
zd7+5{vyUGP9-(U!%CV}9LT}fAfXBV%he3B<Jxsp1e)NFon{KPW`Si$7%igk$B^NnJ
zGX)XyE!wRR!an!cYnibzzi8FDOhQg&F7E@Ig=LbzRr=K_LA91L*{V2EwLdIW^gFlz
zp$$pj*pWSMh30gPAn6zz0>1ax;O4swh@vI>4CgodG<{5FNjqI9_qo740RT~+uubR=
z^K-jad8xkJ;oV5t?W?cFm9gBXLW#Z1<E8q-|7vI*u~4^rJLc{s4enNJidy9@5wsi)
zn7rKFa4z^m`SN|e(j1;0m@X<*)RtT=xWTSTU^8sVR#Q|tN9N$W5^4bNKKsKBxb$iU
zkGQl`qNy<zyRu&dcD;SLQ?+TWfHx;yD_lOdKwps*R!f($rR)`PKMx)h00>L!zuPkz
z%TA$-f;q1NGdc-^dk=@K4Q6s!q2n^el7ICW)v6?)_mxe54^LccS^=9jnZWo4$EauQ
zeF6^s)OdQ&&RQS>>hi}Bcp@IZoVN?Uk4)iZ(<PqXOMknXMQpJ&)D&ad8D*kKhv6<u
zW}F%}<=MS|S;>!JV?PBFhj%)%Ik{X05{Gp<xcOf;vt(DTFk@<(Jw?~GiB#X(fuuk|
z&>=<ls;RoRIxArRE(EUH3w4AV6`-zjUVSDA84P&GKQ=LWhce}e?ROzL99ai)2TxTf
znnSgL!d1nM;6|WOsPmyc>YxBF;uHxAFr#Aq>tMc@z#gZM;iN39K8Am)7sfCld>@Xo
z86LbIfV^PXbbocLk~h=}r%t_NCwLLw?A)U0DF12Prsvp<t=};)L+m-dZH{Cc>D+Tr
zdbqhtP%%wD0g`j>vN>KFKw>gDf^-we1a>D7Wpr)|02ZS}&k6F!<+arxgy3;&$~5yf
zM9{ptQBA4+LO^2L>eR4<&qM*(nN@v&TdF7k@XM=J*(f(bhYf2P+r${KgY@&Y4(@^u
zz*+}_g&{yqTkAl+1kPQ4X?2ECBuLcZvPNWL2@-8Bu~{$JQDe^A&+UZ}2*k<G(b<tw
zR>nK>WAvGUEjMS}o`0X+LU*GddVg2E2S%o#!Z<uOlAhXDDH52uy60Hbcp!!m?Yz_<
zF`yffDT}D^r=Y`YtH<X%z(lze{VZ1WxXP}mu`mxLR^JYcW$o#VnlHX<ySf6x2dRC(
z8bUSP2U>B2yvm}oq?7QE<JXPC$2c+c6t)Kr^J)2v;i&X#_T7T6jag{oFHJeqk3zL8
zezs|9i-I;znYCG@qnST$fJJ<YC_(vh-1CX8t9ne0_yF&)Gbez#=v$UlhwjYFe<z2`
zu27tJZZf#MCKct)kJ5v)l{~CW%ytsDDOm8s<EJOWYOAhUt{(WX^m{H`xlc|OMov44
z7V0_6X7P`UBCU~`my%Dc@<fzT*%ic0w?0mNABI8(#((KM+yCzrQJvnwlQ9YGP?bIK
z-G-ScG&1jS@}ad}O*^+l_hH#ywZPSZFkC#{-%?X`ZEHFY?~-n;Vt3w%`Vhcii{fZG
zz3N-REH$`OfST}z>i)8iyi1_TSQuoFym`G<({!!n2-pJVUTwi{95cGP4MJ)|=9&!l
zTWYE$MLP7@Z6Owo+oN6LzX+{asHjkDO|@(TsQETwH8R1ple%S1YeFqF)hOnk(|)($
zrDzn#pFVQFYU3K)_B*$PHD-JGZc@KvjlBH1;GD^f5%%#%Z}<z!HUM6gi^t=^E2AaJ
z2?+`GLkpHtTf*A!pQ9RcNpwXUWh@kez#D(R*}}oo`Pc*W12W-}b~#&ZHMFvxTdYdE
z@FToKarrK2lAWCRmpC}OGh(t*wrx2qiM^fPZtHx#Cql@il`pRPZ)s|Wcg<nS1qslj
z^kAro6B!}K<l>cTtHtRa5T?Bms>+z*D6a93I!I;L9LeBG6nb!o-ikGmcW9Y_INP8j
zIc8wObNtp5FqtS2a`Bles$LRE)-Qv@y)le;k?yrd2XbWS5)hJO6fH!yy6Nz$H2jWj
z7J*ZEV{9*M@Hn+#<?83MIcFGZZ5#J&5GFFoWvBoH>*HxNOYFOJ6R9=$0sv{5a3Hy)
z6!eXRAQwlbr4bfI?67lR?byNGxdkB2HPQ*=Kg)XUjLLa-`GrmYW0iLSZNb(Y#o*9%
z3XJd1(VQyGU28HqybI7_N#K~wA!Ni`)aeG1RVxGlbLty}scn1|av-g3v68K|8oPt5
zr1rjt1G@rmTpL0AaLU+sA4R!k36>u<lnpW$!-Wu1TFaP@d|Pm&HD{R^e@_TZ)IiAS
z*pU^3v(#0@4p4W1wIB40oq+o|-%O#+P-Ei6dNmy52{;r0yu}*WkWy!OE-Iy9ER3B0
zZn;nJTJtLR)3_5k^x6m|35@$nSB)3|?~kSPhl|Dypo$(FVPFPGKpJIl7=CSpKhKu@
z7b1Y~y8Hc`S#vYc<D~`b64%OMz;9^@1ef4jg67=(@lRX;Kq~R!G=YFW$worbsB!I}
z0F!-{MfGE^gQ^{|6Ie)1i`JSc0>VqK;#M4bJY?E9idb`Ly;Z0Q&gSPO@hRecS?gB(
z00W0R*X*?B>wx6(WAr#%ZpU4>NLP;c_Cn~|&6$qa)bmv1sTy`9R3hWYv^p;0E$^L@
zL}sx`q4NJwaHByT+)ft<wU8mM#=6C6q?5WZonEV333%5TfJY{fz^2$z?2JB_ag`_&
z1?<37!<D{6^dYhN&R*Y;-AM4BH~4fsqDTuZ{yNa^6zNFL)wkq_auV5SGvAmyB(@~h
zJkJ=%d%a=Bl<<E77_gqvZ2}83@*i7aI-rSVS^4%y$BOCf*L^qt2Nj*P?0LO#=p^fv
z63O(s4kBmy*W|GVZCMxuw;xy(1vd~Hd7XS=3vqUth`PU8LbB_*ww{P*2&$_c8z%6}
z*}LF>`MDdDH@FEmvaQbnBfR4Rq*OlW0op8T0Lq6$sig`^gOIpSl}=myRGl4+oVI{!
zsUGSE8YtK`8m?DK#Jx&590pOPOW1PpP8NLfr4H6s8|Uk2XJ2hlJ4W#=8)pbQ>o7cL
z$&=%HLx5}43K_Ocd$fJL$lO`8D;qoFw%TyFfu2`W6!b1Qo{J^*XGwm2T9?83s@%h}
z9b)5^a{}BjJOD!$@vd7^t>*FUm1lSDrq^n;7xExX2Qq9YaWdi)k9z~&wzfr0U&?XH
zAN-=u&sEd4Q+Gblv|iIz_aSej8|MI6lnn@sw^v5H#<NaPo4~vV_#}Ve+N@;p9<e8C
zz(R!#T@pJXx#6D|qFyV(^PYcRsf5ZAM|!)m;Pbicr2mb5h}JE~OTY95Vp&kcj!mN_
zP$&(r@MEy;GD3P&d7sr90<FG=ColVOlG*-rWvIlb@xuzcrsvpqI2Y*zTMB(}L4}B0
z<9#$y7h*!5E3@Vtql5QdZG!X0zu&C9ZEHisr((G$RCX`l9^(Yl7tdE4t})(GV4ZFL
zT)p3j?u;h`uz-wJhXVjx);uHtoLw6jp#H0o1Db1?=KmT==_*bEyy;+F%_BdVVZ+Vc
zYC|HZducg;KH>svkD)KNJ0Tpy#0`+V2RC>BtAgwHP*66=BGfI8C0M$AEl%>WI(1kU
zj#k9_VtW}`x8@n_I6+y@ntb})KhPJI9+b_F#u4zwg=LKMy_Ef0u=Yb<1cq+ukw43H
z4_jt;R!GQYjx}A}?8>GNDX_L{*mHOt>}13yFq!54H;8VHW#S_~@*X=@+yaUxoaj(n
z%60yAPRL85{cG{2*2Qyx7>mCj)CTv#c$|!_iKUS#xZ?`e{44P|Ipb?`qsIlQVfXFS
zFQL)k0gu`}&r{;YMy4Hx<9%BP=iD^%jLqdnXTOTfOy3p|r3;8o)36a)WjGLWcawO|
zX3tJ_Y**OUY{-AQ5#E=!6XZ<uH`8Y2$`;~_ahM}%juL4j*YrkJHaR;9ijWajdoBUd
z04suENs#&ay^wUzA$p|eG%+YyMZn4<_93utGPOv@M1uo$Jfh_+r|*KRbib>Y+A4a!
zN)0S8k}x}j)ShE<j1Pim5*|HnWkjf7uSAp^x8|SvynizoiBK!}x5u|jMF0LwUlANe
zqB!l7!VwXe{>mrbj$;DgGdw0t=ROe{9uLC>KNC#!J`TT}vJ39%n2vjuyxmPW`uBOd
zd9={*a4p?@mEe&EBEUczu4nX~=Y335tU*M&)`W2FsZdalEDn+DD-GUWAf8XMaXush
zL#@EpH{AmZv{Q-f%k<RqLgmBhbSO0P5cqc@xU6vw&jy53VW!AaTfiufcxm|)?-@Jq
zJy<#(XRFY!o&(wOZvDa50*Mwo*w!`FPgl=V?}c9G)Y8SUi_e6EYEp5^P>PaZH0s%N
z068CZp2KD%Qq#JF%h?(9I;aG8t8VF7$NRFIV;*<T><7<_+Iyx~z(U&$t}a^GolU}e
z*bsJt9Bclm+z-c~5S;gH9-EZft*~@<q=MT*zmL<%$$-f_e5cI<)eVP9mNzWPL1TND
zn%HLjQ7#BvW#Q$!*|!90)pr2&9kYR;t~%TCY3vDm%B@fJ30o=7{6-K$1?Tc*(LcId
zziVCTr0y@z=b6*1aUQmjDmyv~+HKn*7$-hM$-@~OsOgJ5=*Fh;Y^>6uYDGlgZUnxP
zg1W=e0&CqdjKld`dM(iAockcmiu0M?hK=(Hkgk=#KDyXDmY9HkQ{7C*_Du}4@0%$Q
zmp`&4uuSl}Lam`IXlh{*!wDT4*Pzaf(arauHqJ030_qiicccn+JPgW-Y;&>|#fBYM
zkyZE6>a29`>CTE;KrBucMtX2?DrvsnRyq}Vm-|2lf#-{<>`l$fi8TmZM%PW_0oB?j
z&^5zT(jCK&`A?vErA!!~!k@1)Pd9eKfj%oLeI|pgGS*!vfxu?`7<3tl+os#tqAd%b
zC}}t5cPqO60XI5Iev**d{XRrFJ+IO@SOqR&p+oJR+O#+u$Yg#8H5bsHdrXh){eUE6
zdBOWVI#s~#CkF!sElo9%x2D5udZrK1M^;e<wHLgZ^Bv9Wlwd)wfCSXhG`v$q<4CwY
zlKe-2_Q1;``TQ`0cVSSBw<Jga8ijUjaI*`UV$-7*k(f{*H1~*>=Szw+Sz&bwBDJX9
z3+Z}!TpF%@HA@>s&R2|FFsA*Ee$#yg)II=S6Jw^tXZ3k!FsM7Mb*R%|Kro5UsCvgP
z^cJ*J-;y8*5Y|C)x_j0M#!qBg;}{b&TOe2hNd+VT?t@Sl9y<~#fMwv?N_z@<SB}|m
zHkc`_+IXU4k`7a^_39R(#w(pb<JeO=xz>W7j>~=m$`07&$5jg4G816FiVdmLWj-9_
zjd@LT?6{Hu%fVB}ucN!u+R)|f0r9l~M#Qk@Qq_+a9<Z+*6HL!2vNH0%Hd1LGUn&l}
z(jWr6mSnSXW{WlYDl%mk*dFCmR&n_+kzt%!?~?{s0Xft&s^pm-GX+yMjkSUiyjwG|
zi!>Lq`Hoe<*I3Fd!@9VxRMexl3Ro;=<LSDi)A}Zv^-@yAqSxZYaAV5l>K2{?1pRLY
zFug!^yxx9=L%?3G6`(`v^jIPOc1Ic_&sTMI9kO72O6mz!AJo;=E8Us+29#stfk4}8
zcQ9Cjt*v9Wgxw|YR3~FY+b*bxg9MUeB>QPwf$0ZC!mT;!21TQ^+=$$=`^lYRrq{nr
zmt>(H>?#IPp}b%n!~@0$*UdfkfVQ7t=sg0hixv9Uz3{KLtD%Ql+*O=Gw9D1;*M$Pb
z3u;&dk7|G|r=Q(-zp>OKo}mOLGr1dh;S=B`4l9uVc{s=Yn0Gw`8!Ry5@QW2-CQTb-
z&A-6G;LJPwxe+!T8a4?6Wnem^)un{gV(4tQ&{MOJii*pZ!5OHd<jd<v&j#PN+GF?`
z40qabCZCo+qQa1_@%Apv9Nr%=xN*hN2;+rR%m`u2Q83&hIyhMfHtn!F`z$?DMleY1
zg4lLqTu&)#scYmcovB+|{w2n2Tq)3w^YSRI@Syo_EAXxgymZNqBTNr|+W$V*mU0Lb
zca;2$sF{*o&&O2$xDK71IM0fNayD0gQwv%TFAX>6wBG3Wt^s8VG%QLUL_17D8cr2Q
z*(oewBit98@iXgANcKtNrbQeJVxHTpx^<N@n7*<d411kF`AQ3Cc3;?(*m|3j%VwpT
z<|^im+w}yE(dMEPl!hAZQ`0PGz9>mN1Sfz8FWups(0eD9NH=)Xq*0~mCL9>Zp53(X
z`C{Q`8E`9_s;}Y(=mY13uKvx&YJ*w3q89Ki;N9L#FT}|TZk<iw6n6?2{zE7=2<VFK
z>Qy;Z-mYY+)u0l{tSk?p+=MBZ*vm@_7p}%+0Q?sNmkl9EZcwXW=4Dv+9Ng@_mcF2>
zrC~EH$Y5@Q7(pp3&{y5;Zng@~sJTm);BB_X^Fm@QC{`n{7tFQYTaB}#?0AK2F&svE
zgW3ZLo0Ur5G#l~1(;b>#kx-*jlojWQKec<w33PEJT@`tF-M`31#l#wYfs<#34*`Pe
zCTz`f6dd_wCp*Od-KvzIjb)oa>acY>rL{j@v2l6hdlizO215yXzPF~mA2G4M(qiTR
z821e^=QMf|${`ZD3N}52GIJ!0UBKR9S@p;_x0jjqEey>`qO0PpOKo=q78R709Rb}V
z_`n&0f}7y^?`pn43jh62Lm-9!lwnm0|0%<N%JAR+G*)%s|Ihzvd|S~4Zq%IMaL=n8
Q5s2aP`D^F!XW;k#7t99APyhe`

diff --git a/sampleB.png b/sampleB.png
deleted file mode 100644
index 10e9f67a3da080f2c4d376bf527c0c04fb3c130a..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 19380
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

diff --git a/sampleC.png b/sampleC.png
deleted file mode 100644
index 160ce0cb8917c64fd15ce9190c183b9648352695..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 23255
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

diff --git a/sampleD.png b/sampleD.png
deleted file mode 100644
index aec44706ec70c1ca4b422d1d41cc94badde21669..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 18899
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

diff --git a/src/i18n.json b/src/i18n.json
deleted file mode 100644
index 56da5d3..0000000
--- a/src/i18n.json
+++ /dev/null
@@ -1,71 +0,0 @@
-{
-	"cn":{
-		"language":"cn",
-		"summary":"AnyProxy 4.x版正在Beta中,欢迎试用 Ref:<a href=\"/4.x/\">AnyProxy 4.x 文档</a>",
-		"featureA":"基于Node.js",
-		"featureADesc":"全程JavaScript,学习无压力",
-		"featureB":"支持Https",
-		"featureBDesc":"明文解析Https请求数据",
-		"featureBHowTo":"如何配置",
-		"featureC":"Web界面",
-		"featureCDesc":"多终端共享,可视化观察每个请求",
-		"featureD":"规则逻辑(Rule)",
-		"featureDDesc":"个性化处理规则,定制专属调试工具",
-		"installationTitle":"安装",
-		"installationStepA":"安装",
-		"installationStepB":"可能需要",
-		"quickStartTitle":"使用",
-		"quickStartStepA":"运行",
-		"quickStartStepB":"把浏览器http代理指向 127.0.0.1:8001",
-		"quickStartStepC":"访问界面:http://127.0.0.1:8002",
-		"quickStartMoreUsage":"更多用法",
-		"sampleRuleTitle":"规则文件(rule)样例",
-		"sampleATitle":"在HTML响应末尾加上\"hello world\"",
-		"sampleBTitle":"去除请求头的if-modified-since字段",
-		"sampleCTitle":"为某个请求指定目标IP地址",
-		"sampleDTitle":"把所有图片响应替换成本地图片",
-		"ruleGuideText":"阅读:规则文件(Rule)API",
-		"ruleGuideLink":"https://github.com/alibaba/anyproxy/wiki/%E4%BB%A3%E7%90%86%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9A%84%E6%96%B0%E8%BD%AE%E5%AD%90%EF%BC%9Aanyproxy#%E5%BC%80%E6%94%BE%E5%BC%8F%E4%BB%A3%E7%90%86%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%AE%BE%E8%AE%A1",
-		"otherFeaturesTitle":"其他特性",
-		"otherFeatureA":"Map Local,Log Filter等常规功能",
-		"otherFeatureB":"低网速网速模拟",
-		"otherFeatureBDesc":",调试应用在2G/3G下的表现",
-		"otherFeatureC":"把AnyProxy作为npm模块",
-		"otherFeatureCDesc":",基于它做二次开发"
-
-	},
-	"en":{
-		"language":"en",
-		"summary":"AnyProxy is a fully configurable http/https proxy in NodeJS, which offers you the ablity to handle http traffic as you wish.",
-		"featureA":"Based on Node.js",
-		"featureADesc":"It's all javascript and easy to learn.",
-		"featureB":"HTTPS supported",
-		"featureBDesc":"help to decrypted HTTPS data",
-		"featureBHowTo":"How to config",
-		"featureC":"Web UI",
-		"featureCDesc":"Web based interface to view requests",
-		"featureD":"Customed Rule File",
-		"featureDDesc":"Make your own debugging tool by writing rule files",
-		"installationTitle":"Installation",
-		"installationStepA":"install",
-		"installationStepB":"may require",
-		"quickStartTitle":"Quick Start",
-		"quickStartStepA":"run",
-		"quickStartStepB":"set proxy to 127.0.0.1:8001 on your browser or device",
-		"quickStartStepC":"view web interface at http://127.0.0.1:8002",
-		"quickStartMoreUsage":"More Usage",
-		"sampleRuleTitle":"Sample of Rule Files",
-		"sampleATitle":"Append \"hello world\" on HTML response",
-		"sampleBTitle":"remove if-modified-since from http request header",
-		"sampleCTitle":"assign a specified ip address for some requests",
-		"sampleDTitle":"replace all image response by local one",
-		"ruleGuideText":"Ref : Guide of Rule file",
-		"ruleGuideLink":"https://github.com/alibaba/anyproxy/wiki/What-is-rule-file-and-how-to-write-one",
-		"otherFeaturesTitle":"Other Features",
-		"otherFeatureA":"Map file to local , filter your logs",
-		"otherFeatureB":"Simulate a low-speed network",
-		"otherFeatureBDesc":" , help to test the performance of your app on poor network",
-		"otherFeatureC":"Using AnyProxy as an npm module",
-		"otherFeatureCDesc":" , to deploy your own debugging tools"
-	}
-}
\ No newline at end of file
diff --git a/src/index.html b/src/index.html
deleted file mode 100644
index 486a07a..0000000
--- a/src/index.html
+++ /dev/null
@@ -1,250 +0,0 @@
-<html>
-<head>
-    <title>AnyProxy</title>
-    <link rel="stylesheet" type="text/css" href="/dest/index.css">
-    <link rel="shortcut icon" type="image/png" href="/favico.png?t=2" />
-    <meta name="description" content="A fully configurable proxy in NodeJS, which can handle HTTPS requests perfectly.">
-    <meta name="description" content="AnyProxy - 开放式的HTTP/HTTPS代理,你可以灵活控制各种网络数据">
-    <meta name="keywords" content="代理服务器 Proxy HTTP HTTPS">
-    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
-    <script> 
-        //redirect to Chinese version if in China
-        if(new Date().getTimezoneOffset() == "-480" && !(/(cn|en)/i.test(location.href))){
-            location.href = "/cn";
-        }else{
-            var _hmt = _hmt || []; (function() {var hm = document.createElement("script"); hm.src = "//hm.baidu.com/hm.js?4e51565b7d471fd6623c163a8fd79e07"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })();
-        }
-    </script>
-
-</head>
-<body>
-
-    <div class="wrapper">
-        <div class="cornerBtnWrapper">
-            <a href="/cn">中文</a>|
-            <a href="/en">English</a>|
-            <a href="https://github.com/alibaba/anyproxy" target="_blank">View on Github</a>
-        </div>
-
-        <div class="brief">
-            <div class="logo">
-                <img src="http://gtms04.alicdn.com/tps/i4/TB1XfxDHpXXXXXpapXX20ySQVXX-512-512.png" width="250" height="250" alt="anyproxy logo" />
-            </div>
-            <h2 class="slogan">$${summary}</h2>
-            <div class="action">
-                <iframe src="https://ghbtns.com/github-btn.html?user=alibaba&repo=anyproxy&type=star&count=true" frameborder="0" scrolling="0" width="100px" height="20px"></iframe>&nbsp;&nbsp;&nbsp;
-                <iframe src="https://ghbtns.com/github-btn.html?user=alibaba&repo=anyproxy&type=fork&count=true" frameborder="0" scrolling="0" width="100px" height="20px"></iframe>
-            </div>
-        </div>
-
-        <div class="feature">
-            <div class="featureContent">
-                <div class="item">
-                    <span class="iconWrapper">
-                        <i class="iconfont">&#xe602;</i>
-                    </span>
-                    <h4>${featureA}</h4>
-                    <h5>${featureADesc}</h5>
-                </div>
-                <div class="item">
-                    <span class="iconWrapper">
-                        <i class="iconfont">&#xe601;</i>
-                    </span>
-                    <h4>${featureB}</h4>
-                    <h5>${featureBDesc}<a href="https://github.com/alibaba/anyproxy/wiki/HTTPS%E7%9B%B8%E5%85%B3%E6%95%99%E7%A8%8B" target="_blank"><br>${featureBHowTo}&nbsp;&gt;&gt;</a></h5>
-                </div>
-                <div class="item">
-                    <span class="iconWrapper">
-                        <i class="iconfont bigger">&#xe600;</i>
-                    </span>
-                    <h4>${featureC}</h4>
-                    <h5>${featureCDesc}</h5>
-                </div>
-                <div class="item">
-                    <span class="iconWrapper">
-                        <i class="iconfont">&#xe604;</i>
-                    </span>
-                    <h4>${featureD}</h4>
-                    <h5>${featureDDesc}</h5>
-                </div>
-                <div style="clear:both"></div>
-            </div>
-        </div>
-
-        <div class="quickstart listSection">
-            <div class="quickstartContent listContent">
-                <h4 class="subtitle" id="install">${installationTitle}</h4>
-                <ul>
-                    <li>${installationStepA} <a href="http://nodejs.org/" target="_blank">Node.js</a> &gt;= v0.12</li>
-                    <li><code class="simpleBash">npm install -g anyproxy</code>, ${installationStepB}<code class="simpleBash">sudo</code></li>
-                    <li><a href="https://github.com/alibaba/anyproxy#quick-start" target="_blank">More&gt;&gt;</a></li>
-                </ul>
-                <h4 class="subtitle" id="quickstart">${quickStartTitle}</h4>
-                <ul>
-                    <li>${quickStartStepA}&nbsp;&nbsp;<code class="simpleBash">anyproxy</code></li>
-                    <li>${quickStartStepB}</li>
-                    <li>${quickStartStepC}</li>
-                    <li><a href="https://github.com/alibaba/anyproxy#quick-start" target="_blank">${quickStartMoreUsage}&nbsp;&gt;&gt;</a></li>
-                </ul>
-                <a href="https://github.com/alibaba/anyproxy#step-4---launch-web-interface" target="_blank"><img class="screenshot" src="http://gtms01.alicdn.com/tps/i1/TB1IdgqGXXXXXa9apXXLExM2pXX-854-480.gif" width="350"/></a>
-            </div>
-        </div>
-
-        <div class="sample">
-
-            <div class="sampleContent">
-                <h4 class="subtitle" id="sample ">${sampleRuleTitle}</h4>
-
-                <div class="item">
-                    <h5 class="itemTitle">${sampleATitle}</h5>
-                    <pre>
-<code class="javascript">
-//append "hello world" to all web pages
-//file : rule_replace_response_data.js
-//run  : anyproxy --rule rule_replace_response_data.js
-module.exports = {
-    replaceServerResDataAsync: function(req,res,serverRes,cb){
-
-        if(/html/i.test(res.headers['content-type'])){
-            var newDataStr = serverRes.toString();
-            newDataStr += "hello world!";
-            cb(newDataStr);
-        }
-    }
-};
-</code>
-                    </pre>
-                    <span class="figure">
-                        <img src="https://t.alipayobjects.com/images/rmsweb/T1LcphXf0eXXXXXXXX.png" width="350"/>
-                    </span>
-                    <hr />
-                </div>              
-                <div class="item">
-                    <h5 class="itemTitle">${sampleBTitle}</h5>
-                    <pre>
-<code class="javascript">
-//remove cache related header
-//file : rule_remove_cache_header.js
-//run  : anyproxy --rule rule_remove_cache_header.js
-module.exports = {
-    replaceRequestOption : function(req,option){
-        var newOption = option;
-        delete newOption.headers['if-modified-since'];
-
-        return newOption;
-    }
-};
-</code>
-                    </pre>
-                    <span class="figure">
-                        <img src="https://t.alipayobjects.com/images/rmsweb/T1ecFhXjxcXXXXXXXX.png" width="350"/>
-                    </span>
-                    <hr />
-                </div>
-
-                <div class="item">
-                    <h5 class="itemTitle">${sampleCTitle}</h5>
-                    <pre>
-<code class="javascript">
-//assign a specific IP adress for some request
-//file : rule_reverse_proxy.js
-//run  : anyproxy --rule anyproxy --rule rule_reverse_proxy.js
-module.exports = {
-    replaceRequestOption : function(req,option){
-        var newOption = option;
-        if(newOption.headers.host == "www.taobao.com"){
-            newOption.hostname = "192.168.1.3";
-            newOption.port     = "80";
-        }
-
-        return newOption;
-    }
-};
-</code>
-                    </pre>
-                    <span class="figure">
-                        <img src="https://t.alipayobjects.com/images/rmsweb/T1hsxhXeddXXXXXXXX.png" width="350"/>
-                    </span>
-                    <hr />
-                </div>
-
-                <div class="item">
-                    <h5 class="itemTitle">${sampleDTitle}</h5>
-                    <pre>
-<code class="javascript">
-//replace all the images with local one
-//file : rule_use_local_data.js
-//run  : anyproxy --rule anyproxy --rule rule_use_local_data.js
-var fs  = require("fs"),
-    img = fs.readFileSync("sample.jpg");
-
-module.exports = {
-    shouldUseLocalResponse : function(req,reqBody){
-        if(/\.(png|gif|jpg|jpeg)$/.test(req.url)){
-            req.replaceLocalFile = true;
-            return true;
-        }else{
-            return false;
-        }
-    },
-
-    dealLocalResponse : function(req,reqBody,callback){
-        if(req.replaceLocalFile){
-            callback(200, {"content-type":"image/png"},img );
-        }
-    }
-};
-</code>
-                    </pre>
-                    <span class="figure">
-                        <img src="https://t.alipayobjects.com/images/rmsweb/T1Zr4hXeXhXXXXXXXX.png" width="350"/>
-                    </span>
-                </div>
-
-                <div class="readmoreBtn">
-                    <a href="${ruleGuideLink}" target="_blank">&gt;&gt;&nbsp;${ruleGuideText}</a>
-                </div>
-
-            </div>
-        </div>
-
-        <div class="readMore listSection">
-            <div class="listContent">
-                <h4 class="subtitle" id="otherfeature">${otherFeaturesTitle}</h4>
-                <ul>
-                    <li>${otherFeatureA}</li>
-                    <li><a href="https://github.com/alibaba/anyproxy#throttling">${otherFeatureB}</a>${otherFeatureBDesc}</li>
-                    <li><a href="https://github.com/alibaba/anyproxy#work-as-a-module-for-nodejs" target="_blank">${otherFeatureC}</a>${otherFeatureCDesc}</li>
-                </ul>
-                {@if language == "cn"}
-                <h4 class="subtitle" id="ref">相关阅读</h4>
-                <ul>
-                    <li><a href="https://github.com/alibaba/anyproxy/wiki/%E4%BB%A3%E7%90%86%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9A%84%E6%96%B0%E8%BD%AE%E5%AD%90%EF%BC%9Aanyproxy" target="_blank">代理服务器的新轮子</a>,介绍AnyProxy的设计初衷,以及它的开放式设计可以解决什么问题。</li>
-                    <li><a href="http://www.infoq.com/cn/presentations/alipay-hybrid-application-quality-assurance-practice" target="_blank">QCon - 《支付宝hybrid应用质量保证实践》</a>,涉及到AnyProxy在测试工程中的应用(By 陈晔)</li>
-                </ul>
-                {@/if}
-            </div>
-        </div>
-
-        <div class="learnMore listSection">
-            <div class="btnWrapper">
-                <h4 class="subtitle white" id="readmore">Read More</h4>
-                <a class="actionBtn actionBtnWhite" href="https://github.com/alibaba/anyproxy" target="_blank">https://github.com/alibaba/anyproxy</a>
-            </div>
-        </div>
-
-        <div class="footer"></div>
-
-    </div>
-
-    <link rel="stylesheet" type="text/css" href="/dest/github.css" />
-    <script src="/dest/lib.js"></script>
-    <script type="text/javascript">
-        Zepto(document).ready(function() {
-            Zepto('.sample code').each(function(i, block) {
-                hljs.highlightBlock(block);
-            });
-        });
-    </script>
-</body>
-</html>
\ No newline at end of file
diff --git a/src/index.js b/src/index.js
deleted file mode 100644
index e69de29..0000000
diff --git a/src/index.less b/src/index.less
deleted file mode 100644
index ca46ea2..0000000
--- a/src/index.less
+++ /dev/null
@@ -1,407 +0,0 @@
-@main : #00AAEE;
-@dark : #326EEB;
-@gray : #F9F9F9;
-@darkGray : #DEDEDE;
-@textDark : #5A5A5A;
-@textLight: #777;
-
-@wideContent : 1200px;
-@normalContent : 890px;
-
-@wideContentMobile : 100%;
-@normalContentMobile : 100%;
-
-@font-face {
-	font-family: 'iconfont';
-	src: url('//at.alicdn.com/t/font_1440130445_6601267.eot'); /* IE9*/
-	src: url('//at.alicdn.com/t/font_1440130445_6601267.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
-	url('//at.alicdn.com/t/font_1440130445_6601267.woff') format('woff'), /* chrome、firefox */
-	url('//at.alicdn.com/t/font_1440130445_6601267.ttf') format('truetype'), /* chrome、firefox、opera、Safari, Android, iOS 4.2+*/
-	url('//at.alicdn.com/t/font_1440130445_6601267.svg#iconfont') format('svg'); /* iOS 4.1- */
-}
-
-i.iconfont{
-	font-family: "iconfont";
-	font-style: normal;
-}
-
-body{
-	margin: 0;
-	padding: 0;
-	font-family: 'Source Sans Pro', 'Helvetica Neue', Arial, sans-serif;
-	-webkit-font-smoothing: antialiased;
-	-moz-osx-font-smoothing: grayscale;
-}
-
-.wrapper{
-	.cornerBtnWrapper{
-		position : absolute;
-		right    : 10px;
-		top      : 10px;
-		z-index  : 1;
-		width: 100%;
-		text-align: right;
-		color: @textDark; 
-	}
-
-	.cornerBtnWrapper a{
-		display: inline-block;
-		margin-right: 10px;
-		margin-left : 10px;
-	}
-
-	a,
-	a:hover{
-		text-decoration: none;
-	}	
-
-	a{
-		font-size: 16px;
-		color: @main;
-	}
-
-	h4.subTitle{
-		font-size: 30px;
-		margin: 0;
-		padding: 50px 0 10px 0;
-		width: 100%;
-		text-align: center;
-		color: @textDark;
-	}
-
-	h4.subTitle.white{
-		color: #FFF;
-	}
-
-	code{
-		display: inline-block;
-	}
-
-	.actionBtn.actionBtnWhite{
-		color: #FFF;
-		border: 1px solid #FFF;
-
-	}
-
-	.actionBtn.actionBtnWhite:hover{
-		background: @gray;
-		color: @dark;
-	}
-
-	.actionBtn{
-		color: @dark;
-		border: 1px solid @dark;
-		line-height: 30px;
-		font-size: 30px;
-		padding: 20px 45px;
-		border-radius: 30px;
-		display: inline-block;
-		transition:0.3s;
-
-		@media only screen 
-		and (min-device-width: 320px) 
-		and (max-device-width: 600px)
-		and (-webkit-min-device-pixel-ratio: 2){
-			font-size:16px;
-			padding: 10px 20px;
-		}
-	}
-
-	.actionBtn:hover{
-		background: @dark;
-		color: @gray;
-	}
-}
-
-.wrapper>div{
-	width: 100%;
-	min-width: @normalContent;
-
-	@media only screen 
-	and (min-device-width: 320px) 
-	and (max-device-width: 600px)
-	and (-webkit-min-device-pixel-ratio: 2){
-		min-width: @normalContentMobile;
-	}
-}
-
-
-
-.brief{
-	height: 300px;
-	text-align: center;
-	padding: 100px 0;
-	position: relative;
-	margin-top: 20px;
-
-
-	@media only screen 
-	and (min-device-width: 320px) 
-	and (max-device-width: 600px)
-	and (-webkit-min-device-pixel-ratio: 2){
-		padding: 60px 0 90px;
-	}
-
-	.slogan{
-		font-size: 16px;
-		color: @textDark;
-		padding: 0 20px;
-	}
-}
-
-.feature{
-	background: @darkGray; 
-
-	.featureContent{
-		@media only screen 
-		and (min-device-width: 320px) 
-		and (max-device-width: 600px)
-		and (-webkit-min-device-pixel-ratio: 2){
-			width: @wideContentMobile;
-		}
-
-		width: @wideContent;
-		margin: 0 auto;
-
-		.item{
-			padding: 30px 0 20px;
-			width: 280px;
-			/*border: 1px solid #AAA;*/
-			margin: 0 10px;
-			float: left;
-			box-sizing:border-box;
-			-webkit-box-sizing:border-box;
-			font-size: 30px;
-			text-align: center;
-		}
-
-		.iconWrapper{
-			display: inline-block;
-			line-height: 40px;
-			width: 70px;
-			text-align: center;
-			font-size: 40px;
-			color: @textDark;
-		}
-		.iconWrapper .bigger{
-			font-size: 44px;
-		}
-
-		h4{
-			color: @textDark;
-			margin: 12px auto 2px;
-			font-size: 20px;
-		}
-
-		h5{
-			color: @textLight;
-			margin: 0;
-		}
-
-		h5,
-		a{
-			font-size: 14px;
-			line-height: 20px;
-		}
-
-
-		@media only screen 
-		and (min-device-width: 320px) 
-		and (max-device-width: 600px)
-		and (-webkit-min-device-pixel-ratio: 2){
-			.item{
-				padding: 20px 0;
-				float     :none;
-				margin    : 0 auto;
-				font-size : 24px;
-			}
-
-			.iconWrapper{
-				font-size: 25px;
-				line-height: 25px;
-			}	
-
-			.iconWrapper .bigger{
-				font-size: 30px;
-			}
-
-			h4{
-				font-size: 16px;
-				margin: 4px;
-			}
-
-		}
-	}
-}
-
-.quickstart{
-	background: @gray;
-
-	.quickstartContent{
-		position: relative;
-	}
-
-	.screenshot{
-		position: absolute;
-		right: 0;
-		bottom: 0;
-
-		@media only screen 
-		and (min-device-width: 320px) 
-		and (max-device-width: 600px)
-		and (-webkit-min-device-pixel-ratio: 2){
-			display : none;
-		}
-	}
-
-	code.simpleBash{
-	    font-family: monospace;
-	    font-weight: bold;
-	    color: #333;
-	    padding: 0;
-	}
-}
-
-.listSection{
-	.listContent{
-
-		@media only screen 
-		and (min-device-width: 320px) 
-		and (max-device-width: 600px)
-		and (-webkit-min-device-pixel-ratio: 2){
-			width: @normalContentMobile;
-		}
-
-		width: @normalContent;
-		margin: 0 auto;
-	}
-
-	ul{
-		margin: 0 auto;
-
-		@media only screen 
-		and (min-device-width: 320px) 
-		and (max-device-width: 600px)
-		and (-webkit-min-device-pixel-ratio: 2){
-			padding: 0 20px 0 30px;
-		}
-	}
-
-	li{
-		color: @textDark;
-		font-size: 16px;
-		line-height: 40px;
-	}
-}
-
-.sample{
-	background: @gray;
-	.sampleContent{
-
-		@media only screen 
-		and (min-device-width: 320px) 
-		and (max-device-width: 600px)
-		and (-webkit-min-device-pixel-ratio: 2){
-			width: @normalContentMobile;
-		}
-
-		width: @normalContent;
-		margin: 0 auto;
-	}
-
-
-	.item{
-		margin: 10px;
-	}
-
-	.itemTitle{
-		font-size: 16px;
-		margin: 0px 10px;
-		color: @textDark;
-
-		@media only screen 
-		and (min-device-width: 320px) 
-		and (max-device-width: 600px)
-		and (-webkit-min-device-pixel-ratio: 2){
-			margin :0;
-		}
-	}
-
-	.figure{
-		vertical-align: top;
-		@media only screen 
-		and (min-device-width: 320px) 
-		and (max-device-width: 600px)
-		and (-webkit-min-device-pixel-ratio: 2){
-			display: block;
-		    margin: 0 auto;
-		    text-align: center;
-		}
-	}
-
-	pre{
-		margin: 0;
-		display: inline-block;
-		vertical-align: top;
-		@media only screen 
-		and (min-device-width: 320px) 
-		and (max-device-width: 600px)
-		and (-webkit-min-device-pixel-ratio: 2){
-			width: 100%;
-		}
-	}
-
-	code{
-		width: 495px;
-		@media only screen 
-		and (min-device-width: 320px) 
-		and (max-device-width: 600px)
-		and (-webkit-min-device-pixel-ratio: 2){
-			width:100%;
-			margin: 0 auto;
-		    word-wrap: break-word;
-		    padding: 0;
-		}
-	}
-
-	hr{
-		border: none;
-		border-top: 1px solid @textLight;
-		width: 80%;
-		margin: 0 auto;
-		padding: 15px 0;
-	}
-
-	.readmoreBtn{
-		margin-left: 10px;
-		padding-bottom: 20px;
-	}
-}
-
-.readMore{
-	background: @gray;
-	padding-bottom: 50px;
-}
-
-.learnMore{
-	background: @dark;
-	text-align: center;
-	position: relative;
-	padding: 120px 0;
-	@media only screen 
-	and (min-device-width: 320px) 
-	and (max-device-width: 600px)
-	and (-webkit-min-device-pixel-ratio: 2){
-		padding: 70px 0;
-	}
-
-	h4.subtitle{
-		padding: 0;
-		margin-bottom: 30px;
-	}
-
-	.btnWrapper{
-		text-align: center;
-	}
-}
-