UNPKG

anyproxy

Version:

A fully configurable HTTP/HTTPS proxy in Node.js

1,262 lines (821 loc) 80.1 kB
<!DOCTYPE HTML> <html lang="cn" > <head> <meta charset="UTF-8"> <meta content="text/html; charset=utf-8" http-equiv="Content-Type"> <title>简介 · AnyProxy</title> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="description" content=""> <meta name="generator" content="GitBook 3.2.2"> <meta name="author" content="AnyProxy"> <link rel="stylesheet" href="../gitbook/style.css"> <link rel="stylesheet" href="../gitbook/gitbook-plugin-highlight/website.css"> <link rel="stylesheet" href="../gitbook/gitbook-plugin-search/search.css"> <link rel="stylesheet" href="../gitbook/gitbook-plugin-fontsettings/website.css"> <link rel="shortcut icon" href="/assets/favicon.png" type="image/png"> <link rel="stylesheet" href="/assets/website.css"> <script src="/assets/main.js" ></script> </head> <body> <div> </div> <div class="book"> <div class="book-summary"> <div id="book-search-input" role="search"> <input type="text" placeholder="Type to search" /> </div> <nav role="navigation"> <ul class="summary"> <li class="chapter active" data-level="1.1" data-path="./"> <a href="./"> <div class="summary-title-span 简介"> 简介 </div> </a> </li> <li class="chapter " data-level="1.2" data-path="./"> <a href="./#快速开始"> <div class="summary-title-span 快速开始"> 快速开始 </div> </a> <ul class="articles"> <li class="chapter " data-level="1.2.1" data-path="./"> <a href="./#安装"> <div class="summary-title-span 安装"> 安装 </div> </a> </li> <li class="chapter " data-level="1.2.2" data-path="./"> <a href="./#启动"> <div class="summary-title-span 启动"> 启动 </div> </a> </li> <li class="chapter " data-level="1.2.3" data-path="./"> <a href="./#其他命令"> <div class="summary-title-span 其他命令"> 其他命令 </div> </a> </li> <li class="chapter " data-level="1.2.4" data-path="./"> <a href="./#作为npm模块使用"> <div class="summary-title-span 作为npm模块启动"> 作为npm模块启动 </div> </a> </li> </ul> </li> <li class="chapter " data-level="1.3" data-path="./"> <a href="./#代理https"> <div class="summary-title-span 代理HTTPS"> 代理HTTPS </div> </a> </li> <li class="chapter " data-level="1.4" data-path="./"> <a href="./#代理websocket"> <div class="summary-title-span 代理WebSocket"> 代理WebSocket </div> </a> </li> <li class="chapter " data-level="1.5" data-path="./"> <a href="./#rule模块"> <div class="summary-title-span rule模块"> rule模块 </div> </a> <ul class="articles"> <li class="chapter " data-level="1.5.1" data-path="./"> <a href="./#开发示例"> <div class="summary-title-span 开发示例"> 开发示例 </div> </a> </li> <li class="chapter " data-level="1.5.2" data-path="./"> <a href="./#处理流程"> <div class="summary-title-span 处理流程"> 处理流程 </div> </a> </li> <li class="chapter " data-level="1.5.3" data-path="./"> <a href="./#如何引用"> <div class="summary-title-span 如何引用"> 如何引用 </div> </a> </li> </ul> </li> <li class="chapter " data-level="1.6" data-path="./"> <a href="./#rule接口文档"> <div class="summary-title-span rule接口文档"> rule接口文档 </div> </a> <ul class="articles"> <li class="chapter " data-level="1.6.1" data-path="./"> <a href="./#summary"> <div class="summary-title-span rule-title"> summary </div> </a> </li> <li class="chapter " data-level="1.6.2" data-path="./"> <a href="./#beforesendrequest"> <div class="summary-title-span rule-title"> beforeSendRequest </div> </a> </li> <li class="chapter " data-level="1.6.3" data-path="./"> <a href="./#beforesendresponse"> <div class="summary-title-span rule-title"> beforeSendResponse </div> </a> </li> <li class="chapter " data-level="1.6.4" data-path="./"> <a href="./#beforedealhttpsrequest"> <div class="summary-title-span rule-title"> beforeDealHttpsRequest </div> </a> </li> <li class="chapter " data-level="1.6.5" data-path="./"> <a href="./#onerror"> <div class="summary-title-span rule-title"> onError </div> </a> </li> <li class="chapter " data-level="1.6.6" data-path="./"> <a href="./#onconnecterror"> <div class="summary-title-span rule-title"> onConnectError </div> </a> </li> </ul> </li> <li class="chapter " data-level="1.7" data-path="./"> <a href="./#rule样例"> <div class="summary-title-span rule样例"> rule样例 </div> </a> <ul class="articles"> <li class="chapter " data-level="1.7.1" data-path="./"> <a href="./#使用本地数据"> <div class="summary-title-span sample-title"> 使用本地数据 </div> </a> </li> <li class="chapter " data-level="1.7.2" data-path="./"> <a href="./#修改请求头"> <div class="summary-title-span sample-title"> 修改请求头 </div> </a> </li> <li class="chapter " data-level="1.7.3" data-path="./"> <a href="./#修改请求数据"> <div class="summary-title-span sample-title"> 修改请求数据 </div> </a> </li> <li class="chapter " data-level="1.7.4" data-path="./"> <a href="./#修改请求的目标地址"> <div class="summary-title-span sample-title"> 修改请求的目标地址 </div> </a> </li> <li class="chapter " data-level="1.7.5" data-path="./"> <a href="./#修改请求协议"> <div class="summary-title-span sample-title"> 修改请求协议 </div> </a> </li> <li class="chapter " data-level="1.7.6" data-path="./"> <a href="./#修改返回状态码"> <div class="summary-title-span sample-title"> 修改返回状态码 </div> </a> </li> <li class="chapter " data-level="1.7.7" data-path="./"> <a href="./#修改返回头"> <div class="summary-title-span sample-title"> 修改返回头 </div> </a> </li> <li class="chapter " data-level="1.7.8" data-path="./"> <a href="./#修改返回内容并延迟"> <div class="summary-title-span sample-title"> 修改返回内容并延迟 </div> </a> </li> </ul> </li> <li class="chapter " data-level="1.8" data-path="./"> <a href="./#证书配置"> <div class="summary-title-span 证书配置"> 证书配置 </div> </a> <ul class="articles"> <li class="chapter " data-level="1.8.1" data-path="./"> <a href="./#osx系统信任ca证书"> <div class="summary-title-span OSX系统信任CA证书"> OSX系统信任CA证书 </div> </a> </li> <li class="chapter " data-level="1.8.2" data-path="./"> <a href="./#windows系统信任ca证书"> <div class="summary-title-span Windows系统信任CA证书"> Windows系统信任CA证书 </div> </a> </li> <li class="chapter " data-level="1.8.3" data-path="./"> <a href="./#配置osx系统代理"> <div class="summary-title-span 配置OSX系统代理"> 配置OSX系统代理 </div> </a> </li> <li class="chapter " data-level="1.8.4" data-path="./"> <a href="./#配置浏览器http代理"> <div class="summary-title-span 配置浏览器HTTP代理"> 配置浏览器HTTP代理 </div> </a> </li> <li class="chapter " data-level="1.8.5" data-path="./"> <a href="./#ios系统信任ca证书"> <div class="summary-title-span iOS系统信任CA证书"> iOS系统信任CA证书 </div> </a> </li> <li class="chapter " data-level="1.8.6" data-path="./"> <a href="./#ios--103信任ca证书"> <div class="summary-title-span iOS >= 10.3信任CA证书"> iOS >= 10.3信任CA证书 </div> </a> </li> <li class="chapter " data-level="1.8.7" data-path="./"> <a href="./#安卓系统信任ca证书"> <div class="summary-title-span 安卓系统信任CA证书"> 安卓系统信任CA证书 </div> </a> </li> <li class="chapter " data-level="1.8.8" data-path="./"> <a href="./#配置iosandroid系统代理"> <div class="summary-title-span 配置iOS/Android系统代理"> 配置iOS/Android系统代理 </div> </a> </li> </ul> </li> <li class="chapter " data-level="1.9" data-path="./"> <a href="./#faq"> <div class="summary-title-span FAQ"> FAQ </div> </a> </li> <li class="divider"></li> <li> <a href="https://www.gitbook.com" target="blank" class="gitbook-link"> Published with GitBook </a> </li> </ul> </nav> </div> <div class="book-body"> <div class="body-inner"> <div class="book-header" role="navigation"> <!-- Title --> <h1> <i class="fa fa-circle-o-notch fa-spin"></i> <a href="." >简介</a> </h1> </div> <div class="page-wrapper" tabindex="-1" role="main"> <div class="page-inner"> <div id="book-search-results"> <div class="search-noresults"> <section class="normal markdown-section"> <h1 id="anyproxy">AnyProxy</h1> <blockquote> <p>&#x672C;&#x6587;&#x6863;&#x7684;&#x9002;&#x7528;&#x8303;&#x56F4;&#x662F;AnyProxy 4.0&#xFF0C;&#x6B22;&#x8FCE;&#x63D0;&#x4F9B;&#x53CD;&#x9988;</p> </blockquote> <p>Ref: <a href="../en">English Doc</a></p> <p>AnyProxy&#x662F;&#x4E00;&#x4E2A;&#x5F00;&#x653E;&#x5F0F;&#x7684;HTTP&#x4EE3;&#x7406;&#x670D;&#x52A1;&#x5668;&#x3002;</p> <p>Github&#x4E3B;&#x9875;&#xFF1A;<a href="https://github.com/alibaba/anyproxy" target="_blank">https://github.com/alibaba/anyproxy</a></p> <p>&#x4E3B;&#x8981;&#x7279;&#x6027;&#x5305;&#x62EC;&#xFF1A;</p> <ul> <li>&#x57FA;&#x4E8E;Node.js&#xFF0C;&#x5F00;&#x653E;&#x4E8C;&#x6B21;&#x5F00;&#x53D1;&#x80FD;&#x529B;&#xFF0C;&#x5141;&#x8BB8;&#x81EA;&#x5B9A;&#x4E49;&#x8BF7;&#x6C42;&#x5904;&#x7406;&#x903B;&#x8F91;</li> <li>&#x652F;&#x6301;Https&#x7684;&#x89E3;&#x6790;</li> <li>&#x63D0;&#x4F9B;GUI&#x754C;&#x9762;&#xFF0C;&#x7528;&#x4EE5;&#x89C2;&#x5BDF;&#x8BF7;&#x6C42;</li> </ul> <p>&#x76F8;&#x6BD4;3.x&#x7248;&#x672C;&#xFF0C;AnyProxy 4.0&#x7684;&#x4E3B;&#x8981;&#x53D8;&#x5316;&#xFF1A;</p> <ul> <li>&#x89C4;&#x5219;&#x6587;&#x4EF6;&#xFF08;Rule&#xFF09;&#x5168;&#x9762;&#x652F;&#x6301;Promise&#x548C;Generator</li> <li>&#x7B80;&#x5316;&#x4E86;&#x89C4;&#x5219;&#x6587;&#x4EF6;&#x5185;&#x7684;&#x63A5;&#x53E3;</li> <li>Web&#x7248;&#x754C;&#x9762;&#x91CD;&#x6784;</li> </ul> <p><img src="https://gw.alipayobjects.com/zos/rmsportal/JoxHUbVhXNedsPUUilnj.gif" width="1275px"></p> <h1 id="&#x5FEB;&#x901F;&#x5F00;&#x59CB;">&#x5FEB;&#x901F;&#x5F00;&#x59CB;</h1> <h2 id="&#x4F5C;&#x4E3A;&#x5168;&#x5C40;&#x6A21;&#x5757;">&#x4F5C;&#x4E3A;&#x5168;&#x5C40;&#x6A21;&#x5757;</h2> <h3 id="&#x5B89;&#x88C5;">&#x5B89;&#x88C5;</h3> <p>&#x5BF9;&#x4E8E;Debian&#x6216;&#x8005;Ubuntu&#x7CFB;&#x7EDF;&#xFF0C;&#x5728;&#x5B89;&#x88C5;AnyProxy&#x4E4B;&#x524D;&#xFF0C;&#x53EF;&#x80FD;&#x8FD8;&#x9700;&#x8981;&#x5B89;&#x88C5; <code>nodejs-legacy</code></p> <pre><code class="lang-bash">sudo apt-get install nodejs-legacy </code></pre> <p>&#x7136;&#x540E;&#xFF0C;&#x5B89;&#x88C5;AnyProxy</p> <pre><code class="lang-bash">npm install -g anyproxy </code></pre> <h3 id="&#x542F;&#x52A8;">&#x542F;&#x52A8;</h3> <ul> <li>&#x547D;&#x4EE4;&#x884C;&#x542F;&#x52A8;AnyProxy&#xFF0C;&#x9ED8;&#x8BA4;&#x7AEF;&#x53E3;&#x53F7;8001</li> </ul> <pre><code class="lang-bash">anyproxy </code></pre> <ul> <li>&#x542F;&#x52A8;&#x540E;&#x5C06;&#x7EC8;&#x7AEF;http&#x4EE3;&#x7406;&#x670D;&#x52A1;&#x5668;&#x914D;&#x7F6E;&#x4E3A;127.0.0.1:8001&#x5373;&#x53EF;</li> <li>&#x8BBF;&#x95EE;<a href="http://127.0.0.1:8002" target="_blank">http://127.0.0.1:8002</a> &#xFF0C;web&#x754C;&#x9762;&#x4E0A;&#x80FD;&#x770B;&#x5230;&#x6240;&#x6709;&#x7684;&#x8BF7;&#x6C42;&#x4FE1;&#x606F;</li> </ul> <h3 id="&#x5176;&#x4ED6;&#x547D;&#x4EE4;">&#x5176;&#x4ED6;&#x547D;&#x4EE4;</h3> <ul> <li>&#x914D;&#x7F6E;&#x542F;&#x52A8;&#x7AEF;&#x53E3;&#xFF0C;&#x5982;1080&#x7AEF;&#x53E3;&#x542F;&#x52A8;</li> </ul> <pre><code class="lang-bash">anyproxy --port 1080 </code></pre> <h2 id="&#x4F5C;&#x4E3A;npm&#x6A21;&#x5757;&#x4F7F;&#x7528;">&#x4F5C;&#x4E3A;npm&#x6A21;&#x5757;&#x4F7F;&#x7528;</h2> <p>AnyProxy&#x53EF;&#x4EE5;&#x4F5C;&#x4E3A;&#x4E00;&#x4E2A;npm&#x6A21;&#x5757;&#x4F7F;&#x7528;&#xFF0C;&#x6574;&#x5408;&#x8FDB;&#x5176;&#x4ED6;&#x5DE5;&#x5177;&#x3002;</p> <blockquote> <p>&#x5982;&#x8981;&#x542F;&#x7528;https&#x89E3;&#x6790;&#xFF0C;&#x8BF7;&#x5728;&#x4EE3;&#x7406;&#x670D;&#x52A1;&#x5668;&#x542F;&#x52A8;&#x524D;&#x81EA;&#x884C;&#x8C03;&#x7528;<code>AnyProxy.utils.certMgr</code>&#x76F8;&#x5173;&#x65B9;&#x6CD5;&#x751F;&#x6210;&#x8BC1;&#x4E66;&#xFF0C;&#x5E76;&#x5F15;&#x5BFC;&#x7528;&#x6237;&#x4FE1;&#x4EFB;&#x5B89;&#x88C5;&#x3002;&#x6216;&#x5F15;&#x5BFC;&#x7528;&#x6237;&#x4F7F;&#x7528;<code>anyproxy-ca</code>&#x65B9;&#x6CD5;&#x3002;</p> </blockquote> <ul> <li>&#x5F15;&#x5165;</li> </ul> <pre><code class="lang-bash">npm i anyproxy --save </code></pre> <ul> <li>&#x4F7F;&#x7528;&#x4E3E;&#x4F8B;</li> </ul> <pre><code class="lang-js"><span class="hljs-keyword">const</span> AnyProxy = <span class="hljs-built_in">require</span>(<span class="hljs-string">&apos;anyproxy&apos;</span>); <span class="hljs-keyword">const</span> options = { port: <span class="hljs-number">8001</span>, rule: <span class="hljs-built_in">require</span>(<span class="hljs-string">&apos;myRuleModule&apos;</span>), webInterface: { enable: <span class="hljs-literal">true</span>, webPort: <span class="hljs-number">8002</span> }, throttle: <span class="hljs-number">10000</span>, forceProxyHttps: <span class="hljs-literal">false</span>, wsIntercept: <span class="hljs-literal">false</span>, <span class="hljs-comment">// &#x4E0D;&#x5F00;&#x542F;websocket&#x4EE3;&#x7406;</span> silent: <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">&apos;ready&apos;</span>, () =&gt; { <span class="hljs-comment">/* */</span> }); proxyServer.on(<span class="hljs-string">&apos;error&apos;</span>, (e) =&gt; { <span class="hljs-comment">/* */</span> }); proxyServer.start(); <span class="hljs-comment">//when finished</span> proxyServer.close(); </code></pre> <ul> <li><p>Class: AnyProxy.proxyServer</p> <ul> <li><p>&#x521B;&#x5EFA;&#x4EE3;&#x7406;&#x670D;&#x52A1;&#x5668;</p> <pre><code class="lang-js"><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> <li><code>port</code> {number} &#x5FC5;&#x9009;&#xFF0C;&#x4EE3;&#x7406;&#x670D;&#x52A1;&#x5668;&#x7AEF;&#x53E3;</li> <li><code>rule</code> {object} &#x81EA;&#x5B9A;&#x4E49;&#x89C4;&#x5219;&#x6A21;&#x5757;</li> <li><code>throttle</code> {number} &#x9650;&#x901F;&#x503C;&#xFF0C;&#x5355;&#x4F4D;kb/s&#xFF0C;&#x9ED8;&#x8BA4;&#x4E0D;&#x9650;&#x901F;</li> <li><code>forceProxyHttps</code> {boolean} &#x662F;&#x5426;&#x5F3A;&#x5236;&#x62E6;&#x622A;&#x6240;&#x6709;&#x7684;https&#xFF0C;&#x5FFD;&#x7565;&#x89C4;&#x5219;&#x6A21;&#x5757;&#x7684;&#x8FD4;&#x56DE;&#xFF0C;&#x9ED8;&#x8BA4;<code>false</code></li> <li><code>silent</code> {boolean} &#x662F;&#x5426;&#x5C4F;&#x853D;&#x6240;&#x6709;console&#x8F93;&#x51FA;&#xFF0C;&#x9ED8;&#x8BA4;<code>false</code></li> <li><code>dangerouslyIgnoreUnauthorized</code> {boolean} &#x662F;&#x5426;&#x5FFD;&#x7565;&#x8BF7;&#x6C42;&#x4E2D;&#x7684;&#x8BC1;&#x4E66;&#x9519;&#x8BEF;&#xFF0C;&#x9ED8;&#x8BA4;<code>false</code></li> <li><code>wsIntercept</code> {boolean} &#x662F;&#x5426;&#x5F00;&#x542F;websocket&#x4EE3;&#x7406;&#xFF0C;&#x9ED8;&#x8BA4;<code>false</code></li> <li><code>webInterface</code> {object} web&#x7248;&#x754C;&#x9762;&#x914D;&#x7F6E;<ul> <li><code>enable</code> {boolean} &#x662F;&#x5426;&#x542F;&#x7528;web&#x7248;&#x754C;&#x9762;&#xFF0C;&#x9ED8;&#x8BA4;<code>false</code></li> <li><code>webPort</code> {number} web&#x7248;&#x754C;&#x9762;&#x7AEF;&#x53E3;&#x53F7;&#xFF0C;&#x9ED8;&#x8BA4;<code>8002</code></li> </ul> </li> </ul> </li> <li><p>Event: <code>ready</code></p> <ul> <li>&#x4EE3;&#x7406;&#x670D;&#x52A1;&#x5668;&#x542F;&#x52A8;&#x5B8C;&#x6210;</li> <li>&#x793A;&#x4F8B;</li> </ul> <pre><code class="lang-js">proxy.on(<span class="hljs-string">&apos;ready&apos;</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> <li>&#x4EE3;&#x7406;&#x670D;&#x52A1;&#x5668;&#x53D1;&#x751F;&#x9519;&#x8BEF;</li> <li>&#x793A;&#x4F8B;</li> </ul> <pre><code class="lang-js">proxy.on(<span class="hljs-string">&apos;error&apos;</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> <li>&#x542F;&#x52A8;&#x4EE3;&#x7406;&#x670D;&#x52A1;&#x5668;</li> <li>&#x793A;&#x4F8B;</li> </ul> <pre><code class="lang-js">proxy.start(); </code></pre> </li> <li><p>Method: <code>close</code></p> <ul> <li>&#x5173;&#x95ED;&#x4EE3;&#x7406;&#x670D;&#x52A1;&#x5668;</li> <li>&#x793A;&#x4F8B;</li> </ul> <pre><code class="lang-js">proxy.close(); </code></pre> </li> </ul> </li> <li><p>AnyProxy.utils.systemProxyMgr</p> <ul> <li>&#x7BA1;&#x7406;&#x7CFB;&#x7EDF;&#x7684;&#x5168;&#x5C40;&#x4EE3;&#x7406;&#x914D;&#x7F6E;&#xFF0C;&#x65B9;&#x6CD5;&#x8C03;&#x7528;&#x65F6;&#x53EF;&#x80FD;&#x4F1A;&#x5F39;&#x51FA;&#x5BC6;&#x7801;&#x6846;</li> <li>&#x4F7F;&#x7528;&#x793A;&#x4F8B;</li> </ul> <pre><code class="lang-js"><span class="hljs-comment">// &#x914D;&#x7F6E;127.0.0.1:8001&#x4E3A;&#x5168;&#x5C40;http&#x4EE3;&#x7406;&#x670D;&#x52A1;&#x5668;</span> AnyProxy.utils.systemProxyMgr.enableGlobalProxy(<span class="hljs-string">&apos;127.0.0.1&apos;</span>, <span class="hljs-string">&apos;8001&apos;</span>); <span class="hljs-comment">// &#x5173;&#x95ED;&#x5168;&#x5C40;&#x4EE3;&#x7406;&#x670D;&#x52A1;&#x5668;</span> AnyProxy.utils.systemProxyMgr.disableGlobalProxy(); </code></pre> </li> <li><p>AnyProxy.utils.certMgr</p> <ul> <li>&#x7BA1;&#x7406;AnyProxy&#x7684;&#x8BC1;&#x4E66;</li> <li><code>AnyProxy.utils.certMgr.ifRootCAFileExists()</code><ul> <li>&#x6821;&#x9A8C;&#x7CFB;&#x7EDF;&#x5185;&#x662F;&#x5426;&#x5B58;&#x5728;AnyProxy&#x7684;&#x6839;&#x8BC1;&#x4E66;</li> </ul> </li> <li><code>AnyProxy.utils.certMgr.generateRootCA(callback)</code><ul> <li>&#x751F;&#x6210;AnyProxy&#x7684;rootCA&#xFF0C;&#x5B8C;&#x6210;&#x540E;&#x8BF7;&#x5F15;&#x5BFC;&#x7528;&#x6237;&#x4FE1;&#x4EFB;.crt&#x6587;&#x4EF6;</li> </ul> </li> <li>&#x6837;&#x4F8B;</li> </ul> <pre><code class="lang-js"> <span class="hljs-keyword">const</span> AnyProxy = <span class="hljs-built_in">require</span>(<span class="hljs-string">&apos;anyproxy&apos;</span>); <span class="hljs-keyword">const</span> exec = <span class="hljs-built_in">require</span>(<span class="hljs-string">&apos;child_process&apos;</span>).exec; <span class="hljs-keyword">if</span> (!AnyProxy.utils.certMgr.ifRootCAFileExists()) { AnyProxy.utils.certMgr.generateRootCA((error, keyPath) =&gt; { <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">&apos;path&apos;</span>).dirname(keyPath); <span class="hljs-built_in">console</span>.log(<span class="hljs-string">&apos;The cert is generated at&apos;</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">&apos;start .&apos;</span>, { cwd: certDir }); } <span class="hljs-keyword">else</span> { exec(<span class="hljs-string">&apos;open .&apos;</span>, { cwd: certDir }); } } <span class="hljs-keyword">else</span> { <span class="hljs-built_in">console</span>.error(<span class="hljs-string">&apos;error when generating rootCA&apos;</span>, error); } }); } </code></pre> </li> </ul> <h1 id="&#x4EE3;&#x7406;https">&#x4EE3;&#x7406;HTTPS</h1> <ul> <li>AnyProxy&#x9ED8;&#x8BA4;&#x4E0D;&#x5BF9;https&#x8BF7;&#x6C42;&#x505A;&#x5904;&#x7406;&#xFF0C;&#x5982;&#x9700;&#x770B;&#x5230;&#x660E;&#x6587;&#x4FE1;&#x606F;&#xFF0C;&#x9700;&#x8981;&#x914D;&#x7F6E;CA&#x8BC1;&#x4E66;</li> </ul> <blockquote> <p>&#x89E3;&#x6790;https&#x8BF7;&#x6C42;&#x7684;&#x539F;&#x7406;&#x662F;&#x4E2D;&#x95F4;&#x4EBA;&#x653B;&#x51FB;&#xFF08;man-in-the-middle&#xFF09;&#xFF0C;&#x7528;&#x6237;&#x5FC5;&#x987B;&#x4FE1;&#x4EFB;AnyProxy&#x751F;&#x6210;&#x7684;CA&#x8BC1;&#x4E66;&#xFF0C;&#x624D;&#x80FD;&#x8FDB;&#x884C;&#x540E;&#x7EED;&#x6D41;&#x7A0B;</p> </blockquote> <ul> <li>&#x751F;&#x6210;&#x8BC1;&#x4E66;&#x5E76;&#x89E3;&#x6790;&#x6240;&#x6709;https&#x8BF7;&#x6C42;</li> </ul> <pre><code class="lang-bash">anyproxy-ca <span class="hljs-comment">#&#x751F;&#x6210;rootCA&#x8BC1;&#x4E66;&#xFF0C;&#x751F;&#x6210;&#x540E;&#x9700;&#x8981;&#x624B;&#x52A8;&#x4FE1;&#x4EFB;</span> anyproxy --intercept <span class="hljs-comment">#&#x542F;&#x52A8;AnyProxy&#xFF0C;&#x5E76;&#x89E3;&#x6790;&#x6240;&#x6709;https&#x8BF7;&#x6C42;</span> </code></pre> <ul> <li><a href="#&#x8BC1;&#x4E66;&#x914D;&#x7F6E;">&#x9644;&#x5F55;&#xFF1A;&#x5982;&#x4F55;&#x4FE1;&#x4EFB;CA&#x8BC1;&#x4E66;</a></li> </ul> <h1 id="&#x4EE3;&#x7406;websocket">&#x4EE3;&#x7406;WebSocket</h1> <pre><code class="lang-bash">anyproxy --ws-intercept </code></pre> <blockquote> <p>&#x5F53;&#x542F;&#x7528;<code>HTTPS</code>&#x4EE3;&#x7406;&#x65F6;&#xFF0C;<code>wss</code>&#x4E5F;&#x4F1A;&#x88AB;&#x4EE3;&#x7406;&#xFF0C;&#x4F46;&#x662F;&#x4E0D;&#x4F1A;&#x88AB;AnyProxy&#x8BB0;&#x5F55;&#x3002;&#x9700;&#x8981;&#x5F00;&#x542F;<code>--ws-intercept</code>&#x540E;&#x624D;&#x4F1A;&#x4ECE;&#x754C;&#x9762;&#x4E0A;&#x770B;&#x5230;&#x76F8;&#x5E94;&#x5185;&#x5BB9;&#x3002;</p> </blockquote> <h1 id="rule&#x6A21;&#x5757;">rule&#x6A21;&#x5757;</h1> <p>AnyProxy&#x63D0;&#x4F9B;&#x4E86;&#x4E8C;&#x6B21;&#x5F00;&#x53D1;&#x7684;&#x80FD;&#x529B;&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x7528;js&#x7F16;&#x5199;&#x81EA;&#x5DF1;&#x7684;&#x89C4;&#x5219;&#x6A21;&#x5757;&#xFF08;rule&#xFF09;&#xFF0C;&#x6765;&#x81EA;&#x5B9A;&#x4E49;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#x7684;&#x5904;&#x7406;&#x903B;&#x8F91;&#x3002;</p> <blockquote> <p>&#x6CE8;&#x610F;&#xFF1A;&#x5F15;&#x7528;&#x89C4;&#x5219;&#x524D;&#xFF0C;&#x8BF7;&#x52A1;&#x5FC5;&#x786E;&#x4FDD;&#x6587;&#x4EF6;&#x6765;&#x6E90;&#x53EF;&#x9760;&#xFF0C;&#x4EE5;&#x514D;&#x53D1;&#x751F;&#x5B89;&#x5168;&#x95EE;&#x9898;</p> </blockquote> <p>&#x89C4;&#x5219;&#x6A21;&#x5757;&#x7684;&#x80FD;&#x529B;&#x8303;&#x56F4;&#x5305;&#x62EC;&#xFF1A;</p> <ul> <li>&#x62E6;&#x622A;&#x5E76;&#x4FEE;&#x6539;&#x6B63;&#x5728;&#x53D1;&#x9001;&#x7684;&#x8BF7;&#x6C42;<ul> <li>&#x53EF;&#x4FEE;&#x6539;&#x5185;&#x5BB9;&#x5305;&#x62EC;&#x8BF7;&#x6C42;&#x5934;&#xFF08;request header)&#xFF0C;&#x8BF7;&#x6C42;&#x4F53;&#xFF08;request body&#xFF09;&#xFF0C;&#x751A;&#x81F3;&#x662F;&#x8BF7;&#x6C42;&#x7684;&#x76EE;&#x6807;&#x5730;&#x5740;&#x7B49;</li> </ul> </li> <li>&#x62E6;&#x622A;&#x5E76;&#x4FEE;&#x6539;&#x670D;&#x52A1;&#x7AEF;&#x54CD;&#x5E94;<ul> <li>&#x53EF;&#x4FEE;&#x6539;&#x7684;&#x5185;&#x5BB9;&#x5305;&#x62EC;http&#x72B6;&#x6001;&#x7801;(status code)&#x3001;&#x54CD;&#x5E94;&#x5934;&#xFF08;response header&#xFF09;&#x3001;&#x54CD;&#x5E94;&#x5185;&#x5BB9;&#x7B49;</li> </ul> </li> <li>&#x62E6;&#x622A;https&#x8BF7;&#x6C42;&#xFF0C;&#x5BF9;&#x5185;&#x5BB9;&#x505A;&#x4FEE;&#x6539;<ul> <li>&#x672C;&#x8D28;&#x662F;&#x4E2D;&#x95F4;&#x4EBA;&#x653B;&#x51FB;&#xFF08;man-in-the-middle attack&#xFF09;&#xFF0C;&#x9700;&#x8981;&#x5BA2;&#x6237;&#x7AEF;&#x63D0;&#x524D;&#x4FE1;&#x4EFB;AnyProxy&#x751F;&#x6210;&#x7684;CA</li> </ul> </li> </ul> <h3 id="&#x5F00;&#x53D1;&#x793A;&#x4F8B;">&#x5F00;&#x53D1;&#x793A;&#x4F8B;</h3> <ul> <li><p>&#x4E3E;&#x4F8B;</p> <ul> <li>&#x9700;&#x8981;&#x7F16;&#x5199;&#x4E00;&#x4E2A;&#x89C4;&#x5219;&#x6A21;&#x5757;&#xFF0C;&#x5728; GET <a href="http://httpbin.org/user-agent" target="_blank">http://httpbin.org/user-agent</a> &#x7684;&#x8FD4;&#x56DE;&#x503C;&#x91CC;&#x52A0;&#x4E0A;&#x6D4B;&#x8BD5;&#x4FE1;&#x606F;&#xFF0C;&#x5E76;&#x5EF6;&#x8FDF;5&#x79D2;&#x8FD4;&#x56DE;</li> </ul> </li> <li><p>Step 1&#xFF0C;&#x7F16;&#x5199;&#x89C4;&#x5219;</p> <pre><code class="lang-js"><span class="hljs-comment">// file: sample.js</span> <span class="hljs-built_in">module</span>.exports = { summary: <span class="hljs-string">&apos;a rule to hack response&apos;</span>, *beforeSendResponse(requestDetail, responseDetail) { <span class="hljs-keyword">if</span> (requestDetail.url === <span class="hljs-string">&apos;http://httpbin.org/user-agent&apos;</span>) { <span class="hljs-keyword">const</span> newResponse = responseDetail.response; newResponse.body += <span class="hljs-string">&apos;- AnyProxy Hacked!&apos;</span>; <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Promise</span>((resolve, reject) =&gt; { setTimeout(() =&gt; { <span class="hljs-comment">// delay</span> resolve({ response: newResponse }); }, <span class="hljs-number">5000</span>); }); } }, }; </code></pre> </li> <li><p>Step 2, &#x542F;&#x52A8;AnyProxy&#xFF0C;&#x52A0;&#x8F7D;&#x89C4;&#x5219;</p> <ul> <li>&#x8FD0;&#x884C; <code>anyproxy --rule sample.js</code></li> </ul> </li> <li><p>Step 3, &#x6D4B;&#x8BD5;&#x89C4;&#x5219;</p> <ul> <li><p>&#x7528;curl&#x6D4B;&#x8BD5;</p> <pre><code class="lang-bash">curl http://httpbin.org/user-agent --proxy http://127.0.0.1:8001 </code></pre> </li> <li><p>&#x7528;&#x6D4F;&#x89C8;&#x5668;&#x6D4B;&#x8BD5;&#xFF1A;&#x914D;&#x7F6E;&#x6D4F;&#x89C8;&#x5668;http&#x4EE3;&#x7406;&#x4E3A; 127.0.0.1:8001&#xFF0C;&#x8BBF;&#x95EE; <a href="http://httpbin.org/user-agent" target="_blank">http://httpbin.org/user-agent</a></p> </li> <li><p>&#x7ECF;&#x8FC7;&#x4EE3;&#x7406;&#x670D;&#x52A1;&#x5668;&#x540E;&#xFF0C;&#x671F;&#x671B;&#x7684;&#x8FD4;&#x56DE;&#x5982;&#x4E0B;</p> </li> </ul> <pre><code>{ &quot;user-agent&quot;: &quot;curl/7.43.0&quot; } - AnyProxy Hacked! </code></pre></li> <li><p>Step 4, &#x67E5;&#x770B;&#x8BF7;&#x6C42;&#x4FE1;&#x606F;</p> <ul> <li>&#x6D4F;&#x89C8;&#x5668;&#x8BBF;&#x95EE;<a href="http://127.0.0.1:8002" target="_blank">http://127.0.0.1:8002</a> &#xFF0C;&#x754C;&#x9762;&#x4E0A;&#x80FD;&#x770B;&#x5230;&#x521A;&#x624D;&#x7684;&#x8BF7;&#x6C42;&#x4FE1;&#x606F;</li> </ul> </li> </ul> <h3 id="&#x5904;&#x7406;&#x6D41;&#x7A0B;">&#x5904;&#x7406;&#x6D41;&#x7A0B;</h3> <ul> <li>&#x5904;&#x7406;&#x6D41;&#x7A0B;&#x56FE;&#x5982;&#x4E0B;</li> </ul> <p><img src="https://zos.alipayobjects.com/rmsportal/TWyNuSJtEZBdrdcOMRjE.png" width="550"></p> <ul> <li><p>&#x5F53;http&#x8BF7;&#x6C42;&#x7ECF;&#x8FC7;&#x4EE3;&#x7406;&#x670D;&#x52A1;&#x5668;&#x65F6;&#xFF0C;&#x5177;&#x4F53;&#x5904;&#x7406;&#x8FC7;&#x7A0B;&#x662F;&#xFF1A;</p> <ul> <li>&#x6536;&#x96C6;&#x8BF7;&#x6C42;&#x6240;&#x6709;&#x8BF7;&#x6C42;&#x53C2;&#x6570;&#xFF0C;&#x5305;&#x62EC;method, header, body&#x7B49;</li> <li>AnyProxy&#x8C03;&#x7528;&#x89C4;&#x5219;&#x6A21;&#x5757;<code>beforeSendRequest</code>&#x65B9;&#x6CD5;&#xFF0C;&#x7531;&#x6A21;&#x5757;&#x505A;&#x5904;&#x7406;&#xFF0C;&#x8FD4;&#x56DE;&#x65B0;&#x7684;&#x8BF7;&#x6C42;&#x53C2;&#x6570;&#xFF0C;&#x6216;&#x8FD4;&#x56DE;&#x54CD;&#x5E94;&#x5185;&#x5BB9;</li> <li>&#x5982;&#x679C;<code>beforeSendRequest</code>&#x8FD4;&#x56DE;&#x4E86;&#x54CD;&#x5E94;&#x5185;&#x5BB9;&#xFF0C;&#x5219;&#x7ACB;&#x5373;&#x628A;&#x6B64;&#x54CD;&#x5E94;&#x8FD4;&#x56DE;&#x5230;&#x5BA2;&#x6237;&#x7AEF;&#xFF08;&#x800C;&#x4E0D;&#x518D;&#x53D1;&#x9001;&#x5230;&#x771F;&#x6B63;&#x7684;&#x670D;&#x52A1;&#x7AEF;&#xFF09;&#xFF0C;&#x6D41;&#x7A0B;&#x7ED3;&#x675F;&#x3002;</li> <li>&#x6839;&#x636E;&#x8BF7;&#x6C42;&#x53C2;&#x6570;&#xFF0C;&#x5411;&#x670D;&#x52A1;&#x7AEF;&#x53D1;&#x51FA;&#x8BF7;&#x6C42;&#xFF0C;&#x63A5;&#x6536;&#x670D;&#x52A1;&#x7AEF;&#x54CD;&#x5E94;&#x3002;</li> <li>&#x8C03;&#x7528;&#x89C4;&#x5219;&#x6A21;&#x5757;<code>beforeSendResponse</code>&#x65B9;&#x6CD5;&#xFF0C;&#x7531;&#x6A21;&#x5757;&#x5BF9;&#x54CD;&#x5E94;&#x5185;&#x5BB9;&#x8FDB;&#x884C;&#x5904;&#x7406;</li> <li>&#x628A;&#x54CD;&#x5E94;&#x4FE1;&#x606F;&#x8FD4;&#x56DE;&#x7ED9;&#x5BA2;&#x6237;&#x7AEF;</li> </ul> </li> <li><p>&#x5F53;&#x4EE3;&#x7406;&#x670D;&#x52A1;&#x5668;&#x6536;&#x5230;https&#x8BF7;&#x6C42;&#x65F6;&#xFF0C;AnyProxy&#x53EF;&#x4EE5;&#x66FF;&#x6362;&#x8BC1;&#x4E66;&#xFF0C;&#x5BF9;&#x8BF7;&#x6C42;&#x505A;&#x660E;&#x6587;&#x89E3;&#x6790;&#x3002;</p> <ul> <li>&#x8C03;&#x7528;&#x89C4;&#x5219;&#x6A21;&#x5757;<code>beforeDealHttpsRequest</code>&#x65B9;&#x6CD5;&#xFF0C;&#x5982;&#x679C;&#x8FD4;&#x56DE;<code>true</code>&#xFF0C;&#x4F1A;&#x660E;&#x6587;&#x89E3;&#x6790;&#x8FD9;&#x4E2A;&#x8BF7;&#x6C42;&#xFF0C;&#x5176;&#x4ED6;&#x8BF7;&#x6C42;&#x4E0D;&#x5904;&#x7406;</li> <li>&#x88AB;&#x660E;&#x6587;&#x89E3;&#x6790;&#x540E;&#x7684;https&#x8BF7;&#x6C42;&#xFF0C;&#x5904;&#x7406;&#x6D41;&#x7A0B;&#x540C;http&#x4E00;&#x81F4;&#x3002;&#x672A;&#x660E;&#x6587;&#x89E3;&#x6790;&#x8BF7;&#x6C42;&#x4E0D;&#x4F1A;&#x518D;&#x8FDB;&#x5165;&#x89C4;&#x5219;&#x6A21;&#x5757;&#x505A;&#x5904;&#x7406;&#x3002;</li> </ul> </li> </ul> <h3 id="&#x5982;&#x4F55;&#x5F15;&#x7528;">&#x5982;&#x4F55;&#x5F15;&#x7528;</h3> <p>&#x5982;&#x4E0B;&#x51E0;&#x79CD;&#x65B9;&#x6848;&#x90FD;&#x53EF;&#x4EE5;&#x7528;&#x6765;&#x5F15;&#x7528;&#x89C4;&#x5219;&#x6A21;&#x5757;&#xFF1A;</p> <ul> <li>&#x4F7F;&#x7528;&#x672C;&#x5730;&#x8DEF;&#x5F84;<pre><code class="lang-bash">anyproxy --rule ./rule.js </code></pre> </li> <li><p>&#x4F7F;&#x7528;&#x5728;&#x7EBF;&#x5730;&#x5740;</p> <pre><code class="lang-bash">anyproxy --rule https://sample.com/rule.js </code></pre> </li> <li><p>&#x4F7F;&#x7528;npm&#x5305;</p> <ul> <li>AnyProxy&#x4F7F;&#x7528;<code>require()</code>&#x52A0;&#x8F7D;&#x672C;&#x5730;&#x89C4;&#x5219;&#xFF0C;&#x4F60;&#x53EF;&#x4EE5;&#x5728;&#x53C2;&#x6570;&#x91CC;&#x4F20;&#x5165;&#x4E00;&#x4E2A;&#x672C;&#x5730;&#x7684;npm&#x5305;&#x8DEF;&#x5F84;&#xFF0C;&#x6216;&#x662F;&#x67D0;&#x4E2A;&#x5168;&#x5C40;&#x5B89;&#x88C5;&#x7684;npm&#x5305;</li> </ul> <pre><code class="lang-bash">anyproxy --rule ./myRulePkg/ <span class="hljs-comment">#&#x672C;&#x5730;&#x5305;</span> npm i -g myRulePkg &amp;&amp; anyproxy --rule myRulePkg <span class="hljs-comment">#&#x5168;&#x5C40;&#x5305;</span> </code></pre> </li> </ul> <h1 id="rule&#x63A5;&#x53E3;&#x6587;&#x6863;">rule&#x63A5;&#x53E3;&#x6587;&#x6863;</h1> <p>&#x89C4;&#x5219;&#x6A21;&#x5757;&#x5E94;&#x8BE5;&#x7B26;&#x5408;cmd&#x89C4;&#x8303;&#xFF0C;&#x4E00;&#x4E2A;&#x5178;&#x578B;&#x7684;&#x89C4;&#x5219;&#x6A21;&#x5757;&#x4EE3;&#x7801;&#x7ED3;&#x6784;&#x5982;&#x4E0B;&#x3002;&#x6A21;&#x5757;&#x4E2D;&#x6240;&#x6709;&#x65B9;&#x6CD5;&#x90FD;&#x662F;&#x53EF;&#x9009;&#x7684;&#xFF0C;&#x53EA;&#x9700;&#x5B9E;&#x73B0;&#x4E1A;&#x52A1;&#x611F;&#x5174;&#x8DA3;&#x7684;&#x90E8;&#x5206;&#x5373;&#x53EF;&#x3002;</p> <pre><code class="lang-js"><span class="hljs-built_in">module</span>.exports = { <span class="hljs-comment">// &#x6A21;&#x5757;&#x4ECB;&#x7ECD;</span> summary: <span class="hljs-string">&apos;my customized rule for AnyProxy&apos;</span>, <span class="hljs-comment">// &#x53D1;&#x9001;&#x8BF7;&#x6C42;&#x524D;&#x62E6;&#x622A;&#x5904;&#x7406;</span> *beforeSendRequest(requestDetail) { <span class="hljs-comment">/* ... */</span> }, <span class="hljs-comment">// &#x53D1;&#x9001;&#x54CD;&#x5E94;&#x524D;&#x5904;&#x7406;</span> *beforeSendResponse(requestDetail, responseDetail) { <span class="hljs-comment">/* ... */</span> }, <span class="hljs-comment">// &#x662F;&#x5426;&#x5904;&#x7406;https&#x8BF7;&#x6C42;</span> *beforeDealHttpsRequest(requestDetail) { <span class="hljs-comment">/* ... */</span> }, <span class="hljs-comment">// &#x8BF7;&#x6C42;&#x51FA;&#x9519;&#x7684;&#x4E8B;&#x4EF6;</span> *onError(requestDetail, error) { <span class="hljs-comment">/* ... */</span> }, <span class="hljs-comment">// https&#x8FDE;&#x63A5;&#x670D;&#x52A1;&#x5668;&#x51FA;&#x9519;</span> *onConnectError(requestDetail, error) { <span class="hljs-comment">/* ... */</span> } }; </code></pre> <blockquote> <p>&#x89C4;&#x5219;&#x6587;&#x4EF6;&#x4E2D;&#xFF0C;&#x9664;&#x4E86;summary&#xFF0C;&#x90FD;&#x662F;&#x7531; <a href="https://www.npmjs.com/package/co" target="_blank">co</a> &#x9A71;&#x52A8;&#x7684;&#xFF0C;&#x51FD;&#x6570;&#x9700;&#x8981;&#x6EE1;&#x8DB3;yieldable&#x3002;&#x53EF;&#x4EE5;&#x8FD4;&#x56DE;promise&#x6216;&#x4F7F;&#x7528;generator&#x51FD;&#x6570;&#x3002;</p> </blockquote> <h3 id="summary">summary</h3> <h4 id="summary-string--summarystring">summary(): string | summary:string</h4> <ul> <li>&#x89C4;&#x5219;&#x6A21;&#x5757;&#x7684;&#x4ECB;&#x7ECD;&#x6587;&#x6848;&#xFF0C;&#x7528;&#x4E8E;AnyProxy&#x63D0;&#x793A;&#x7528;&#x6237;, &#x53EF;&#x4EE5;&#x662F;&#x4E00;&#x4E2A;&#x51FD;&#x6570;&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x662F;&#x4E00;&#x4E2A;&#x666E;&#x901A;&#x7684;&#x5B57;&#x7B26;&#x4E32;</li> </ul> <h3 id="beforesendrequest">beforeSendRequest</h3> <h4 id="beforesendrequestrequestdetail">beforeSendRequest(requestDetail)</h4> <ul> <li>AnyProxy&#x5411;&#x670D;&#x52A1;&#x7AEF;&#x53D1;&#x9001;&#x8BF7;&#x6C42;&#x524D;&#xFF0C;&#x4F1A;&#x8C03;&#x7528;<code>beforeSendRequest</code>&#xFF0C;&#x5E76;&#x5E26;&#x4E0A;&#x53C2;&#x6570;<code>requestDetail</code></li> <li><code>requestDetail</code><ul> <li><code>protocol</code> {string} &#x8BF7;&#x6C42;&#x4F7F;&#x7528;&#x7684;&#x534F;&#x8BAE;&#xFF0C;http&#x6216;&#x8005;https</li> <li><code>requestOptions</code> {object} &#x5373;&#x5C06;&#x53D1;&#x9001;&#x7684;&#x8BF7;&#x6C42;&#x914D;&#x7F6E;&#xFF0C;&#x4F9B;require(&apos;http&apos;).request&#x4F5C;&#x4E3A;&#x4F7F;&#x7528;&#x3002;&#x8BE6;&#x89C1;&#xFF1A;<a href="https://nodejs.org/api/http.html#http_http_request_options_callback" target="_blank">https://nodejs.org/api/http.html#http_http_request_options_callback</a></li> <li><code>requestData</code> {object} &#x8BF7;&#x6C42;Body</li> <li><code>url</code> {string} &#x8BF7;&#x6C42;url</li> <li><code>_req</code> {object} &#x8BF7;&#x6C42;&#x7684;&#x539F;&#x59CB;request</li> </ul> </li> <li><p>&#x4E3E;&#x4F8B;&#xFF1A;&#x8BF7;&#x6C42; <em>anyproxy.io</em> &#x65F6;&#xFF0C;<code>requestDetail</code>&#x53C2;&#x6570;&#x5185;&#x5BB9;&#x5927;&#x81F4;&#x5982;&#x4E0B;</p> <pre><code class="lang-js">{ protocol: <span class="hljs-string">&apos;http&apos;</span>, url: <span class="hljs-string">&apos;http://anyproxy.io/&apos;</span>, requestOptions: { hostname: <span class="hljs-string">&apos;anyproxy.io&apos;</span>, port: <span class="hljs-number">80</span>, path: <span class="hljs-string">&apos;/&apos;</span>, method: <span class="hljs-string">&apos;GET&apos;</span>, headers: { Host: <span class="hljs-string">&apos;anyproxy.io&apos;</span>, <span class="hljs-string">&apos;Proxy-Connection&apos;</span>: <span class="hljs-string">&apos;keep-alive&apos;</span>, <span class="hljs-string">&apos;User-Agent&apos;</span>: <span class="hljs-string">&apos;...&apos;</span> } }, requestData: <span class="hljs-string">&apos;...&apos;</span>, _req: { <span class="hljs-comment">/* ... */</span>} } </code></pre> </li> <li><p>&#x4EE5;&#x4E0B;&#x51E0;&#x79CD;&#x8FD4;&#x56DE;&#x90FD;&#x662F;&#x5408;&#x6CD5;&#x7684;</p> <ul> <li>&#x4E0D;&#x505A;&#x4EFB;&#x4F55;&#x5904;&#x7406;&#xFF0C;&#x8FD4;&#x56DE;null</li> </ul> <pre><code class="lang-js"><span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>; </code></pre> <ul> <li>&#x4FEE;&#x6539;&#x8BF7;&#x6C42;&#x534F;&#x8BAE;&#xFF0C;&#x5982;&#x5F3A;&#x5236;&#x6539;&#x7528;https&#x53D1;&#x8D77;&#x8BF7;&#x6C42;</li> </ul> <pre><code class="lang-js"><span class="hljs-keyword">return</span> { protocol: <span class="hljs-string">&apos;https&apos;</span> }; </code></pre> <ul> <li>&#x4FEE;&#x6539;&#x8BF7;&#x6C42;&#x53C2;&#x6570;</li> </ul> <pre><code class="lang-js"><span class="hljs-keyword">var</span> newOption = <span class="hljs-built_in">Object</span>.assign({}, requestDetail.requestOptions); newOption.path = <span class="hljs-string">&apos;/redirect/to/another/path&apos;</span>; <span class="hljs-keyword">return</span> { requestOptions: newOption }; </code></pre> <ul> <li>&#x4FEE;&#x6539;&#x8BF7;&#x6C42;body</li> </ul> <pre><code class="lang-js"><span class="hljs-keyword">return</span> { requestData: <span class="hljs-string">&apos;my new request data&apos;</span> <span class="hljs-comment">//&#x8FD9;&#x91CC;&#x4E5F;&#x53EF;&#x4EE5;&#x540C;&#x65F6;&#x52A0;&#x4E0A;requestOptions</span> }; </code></pre> <ul> <li>&#x76F4;&#x63A5;&#x8FD4;&#x56DE;&#x5BA2;&#x6237;&#x7AEF;&#xFF0C;&#x4E0D;&#x518D;&#x53D1;&#x8D77;&#x8BF7;&#x6C42;&#xFF0C;&#x5176;&#x4E2D;<code>statusCode</code> <code>header</code> &#x662F;&#x5FC5;&#x9009;&#x5B57;&#x6BB5;</li> </ul> <pre><code class="lang-js"><span class="hljs-keyword">return</span> { response: { statusCode: <span class="hljs-number">200</span>, header: { <span class="hljs-string">&apos;content-type&apos;</span>: <span class="hljs-string">&apos;text/html&apos;</span> }, body: <span class="hljs-string">&apos;this could be a &lt;string&gt; or &lt;buffer&gt;&apos;</span> } }; </code></pre> </li> </ul> <h3 id="beforesendresponse">beforeSendResponse</h3> <h4 id="beforesendresponserequestdetail-responsedetail">beforeSendResponse(requestDetail, responseDetail)</h4> <ul> <li>AnyProxy&#x5411;&#x5BA2;&#x6237;&#x7AEF;&#x53D1;&#x9001;&#x8BF7;&#x6C42;&#x524D;&#xFF0C;&#x4F1A;&#x8C03;&#x7528;<code>beforeSendResponse</code>&#xFF0C;&#x5E76;&#x5E26;&#x4E0A;&#x53C2;&#x6570;<code>requestDetail</code> <code>responseDetail</code></li> <li><code>requestDetail</code> &#x540C;<code>beforeSendRequest</code>&#x4E2D;&#x7684;&#x53C2;&#x6570;</li> <li><code>responseDetail</code><ul> <li><code>response</code> {object} &#x670D;&#x52A1;&#x7AEF;&#x7684;&#x8FD4;&#x56DE;&#x4FE1;&#x606F;&#xFF0C;&#x5305;&#x62EC;<code>statusCode</code> <code>header</code> <code>body</code>&#x4E09;&#x4E2A;&#x5B57;&#x6BB5;</li> <li><code>_res</code> {object} &#x539F;&#x59CB;&#x7684;&#x670D;&#x52A1;&#x7AEF;&#x8FD4;&#x56DE;&#x5BF9;&#x8C61;</li> </ul> </li> <li><p>&#x4E3E;&#x4F8B;&#xFF0C;&#x8BF7;&#x6C42; <em>anyproxy.io</em> &#x65F6;&#xFF0C;<code>responseDetail</code>&#x53C2;&#x6570;&#x5185;&#x5BB9;&#x5927;&#x81F4;&#x5982;&#x4E0B;</p> <pre><code class="lang-js">{ response: { statusCode: <span class="hljs-number">200</span>, header: { <span class="hljs-string">&apos;Content-Type&apos;</span>: <span class="hljs-string">&apos;image/gif&apos;</span>, Connection: <span class="hljs-string">&apos;close&apos;</span>, <span class="hljs-string">&apos;Cache-Control&apos;</span>: <span class="hljs-string">&apos;...&apos;</span> }, body: <span class="hljs-string">&apos;...&apos;</span> }, _res: { <span class="hljs-comment">/* ... */</span> } } </code></pre> </li> <li><p>&#x4EE5;&#x4E0B;&#x51E0;&#x79CD;&#x8FD4;&#x56DE;&#x90FD;&#x662F;&#x5408;&#x6CD5;&#x7684;</p> <ul> <li>&#x4E0D;&#x505A;&#x4EFB;&#x4F55;&#x5904;&#x7406;&#xFF0C;&#x8FD4;&#x56DE;null</li> </ul> <pre><code class="lang-js"><span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>; </code></pre> <ul> <li>&#x4FEE;&#x6539;&#x8FD4;&#x56DE;&#x7684;&#x72B6;&#x6001;&#x7801;</li> </ul> <pre><code class="lang-js"><span class="hljs-keyword">var</span> newResponse = <span class="hljs-built_in">Object</span>.assign({}, responseDetail.response); newResponse.statusCode = <span class="hljs-number">404</span>; <span class="hljs-keyword">return</span> { response: newResponse }; </code></pre> <ul> <li>&#x4FEE;&#x6539;&#x8FD4;&#x56DE;&#x7684;&#x5185;&#x5BB9;</li> </ul> <pre><code class="lang-js"><span class="hljs-keyword">var</span> newResponse = <span class="hljs-built_in">Object</span>.assign({}, responseDetail.response); newResponse.body += <span class="hljs-string">&apos;--from anyproxy--&apos;</span>; <span class="hljs-keyword">return</span> { response: newResponse }; </code></pre> </li> </ul> <h3 id="beforedealhttpsrequest">beforeDealHttpsRequest</h3> <h4 id="beforedealhttpsrequestrequestdetail">beforeDealHttpsRequest(requestDetail)</h4> <ul> <li>AnyProxy&#x6536;&#x5230;https&#x8BF7;&#x6C42;&#x65F6;&#xFF0C;&#x4F1A;&#x8C03;&#x7528;<code>beforeDealHttpsRequest</code>&#xFF0C;&#x5E76;&#x5E26;&#x4E0A;&#x53C2;&#x6570;<code>requestDetail</code></li> <li>&#x5982;&#x679C;&#x914D;&#x7F6E;&#x4E86;&#x5168;&#x5C40;&#x89E3;&#x6790;https&#x7684;&#x53C2;&#x6570;&#xFF0C;&#x5219;AnyProxy&#x4F1A;&#x7565;&#x8FC7;&#x8FD9;&#x4E2A;&#x8C03;&#x7528;</li> <li>&#x53EA;&#x6709;&#x8FD4;&#x56DE;<code>true</code>&#x65F6;&#xFF0C;AnyProxy&#x624D;&#x4F1A;&#x5C1D;&#x8BD5;&#x66FF;&#x6362;&#x8BC1;&#x4E66;&#x3001;&#x89E3;&#x6790;https&#x3002;&#x5426;&#x5219;&#x53EA;&#x505A;&#x6570;&#x636E;&#x6D41;&#x8F6C;&#x53D1;&#xFF0C;&#x65E0;&#x6CD5;&#x770B;&#x5230;&#x660E;&#x6587;&#x6570;&#x636E;&#x3002;</li> <li>&#x6CE8;&#x610F;&#xFF1A;https over http&#x7684;&#x4EE3;&#x7406;&#x6A21;&#x5F0F;&#x4E2D;&#xFF0C;&#x8FD9;&#x91CC;&#x7684;request&#x662F;CONNECT&#x8BF7;&#x6C42;</li> <li><code>requestDetail</code><ul> <li><code>host</code> {string} &#x8BF7;&#x6C42;&#x76EE;&#x6807;&#x7684;Host&#xFF0C;&#x53D7;&#x5236;&#x4E8E;&#x534F;&#x8BAE;&#xFF0C;&#x8FD9;&#x91CC;&#x65E0;&#x6CD5;&#x83B7;&#x53D6;&#x5B8C;&#x6574;url</li> <li><code>_req</code> {object} &#x8BF7;&#x6C42;&#x7684;&#x539F;&#x59CB;request</li> </ul> </li> <li>&#x8FD4;&#x56DE;&#x503C;<ul> <li><code>true</code>&#x6216;&#x8005;<code>false</code>&#xFF0C;&#x8868;&#x793A;&#x662F;&#x5426;&#x9700;&#x8981;AnyProxy&#x66FF;&#x6362;&#x8BC1;&#x4E66;&#x5E76;&#x89E3;&#x6790;https</li> </ul> </li> </ul> <h3 id="onerror">onError</h3> <h4 id="onerrorrequestdetail-error">onError(requestDetail, error)</h4> <ul> <li>&#x5728;&#x8BF7;&#x6C42;&#x5904;&#x7406;&#x8FC7;&#x7A0B;&#x4E2D;&#x53D1;&#x751F;&#x9519;&#x8BEF;&#x65F6;&#xFF0C;AnyProxy&#x4F1A;&#x8C03;&#x7528;<code>onError</code>&#x65B9;&#x6CD5;&#xFF0C;&#x5E76;&#x63D0;&#x4F9B;&#x5BF9;&#x5E94;&#x7684;&#x9519;&#x8BEF;&#x4FE1;&#x606F;</li> <li>&#x591A;&#x6570;&#x573A;&#x666F;&#x4E0B;&#xFF0C;&#x9519;&#x8BEF;&#x4F1A;&#x5728;&#x8BF7;&#x6C42;&#x76EE;&#x6807;&#x670D;&#x52A1;&#x5668;&#x7684;&#x65F6;&#x5019;&#x53D1;&#x751F;&#xFF0C;&#x6BD4;&#x5982;DNS&#x89E3;&#x6790;&#x5931;&#x8D25;&#x3001;&#x8BF7;&#x6C42;&#x8D85;&#x65F6;&#x7B49;</li> <li><code>requestDetail</code> &#x540C;<code>beforeSendRequest</code>&#x4E2D;&#x7684;&#x53C2;&#x6570;</li> <li><p>&#x4EE5;&#x4E0B;&#x51E0;&#x79CD;&#x8FD4;&#x56DE;&#x90FD;&#x662F;&#x5408;&#x6CD5;&#x7684;</p> <ul> <li>&#x4E0D;&#x505A;&#x4EFB;&#x4F55;&#x5904;&#x7406;&#x3002;&#x6B64;&#x65F6;AnyProxy&#x4F1A;&#x8FD4;&#x56DE;&#x4E00;&#x4E2A;&#x9ED8;&#x8BA4;&#x7684;&#x9519;&#x8BEF;&#x9875;&#