From 3ca8359a21835a22c372c313e7809af407c14008 Mon Sep 17 00:00:00 2001 From: Otto Mao <ottomao@gmail.com> Date: Wed, 3 Sep 2014 19:41:27 +0800 Subject: [PATCH] Create gh-pages branch via GitHub --- index.html | 209 ++++++++++++++++++++++++++++++++++++++++++++++------ params.json | 2 +- 2 files changed, 188 insertions(+), 23 deletions(-) diff --git a/index.html b/index.html index 7f4a7aa..488d5be 100644 --- a/index.html +++ b/index.html @@ -16,7 +16,7 @@ <div class="wrapper"> <header> <h1>Anyproxy</h1> - <p>a charles/fiddler like proxy written in NodeJs, which can handle HTTPS requests and CROS perfectly.</p> + <p>A fully configurable proxy in NodeJS, which can handle HTTPS requests perfectly.</p> <p class="view"><a href="https://github.com/alipay-ct-wd/anyproxy">View the Project on GitHub <small>alipay-ct-wd/anyproxy</small></a></p> @@ -28,37 +28,202 @@ </ul> </header> <section> - <h3> -<a name="welcome-to-github-pages" class="anchor" href="#welcome-to-github-pages"><span class="octicon octicon-link"></span></a>Welcome to GitHub Pages.</h3> + <h1> +<a name="anyproxy" class="anchor" href="#anyproxy"><span class="octicon octicon-link"></span></a>anyproxy</h1> -<p>This automatic page generator is the easiest way to create beautiful pages for all of your projects. Author your page content here using GitHub Flavored Markdown, select a template crafted by a designer, and publish. After your page is generated, you can check out the new branch:</p> +<p>A fully configurable proxy in NodeJS, which can handle HTTPS requests perfectly.</p> -<pre><code>$ cd your_repo_root/repo_name -$ git fetch origin -$ git checkout gh-pages +<h2> +<a name="feature" class="anchor" href="#feature"><span class="octicon octicon-link"></span></a>Feature</h2> + +<ul> +<li>work as http or https proxy</li> +<li>fully configurable, you can modify a request at any stage by your own javascript code</li> +<li>when working as https proxy, it can generate and intercept https requests for any domain without complaint by browser (after you trust its root CA)</li> +<li>provide a web interface</li> +</ul><p><img src="http://gtms03.alicdn.com/tps/i3/TB1ddyqGXXXXXbXXpXXihxC1pXX-1000-549.jpg_640x640q90.jpg" alt="screenshot"></p> + +<h2> +<a name="usage" class="anchor" href="#usage"><span class="octicon octicon-link"></span></a>Usage</h2> + +<h3> +<a name="step-1---install" class="anchor" href="#step-1---install"><span class="octicon octicon-link"></span></a>step 1 - install</h3> + +<ul> +<li>install <a href="http://nodejs.org/">NodeJS</a> +</li> +<li> +<code>npm install -g anyproxy</code> , may require <code>sudo</code> +</li> +</ul><h3> +<a name="step-2---start-server" class="anchor" href="#step-2---start-server"><span class="octicon octicon-link"></span></a>step 2 - start server</h3> + +<ul> +<li>start with default settings : <code>anyproxy</code> +</li> +<li>start with a specific port: <code>anyproxy --port 8001</code> +</li> +</ul><h3> +<a name="step-3---launch-web-interface" class="anchor" href="#step-3---launch-web-interface"><span class="octicon octicon-link"></span></a>step 3 - launch web interface</h3> + +<ul> +<li>visit <a href="http://127.0.0.1:8002">http://127.0.0.1:8002</a> with modern browsers</li> +</ul><h2> +<a name="how-to-write-your-own-rule-file" class="anchor" href="#how-to-write-your-own-rule-file"><span class="octicon octicon-link"></span></a>How to write your own rule file</h2> + +<ul> +<li>with rule file, you can modify a request at any stage, no matter it's just before sending or after servers' responding.</li> +<li>actually ruleFile.js is a module for Nodejs, feel free to invoke your own modules.</li> +<li><code>anyproxy --rule /path/to/ruleFile.js</code></li> +<li>you may learn how it works by our samples: <a href="https://github.com/alipay-ct-wd/anyproxy/tree/master/rule_sample">https://github.com/alipay-ct-wd/anyproxy/tree/master/rule_sample</a> +</li> +<li> +<p>samples in <a href="https://github.com/alipay-ct-wd/anyproxy/tree/master/rule_sample">rule_sample</a></p> + +<ul> +<li><p><strong>rule__blank.js</strong>, blank rule file with some comments. You may read this before writing your own rule file.</p></li> +<li><p><strong>rule_adjust_response_time.js</strong>, delay all the response for 1500ms</p></li> +<li> +<strong>rule_allow_CORS.js</strong>, add CORS headers to allow cross-domain ajax request</li> +<li> +<strong>rule_intercept_some_https_requests.js</strong>, intercept https requests toward github.com</li> +<li> +<strong>rule_remove_cache_header.js</strong>, remove all cache-related headers from server</li> +<li> +<strong>rule_replace_request_option.js</strong>, replace request parameters before sending to the server</li> +<li> +<strong>rule_replace_response_data.js</strong>, modify response data</li> +<li> +<strong>rule_replace_response_status_code.js</strong>, replace server's status code</li> +<li> +<strong>rule_use_local_data.js</strong>, map some requests to local file</li> +</ul> +</li> +<li><p>rule file scheme is as follows, you may also get it from <a href="https://github.com/alipay-ct-wd/anyproxy/blob/master/rule_sample/rule__blank.js">rule__blank.js</a></p></li> +</ul><div class="highlight highlight-javascript"><pre> +<span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="p">{</span> + <span class="cm">/*</span> +<span class="cm"> these functions will overwrite the default ones, write your own when necessary.</span> +<span class="cm"> */</span> + + <span class="c1">//whether to intercept this request by local logic</span> + <span class="c1">//if the return value is true, anyproxy will call dealLocalResponse to get response data and will not send request to remote server anymore</span> + <span class="nx">shouldUseLocalResponse</span> <span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span><span class="nx">reqBody</span><span class="p">){</span> + <span class="k">return</span> <span class="kc">false</span><span class="p">;</span> + <span class="p">},</span> + + <span class="c1">//you may deal the response locally instead of sending it to server</span> + <span class="c1">//this function be called when shouldUseLocalResponse returns true</span> + <span class="c1">//callback(statusCode,resHeader,responseData)</span> + <span class="c1">//e.g. callback(200,{"content-type":"text/html"},"hello world")</span> + <span class="nx">dealLocalResponse</span> <span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span><span class="nx">reqBody</span><span class="p">,</span><span class="nx">callback</span><span class="p">){</span> + <span class="nx">callback</span><span class="p">(</span><span class="nx">statusCode</span><span class="p">,</span><span class="nx">resHeader</span><span class="p">,</span><span class="nx">responseData</span><span class="p">)</span> + <span class="p">},</span> + + <span class="c1">//replace the request protocol when sending to the real server</span> + <span class="c1">//protocol : "http" or "https"</span> + <span class="nx">replaceRequestProtocol</span><span class="o">:</span><span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span><span class="nx">protocol</span><span class="p">){</span> + <span class="kd">var</span> <span class="nx">newProtocol</span> <span class="o">=</span> <span class="nx">protocol</span><span class="p">;</span> + <span class="k">return</span> <span class="nx">newProtocol</span><span class="p">;</span> + <span class="p">},</span> + + <span class="c1">//req is user's request sent to the proxy server</span> + <span class="c1">//option is how the proxy server will send request to the real server. i.e. require("http").request(option,function(){...})</span> + <span class="c1">//you may return a customized option to replace the original option</span> + <span class="c1">//you should not write content-length header in options, since anyproxy will handle it for you</span> + <span class="nx">replaceRequestOption</span> <span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span><span class="nx">option</span><span class="p">){</span> + <span class="kd">var</span> <span class="nx">newOption</span> <span class="o">=</span> <span class="nx">option</span><span class="p">;</span> + <span class="k">return</span> <span class="nx">newOption</span><span class="p">;</span> + <span class="p">},</span> + + <span class="c1">//replace the request body</span> + <span class="nx">replaceRequestData</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span><span class="nx">data</span><span class="p">){</span> + <span class="k">return</span> <span class="nx">data</span><span class="p">;</span> + <span class="p">},</span> + + <span class="c1">//replace the statusCode before it's sent to the user</span> + <span class="nx">replaceResponseStatusCode</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span><span class="nx">res</span><span class="p">,</span><span class="nx">statusCode</span><span class="p">){</span> + <span class="kd">var</span> <span class="nx">newStatusCode</span> <span class="o">=</span> <span class="nx">statusCode</span><span class="p">;</span> + <span class="k">return</span> <span class="nx">newStatusCode</span><span class="p">;</span> + <span class="p">},</span> + + <span class="c1">//replace the httpHeader before it's sent to the user</span> + <span class="c1">//Here header == res.headers</span> + <span class="nx">replaceResponseHeader</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span><span class="nx">res</span><span class="p">,</span><span class="nx">header</span><span class="p">){</span> + <span class="kd">var</span> <span class="nx">newHeader</span> <span class="o">=</span> <span class="nx">header</span><span class="p">;</span> + <span class="k">return</span> <span class="nx">newHeader</span><span class="p">;</span> + <span class="p">},</span> + + <span class="c1">//replace the response from the server before it's sent to the user</span> + <span class="c1">//you may return either a Buffer or a string</span> + <span class="c1">//serverResData is a Buffer, you may get its content by calling serverResData.toString()</span> + <span class="nx">replaceServerResData</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span><span class="nx">res</span><span class="p">,</span><span class="nx">serverResData</span><span class="p">){</span> + <span class="k">return</span> <span class="nx">serverResData</span><span class="p">;</span> + <span class="p">},</span> + + <span class="c1">//add a pause before sending response to user</span> + <span class="nx">pauseBeforeSendingResponse</span> <span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">,</span><span class="nx">res</span><span class="p">){</span> + <span class="kd">var</span> <span class="nx">timeInMS</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="c1">//delay all requests for 1ms</span> + <span class="k">return</span> <span class="nx">timeInMS</span><span class="p">;</span> + <span class="p">},</span> + + <span class="c1">//should intercept https request, or it will be forwarded to real server</span> + <span class="nx">shouldInterceptHttpsReq</span> <span class="o">:</span><span class="kd">function</span><span class="p">(</span><span class="nx">req</span><span class="p">){</span> + <span class="k">return</span> <span class="kc">false</span><span class="p">;</span> + <span class="p">}</span> + +<span class="p">};</span> + +</pre></div> + +<h2> +<a name="using-https-features" class="anchor" href="#using-https-features"><span class="octicon octicon-link"></span></a>Using https features</h2> + +<h4> +<a name="step-1---install-openssl" class="anchor" href="#step-1---install-openssl"><span class="octicon octicon-link"></span></a>step 1 - install openssl</h4> + +<ul> +<li>install <a href="http://wiki.openssl.org/index.php/Compilation_and_Installation">openssl</a> ,if you want to use HTTPS-related features. After that, the command <code>openssl</code> should be exposed to your shell</li> +</ul><h4> +<a name="step-2---generate-a-rootca-and-trust-it" class="anchor" href="#step-2---generate-a-rootca-and-trust-it"><span class="octicon octicon-link"></span></a>step 2 - generate a rootCA and trust it</h4> + +<ul> +<li>you should do this when it is the first time to start anyproxy</li> +<li>execute <code>anyproxy --root</code> ,follow the instructions on screen</li> +<li>you will see some tip like <em>rootCA generated at : /usr/lib...</em> . <code>cd</code> to that directory, add/trust the rootCA.crt file to your system keychain. In OSX, you may do that by open the *crt file directly</li> +</ul><h4> +<a name="step-3---start-a-https-proxy" class="anchor" href="#step-3---start-a-https-proxy"><span class="octicon octicon-link"></span></a>step 3 - start a https proxy</h4> + +<ul> +<li><code>anyproxy --type https --host my.domain.com</code></li> +<li>the param <code>host</code> is required with https proxy and it should be kept exactly what it it when you config your browser. Otherwise, you may get some warning about security.</li> +</ul><h2> +<a name="others" class="anchor" href="#others"><span class="octicon octicon-link"></span></a>Others</h2> + +<h4> +<a name="work-as-a-module" class="anchor" href="#work-as-a-module"><span class="octicon octicon-link"></span></a>work as a module</h4> + +<pre><code>npm install anyproxy --save </code></pre> -<p>If you're using the GitHub for Mac, simply sync your repository and you'll see the new branch.</p> +<div class="highlight highlight-javascript"><pre><span class="kd">var</span> <span class="nx">proxy</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s2">"anyproxy"</span><span class="p">);</span> -<h3> -<a name="designer-templates" class="anchor" href="#designer-templates"><span class="octicon octicon-link"></span></a>Designer Templates</h3> +<span class="o">!</span><span class="nx">proxy</span><span class="p">.</span><span class="nx">isRootCAFileExists</span><span class="p">()</span> <span class="o">&&</span> <span class="nx">proxy</span><span class="p">.</span><span class="nx">generateRootCA</span><span class="p">();</span> <span class="c1">//please manually trust this rootCA</span> +<span class="k">new</span> <span class="nx">proxy</span><span class="p">.</span><span class="nx">proxyServer</span><span class="p">(</span><span class="s2">"http"</span><span class="p">,</span><span class="s2">"8001"</span><span class="p">,</span> <span class="s2">"localhost"</span> <span class="p">,</span><span class="s2">"path/to/rule/file.js"</span><span class="p">);</span> -<p>We've crafted some handsome templates for you to use. Go ahead and continue to layouts to browse through them. You can easily go back to edit your page before publishing. After publishing your page, you can revisit the page generator and switch to another theme. Your Page content will be preserved if it remained markdown format.</p> +</pre></div> -<h3> -<a name="rather-drive-stick" class="anchor" href="#rather-drive-stick"><span class="octicon octicon-link"></span></a>Rather Drive Stick?</h3> +<h4> +<a name="clear-all-the-temperary-certificates" class="anchor" href="#clear-all-the-temperary-certificates"><span class="octicon octicon-link"></span></a>clear all the temperary certificates</h4> -<p>If you prefer to not use the automatic generator, push a branch named <code>gh-pages</code> to your repository to create a page manually. In addition to supporting regular HTML content, GitHub Pages support Jekyll, a simple, blog aware static site generator written by our own Tom Preston-Werner. Jekyll makes it easy to create site-wide headers and footers without having to copy them across every page. It also offers intelligent blog support and other advanced templating features.</p> +<p><code>anyproxy --clear</code></p> -<h3> -<a name="authors-and-contributors" class="anchor" href="#authors-and-contributors"><span class="octicon octicon-link"></span></a>Authors and Contributors</h3> +<h2> +<a name="contact" class="anchor" href="#contact"><span class="octicon octicon-link"></span></a>Contact</h2> -<p>You can <a href="https://github.com/blog/821" class="user-mention">@mention</a> a GitHub username to generate a link to their profile. The resulting <code><a></code> element will link to the contributor's GitHub Profile. For example: In 2007, Chris Wanstrath (<a href="https://github.com/defunkt" class="user-mention">@defunkt</a>), PJ Hyett (<a href="https://github.com/pjhyett" class="user-mention">@pjhyett</a>), and Tom Preston-Werner (<a href="https://github.com/mojombo" class="user-mention">@mojombo</a>) founded GitHub.</p> - -<h3> -<a name="support-or-contact" class="anchor" href="#support-or-contact"><span class="octicon octicon-link"></span></a>Support or Contact</h3> - -<p>Having trouble with Pages? Check out the documentation at <a href="http://help.github.com/pages">http://help.github.com/pages</a> or contact <a href="mailto:support@github.com">support@github.com</a> and we’ll help you sort it out.</p> +<ul> +<li>Please feel free to raise any issue about this project, or give us some advice on this doc. :)</li> +</ul> </section> <footer> <p>This project is maintained by <a href="https://github.com/alipay-ct-wd">alipay-ct-wd</a></p> diff --git a/params.json b/params.json index ec48fe8..799d4ca 100644 --- a/params.json +++ b/params.json @@ -1 +1 @@ -{"name":"Anyproxy","tagline":"a charles/fiddler like proxy written in NodeJs, which can handle HTTPS requests and CROS perfectly.","body":"### Welcome to GitHub Pages.\r\nThis automatic page generator is the easiest way to create beautiful pages for all of your projects. Author your page content here using GitHub Flavored Markdown, select a template crafted by a designer, and publish. After your page is generated, you can check out the new branch:\r\n\r\n```\r\n$ cd your_repo_root/repo_name\r\n$ git fetch origin\r\n$ git checkout gh-pages\r\n```\r\n\r\nIf you're using the GitHub for Mac, simply sync your repository and you'll see the new branch.\r\n\r\n### Designer Templates\r\nWe've crafted some handsome templates for you to use. Go ahead and continue to layouts to browse through them. You can easily go back to edit your page before publishing. After publishing your page, you can revisit the page generator and switch to another theme. Your Page content will be preserved if it remained markdown format.\r\n\r\n### Rather Drive Stick?\r\nIf you prefer to not use the automatic generator, push a branch named `gh-pages` to your repository to create a page manually. In addition to supporting regular HTML content, GitHub Pages support Jekyll, a simple, blog aware static site generator written by our own Tom Preston-Werner. Jekyll makes it easy to create site-wide headers and footers without having to copy them across every page. It also offers intelligent blog support and other advanced templating features.\r\n\r\n### Authors and Contributors\r\nYou can @mention a GitHub username to generate a link to their profile. The resulting `<a>` element will link to the contributor's GitHub Profile. For example: In 2007, Chris Wanstrath (@defunkt), PJ Hyett (@pjhyett), and Tom Preston-Werner (@mojombo) founded GitHub.\r\n\r\n### Support or Contact\r\nHaving trouble with Pages? Check out the documentation at http://help.github.com/pages or contact support@github.com and we’ll help you sort it out.\r\n","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."} \ No newline at end of file +{"name":"Anyproxy","tagline":"A fully configurable proxy in NodeJS, which can handle HTTPS requests perfectly.","body":"anyproxy\r\n==========\r\nA fully configurable proxy in NodeJS, which can handle HTTPS requests perfectly.\r\n\r\nFeature\r\n------------\r\n* work as http or https proxy\r\n* fully configurable, you can modify a request at any stage by your own javascript code\r\n* when working as https proxy, it can generate and intercept https requests for any domain without complaint by browser (after you trust its root CA)\r\n* provide a web interface\r\n\r\n\r\n \r\nUsage\r\n--------------\r\n\r\n### step 1 - install\r\n\r\n* install [NodeJS](http://nodejs.org/)\r\n* ``npm install -g anyproxy`` , may require ``sudo``\r\n\r\n### step 2 - start server\r\n\r\n* start with default settings : ``anyproxy``\r\n* start with a specific port: ``anyproxy --port 8001``\r\n\r\n### step 3 - launch web interface\r\n\r\n* visit [http://127.0.0.1:8002](http://127.0.0.1:8002) with modern browsers\r\n\r\nHow to write your own rule file\r\n-------------------\r\n* with rule file, you can modify a request at any stage, no matter it's just before sending or after servers' responding.\r\n* actually ruleFile.js is a module for Nodejs, feel free to invoke your own modules.\r\n* ``anyproxy --rule /path/to/ruleFile.js``\r\n* you may learn how it works by our samples: [https://github.com/alipay-ct-wd/anyproxy/tree/master/rule_sample](https://github.com/alipay-ct-wd/anyproxy/tree/master/rule_sample)\r\n* samples in [rule_sample](https://github.com/alipay-ct-wd/anyproxy/tree/master/rule_sample)\r\n * **rule__blank.js**, blank rule file with some comments. You may read this before writing your own rule file.\r\n\r\n * **rule_adjust_response_time.js**, delay all the response for 1500ms\r\n * **rule_allow_CORS.js**, add CORS headers to allow cross-domain ajax request\r\n * **rule_intercept_some_https_requests.js**, intercept https requests toward github.com\r\n * **rule_remove_cache_header.js**, remove all cache-related headers from server\r\n * **rule_replace_request_option.js**, replace request parameters before sending to the server\r\n * **rule_replace_response_data.js**, modify response data\r\n * **rule_replace_response_status_code.js**, replace server's status code\r\n * **rule_use_local_data.js**, map some requests to local file\r\n\r\n* rule file scheme is as follows, you may also get it from [rule__blank.js](https://github.com/alipay-ct-wd/anyproxy/blob/master/rule_sample/rule__blank.js)\r\n\r\n```javascript\r\n\r\nmodule.exports = {\r\n /*\r\n these functions will overwrite the default ones, write your own when necessary.\r\n */\r\n\r\n //whether to intercept this request by local logic\r\n //if the return value is true, anyproxy will call dealLocalResponse to get response data and will not send request to remote server anymore\r\n shouldUseLocalResponse : function(req,reqBody){\r\n return false;\r\n },\r\n\r\n //you may deal the response locally instead of sending it to server\r\n //this function be called when shouldUseLocalResponse returns true\r\n //callback(statusCode,resHeader,responseData)\r\n //e.g. callback(200,{\"content-type\":\"text/html\"},\"hello world\")\r\n dealLocalResponse : function(req,reqBody,callback){\r\n callback(statusCode,resHeader,responseData)\r\n },\r\n\r\n //replace the request protocol when sending to the real server\r\n //protocol : \"http\" or \"https\"\r\n replaceRequestProtocol:function(req,protocol){\r\n var newProtocol = protocol;\r\n return newProtocol;\r\n },\r\n\r\n //req is user's request sent to the proxy server\r\n //option is how the proxy server will send request to the real server. i.e. require(\"http\").request(option,function(){...})\r\n //you may return a customized option to replace the original option\r\n //you should not write content-length header in options, since anyproxy will handle it for you\r\n replaceRequestOption : function(req,option){\r\n var newOption = option;\r\n return newOption;\r\n },\r\n\r\n //replace the request body\r\n replaceRequestData: function(req,data){\r\n return data;\r\n },\r\n\r\n //replace the statusCode before it's sent to the user\r\n replaceResponseStatusCode: function(req,res,statusCode){\r\n var newStatusCode = statusCode;\r\n return newStatusCode;\r\n },\r\n\r\n //replace the httpHeader before it's sent to the user\r\n //Here header == res.headers\r\n replaceResponseHeader: function(req,res,header){\r\n var newHeader = header;\r\n return newHeader;\r\n },\r\n\r\n //replace the response from the server before it's sent to the user\r\n //you may return either a Buffer or a string\r\n //serverResData is a Buffer, you may get its content by calling serverResData.toString()\r\n replaceServerResData: function(req,res,serverResData){\r\n return serverResData;\r\n },\r\n\r\n //add a pause before sending response to user\r\n pauseBeforeSendingResponse : function(req,res){\r\n var timeInMS = 1; //delay all requests for 1ms\r\n return timeInMS; \r\n },\r\n\r\n //should intercept https request, or it will be forwarded to real server\r\n shouldInterceptHttpsReq :function(req){\r\n return false;\r\n }\r\n\r\n};\r\n\r\n```\r\n\r\nUsing https features\r\n----------------\r\n#### step 1 - install openssl\r\n* install [openssl](http://wiki.openssl.org/index.php/Compilation_and_Installation) ,if you want to use HTTPS-related features. After that, the command ``openssl`` should be exposed to your shell\r\n\r\n#### step 2 - generate a rootCA and trust it\r\n* you should do this when it is the first time to start anyproxy\r\n* execute ``anyproxy --root`` ,follow the instructions on screen\r\n* you will see some tip like *rootCA generated at : /usr/lib...* . ``cd`` to that directory, add/trust the rootCA.crt file to your system keychain. In OSX, you may do that by open the *crt file directly\r\n\r\n#### step 3 - start a https proxy\r\n* ``anyproxy --type https --host my.domain.com``\r\n* the param ``host`` is required with https proxy and it should be kept exactly what it it when you config your browser. Otherwise, you may get some warning about security.\r\n\r\n\r\nOthers\r\n-----------------\r\n#### work as a module\r\n```\r\nnpm install anyproxy --save\r\n```\r\n\r\n```javascript\r\nvar proxy = require(\"anyproxy\");\r\n\r\n!proxy.isRootCAFileExists() && proxy.generateRootCA(); //please manually trust this rootCA\r\nnew proxy.proxyServer(\"http\",\"8001\", \"localhost\" ,\"path/to/rule/file.js\");\r\n\r\n```\r\n\r\n#### clear all the temperary certificates\r\n``anyproxy --clear``\r\n\r\n\r\n## Contact\r\n* Please feel free to raise any issue about this project, or give us some advice on this doc. :)\r\n","google":"","note":"Don't delete this file! It's used internally to help with page regeneration."} \ No newline at end of file