Full Code of alibaba/anyproxy for AI

master b93f948107b9 cached
165 files
1.5 MB
510.7k tokens
670 symbols
1 requests
Download .txt
Showing preview only (1,566K chars total). Download the full file or copy to clipboard to get everything.
Repository: alibaba/anyproxy
Branch: master
Commit: b93f948107b9
Files: 165
Total size: 1.5 MB

Directory structure:
gitextract_zmx3jyvr/

├── .eslintignore
├── .eslintrc
├── .github/
│   └── ISSUE_TEMPLATE.md
├── .gitignore
├── .npmignore
├── .travis.yml
├── CHANGELOG
├── LICENSE
├── README.md
├── babel.config.js
├── bin/
│   ├── anyproxy
│   ├── anyproxy-ca
│   ├── rootCACheck.js
│   └── startServer.js
├── build_scripts/
│   ├── build-doc-site.sh
│   └── prebuild-doc.js
├── docs/
│   ├── CNAME
│   ├── README.md
│   ├── assets/
│   │   ├── auto-lang.js
│   │   ├── main.js
│   │   └── website.css
│   ├── cn/
│   │   ├── index.html
│   │   ├── search_index.json
│   │   └── src_doc.md
│   ├── en/
│   │   ├── index.html
│   │   ├── search_index.json
│   │   └── src_doc.md
│   ├── gitbook/
│   │   ├── fonts/
│   │   │   └── fontawesome/
│   │   │       └── FontAwesome.otf
│   │   ├── gitbook-plugin-fontsettings/
│   │   │   ├── fontsettings.js
│   │   │   └── website.css
│   │   ├── gitbook-plugin-highlight/
│   │   │   ├── ebook.css
│   │   │   └── website.css
│   │   ├── gitbook-plugin-lunr/
│   │   │   └── search-lunr.js
│   │   ├── gitbook-plugin-search/
│   │   │   ├── search-engine.js
│   │   │   ├── search.css
│   │   │   └── search.js
│   │   ├── gitbook-plugin-sharing/
│   │   │   └── buttons.js
│   │   ├── gitbook.js
│   │   ├── style.css
│   │   └── theme.js
│   ├── index.html
│   └── search_index.json
├── docs-src/
│   ├── CNAME
│   ├── LANGS.md
│   ├── README.md
│   ├── _layouts/
│   │   └── layout.html
│   ├── assets/
│   │   ├── auto-lang.js
│   │   ├── main.js
│   │   └── website.css
│   ├── book.json
│   ├── cn/
│   │   ├── README.md
│   │   ├── SUMMARY.md
│   │   ├── _layouts/
│   │   │   ├── layout.html
│   │   │   └── website/
│   │   │       └── summary.html
│   │   └── src_doc.md
│   └── en/
│       ├── README.md
│       ├── SUMMARY.md
│       ├── _layouts/
│       │   ├── layout.html
│       │   └── website/
│       │       └── summary.html
│       ├── book.json
│       └── src_doc.md
├── jest.config.js
├── lib/
│   ├── certMgr.js
│   ├── configUtil.js
│   ├── httpsServerMgr.js
│   ├── log.js
│   ├── recorder.js
│   ├── requestErrorHandler.js
│   ├── requestHandler.js
│   ├── ruleLoader.js
│   ├── rule_default.js
│   ├── systemProxyMgr.js
│   ├── util.js
│   ├── webInterface.js
│   ├── wsServer.js
│   └── wsServerMgr.js
├── module_sample/
│   ├── core_reload.js
│   ├── https_config.js
│   ├── normal_use.js
│   └── simple_use.js
├── package.json
├── proxy.js
├── resource/
│   ├── 502.pug
│   ├── cert_download.pug
│   └── cert_error.pug
├── rule_sample/
│   ├── sample_modify_request_data.js
│   ├── sample_modify_request_header.js
│   ├── sample_modify_request_path.js
│   ├── sample_modify_request_protocol.js
│   ├── sample_modify_response_data.js
│   ├── sample_modify_response_header.js
│   ├── sample_modify_response_statuscode.js
│   └── sample_use_local_response.js
├── test/
│   ├── __snapshots__/
│   │   └── basic.spec.js.snap
│   ├── basic.spec.js
│   ├── fixtures/
│   │   ├── someRule.js
│   │   └── upload.txt
│   ├── lib/
│   │   ├── httpsServerMgr.spec.js
│   │   ├── ruleLoader.spec.js
│   │   └── util.spec.js
│   ├── rule/
│   │   ├── beforeDealHttpsRequest.spec.js
│   │   ├── beforeSendRequest.spec.js
│   │   ├── beforeSendResponse.js
│   │   └── onError.spec.js
│   ├── util.js
│   └── web/
│       ├── curlUtil.spec.js
│       └── webInterface.spec.js
└── web/
    ├── index.html
    ├── postcss.config.js
    ├── src/
    │   ├── action/
    │   │   ├── globalStatusAction.js
    │   │   └── recordAction.js
    │   ├── common/
    │   │   ├── ApiUtil.js
    │   │   ├── Constant.js
    │   │   ├── WsUtil.js
    │   │   ├── apiUtil.js
    │   │   ├── commonUtil.js
    │   │   ├── constant.js
    │   │   ├── curlUtil.js
    │   │   ├── promiseUtil.js
    │   │   └── wsUtil.js
    │   ├── component/
    │   │   ├── download-root-ca.jsx
    │   │   ├── download-root-ca.less
    │   │   ├── header-menu.jsx
    │   │   ├── header-menu.less
    │   │   ├── json-viewer.jsx
    │   │   ├── json-viewer.less
    │   │   ├── left-menu.jsx
    │   │   ├── left-menu.less
    │   │   ├── map-local.jsx
    │   │   ├── map-local.less
    │   │   ├── modal-panel.jsx
    │   │   ├── modal-panel.less
    │   │   ├── record-detail.jsx
    │   │   ├── record-detail.less
    │   │   ├── record-filter.jsx
    │   │   ├── record-filter.less
    │   │   ├── record-list-diff-worker.jsx
    │   │   ├── record-panel.jsx
    │   │   ├── record-panel.less
    │   │   ├── record-request-detail.jsx
    │   │   ├── record-response-detail.jsx
    │   │   ├── record-row.jsx
    │   │   ├── record-row.less
    │   │   ├── record-worker.jsx
    │   │   ├── record-ws-message-detail.jsx
    │   │   ├── record-ws-message-detail.less
    │   │   ├── resizable-panel.jsx
    │   │   ├── resizable-panel.less
    │   │   ├── table-panel.jsx
    │   │   ├── table-panel.less
    │   │   ├── title-bar.jsx
    │   │   ├── title-bar.less
    │   │   └── ws-listener.jsx
    │   ├── index.jsx
    │   ├── index.less
    │   ├── reducer/
    │   │   ├── globalStatusReducer.js
    │   │   ├── requestRecordReducer.js
    │   │   └── rootReducer.js
    │   ├── saga/
    │   │   └── rootSaga.js
    │   └── style/
    │       ├── animate.less
    │       ├── antd-constant.less
    │       ├── antd-reset.global.less
    │       ├── common.less
    │       └── constant.less
    └── webpack.config.js

================================================
FILE CONTENTS
================================================

================================================
FILE: .eslintignore
================================================
node_modules
dist
web
web2
resource
*.sh
docs

================================================
FILE: .eslintrc
================================================
{
  "extends": "airbnb",
  "parser": "babel-eslint",
  "env": {
    "browser": true,
    "node": true,
    "es6": true,
    "jest": true
  },
  "globals": {
    "React": true,
    "ReactDOM": true,
    "Zepto": true,
    "JsBridgeUtil": true
  },
  "rules": {
    "semi": [0],
    "comma-dangle": [0],
    "global-require": [0],
    "no-alert": [0],
    "no-console": [0],
    "no-param-reassign": [0],
    "max-len": [0],
    "func-names": [0],
    "no-underscore-dangle": [0],
    "no-unused-vars": ["error", { "vars": "all", "args": "none", "ignoreRestSiblings": false }],
    "object-shorthand": [0],
    "arrow-body-style": [0],
    "no-new": [0],
    "strict": [0],
    "no-script-url": [0],
    "spaced-comment": [0],
    "no-empty": [0],
    "no-constant-condition": [0],
    "no-else-return": [0],
    "no-use-before-define": [0],
    "no-unused-expressions": [0],
    "no-class-assign": [0],
    "new-cap": [0],
    "array-callback-return": [0],
    "prefer-template": [0],
    "no-restricted-syntax": [0],
    "no-trailing-spaces": [0],
    "import/no-unresolved": [0],
    "jsx-a11y/img-has-alt": [0],
    "camelcase": [0],
    "consistent-return": [0],
    "guard-for-in": [0],
    "one-var": [0],
    "react/wrap-multilines": [0],
    "react/no-multi-comp": [0],
    "react/jsx-no-bind": [0],
    "react/prop-types": [0],
    "react/prefer-stateless-function": [0],
    "react/jsx-first-prop-new-line": [0],
    "react/sort-comp": [0],
    "import/no-extraneous-dependencies": [0],
    "import/extensions": [0],
    "react/forbid-prop-types": [0],
    "react/require-default-props": [0],
    "class-methods-use-this": [0],
    "jsx-a11y/no-static-element-interactions": [0],
    "react/no-did-mount-set-state": [0],
    "jsx-a11y/alt-text": [0],
    "import/no-dynamic-require": [0],
    "no-extra-boolean-cast": [0],
    "no-lonely-if": [0],
    "no-plusplus": [0],
    "generator-star-spacing": ["error", {"before": true, "after": false}],
    "require-yield": [0],
    "arrow-parens": [0],
    "no-template-curly-in-string": [0],
    "no-mixed-operators": [0]
  }
}


================================================
FILE: .github/ISSUE_TEMPLATE.md
================================================
<!-- Issue Template -->
Plese fill the template when you reporting a new issue, thanks!
<!-- 请在提交Issue的同时,附带如下信息,方便我们定位,谢谢 -->

#### Which platform are you running AnyProxy
<!-- 您使用的是哪个平台的系统,Mac,Windows,或者Linux -->

#### The version of the AnyProxy
<!-- 您使用的是AnyProxy为哪个版本 -->


#### Your expected behavior of AnyProxy
<!-- 您所期待的结果是怎么样的 -->

#### The actual behavior of AnyProxy
<!-- AnyProxy实际处理的结果是怎样的 -->

#### The log of the error
<!-- 有请求的AnyProxy日志信息,还请附上 -->


================================================
FILE: .gitignore
================================================
cert/**/*.srl
cert/**/*.key
cert/**/*.crt
cert/**/*.csr
web/build/.module-cache/
test/report/*.txt
tmp.txt
.*.swp
._*
.DS_Store
.vscode
.git
.hg
.lock-wscript
.svn
.wafpickle-*
.vscode
CVS
npm-debug.log
logs
*.log
pids
*.pid
*.seed
lib-cov
coverage
.grunt
build/Release
node_modules
.lock-wscript
temp
dist
test/report
*.tgz
doc_compiled.md
docs-md/cn/doc.md
docs-md/en/doc.md
docs/gitbook/gitbook-plugin-livereload/
node_modules


================================================
FILE: .npmignore
================================================
cert/**/*.srl
cert/**/*.key
cert/**/*.crt
cert/**/*.csr
web/build/.module-cache/
tmp.txt
.*.swp
._*
.DS_Store
.git
.hg
.lock-wscript
.svn
.wafpickle-*
CVS
npm-debug.log
logs
*.log
pids
*.pid
*.seed
lib-cov
coverage
.grunt
node_modules
.lock-wscript
temp
releases
rule_sample
test
*.tgz

================================================
FILE: .travis.yml
================================================
language: node_js
node_js:
  - 12
before_script:
  - node ./bin/anyproxy-ca -g

================================================
FILE: CHANGELOG
================================================
22 Dec 2016: AnyProxy 4.0.0-beta:

    * to AnyProxy rules: all the rule interfaces are asynchronous now, you can write them in a Promise way
    * to the UI, rewrite the code and enhance the user experience

26 Feb 2016: AnyProxy 3.10.4:

   * let users assign the port for web socket in AnyProxy cli

19 Sep 2016: AnyProxy 3.10.3:

    * fix the cert path issue with Windows
    * split out the cert management to an independent module
    * add unit tests to AnyProxy

29 Apr 2016: AnyProxy 3.10.0:

    * using node-forge to generate HTTPS certificates instead of openssl

29 Apr 2016: AnyProxy 3.9.1:

    * update SHA1 to SHA256 for openssl certificates

19 Nov 2015: AnyProxy 3.8.1:

    * bugfix for image content in web GUI

19 Nov 2015: AnyProxy 3.8.1:

    * bugfix for image content in web GUI

16 Nov 2015: AnyProxy 3.8.0:

    * optimize the memory strategy

2 Oct 2015: AnyProxy 3.7.7:

    * bugfix for proxy.close() ref #36

9 Sep 2015: AnyProxy 3.7.6:

    * optimize detail panel, ref #35

3 Sep 2015: AnyProxy 3.7.5:

    * bugfix for intercepting urls like http://a.com?url=http://b.com

19 Aug 2015: AnyProxy 3.7.4:

    * bugfix for intercepting urls like http://a.com?url=http://b.com

31 July 2015: AnyProxy 3.7.3:

    * show lastest 100 records when visit the web ui
    * save map-local config file to local file
    * show an indicator when filter or map-local is in use

31 July 2015: AnyProxy 3.7.2:

    * bugfix for issue #29

28 July 2015: AnyProxy 3.7.1:

    * fix a bug about deflate compression

20 July 2015: AnyProxy 3.7.0:

    * add a map-local panel on web ui, now you can easily map some request to your local files

1 July 2015: AnyProxy 3.6.0:

    * add a filter on web ui

1 July 2015: AnyProxy 3.5.2:

    * optimize the row height on web ui

18 June 2015: AnyProxy 3.5.1:

    * print a hint when using SNI features in node <0.12
    * Ref : https://github.com/alibaba/anyproxy/issues/25

18 June 2015: AnyProxy 3.5.0:

    * it's a formal release of 3.4.0@beta.

27 Apr 2015: AnyProxy 3.4.0@beta:

    * optimize web server and web socket interface

20 Apr 2015: AnyProxy 3.3.1:

    * now you can assign your own port for web gui

31 Mar 2015: AnyProxy 3.3.0:

    * optimize https features in windows
    * add switch to mute the console

20 Mar 2015: AnyProxy 3.2.5:

    * bugfix for internal https server

19 Mar 2015: AnyProxy 3.2.4:

    * bugfix for absolute rule path

23 Feb 2015: AnyProxy 3.2.2:

    * [bugfix for relative rule path](https://github.com/alibaba/anyproxy/pull/18)

10 Feb 2015: AnyProxy 3.2.1:

    * bugfix for 3.2.0

10 Feb 2015: AnyProxy 3.2.0:

    * using SNI when intercepting https requests

28 Jan 2015: AnyProxy 3.1.2:

    * thanks to iconv-lite, almost webpage with any charset can be correctly decoded in web interface.

28 Jan 2015: AnyProxy 3.1.1:

    * convert GBK to UTF8 in web interface

22 Jan 2015: AnyProxy 3.1.0:

    * will NOT intercept https request by default. Use ``anyproxy --intercept`` to turn on this feature.

12 Jan 2015: AnyProxy 3.0.4:

    * show anyproxy version by --version

12 Jan 2015: AnyProxy 3.0.3:

    * Bugfix: https throttle

9 Jan 2015: AnyProxy 3.0.2:

    * UI improvement: add link and qr code to root CA file.


================================================
FILE: LICENSE
================================================

                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.

================================================
FILE: README.md
================================================
AnyProxy
----------------

[![NPM version][npm-image]][npm-url]
[![node version][node-image]][node-url]
[![npm download][download-image]][download-url]
[![Build Status](https://travis-ci.org/alibaba/anyproxy.svg?branch=master)](https://travis-ci.org/alibaba/anyproxy)

[npm-image]: https://img.shields.io/npm/v/anyproxy.svg?style=flat-square
[npm-url]: https://npmjs.org/package/anyproxy
[node-image]: https://img.shields.io/badge/node.js-%3E=_6.0.0-green.svg?style=flat-square
[node-url]: http://nodejs.org/download/
[download-image]: https://img.shields.io/npm/dm/anyproxy.svg?style=flat-square
[download-url]: https://npmjs.org/package/anyproxy

AnyProxy is A fully configurable HTTP/HTTPS proxy in NodeJS.

Home page : [AnyProxy.io](http://anyproxy.io)

Issue: https://github.com/alibaba/anyproxy/issues

AnyProxy是一个基于NodeJS的,可供插件配置的HTTP/HTTPS代理服务器。

主页:[AnyProxy.io](http://anyproxy.io),访问可能需要稳定的国际网络环境

![](https://gw.alipayobjects.com/zos/rmsportal/gUfcjGxLONndTfllxynC.jpg@_90q)

----------------

Legacy doc of version 3.x : https://github.com/alibaba/anyproxy/wiki/3.x-docs

================================================
FILE: babel.config.js
================================================
if (process.env.NODE_ENV === 'test') {
  module.exports = {};
} else {
  module.exports = {
    presets: [
      'es2015',
      'stage-0'
    ]
  };
}



================================================
FILE: bin/anyproxy
================================================
#!/usr/bin/env node

'use strict';

const program = require('commander'),
  color = require('colorful'),
  co = require('co'),
  packageInfo = require('../package.json'),
  util = require('../lib/util'),
  rootCACheck = require('./rootCACheck'),
  startServer = require('./startServer'),
  logUtil = require('../lib/log');

program
  .version(packageInfo.version)
  .option('-p, --port [value]', 'proxy port, 8001 for default')
  .option('-w, --web [value]', 'web GUI port, 8002 for default')
  .option('-r, --rule [value]', 'path for rule file,')
  .option('-l, --throttle [value]', 'throttle speed in kb/s (kbyte / sec)')
  .option('-i, --intercept', 'intercept(decrypt) https requests when root CA exists')
  .option('-s, --silent', 'do not print anything into terminal')
  .option('-c, --clear', 'clear all the certificates and temp files')
  .option('--ws-intercept', 'intercept websocket')
  .option('--ignore-unauthorized-ssl', 'ignore all ssl error')
  .parse(process.argv);

if (program.clear) {
  require('../lib/certMgr').clearCerts(() => {
    util.deleteFolderContentsRecursive(util.getAnyProxyTmpPath());
    console.log(color.green('done !'));
    process.exit(0);
  });
} else if (program.root) {
  require('../lib/certMgr').generateRootCA(() => {
    process.exit(0);
  });
} else {
  co(function *() {
    if (program.silent) {
      logUtil.setPrintStatus(false);
    }

    if (program.intercept) {
      try {
        yield rootCACheck();
      } catch (e) {
        console.error(e);
      }
    }

    return startServer(program);
  })
}



================================================
FILE: bin/anyproxy-ca
================================================
#!/usr/bin/env node

'use strict'

// exist-false, trusted-false : create CA
// exist-true,  trusted-false : trust CA
// exist-true,  trusted-true  : all things done
const program = require('commander');
const color = require('colorful');
const certMgr = require('../lib/certMgr');
const AnyProxy = require('../proxy');
const exec = require('child_process').exec;
const co = require('co');
const path = require('path');
const inquirer = require('inquirer');

program
  .option('-c, --clear', 'clear all the tmp certificates and root CA')
  .option('-g, --generate', 'generate a new rootCA')
  .parse(process.argv);

function openFolderOfFile(filePath) {
  const platform = process.platform;
  if (/^win/.test(platform)) {
    exec('start .', { cwd: path.dirname(filePath) });
  } else if (/darwin/.test(platform)) {
    exec(`open -R ${filePath}`);
  }
}

function guideToGenrateCA() {
  AnyProxy.utils.certMgr.generateRootCA((error, keyPath, crtPath) => {
    if (!error) {
      const certDir = path.dirname(keyPath);
      console.log(`The cert is generated at ${certDir}. Please trust the ${color.bold('rootCA.crt')}.`);
      openFolderOfFile(crtPath);
    } else {
      console.error('failed to generate rootCA', error);
    }
  });
}

function guideToTrustCA() {
  const certPath = AnyProxy.utils.certMgr.getRootCAFilePath();
  if (certPath) {
    openFolderOfFile(certPath);
  } else {
    console.error('failed to get cert path');
  }
}

if (program.clear) {
  AnyProxy.utils.certMgr.clearCerts(() => {
    console.log(color.green('done !'));
  });
} else if (program.generate) {
  guideToGenrateCA();
} else {
  console.log('detecting CA status...');
  co(certMgr.getCAStatus)
    .then(status => {
      if (!status.exist) {
        console.log('AnyProxy CA does not exist.');
        const questions = [{
          type: 'confirm',
          name: 'ifCreate',
          message: 'Would you like to generate one ?',
          default: true
        }];
        inquirer.prompt(questions).then(answers => {
          if (answers.ifCreate) {
            guideToGenrateCA();
          }
        });
      } else if (!status.trusted) {
        if (/^win/.test(process.platform)) {
          console.log('AnyProxy CA exists, make sure it has been trusted');
        } else {
          console.log('AnyProxy CA exists, but not be trusted');
          const questions = [{
            type: 'confirm',
            name: 'ifGotoTrust',
            message: 'Would you like to open the folder and trust it ?',
            default: true
          }];
          inquirer.prompt(questions).then(answers => {
            if (answers.ifGotoTrust) {
              guideToTrustCA();
            }
          });
        }
        // AnyProxy.utils.certMgr.clearCerts()
      } else {
        console.log(color.green('AnyProxy CA has already been trusted'));
      }
    })
    .catch(e => {
      console.log(e);
    })
}


================================================
FILE: bin/rootCACheck.js
================================================
/**
* check if root CA exists and installed
* will prompt to generate when needed
*/

const thunkify = require('thunkify');
const AnyProxy = require('../proxy');
const logUtil = require('../lib/log');

const certMgr = AnyProxy.utils.certMgr;

function checkRootCAExists() {
  return certMgr.isRootCAFileExists();
}

module.exports = function *() {
  try {
    if (!checkRootCAExists()) {
      logUtil.warn('Missing root CA, generating now');
      yield thunkify(certMgr.generateRootCA)();
      yield certMgr.trustRootCA();
    } else {
      const isCATrusted = yield thunkify(certMgr.ifRootCATrusted)();
      if (!isCATrusted) {
        logUtil.warn('ROOT CA NOT INSTALLED YET');
        yield certMgr.trustRootCA();
      }
    }
  } catch (e) {
    console.error(e);
  }
};



================================================
FILE: bin/startServer.js
================================================
/**
* start the AnyProxy server
*/

const ruleLoader = require('../lib/ruleLoader');
const logUtil = require('../lib/log');
const AnyProxy = require('../proxy');

module.exports = function startServer(program) {
  let proxyServer;
  // load rule module
  new Promise((resolve, reject) => {
    if (program.rule) {
      resolve(ruleLoader.requireModule(program.rule));
    } else {
      resolve(null);
    }
  })
    .catch(e => {
      logUtil.printLog('Failed to load rule file', logUtil.T_ERR);
      logUtil.printLog(e, logUtil.T_ERR);
      process.exit();
    })

    //start proxy
    .then(ruleModule => {
      proxyServer = new AnyProxy.ProxyServer({
        type: 'http',
        port: program.port || 8001,
        throttle: program.throttle,
        rule: ruleModule,
        webInterface: {
          enable: true,
          webPort: program.web,
        },
        wsIntercept: program.wsIntercept,
        forceProxyHttps: program.intercept,
        dangerouslyIgnoreUnauthorized: !!program.ignoreUnauthorizedSsl,
        silent: program.silent
      });
      // proxyServer.on('ready', () => {});
      proxyServer.start();
    })
    .catch(e => {
      logUtil.printLog(e, logUtil.T_ERR);
      if (e && e.code) {
        logUtil.printLog('code ' + e.code, logUtil.T_ERR);
      }
      logUtil.printLog(e.stack, logUtil.T_ERR);
    });


  process.on('exit', (code) => {
    if (code > 0) {
      logUtil.printLog('AnyProxy is about to exit with code: ' + code, logUtil.T_ERR);
    }

    process.exit();
  });

  //exit cause ctrl+c
  process.on('SIGINT', () => {
    try {
      proxyServer && proxyServer.close();
    } catch (e) {
      console.error(e);
    }
    process.exit();
  });

  process.on('uncaughtException', (err) => {
    let errorTipText = 'got an uncaught exception, is there anything goes wrong in your rule file ?\n';
    try {
      if (err && err.stack) {
        errorTipText += err.stack;
      } else {
        errorTipText += err;
      }
    } catch (e) { }
    logUtil.printLog(errorTipText, logUtil.T_ERR);
    try {
      proxyServer && proxyServer.close();
    } catch (e) { }
    process.exit();
  });
}


================================================
FILE: build_scripts/build-doc-site.sh
================================================
#!/bin/bash

## get into the "build_scripts" folder regardless of the excution directory
parent_path=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P )
cd "$parent_path/.."

## compile the doc
node ./build_scripts/prebuild-doc.js
gitbook build ./docs-src ./docs

## push the doc into github
# git add ./docs
# git commit -m 'building docs'
# git push origin


================================================
FILE: build_scripts/prebuild-doc.js
================================================
const fs = require('fs');
const path = require('path');

const textTpl = [
  '```bash',
  'anyproxy --rule {{url}}',
  '```',
  '```js',
  '{{content}}',
  '```'
].join('\n');

/**
 *
 * @param {*} config
 * @param {string} config.input input markdown path
 * @param {string} config.ouput output markdown path
 */
function mergeMdWithRuleFile(config) {
  const doc = fs.readFileSync(config.input, { encoding: 'utf8' });
  const rules = doc.match(/\{\{sample-rule:([\S]+)\}\}/g).map((rawToReplace) => ({
    raw: rawToReplace,
    url: rawToReplace.replace(/\{\{sample-rule:([\S]+)\}\}/g, ($0, $1) => {
      return $1;
    })
  }));

  const tasks = rules.map((item) => (
    new Promise((resolve, reject) => {
      fs.readFile(item.url, 'utf8', (err, data) => {
        if (!err) {
          const result = Object.assign({}, item);
          result.content = data;
          resolve(result);
        } else {
          reject(err);
        }
      });
    })
  ));

  // fetch all samples
  return Promise.all(tasks)
    .then((results) => {
      // merge to doc
      let resultDoc = doc;
      results.forEach((item) => {
        const contentToInsert = textTpl.replace('{{url}}', item.url).replace('{{content}}', item.content);
        resultDoc = resultDoc.replace(item.raw, contentToInsert);
      });
      fs.writeFileSync(config.output, resultDoc);
    }, (fail) => {
      console.log('failed to load resource');
      console.log(fail);
      process.exit();
    })
    .catch(e => {
      console.log(e);
      process.exit();
    });
}

Promise.all([
  {
    input: path.join(__dirname, '../docs-src/cn/src_doc.md'),
    output: path.join(__dirname, '../docs-src/cn/README.md'),
  },
  {
    input: path.join(__dirname, '../docs-src/en/src_doc.md'),
    output: path.join(__dirname, '../docs-src/en/README.md'),
  }
].map(mergeMdWithRuleFile)).then(result => {
  console.log('done');
}).catch(e => {
  console.log('err');
  console.log(e);
});


================================================
FILE: docs/CNAME
================================================
anyproxy.io

================================================
FILE: docs/README.md
================================================
# THIS IS AUTO GENERATED FILE, DO NOT EDIT THE HTML DIRECTLY.
# YOU CAN EDIT THE SOURCE IN docs-md FOLDER


================================================
FILE: docs/assets/auto-lang.js
================================================
/* eslint no-var: off */
/**
* detect if the browser is in UTF-8 zone
* @return boolean
*/
function isUTF8Zone() {
  return new Date().getTimezoneOffset() === -480;
}

/**
* detect if the browser is already in a locale view
*/
function isInLocaleView() {
  return /(cn|en)/i.test(location.href);
}

function initDefaultLocaleAndStatic() {
  if (!isInLocaleView()) {
    location.href = isUTF8Zone() ? '/cn' : 'en';
  }
}

initDefaultLocaleAndStatic();


================================================
FILE: docs/assets/main.js
================================================
/* eslint no-var: off */
function injectBaiduStatic() {
  var _hmt = _hmt || [];
  var hm = document.createElement('script');
  var s = document.getElementsByTagName('script')[0];

  hm.src = '//hm.baidu.com/hm.js?4e51565b7d471fd6623c163a8fd79e07';
  s.parentNode.insertBefore(hm, s);
}


injectBaiduStatic();


================================================
FILE: docs/assets/website.css
================================================
.book .book-summary ul.summary li.active>a, .book .book-summary ul.summary li a:hover {
  color: #008cff;
  background: transparent;
  text-decoration: none !important;
}

h1 {
  color: #2674BA;
}
h2 {
  color: #0099CC;
}
h3 {
  color: #108ee9;
}
h4 {
  color: #662D91;
}
h5 {
  color: #444444;
}

.gitbook-link {
  display: none !important;
}

.summary-title-span {
  position: relative !important;
  padding: 0 !important;
}
.rule-title:after,
.sample-title:after {
  font-size: 12px;
  padding: 0 3px;
  border-radius: 3px;
  color: #fff;
}

.rule-title:after{
  content: 'rule';
  background-color: #108ee9;
}

.sample-title:after {
  content: 'sample';
  background-color: #00a854;
}

.page-inner {
  max-width: 1000px !important;
}


================================================
FILE: docs/cn/index.html
================================================

<!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;&#x3002;</li>
</ul>
<pre><code class="lang-js"><span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;
</code></pre>
<ul>
<li>&#x8FD4;&#x56DE;&#x81EA;&#x5B9A;&#x4E49;&#x9519;&#x8BEF;&#x9875;</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="onconnecterror">onConnectError</h3>
<h4 id="onconnecterrorrequestdetail-error">onConnectError(requestDetail, error)</h4>
<ul>
<li>AnyProxy&#x5728;&#x4E0E;&#x76EE;&#x6807;HTTPS&#x670D;&#x52A1;&#x5668;&#x5EFA;&#x7ACB;&#x8FDE;&#x63A5;&#x7684;&#x8FC7;&#x7A0B;&#x4E2D;&#xFF0C;&#x5982;&#x679C;&#x53D1;&#x751F;&#x9519;&#x8BEF;&#xFF0C;AnyProxy&#x4F1A;&#x8C03;&#x7528;&#x8FD9;&#x4E2A;&#x65B9;&#x6CD5;</li>
<li><code>requestDetail</code> &#x540C;<code>beforeDealHttpsRequest</code>&#x4E2D;&#x7684;&#x53C2;&#x6570;</li>
<li>&#x6B64;&#x5904;&#x65E0;&#x6CD5;&#x63A7;&#x5236;&#x5411;&#x5BA2;&#x6237;&#x7AEF;&#x7684;&#x8FD4;&#x56DE;&#x4FE1;&#x606F;&#xFF0C;&#x65E0;&#x9700;&#x8FD4;&#x56DE;&#x503C;&#x3002;</li>
</ul>
<h1 id="rule&#x6837;&#x4F8B;">rule&#x6837;&#x4F8B;</h1>
<ul>
<li>&#x8FD9;&#x91CC;&#x63D0;&#x4F9B;&#x4E00;&#x4E9B;&#x6837;&#x4F8B;&#xFF0C;&#x6765;&#x8BB2;&#x89E3;&#x89C4;&#x5219;&#x6A21;&#x5757;&#x7684;&#x5E38;&#x89C1;&#x7528;&#x6CD5;</li>
<li>&#x4F60;&#x53EF;&#x4EE5;&#x901A;&#x8FC7; <code>anyproxy --rule http://....js</code> &#x6765;&#x52A0;&#x8F7D;&#x6A21;&#x5757;&#x5E76;&#x4F53;&#x9A8C;</li>
<li>&#x7528;curl&#x53D1;&#x8BF7;&#x6C42;&#x6D4B;&#x8BD5;&#x7684;&#x65B9;&#x6CD5;&#x5982;&#x4E0B;<ul>
<li>&#x76F4;&#x63A5;&#x8BF7;&#x6C42;&#x670D;&#x52A1;&#x5668;&#xFF1A;<code>curl http://httpbin.org/</code></li>
<li>&#x901A;&#x8FC7;&#x4EE3;&#x7406;&#x670D;&#x52A1;&#x5668;&#x8BF7;&#x6C42;&#xFF1A;<code>curl http://httpbin.org/ --proxy http://127.0.0.1:8001</code></li>
</ul>
</li>
</ul>
<h3 id="&#x4F7F;&#x7528;&#x672C;&#x5730;&#x6570;&#x636E;">&#x4F7F;&#x7528;&#x672C;&#x5730;&#x6570;&#x636E;</h3>
<ul>
<li>&#x62E6;&#x622A;&#x53D1;&#x9001;&#x5230; <a href="http://httpbin.org" target="_blank">http://httpbin.org</a> &#x7684;&#x8BF7;&#x6C42;&#xFF0C;&#x4F7F;&#x7528;&#x672C;&#x5730;&#x6570;&#x636E;&#x4EE3;&#x66FF;&#x670D;&#x52A1;&#x7AEF;&#x8FD4;&#x56DE;</li>
</ul>
<pre><code class="lang-bash">anyproxy --rule rule_sample/sample_use_<span class="hljs-built_in">local</span>_response.js
</code></pre>
<pre><code class="lang-js"><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 = {
      statusCode: <span class="hljs-number">200</span>,
      header: { <span class="hljs-string">&apos;Content-Type&apos;</span>: <span class="hljs-string">&apos;application/json&apos;</span> },
      body: <span class="hljs-string">&apos;{&quot;hello&quot;: &quot;this is local response&quot;}&apos;</span>
    };
    <span class="hljs-keyword">if</span> (requestDetail.url.indexOf(<span class="hljs-string">&apos;http://httpbin.org&apos;</span>) === <span class="hljs-number">0</span>) {
      <span class="hljs-keyword">return</span> {
        response: localResponse
      };
    }
  },
};
</code></pre>
<h3 id="&#x4FEE;&#x6539;&#x8BF7;&#x6C42;&#x5934;">&#x4FEE;&#x6539;&#x8BF7;&#x6C42;&#x5934;</h3>
<ul>
<li>&#x4FEE;&#x6539;&#x53D1;&#x9001;&#x5230; httpbin.org &#x7684;user-agent</li>
</ul>
<pre><code class="lang-bash">anyproxy --rule rule_sample/sample_modify_request_header.js
</code></pre>
<pre><code class="lang-js"><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">&apos;http://httpbin.org&apos;</span>) === <span class="hljs-number">0</span>) {
      <span class="hljs-keyword">const</span> newRequestOptions = requestDetail.requestOptions;
      newRequestOptions.headers[<span class="hljs-string">&apos;User-Agent&apos;</span>] = <span class="hljs-string">&apos;AnyProxy/0.0.0&apos;</span>;
      <span class="hljs-keyword">return</span> {
        requestOptions: newRequestOptions
      };
    }
  },
};
</code></pre>
<h3 id="&#x4FEE;&#x6539;&#x8BF7;&#x6C42;&#x6570;&#x636E;">&#x4FEE;&#x6539;&#x8BF7;&#x6C42;&#x6570;&#x636E;</h3>
<ul>
<li>&#x4FEE;&#x6539;&#x53D1;&#x9001;&#x5230; <a href="http://httpbin.org/post" target="_blank">http://httpbin.org/post</a> &#x7684;post&#x6570;&#x636E;</li>
</ul>
<pre><code class="lang-bash">anyproxy --rule rule_sample/sample_modify_request_data.js
</code></pre>
<pre><code class="lang-js"><span class="hljs-comment">/*
  sample:
    modify the post data towards http://httpbin.org/post
  test:
    curl -H &quot;Content-Type: text/plain&quot; -X POST -d &apos;original post data&apos; http://httpbin.org/post --proxy http://127.0.0.1:8001
  expected response:
    { &quot;data&quot;: &quot;i-am-anyproxy-modified-post-data&quot; }
*/</span>
<span class="hljs-built_in">module</span>.exports = {
  summary: <span class="hljs-string">&apos;Rule to modify request data&apos;</span>,
  *beforeSendRequest(requestDetail) {
    <span class="hljs-keyword">if</span> (requestDetail.url.indexOf(<span class="hljs-string">&apos;http://httpbin.org/post&apos;</span>) === <span class="hljs-number">0</span>) {
      <span class="hljs-keyword">return</span> {
        requestData: <span class="hljs-string">&apos;i-am-anyproxy-modified-post-data&apos;</span>
      };
    }
  },
};
</code></pre>
<h3 id="&#x4FEE;&#x6539;&#x8BF7;&#x6C42;&#x7684;&#x76EE;&#x6807;&#x5730;&#x5740;">&#x4FEE;&#x6539;&#x8BF7;&#x6C42;&#x7684;&#x76EE;&#x6807;&#x5730;&#x5740;</h3>
<ul>
<li>&#x628A;&#x6240;&#x6709;&#x53D1;&#x9001;&#x5230; <a href="http://httpbin.org/" target="_blank">http://httpbin.org/</a> &#x7684;&#x8BF7;&#x6C42;&#x5168;&#x90E8;&#x6539;&#x5230; <a href="http://httpbin.org/user-agent" target="_blank">http://httpbin.org/user-agent</a></li>
</ul>
<pre><code class="lang-bash">anyproxy --rule rule_sample/sample_modify_request_path.js
</code></pre>
<pre><code class="lang-js"><span class="hljs-comment">/*
  sample:
    redirect all https://httpbin.org/user-agent requests to http://localhost:8008/index.html
  test:
    curl https://httpbin.org/user-agent --proxy http://127.0.0.1:8001
  expected response:
    &apos;hello world&apos; from 127.0.0.1:8001/index.html
*/</span>
<span class="hljs-built_in">module</span>.exports = {
  *beforeSendRequest(requestDetail) {
    <span class="hljs-keyword">if</span> (requestDetail.url.indexOf(<span class="hljs-string">&apos;https://httpbin.org/user-agent&apos;</span>) === <span class="hljs-number">0</span>) {
      <span class="hljs-keyword">const</span> newRequestOptions = requestDetail.requestOptions;
      requestDetail.protocol = <span class="hljs-string">&apos;http&apos;</span>;
      newRequestOptions.hostname = <span class="hljs-string">&apos;127.0.0.1&apos;</span>
      newRequestOptions.port = <span class="hljs-string">&apos;8008&apos;</span>;
      newRequestOptions.path = <span class="hljs-string">&apos;/index.html&apos;</span>;
      newRequestOptions.method = <span class="hljs-string">&apos;GET&apos;</span>;
      <span class="hljs-keyword">return</span> requestDetail;
    }
  },
  *beforeDealHttpsRequest(requestDetail) {
    <span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>;
  }
};
</code></pre>
<h3 id="&#x4FEE;&#x6539;&#x8BF7;&#x6C42;&#x534F;&#x8BAE;">&#x4FEE;&#x6539;&#x8BF7;&#x6C42;&#x534F;&#x8BAE;</h3>
<ul>
<li>&#x628A;&#x7528;http&#x534F;&#x8BAE;&#x8BF7;&#x6C42;&#x7684; <a href="http://httpbin.org" target="_blank">http://httpbin.org</a> &#x6539;&#x6210;https&#x5E76;&#x53D1;&#x9001;</li>
</ul>
<pre><code class="lang-bash">anyproxy --rule rule_sample/sample_modify_request_protocol.js
</code></pre>
<pre><code class="lang-js"><span class="hljs-comment">/* 
  sample: 
    redirect all http requests of httpbin.org to https
  test:
    curl &apos;http://httpbin.org/get?show_env=1&apos; --proxy http://127.0.0.1:8001
  expected response:
    { &quot;X-Forwarded-Protocol&quot;: &quot;https&quot; }
*/</span>
<span class="hljs-built_in">module</span>.exports = {
  *beforeSendRequest(requestDetail) {
    <span class="hljs-keyword">if</span> (requestDetail.url.indexOf(<span class="hljs-string">&apos;http://httpbin.org&apos;</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> {
        protocol: <span class="hljs-string">&apos;https&apos;</span>,
        requestOptions: newOption
      };
    }
  }
};
</code></pre>
<h3 id="&#x4FEE;&#x6539;&#x8FD4;&#x56DE;&#x72B6;&#x6001;&#x7801;">&#x4FEE;&#x6539;&#x8FD4;&#x56DE;&#x72B6;&#x6001;&#x7801;</h3>
<ul>
<li>&#x628A; &#x6240;&#x6709;<a href="http://httpbin.org" target="_blank">http://httpbin.org</a> &#x7684;&#x8FD4;&#x56DE;&#x72B6;&#x6001;&#x7801;&#x90FD;&#x6539;&#x6210;404</li>
</ul>
<pre><code class="lang-bash">anyproxy --rule rule_sample/sample_modify_response_statuscode.js
</code></pre>
<pre><code class="lang-js"><span class="hljs-comment">/* 
  sample: 
    modify all status code of http://httpbin.org/ to 404
  test:
    curl -I &apos;http://httpbin.org/user-agent&apos; --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">&apos;http://httpbin.org&apos;</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> {
        response: newResponse
      };
    }
  }
};
</code></pre>
<h3 id="&#x4FEE;&#x6539;&#x8FD4;&#x56DE;&#x5934;">&#x4FEE;&#x6539;&#x8FD4;&#x56DE;&#x5934;</h3>
<ul>
<li>&#x5728; <a href="http://httpbin.org/user-agent" target="_blank">http://httpbin.org/user-agent</a> &#x7684;&#x8FD4;&#x56DE;&#x5934;&#x91CC;&#x52A0;&#x4E0A; X-Proxy-By:AnyProxy</li>
</ul>
<pre><code class="lang-bash">anyproxy --rule rule_sample/sample_modify_response_header.js
</code></pre>
<pre><code class="lang-js"><span class="hljs-comment">/* 
  sample: 
    modify response header of http://httpbin.org/user-agent
  test:
    curl -I &apos;http://httpbin.org/user-agent&apos; --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">&apos;http://httpbin.org/user-agent&apos;</span>) === <span class="hljs-number">0</span>) {
      <span class="hljs-keyword">const</span> newResponse = responseDetail.response;
      newResponse.header[<span class="hljs-string">&apos;X-Proxy-By&apos;</span>] = <span class="hljs-string">&apos;AnyProxy&apos;</span>;
      <span class="hljs-keyword">return</span> {
        response: newResponse
      };
    }
  }
};
</code></pre>
<h3 id="&#x4FEE;&#x6539;&#x8FD4;&#x56DE;&#x5185;&#x5BB9;&#x5E76;&#x5EF6;&#x8FDF;">&#x4FEE;&#x6539;&#x8FD4;&#x56DE;&#x5185;&#x5BB9;&#x5E76;&#x5EF6;&#x8FDF;</h3>
<ul>
<li>&#x5728; <a href="http://httpbin.org/user-agent" target="_blank">http://httpbin.org/user-agent</a> &#x7684;&#x8FD4;&#x56DE;&#x6700;&#x540E;&#x8FFD;&#x52A0;AnyProxy&#x7684;&#x7B7E;&#x540D;&#xFF0C;&#x5E76;&#x5EF6;&#x8FDF;5&#x79D2;</li>
</ul>
<pre><code class="lang-bash">anyproxy --rule rule_sample/sample_modify_response_data.js
</code></pre>
<pre><code class="lang-js"><span class="hljs-comment">/* 
  sample: 
    modify response data of http://httpbin.org/user-agent
  test:
    curl &apos;http://httpbin.org/user-agent&apos; --proxy http://127.0.0.1:8001
  expected response:
    { &quot;user-agent&quot;: &quot;curl/7.43.0&quot; } -- 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">&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 the response for 5s</span>
          resolve({ response: newResponse });
        }, <span class="hljs-number">5000</span>);
      });
    }
  },
};
</code></pre>
<h1 id="&#x8BC1;&#x4E66;&#x914D;&#x7F6E;">&#x8BC1;&#x4E66;&#x914D;&#x7F6E;</h1>
<h3 id="osx&#x7CFB;&#x7EDF;&#x4FE1;&#x4EFB;ca&#x8BC1;&#x4E66;">OSX&#x7CFB;&#x7EDF;&#x4FE1;&#x4EFB;CA&#x8BC1;&#x4E66;</h3>
<ul>
<li>&#x7C7B;&#x4F3C;&#x8FD9;&#x79CD;&#x62A5;&#x9519;&#x90FD;&#x662F;&#x56E0;&#x4E3A;&#x7CFB;&#x7EDF;&#x6CA1;&#x6709;&#x4FE1;&#x4EFB;AnyProxy&#x751F;&#x6210;&#x7684;CA&#x6240;&#x9020;&#x6210;&#x7684;</li>
</ul>
<p><img src="https://zos.alipayobjects.com/rmsportal/CBkLGYgvoHAYwNVAYkpk.png" width="450"></p>
<blockquote>
<p>&#x8B66;&#x544A;&#xFF1A;CA&#x8BC1;&#x4E66;&#x548C;&#x7CFB;&#x7EDF;&#x5B89;&#x5168;&#x606F;&#x606F;&#x76F8;&#x5173;&#xFF0C;&#x5EFA;&#x8BAE;&#x4EB2;&#x81EA;&#x751F;&#x6210;&#xFF0C;&#x5E76;&#x59A5;&#x5584;&#x4FDD;&#x7BA1;</p>
</blockquote>
<p>&#x5B89;&#x88C5;CA&#xFF1A;</p>
<ul>
<li><p>&#x53CC;&#x51FB;&#x6253;&#x5F00;<em>rootCA.crt</em></p>
</li>
<li><p>&#x786E;&#x8BA4;&#x5C06;&#x8BC1;&#x4E66;&#x6DFB;&#x52A0;&#x5230;login&#x6216;system</p>
</li>
</ul>
<p><img src="https://zos.alipayobjects.com/rmsportal/bCwNUFFpvsmVuljQKrIk.png" width="350"></p>
<ul>
<li>&#x627E;&#x5230;&#x521A;&#x521A;&#x5BFC;&#x5165;&#x7684;AnyProxy&#x8BC1;&#x4E66;&#xFF0C;&#x914D;&#x7F6E;&#x4E3A;&#x4FE1;&#x4EFB;&#xFF08;Always Trust&#xFF09;</li>
</ul>
<p><img src="https://zos.alipayobjects.com/rmsportal/HOmEElNGdoZEWFMLsTNT.png" width="700"></p>
<h3 id="windows&#x7CFB;&#x7EDF;&#x4FE1;&#x4EFB;ca&#x8BC1;&#x4E66;">Windows&#x7CFB;&#x7EDF;&#x4FE1;&#x4EFB;CA&#x8BC1;&#x4E66;</h3>
<p><img src="https://t.alipayobjects.com/tfscom/T1D3hfXeFtXXXXXXXX.jpg" width="700"></p>
<h3 id="&#x914D;&#x7F6E;osx&#x7CFB;&#x7EDF;&#x4EE3;&#x7406;">&#x914D;&#x7F6E;OSX&#x7CFB;&#x7EDF;&#x4EE3;&#x7406;</h3>
<ul>
<li>&#x5728;wifi&#x9AD8;&#x7EA7;&#x8BBE;&#x7F6E;&#x4E2D;&#xFF0C;&#x914D;&#x7F6E;http&#x4EE3;&#x7406;&#x5373;&#x53EF;</li>
</ul>
<p><img src="https://zos.alipayobjects.com/rmsportal/vduwhobSTypTfgniBvoa.png" width="500"></p>
<h3 id="&#x914D;&#x7F6E;&#x6D4F;&#x89C8;&#x5668;http&#x4EE3;&#x7406;">&#x914D;&#x7F6E;&#x6D4F;&#x89C8;&#x5668;HTTP&#x4EE3;&#x7406;</h3>
<ul>
<li>&#x4EE5;Chrome&#x7684;<a href="https://chrome.google.com/webstore/detail/padekgcemlokbadohgkifijomclgjgif" target="_blank">SwitchyOmega&#x63D2;&#x4EF6;</a>&#x4E3A;&#x4F8B;</li>
</ul>
<p><img src="https://zos.alipayobjects.com/rmsportal/jIPZrKmqXRaSledQeJUJ.png" width="500"></p>
<h3 id="ios&#x7CFB;&#x7EDF;&#x4FE1;&#x4EFB;ca&#x8BC1;&#x4E66;">iOS&#x7CFB;&#x7EDF;&#x4FE1;&#x4EFB;CA&#x8BC1;&#x4E66;</h3>
<ul>
<li>&#x70B9;&#x51FB;web ui&#x4E2D;&#x7684; <em>Root CA</em>&#xFF0C;&#x6309;&#x63D0;&#x793A;&#x626B;&#x63CF;&#x4E8C;&#x7EF4;&#x7801;&#x5373;&#x53EF;&#x5B89;&#x88C5;</li>
</ul>
<p><img src="https://zos.alipayobjects.com/rmsportal/BrugmMelGVysLDOIBblj.png" width="260"></p>
<h3 id="ios--103&#x4FE1;&#x4EFB;ca&#x8BC1;&#x4E66;">iOS &gt;= 10.3&#x4FE1;&#x4EFB;CA&#x8BC1;&#x4E66;</h3>
<ul>
<li>&#x9664;&#x4E86;&#x4E0A;&#x8FF0;&#x8BC1;&#x4E66;&#x5B89;&#x88C5;&#x8FC7;&#x7A0B;&#xFF0C;&#x8FD8;&#x9700;&#x8981;&#x5728; <em>&#x8BBE;&#x7F6E;-&gt;&#x901A;&#x7528;-&gt;&#x5173;&#x4E8E;&#x672C;&#x673A;-&gt;&#x8BC1;&#x4E66;&#x4FE1;&#x4EFB;&#x8BBE;&#x7F6E;</em> &#x4E2D;&#x628A;AnyProxy&#x8BC1;&#x4E66;&#x7684;&#x5F00;&#x5173;&#x6253;&#x5F00;&#xFF0C;&#x5426;&#x5219;safari&#x5C06;&#x62A5;&#x9519;&#x3002;</li>
</ul>
<p><img src="https://zos.alipayobjects.com/rmsportal/hVWkXHrzHmOKOtCKGUWx.png" width="500"></p>
<h3 id="&#x5B89;&#x5353;&#x7CFB;&#x7EDF;&#x4FE1;&#x4EFB;ca&#x8BC1;&#x4E66;">&#x5B89;&#x5353;&#x7CFB;&#x7EDF;&#x4FE1;&#x4EFB;CA&#x8BC1;&#x4E66;</h3>
<p>&#x9996;&#x5148;&#x548C;iOS&#x7C7B;&#x4F3C;&#xFF0C;&#x9700;&#x8981;&#x5148;&#x626B;&#x63CF;&#x8BC1;&#x4E66;&#x7684;&#x4E8C;&#x7EF4;&#x7801;&#x8FDB;&#x884C;&#x4E0B;&#x8F7D;&#x3002;&#x7136;&#x540E;&#x4E0D;&#x540C;&#x7684;&#x5B89;&#x5353;&#x7CFB;&#x7EDF;&#x5B89;&#x88C5;&#x8BC1;&#x4E66;&#x7684;&#x65B9;&#x5F0F;&#x53EF;&#x80FD;&#x6709;&#x6240;&#x4E0D;&#x540C;&#xFF0C;&#x4F46;&#x662F;&#x5B89;&#x88C5;&#x7684;&#x6B65;&#x9AA4;&#x662F;&#x7C7B;&#x4F3C;&#x7684;&#xFF0C;&#x6211;&#x4EEC;&#x5217;&#x4E3E;&#x4E86;&#x51E0;&#x79CD;&#x7C7B;&#x578B;&#x3002;</p>
<ul>
<li>&#x4E0B;&#x8F7D;&#x540E;&#x7684;&#x8BC1;&#x4E66;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x5355;&#x51FB;&#x6253;&#x5F00;&#x5E76;&#x5B89;&#x88C5;&#xFF0C;&#x8FD9;&#x79CD;&#x65B9;&#x5F0F;&#x662F;&#x6700;&#x7B80;&#x5355;&#x7684;&#xFF0C;&#x76F4;&#x63A5;&#x5B89;&#x88C5;&#x5373;&#x53EF;</li>
<li>&#x8BC1;&#x4E66;&#x4E0B;&#x8F7D;&#x5230;&#x6307;&#x5B9A;&#x76EE;&#x5F55;&#x540E;&#xFF0C;&#x9700;&#x8981;&#x4ECE;&#x5176;&#x4ED6;&#x5165;&#x53E3;&#x8FDB;&#x884C;&#x5B89;&#x88C5;&#xFF0C;&#x5305;&#x62EC;&#xFF1A;<ul>
<li>&#x8BBE;&#x7F6E; -&gt; &#x5B89;&#x5168;&#x6027;&#x4E0E;&#x4F4D;&#x7F6E;&#x4FE1;&#x606F; -&gt; &#x52A0;&#x5BC6;&#x4E0E;&#x51ED;&#x636E; -&gt; &#x4ECE;&#x5B58;&#x50A8;&#x8BBE;&#x5907;&#x5B89;&#x88C5;&#x3002;&#x627E;&#x5230;&#x4F60;&#x4E0B;&#x8F7D;&#x7684;&#x8BC1;&#x4E66;&#x6587;&#x4EF6;&#xFF0C;&#x8FDB;&#x884C;&#x5B89;&#x88C5;</li>
<li>&#x8BBE;&#x7F6E; -&gt; &#x5B89;&#x5168; -&gt; &#x4ECE;SD&#x5361;&#x5B89;&#x88C5;&#x8BC1;&#x4E66;&#x3002;&#x627E;&#x5230;&#x4F60;&#x4E0B;&#x8F7D;&#x7684;&#x8BC1;&#x4E66;&#x6587;&#x4EF6;&#xFF0C;&#x8FDB;&#x884C;&#x5B89;&#x88C5;</li>
</ul>
</li>
</ul>
<p>&#x4E0D;&#x540C;&#x5B89;&#x5353;&#x7CFB;&#x7EDF;&#x652F;&#x6301;&#x5B89;&#x88C5;&#x7684;&#x8BC1;&#x4E66;&#x6587;&#x4EF6;&#x7C7B;&#x578B;&#x4E0D;&#x5C3D;&#x76F8;&#x540C;&#xFF0C;&#x5927;&#x591A;&#x652F;&#x6301;&#x5B89;&#x88C5;&#x62D3;&#x5C55;&#x540D;&#x4E3A; .crt &#x7684;&#x8BC1;&#x4E66;&#x6587;&#x4EF6;&#xFF0C;&#x5C11;&#x90E8;&#x5206;&#x4EC5;&#x652F;&#x6301; .cer &#x6587;&#x4EF6;&#xFF08;&#x5DF2;&#x77E5;&#x5982; OPPO R15&#xFF09;&#xFF0C;AnyProxy &#x63D0;&#x4F9B;&#x4E86;&#x591A;&#x79CD;&#x7C7B;&#x578B;&#x7684;&#x8BC1;&#x4E66;&#x6587;&#x4EF6;&#xFF0C;&#x53EF;&#x5728;&#x4E0B;&#x8F7D;&#x5B89;&#x88C5;&#x65F6;&#x9009;&#x62E9;&#x3002;</p>
<h3 id="&#x914D;&#x7F6E;iosandroid&#x7CFB;&#x7EDF;&#x4EE3;&#x7406;">&#x914D;&#x7F6E;iOS/Android&#x7CFB;&#x7EDF;&#x4EE3;&#x7406;</h3>
<ul>
<li><p>&#x4EE3;&#x7406;&#x670D;&#x52A1;&#x5668;&#x90FD;&#x5728;wifi&#x8BBE;&#x7F6E;&#x4E2D;&#x914D;&#x7F6E;</p>
</li>
<li><p>iOS HTTP&#x4EE3;&#x7406;&#x914D;&#x7F6E;</p>
</li>
</ul>
<p><img src="https://zos.alipayobjects.com/rmsportal/tLGqIozhffTccUgPakuw.png" width="260"></p>
<ul>
<li>Android HTTP&#x4EE3;&#x7406;&#x914D;&#x7F6E;</li>
</ul>
<p><img src="https://zos.alipayobjects.com/rmsportal/YQtbQYVNuOszZGdAOauU.png" width="260"></p>
<h1 id="faq">FAQ</h1>
<h4 id="q-&#x4E3A;&#x4EC0;&#x4E48;https&#x8BF7;&#x6C42;&#x4E0D;&#x80FD;&#x8FDB;&#x5165;&#x5904;&#x7406;&#x51FD;&#x6570;&#xFF1F;">Q: &#x4E3A;&#x4EC0;&#x4E48;https&#x8BF7;&#x6C42;&#x4E0D;&#x80FD;&#x8FDB;&#x5165;&#x5904;&#x7406;&#x51FD;&#x6570;&#xFF1F;</h4>
<p> A: &#x4EE5;&#x4E0B;&#x4EFB;&#x610F;&#x4E00;&#x9879;&#x90FD;&#x80FD;&#x7528;&#x6765;&#x6539;&#x53D8;https&#x7684;&#x5904;&#x7406;&#x7279;&#x6027;&#xFF1A;</p>
<pre><code> 1. &#x547D;&#x4EE4;&#x884C;&#x542F;&#x52A8;AnyProxy&#x65F6;&#x914D;&#x7F6E;`--intercept`&#x53C2;&#x6570;&#xFF0C;&#x6309;npm&#x6A21;&#x5757;&#x542F;&#x52A8;&#x65F6;&#x914D;&#x7F6E;`forceProxyHttps`&#x53C2;&#x6570;&#xFF0C;&#x6240;&#x6709;Https&#x8BF7;&#x6C42;&#x90FD;&#x4F1A;&#x88AB;&#x66FF;&#x6362;&#x8BC1;&#x4E66;&#x5E76;&#x89E3;&#x6790;
 2. &#x89C4;&#x5219;&#x6587;&#x4EF6;&#x5185;&#x63D0;&#x4F9B;`beforeDealHttpsRequest`&#x65B9;&#x6CD5;&#xFF0C;&#x8FD4;&#x56DE; *true* &#x7684;https&#x8BF7;&#x6C42;&#x4F1A;&#x88AB;&#x89E3;&#x6790;
</code></pre><h4 id="q-&#x63D0;&#x793A;-function-is-not-yieldable">Q: &#x63D0;&#x793A; <em>function is not yieldable</em></h4>
<ul>
<li>A: &#x89C4;&#x5219;&#x6A21;&#x5757;&#x662F;&#x7528; <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;&#x4F7F;&#x7528;generator&#x65B9;&#x6CD5;&#x6216;&#x662F;&#x8FD4;&#x56DE;Promise&#x3002;</li>
</ul>
<h4 id="q-the-connection-is-not-private">Q: The connection is not private</h4>
<p>&#x5F53;&#x8BBF;&#x95EE;&#x7279;&#x5B9A;&#x7684;HTTPS&#x7AD9;&#x70B9;&#xFF0C;AnyProxy&#x4F1A;&#x63D0;&#x793A;&#x8BE5;&#x7AD9;&#x70B9;&#x4E0D;&#x662F;&#x4E00;&#x4E2A;&#x5B89;&#x5168;&#x7684;&#x7F51;&#x7AD9;&#xFF0C;&#x8FD9;&#x901A;&#x5E38;&#x662F;&#x56E0;&#x4E3A;&#x7AD9;&#x70B9;&#x7684;&#x8BC1;&#x4E66;&#x8BBE;&#x7F6E;&#x4E0D;&#x80FD;&#x88AB;&#x6B63;&#x786E;&#x8BC6;&#x522B;&#x5BFC;&#x81F4;&#x7684;&#xFF08;&#x6BD4;&#x5982;&#xFF0C;&#x7AD9;&#x70B9;&#x7684;&#x8BC1;&#x4E66;&#x662F;&#x81EA;&#x7B7E;&#x53D1;&#x7684;&#xFF09;&#x3002;&#x5982;&#x679C;&#x60A8;&#x4FE1;&#x4EFB;&#x8BE5;&#x7F51;&#x7AD9;&#xFF0C;&#x53EF;&#x4EE5;&#x7528;&#x4EE5;&#x4E0B;&#x65B9;&#x5F0F;&#x6765;&#x7EE7;&#x7EED;&#x8BBF;&#x95EE;&#xFF1A;</p>
<ul>
<li><p>&#x547D;&#x4EE4;&#x884C;&#x76F4;&#x63A5;&#x542F;&#x52A8;</p>
<p>&#x901A;&#x8FC7;&#x542F;&#x52A8;&#x53C2;&#x6570; <code>--ignore-unauthorized-ssl</code> &#x6765;&#x5FFD;&#x7565;&#x8BC1;&#x4E66;&#x8BA4;&#x8BC1;&#x7684;&#x9519;&#x8BEF;&#x3002;&#x9700;&#x8981;&#x6CE8;&#x610F;&#x7684;&#x662F;&#xFF0C;&#x8BE5;&#x53C2;&#x6570;&#x662F;&#x5168;&#x5C40;&#x751F;&#x6548;&#x7684;&#xFF0C;&#x5982;&#x679C;&#x4F60;&#x5728;&#x6B64;&#x671F;&#x95F4;&#x8BBF;&#x95EE;&#x4E86;&#x5176;&#x4ED6;&#x672A;&#x77E5;&#x7684;&#x7F51;&#x7AD9;&#xFF0C;&#x4ED6;&#x4EEC;&#x7684;&#x8BC1;&#x4E66;&#x95EE;&#x9898;&#x4E5F;&#x4F1A;&#x88AB;&#x5FFD;&#x7565;&#xFF0C;&#x8FD9;&#x53EF;&#x80FD;&#x4F1A;&#x5E26;&#x6765;&#x5B89;&#x5168;&#x9690;&#x60A3;&#x3002;</p>
<pre><code class="lang-bash">anyproxy -i --ignore-unauthorized-ssl
</code></pre>
</li>
<li><p>&#x5728;Nodejs&#x4EE3;&#x7801;&#x4E2D;&#x542F;&#x52A8;</p>
<p>&#x5728;&#x6784;&#x9020;AnyProxy&#x5B9E;&#x4F8B;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x4F20;&#x5165;&#x53C2;&#x6570;<code>dangerouslyIgnoreUnauthorized:true</code>, &#x5982;&#x4E0B;&#xFF1A;</p>
<pre><code class="lang-js"> <span class="hljs-keyword">const</span> options = {
  ...,
  dangerouslyIgnoreUnauthorized: <span class="hljs-literal">true</span>
 };

 <span class="hljs-keyword">const</span> anyproxyIns = <span class="hljs-keyword">new</span> AnyProxy.ProxyCore(options);
 anyproxyIns.start();
</code></pre>
<p><em>&#x901A;&#x8FC7;&#x8FD9;&#x79CD;&#x65B9;&#x5F0F;&#x521D;&#x59CB;&#x5316;&#x7684;AnyProxy&#xFF0C;&#x5176;&#x914D;&#x7F6E;&#x4E5F;&#x662F;&#x5168;&#x5C40;&#x6027;&#x7684;&#xFF0C;&#x6240;&#x6709;&#x7F51;&#x7AD9;&#x7684;&#x8BC1;&#x4E66;&#x95EE;&#x9898;&#x90FD;&#x4F1A;&#x88AB;&#x5FFD;&#x7565;</em></p>
</li>
<li><p>&#x901A;&#x8FC7;&#x81EA;&#x5B9A;&#x4E49;&#x7684;Rule&#x6765;&#x4FEE;&#x6539;</p>
<p>&#x6211;&#x4EEC;&#x81EA;&#x7136;&#x4E5F;&#x53EF;&#x4EE5;&#x501F;&#x52A9;&#x81EA;&#x5B9A;&#x4E49;&#x7684;Rule&#x6765;&#x5B9E;&#x73B0;&#x8FD9;&#x4E2A;&#x6548;&#x679C;&#xFF0C;&#x800C;&#x4E14;&#x6211;&#x4EEC;&#x8FD8;&#x53EF;&#x4EE5;&#x63A7;&#x5236;&#x5230;&#x53EA;&#x5141;&#x8BB8;&#x6307;&#x5B9A;&#x7F51;&#x5740;&#x7684;&#x8BC1;&#x4E66;&#x9519;&#x8BEF;&#xFF0C;&#x5BF9;&#x4E0D;&#x5728;&#x5217;&#x8868;&#x7684;&#x7F51;&#x5740;&#xFF0C;&#x8FDB;&#x884C;&#x8BC1;&#x4E66;&#x7684;&#x5F3A;&#x9A8C;&#x8BC1;&#x3002;</p>
<pre><code class="lang-js"><span class="hljs-built_in">module</span>.exports = {
  *beforeSendRequest(requestDetail) {
    <span class="hljs-keyword">if</span> (requestDetail.url.indexOf(<span class="hljs-string">&apos;https://the-site-you-know.com&apos;</span>) === <span class="hljs-number">0</span>) {
      <span class="hljs-keyword">const</span> newRequestOptions = requestDetail.requestOptions;
      <span class="hljs-comment">// &#x8BBE;&#x7F6E;&#x5C5E;&#x6027; rejectUnauthorized &#x4E3A; false</span>
      newRequestOptions.rejectUnauthorized = <span class="hljs-literal">false</span>;
      <span class="hljs-keyword">return</span> {
        requestOptions: newRequestOptions
      };
    }
  },
};
</code></pre>
</li>
</ul>

                                
                                </section>
                            
    </div>
    <div class="search-results">
        <div class="has-results">
            
            <h1 class="search-results-title"><span class='search-results-count'></span> results matching "<span class='search-query'></span>"</h1>
            <ul class="search-results-list"></ul>
            
        </div>
        <div class="no-results">
            
            <h1 class="search-results-title">No results matching "<span class='search-query'></span>"</h1>
            
        </div>
    </div>
</div>

                        </div>
                    </div>
                
            </div>

            
                
                
                <a href="./#快速开始" class="navigation navigation-next navigation-unique" aria-label="Next page: 快速开始">
                    <i class="fa fa-angle-right"></i>
                </a>
                
            
        
    </div>

    <script>
        var gitbook = gitbook || [];
        gitbook.push(function() {
            gitbook.page.hasChanged({"page":{"title":"简介","level":"1.1","depth":1,"next":{"title":"快速开始","level":"1.2","depth":1,"anchor":"#快速开始","path":"README.md","ref":"README.md#快速开始","articles":[{"title":"安装","level":"1.2.1","depth":2,"anchor":"#安装","path":"README.md","ref":"README.md#安装","articles":[]},{"title":"启动","level":"1.2.2","depth":2,"anchor":"#启动","path":"README.md","ref":"README.md#启动","articles":[]},{"title":"其他命令","level":"1.2.3","depth":2,"anchor":"#其他命令","path":"README.md","ref":"README.md#其他命令","articles":[]},{"title":"作为npm模块启动","level":"1.2.4","depth":2,"anchor":"#作为npm模块使用","path":"README.md","ref":"README.md#作为npm模块使用","articles":[]}]},"dir":"ltr"},"config":{"plugins":[],"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"pluginsConfig":{"livereload":{},"highlight":{},"search":{},"lunr":{"maxIndexSize":1000000,"ignoreSpecialCharacters":false},"sharing":{"facebook":true,"twitter":true,"google":false,"weibo":false,"instapaper":false,"vk":false,"all":["facebook","google","twitter","weibo","instapaper"]},"fontsettings":{"theme":"white","family":"sans","size":2},"theme-default":{"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"showLevel":false}},"theme":"default","author":"AnyProxy","pdf":{"pageNumbers":true,"fontSize":12,"fontFamily":"Arial","paperSize":"a4","chapterMark":"pagebreak","pageBreaksBefore":"/","margin":{"right":62,"left":62,"top":56,"bottom":56}},"structure":{"langs":"LANGS.md","readme":"README.md","glossary":"GLOSSARY.md","summary":"SUMMARY.md"},"variables":{},"title":"AnyProxy","language":"cn","gitbook":"*","description":"A fully configurable http/https proxy in NodeJS"},"file":{"path":"README.md","mtime":"2019-03-26T12:49:35.827Z","type":"markdown"},"gitbook":{"version":"3.2.2","time":"2019-03-26T12:49:36.852Z"},"basePath":".","book":{"language":"cn"}});
        });
    </script>
</div>

        
    <script src="../gitbook/gitbook.js"></script>
    <script src="../gitbook/theme.js"></script>
    
        
        <script src="../gitbook/gitbook-plugin-livereload/plugin.js"></script>
        
    
        
        <script src="../gitbook/gitbook-plugin-search/search-engine.js"></script>
        
    
        
        <script src="../gitbook/gitbook-plugin-search/search.js"></script>
        
    
        
        <script src="../gitbook/gitbook-plugin-lunr/lunr.min.js"></script>
        
    
        
        <script src="../gitbook/gitbook-plugin-lunr/search-lunr.js"></script>
        
    
        
        <script src="../gitbook/gitbook-plugin-sharing/buttons.js"></script>
        
    
        
        <script src="../gitbook/gitbook-plugin-fontsettings/fontsettings.js"></script>
        
    

    </body>
</html>



================================================
FILE: docs/cn/search_index.json
================================================
{"index":{"version":"0.5.12","fields":[{"name":"title","boost":10},{"name":"keywords","boost":15},{"name":"body","boost":1}],"ref":"url","documentStore":{"store":{"./":["\"content","\"curl/7.43.0\"","\"data\":","\"https\"","\"i","\"thi","\"user","\"x","#全局包","#启动anyproxy,并解析所有https请求","#本地包","#生成rootca证书,生成后需要手动信任","&&","'","'...'","'...',","'/',","'/index.html';","'/redirect/to/another/path';","'127.0.0.1'","'8001');","'8008';","';","'a","'anyproxy';","'anyproxy.io',","'anyproxy/0.0.0';","'application/json'","'cach","'close',","'content","'get',","'get';","'hello","'http',","'http';","'http://anyproxy.io/',","'http://httpbin.org/get?show_env=1'","'http://httpbin.org/us","'https'","'https',","'i","'image/gif',","'keep","'mi","'origin","'proxi","'rule","'text/html'","'thi","'user","'{\"hello\":","(!anyproxy.utils.certmgr.ifrootcafileexists())","(!error)","()","(e)","(iswin)","(requestdetail.url","(requestdetail.url.indexof('http://httpbin.org')","(requestdetail.url.indexof('http://httpbin.org/post')","(requestdetail.url.indexof('http://httpbin.org/us","(requestdetail.url.indexof('https://httpbin.org/us","(requestdetail.url.indexof('https://th","*/","*/}","*beforedealhttpsrequest(requestdetail)","*beforesendrequest(requestdetail)","*beforesendresponse(requestdetail,","*onconnecterror(requestdetail,","*onerror(requestdetail,","*true*","+=",".',","...","...,","./myrulepkg/","./rule.j",".cer",".crt","/*","//","//when","//这里也可以同时加上requestopt","/^win/.test(process.platform);","0)","1.","10.3信任ca证书","10000,","1080","127.0.0.1:8001/index.html","127.0.0.1:8001,访问","1,编写规则","2,","2.","200,","3,","4,","4.0的主要变化:","4.0,欢迎提供反馈","404","404;","443;","5000);","5s","80,","8001,","8002","=","===","=>",">",">=",">关于本机",">证书信任设置",">通用","_re","_req","_req:","_res:","a:","agent","agent\":","agent'","agent')","agent':","agent']","alive',","android","anyproxi","anyproxy',","anyproxy.io","anyproxy.proxycore(options);","anyproxy.proxyserv","anyproxy.proxyserver(options)","anyproxy.proxyserver(options);","anyproxy.utils.certmgr","anyproxy.utils.certmgr.generaterootca((error,","anyproxy.utils.certmgr.generaterootca(callback)","anyproxy.utils.certmgr.ifrootcafileexists()","anyproxy.utils.systemproxymgr","anyproxy.utils.systemproxymgr.disableglobalproxy();","anyproxy.utils.systemproxymgr.enableglobalproxy('127.0.0.1',","anyproxyin","anyproxyins.start();","anyproxy使用require()加载本地规则,你可以在参数里传入一个本地的npm包路径,或是某个全局安装的npm包","anyproxy可以作为一个npm模块使用,整合进其他工具。","anyproxy向客户端发送请求前,会调用beforesendresponse,并带上参数requestdetail","anyproxy向服务端发送请求前,会调用beforesendrequest,并带上参数requestdetail","anyproxy在与目标https服务器建立连接的过程中,如果发生错误,anyproxy会调用这个方法","anyproxy提供了二次开发的能力,你可以用js编写自己的规则模块(rule),来自定义网络请求的处理逻辑。","anyproxy收到https请求时,会调用beforedealhttpsrequest,并带上参数requestdetail","anyproxy是一个开放式的http代理服务器。","anyproxy调用规则模块beforesendrequest方法,由模块做处理,返回新的请求参数,或返回响应内容","anyproxy默认不对https请求做处理,如需看到明文信息,需要配置ca证书","apt","at',","attack),需要客户端提前信任anyproxy生成的ca","befor","beforedealhttpsrequest","beforedealhttpsrequest(requestdetail)","beforesendrequest","beforesendrequest(requestdetail)","beforesendrespons","beforesendresponse(requestdetail,","body:","body三个字段","body等","body),甚至是请求的目标地址等","by']","by:","by:anyproxi","ca","ca方法。","ca,按提示扫描二维码即可安装","cert","certdir","certdir);","class:","close","co","code","code)、响应头(respons","connect","connection':","connection:","console.error('error","console.log('th","const","control':","curl","custom","cwd:","d","dangerouslyignoreunauthor","dangerouslyignoreunauthorized:","data","data\"","data'","data',","delay","doc","enabl","enable:","english","error","error)","error);","event:","exec","exec('open","exec('start","expect","fals","false,","false;","faq","file:","finish","forceproxyhttp","forceproxyhttps:","forward","found","function","function()","g","gener","github主页:https://github.com/alibaba/anyproxi","h","hack","hacked!","hacked!';","header","header),请求体(request","header,","header:","headers:","header)、响应内容等","host","host:","hostname:","http","http/1.1","http://....j","http://127.0.0.1:8001","http://httpbin.org","http://httpbin.org/","http://httpbin.org/post","http://httpbin.org/us","http://localhost:8008/index.html","httpbin.org","httpbin.org,","https://httpbin.org/us","https://sample.com/rule.j","https连接服务器出错","http代理配置","http的代理模式中,这里的request是connect请求","ignor","instal","intercept","intercept`参数,按npm模块启动时配置`forceproxyhttps`参数,所有https请求都会被替换证书并解析","intercept后才会从界面上看到相应内容。","io","ios系统信任ca证书","iswin","keypath)","know.com')","legaci","local","localrespons","method:","middl","middle),用户必须信任anyproxy生成的ca证书,才能进行后续流程","modifi","module.export","myrulepkg","new","newopt","newoption.path","newoption.port","newrequestopt","newrequestoptions.headers['us","newrequestoptions.hostnam","newrequestoptions.method","newrequestoptions.path","newrequestoptions.port","newrequestoptions.rejectunauthor","newrespons","newresponse.bodi","newresponse.header['x","newresponse.statuscod","nodej","npm","null;","object.assign({},","onconnecterror","onconnecterror(requestdetail,","onerror","onerror(requestdetail,","oppo","option","osx系统信任ca证书","over","path:","port","port:","post","privat","promise((resolve,","protocol","protocol\":","protocol:","proxi","proxy.close();","proxy.on('error',","proxy.on('ready',","proxy.start();","proxyserv","proxyserver.close();","proxyserver.on('error',","proxyserver.on('ready',","proxyserver.start();","q:","r15),anyproxi","readi","redirect","ref:","reject)","rejectunauthor","request","requestdata","requestdata:","requestdetail","requestdetail.protocol","requestdetail.requestoptions);","requestdetail.requestoptions;","requestdetail;","requestopt","requestoptions:","require('anyproxy');","require('child_process').exec;","require('myrulemodule'),","require('path').dirname(keypath);","resolve({","respons","response\"}'","response',","response:","responsedetail","responsedetail)","responsedetail.response);","responsedetail.response;","return","root","rootca',","rule","rule:","rule_sample/sample_modify_request_data.j","rule_sample/sample_modify_request_header.j","rule_sample/sample_modify_request_path.j","rule_sample/sample_modify_request_protocol.j","rule_sample/sample_modify_response_data.j","rule_sample/sample_modify_response_header.j","rule_sample/sample_modify_response_statuscode.j","rule_sample/sample_use_local_response.j","rule接口文档","rule样例","rule模块","sample.j","sample:","save","settimeout(()","silent","silent:","site","ssl","start","statu","statuscode:","step","string","sudo","summari","summary():","summary:","summary:str","test:","text/plain\"","throttl","throttle:","toward","true","true,","true;","true或者false,表示是否需要anyproxy替换证书并解析http","trust","trust)","type':","type:","ui中的","unauthor","url","url:","us","user","var","webinterfac","webinterface:","webport","webport:","web版界面端口号,默认8002","web版界面配置","web版界面重构","windows系统信任ca证书","world'","ws","wsintercept","wsintercept:","x","yieldabl","{","{boolean}","{number}","{object}","{string}","|","}","})","});","},","};","下载后的证书可以直接单击打开并安装,这种方式是最简单的,直接安装即可","不做任何处理。此时anyproxy会返回一个默认的错误页。","不做任何处理,返回null","不同安卓系统支持安装的证书文件类型不尽相同,大多支持安装拓展名为","不开启websocket代理","中把anyproxy证书的开关打开,否则safari将报错。","为","为什么https请求不能进入处理函数?","主要特性包括:","举例","举例,请求","举例:请求","从sd卡安装证书。找到你下载的证书文件,进行安装","从存储设备安装。找到你下载的证书文件,进行安装","代理http","代理websocket","代理服务器发生错误","代理服务器启动完成","代理服务器都在wifi设置中配置","以chrome的switchyomega插件为例","以下任意一项都能用来改变https的处理特性:","以下几种返回都是合法的","作为npm模块使用","作为全局模块","你可以通过","使用npm包","使用举例","使用在线地址","使用本地数据","使用本地路径anyproxi","使用示例","修改发送到","修改请求bodi","修改请求协议","修改请求协议,如强制改用https发起请求","修改请求参数","修改请求头","修改请求数据","修改请求的目标地址","修改返回内容并延迟","修改返回头","修改返回状态码","修改返回的内容","修改返回的状态码","关闭代理服务器","关闭全局代理服务器","其他命令","创建代理服务器","加密与凭据","即将发送的请求配置,供require('http').request作为使用。详见:https://nodejs.org/api/http.html#http_http_request_options_callback","原始的服务端返回对象","双击打开rootca.crt","发送响应前处理","发送请求前拦截处理","只有返回true时,anyproxy才会尝试替换证书、解析https。否则只做数据流转发,无法看到明文数据。","可以是一个函数,也可以是一个普通的字符串","可修改内容包括请求头(request","可修改的内容包括http状态码(statu","同beforedealhttpsrequest中的参数","同beforesendrequest中的参数","启动","启动anyproxy,加载规则","启动代理服务器","启动后将终端http代理服务器配置为127.0.0.1:8001即可","命令行启动anyproxy时配置`","命令行启动anyproxy,默认端口号8001","命令行直接启动","在","在nodejs代码中启动","在wifi高级设置中,配置http代理即可","在构造anyproxy实例的时候,传入参数dangerouslyignoreunauthorized:true,","在请求处理过程中发生错误时,anyproxy会调用onerror方法,并提供对应的错误信息","基于node.js,开放二次开发能力,允许自定义请求处理逻辑","处理流程","处理流程图如下","多数场景下,错误会在请求目标服务器的时候发生,比如dns解析失败、请求超时等","如下几种方案都可以用来引用规则模块:","如下:","如何引用","如果beforesendrequest返回了响应内容,则立即把此响应返回到客户端(而不再发送到真正的服务端),流程结束。","如果配置了全局解析https的参数,则anyproxy会略过这个调用","如要启用https解析,请在代理服务器启动前自行调用anyproxy.utils.certmgr相关方法生成证书,并引导用户信任安装。或引导用户使用anyproxi","安全","安全性与位置信息","安卓系统信任ca证书","安装","安装ca:","对于debian或者ubuntu系统,在安装anyproxy之前,可能还需要安装","开发示例","引入","当http请求经过代理服务器时,具体处理过程是:","当代理服务器收到https请求时,anyproxy可以替换证书,对请求做明文解析。","当启用https代理时,wss也会被代理,但是不会被anyproxy记录。需要开启","当访问特定的https站点,anyproxy会提示该站点不是一个安全的网站,这通常是因为站点的证书设置不能被正确识别导致的(比如,站点的证书是自签发的)。如果您信任该网站,可以用以下方式来继续访问:","必选,代理服务器端口","快速开始","我们自然也可以借助自定义的rule来实现这个效果,而且我们还可以控制到只允许指定网址的证书错误,对不在列表的网址,进行证书的强验证。","所有http://httpbin.org","找到刚刚导入的anyproxy证书,配置为信任(alway","把","把响应信息返回给客户端","把所有发送到","把用http协议请求的","拦截https请求,对内容做修改","拦截发送到","拦截并修改服务端响应","拦截并修改正在发送的请求","提供gui界面,用以观察请求","提供了多种类型的证书文件,可在下载安装时选择。","提示","支持https的解析","收集请求所有请求参数,包括method,","改成https并发送","文件(已知如","时,requestdetail参数内容大致如下","时,responsedetail参数内容大致如下","是否启用web版界面,默认fals","是否处理https请求","是否屏蔽所有console输出,默认fals","是否开启websocket代理,默认fals","是否强制拦截所有的https,忽略规则模块的返回,默认fals","是否忽略请求中的证书错误,默认fals","是必选字段","服务端的返回信息,包括statuscod","本文档的适用范围是anyproxi","本质是中间人攻击(man","来加载模块并体验","来忽略证书认证的错误。需要注意的是,该参数是全局生效的,如果你在此期间访问了其他未知的网站,他们的证书问题也会被忽略,这可能会带来安全隐患。","查看请求信息","校验系统内是否存在anyproxy的根证书","样例","根据请求参数,向服务端发出请求,接收服务端响应。","模块介绍","此处无法控制向客户端的返回信息,无需返回值。","注意:http","注意:引用规则前,请务必确保文件来源可靠,以免发生安全问题","测试规则","浏览器访问http://127.0.0.1:8002","点击web","然后,安装anyproxi","生成anyproxy的rootca,完成后请引导用户信任.crt文件","生成证书并解析所有https请求","用curl发请求测试的方法如下","用curl测试","用浏览器测试:配置浏览器http代理为","的https请求会被解析","的post数据","的user","的证书文件,少部分仅支持","的请求全部改到","的请求,使用本地数据代替服务端返回","的返回值里加上测试信息,并延迟5秒返回","的返回头里加上","的返回最后追加anyproxy的签名,并延迟5秒","的返回状态码都改成404","直接请求服务器:curl","直接返回客户端,不再发起请求,其中statuscod","相比3.x版本,anyproxi","确认将证书添加到login或system","示例","简介","简化了规则文件内的接口","管理anyproxy的证书","管理系统的全局代理配置,方法调用时可能会弹出密码框","类似这种报错都是因为系统没有信任anyproxy生成的ca所造成的","经过代理服务器后,期望的返回如下","自定义规则模块","被明文解析后的https请求,处理流程同http一致。未明文解析请求不会再进入规则模块做处理。","规则文件中,除了summary,都是由","规则文件内提供`beforedealhttpsrequest`方法,返回","规则文件(rule)全面支持promise和gener","规则模块应该符合cmd规范,一个典型的规则模块代码结构如下。模块中所有方法都是可选的,只需实现业务感兴趣的部分即可。","规则模块是用","规则模块的介绍文案,用于anyproxy提示用户,","规则模块的能力范围包括:","解析https请求的原理是中间人攻击(man","警告:ca证书和系统安全息息相关,建议亲自生成,并妥善保管","设置","设置属性","访问http://127.0.0.1:8002","证书下载到指定目录后,需要从其他入口进行安装,包括:","证书配置","请求bodi","请求url","请求使用的协议,http或者http","请求出错的事件","请求的原始request","请求目标的host,受制于协议,这里无法获取完整url","调用规则模块beforedealhttpsrequest方法,如果返回true,会明文解析这个请求,其他请求不处理","调用规则模块beforesendresponse方法,由模块对响应内容进行处理","运行","返回值","返回自定义错误页","这里提供一些样例,来讲解规则模块的常见用法","通过代理服务器请求:curl","通过启动参数","通过自定义的rule来修改","通过这种方式初始化的anyproxy,其配置也是全局性的,所有网站的证书问题都会被忽略","配置127.0.0.1:8001为全局http代理服务器","配置ios/android系统代理","配置osx系统代理","配置启动端口,如1080端口启动","配置浏览器http代理","附录:如何信任ca证书","限速值,单位kb/s,默认不限速","除了上述证书安装过程,还需要在","需要编写一个规则模块,在","首先和ios类似,需要先扫描证书的二维码进行下载。然后不同的安卓系统安装证书的方式可能有所不同,但是安装的步骤是类似的,我们列举了几种类型。","驱动的,函数需要满足yieldable。可以使用generator方法或是返回promise。","驱动的,函数需要满足yieldable。可以返回promise或使用generator函数。",",web界面上能看到所有的请求信息",",界面上能看到刚才的请求信息"]},"length":1},"tokenStore":{"root":{"0":{"docs":{},")":{"docs":{"./":{"ref":"./","tf":0.0058953574060427415}}}},"1":{"0":{"0":{"0":{"0":{"docs":{},",":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}},"docs":{}},"docs":{}},"8":{"0":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}},"docs":{}},"docs":{},".":{"3":{"docs":{},"信":{"docs":{},"任":{"docs":{},"c":{"docs":{},"a":{"docs":{},"证":{"docs":{},"书":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}},"docs":{}}},"2":{"7":{"docs":{},".":{"0":{"docs":{},".":{"0":{"docs":{},".":{"1":{"docs":{},":":{"8":{"0":{"0":{"1":{"docs":{},"/":{"docs":{},"i":{"docs":{},"n":{"docs":{},"d":{"docs":{},"e":{"docs":{},"x":{"docs":{},".":{"docs":{},"h":{"docs":{},"t":{"docs":{},"m":{"docs":{},"l":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}},",":{"docs":{},"访":{"docs":{},"问":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}},"docs":{}},"docs":{}},"docs":{}},"docs":{}}},"docs":{}}},"docs":{}}},"docs":{}}},"docs":{}},"docs":{},".":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}},",":{"docs":{},"编":{"docs":{},"写":{"docs":{},"规":{"docs":{},"则":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}},"2":{"0":{"0":{"docs":{},",":{"docs":{"./":{"ref":"./","tf":0.0029476787030213707}}}},"docs":{}},"docs":{},",":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}},".":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}},"3":{"docs":{},",":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}},"4":{"0":{"4":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}},";":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}}}},"docs":{}},"4":{"3":{"docs":{},";":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}},"docs":{}},"docs":{},",":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}},".":{"0":{"docs":{},"的":{"docs":{},"主":{"docs":{},"要":{"docs":{},"变":{"docs":{},"化":{"docs":{},":":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}},",":{"docs":{},"欢":{"docs":{},"迎":{"docs":{},"提":{"docs":{},"供":{"docs":{},"反":{"docs":{},"馈":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}},"docs":{}}},"5":{"0":{"0":{"0":{"docs":{},")":{"docs":{},";":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}}}}},"docs":{}},"docs":{}},"docs":{},"s":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}},"8":{"0":{"0":{"1":{"docs":{},",":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}},"2":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}},"docs":{}},"docs":{},",":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}},"docs":{}},"docs":{},"\"":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}},"u":{"docs":{},"r":{"docs":{},"l":{"docs":{},"/":{"7":{"docs":{},".":{"4":{"3":{"docs":{},".":{"0":{"docs":{},"\"":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}}}},"docs":{}}},"docs":{}},"docs":{}}},"docs":{}}}}}},"d":{"docs":{},"a":{"docs":{},"t":{"docs":{},"a":{"docs":{},"\"":{"docs":{},":":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}},"h":{"docs":{},"t":{"docs":{},"t":{"docs":{},"p":{"docs":{},"s":{"docs":{},"\"":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}},"i":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}},"t":{"docs":{},"h":{"docs":{},"i":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}}}}}},"x":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}},"#":{"docs":{},"全":{"docs":{},"局":{"docs":{},"包":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}},"启":{"docs":{},"动":{"docs":{},"a":{"docs":{},"n":{"docs":{},"y":{"docs":{},"p":{"docs":{},"r":{"docs":{},"o":{"docs":{},"x":{"docs":{},"y":{"docs":{},",":{"docs":{},"并":{"docs":{},"解":{"docs":{},"析":{"docs":{},"所":{"docs":{},"有":{"docs":{},"h":{"docs":{},"t":{"docs":{},"t":{"docs":{},"p":{"docs":{},"s":{"docs":{},"请":{"docs":{},"求":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}}}}}}}},"本":{"docs":{},"地":{"docs":{},"包":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}},"生":{"docs":{},"成":{"docs":{},"r":{"docs":{},"o":{"docs":{},"o":{"docs":{},"t":{"docs":{},"c":{"docs":{},"a":{"docs":{},"证":{"docs":{},"书":{"docs":{},",":{"docs":{},"生":{"docs":{},"成":{"docs":{},"后":{"docs":{},"需":{"docs":{},"要":{"docs":{},"手":{"docs":{},"动":{"docs":{},"信":{"docs":{},"任":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}}}}}},"&":{"docs":{},"&":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}},"'":{"1":{"2":{"7":{"docs":{},".":{"0":{"docs":{},".":{"0":{"docs":{},".":{"1":{"docs":{},"'":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}},"docs":{}}},"docs":{}}},"docs":{}}},"docs":{}},"docs":{}},"8":{"0":{"0":{"1":{"docs":{},"'":{"docs":{},")":{"docs":{},";":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}},"8":{"docs":{},"'":{"docs":{},";":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}},"docs":{}},"docs":{}},"docs":{}},"docs":{"./":{"ref":"./","tf":0.0036845983787767134}},".":{"docs":{},".":{"docs":{},".":{"docs":{},"'":{"docs":{"./":{"ref":"./","tf":0.002210759027266028}},",":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}},"/":{"docs":{},"'":{"docs":{},",":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}},"i":{"docs":{},"n":{"docs":{},"d":{"docs":{},"e":{"docs":{},"x":{"docs":{},".":{"docs":{},"h":{"docs":{},"t":{"docs":{},"m":{"docs":{},"l":{"docs":{},"'":{"docs":{},";":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}},"r":{"docs":{},"e":{"docs":{},"d":{"docs":{},"i":{"docs":{},"r":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},"/":{"docs":{},"t":{"docs":{},"o":{"docs":{},"/":{"docs":{},"a":{"docs":{},"n":{"docs":{},"o":{"docs":{},"t":{"docs":{},"h":{"docs":{},"e":{"docs":{},"r":{"docs":{},"/":{"docs":{},"p":{"docs":{},"a":{"docs":{},"t":{"docs":{},"h":{"docs":{},"'":{"docs":{},";":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}}}}}}}}}}}},";":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}}},"a":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}},"n":{"docs":{},"y":{"docs":{},"p":{"docs":{},"r":{"docs":{},"o":{"docs":{},"x":{"docs":{},"y":{"docs":{},"'":{"docs":{},";":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}},".":{"docs":{},"i":{"docs":{},"o":{"docs":{},"'":{"docs":{},",":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}}}}}}},"/":{"0":{"docs":{},".":{"0":{"docs":{},".":{"0":{"docs":{},"'":{"docs":{},";":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}},"docs":{}}},"docs":{}}},"docs":{}}}}}}}}},"p":{"docs":{},"p":{"docs":{},"l":{"docs":{},"i":{"docs":{},"c":{"docs":{},"a":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"/":{"docs":{},"j":{"docs":{},"s":{"docs":{},"o":{"docs":{},"n":{"docs":{},"'":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}},"c":{"docs":{},"a":{"docs":{},"c":{"docs":{},"h":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}},"l":{"docs":{},"o":{"docs":{},"s":{"docs":{},"e":{"docs":{},"'":{"docs":{},",":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}},"o":{"docs":{},"n":{"docs":{},"t":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.0029476787030213707}}}}}}}}},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{},"'":{"docs":{},",":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}},";":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}},"h":{"docs":{},"e":{"docs":{},"l":{"docs":{},"l":{"docs":{},"o":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}},"t":{"docs":{},"t":{"docs":{},"p":{"docs":{},"'":{"docs":{},",":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}},";":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}},":":{"docs":{},"/":{"docs":{},"/":{"docs":{},"a":{"docs":{},"n":{"docs":{},"y":{"docs":{},"p":{"docs":{},"r":{"docs":{},"o":{"docs":{},"x":{"docs":{},"y":{"docs":{},".":{"docs":{},"i":{"docs":{},"o":{"docs":{},"/":{"docs":{},"'":{"docs":{},",":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}},"h":{"docs":{},"t":{"docs":{},"t":{"docs":{},"p":{"docs":{},"b":{"docs":{},"i":{"docs":{},"n":{"docs":{},".":{"docs":{},"o":{"docs":{},"r":{"docs":{},"g":{"docs":{},"/":{"docs":{},"g":{"docs":{},"e":{"docs":{},"t":{"docs":{},"?":{"docs":{},"s":{"docs":{},"h":{"docs":{},"o":{"docs":{},"w":{"docs":{},"_":{"docs":{},"e":{"docs":{},"n":{"docs":{},"v":{"docs":{},"=":{"1":{"docs":{},"'":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}},"docs":{}}}}}}}}}}}}}},"u":{"docs":{},"s":{"docs":{"./":{"ref":"./","tf":0.0036845983787767134}}}}}}}}}}}}}}}}}}},"s":{"docs":{},"'":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}},",":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}},"i":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}},"m":{"docs":{},"a":{"docs":{},"g":{"docs":{},"e":{"docs":{},"/":{"docs":{},"g":{"docs":{},"i":{"docs":{},"f":{"docs":{},"'":{"docs":{},",":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}},"k":{"docs":{},"e":{"docs":{},"e":{"docs":{},"p":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}},"m":{"docs":{},"i":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}}}},"o":{"docs":{},"r":{"docs":{},"i":{"docs":{},"g":{"docs":{},"i":{"docs":{},"n":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}},"p":{"docs":{},"r":{"docs":{},"o":{"docs":{},"x":{"docs":{},"i":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}},"r":{"docs":{},"u":{"docs":{},"l":{"docs":{},"e":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}},"t":{"docs":{},"e":{"docs":{},"x":{"docs":{},"t":{"docs":{},"/":{"docs":{},"h":{"docs":{},"t":{"docs":{},"m":{"docs":{},"l":{"docs":{},"'":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}}}}}}}}}}},"h":{"docs":{},"i":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}}}}},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}},"{":{"docs":{},"\"":{"docs":{},"h":{"docs":{},"e":{"docs":{},"l":{"docs":{},"l":{"docs":{},"o":{"docs":{},"\"":{"docs":{},":":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}},"(":{"docs":{},"!":{"docs":{},"a":{"docs":{},"n":{"docs":{},"y":{"docs":{},"p":{"docs":{},"r":{"docs":{},"o":{"docs":{},"x":{"docs":{},"y":{"docs":{},".":{"docs":{},"u":{"docs":{},"t":{"docs":{},"i":{"docs":{},"l":{"docs":{},"s":{"docs":{},".":{"docs":{},"c":{"docs":{},"e":{"docs":{},"r":{"docs":{},"t":{"docs":{},"m":{"docs":{},"g":{"docs":{},"r":{"docs":{},".":{"docs":{},"i":{"docs":{},"f":{"docs":{},"r":{"docs":{},"o":{"docs":{},"o":{"docs":{},"t":{"docs":{},"c":{"docs":{},"a":{"docs":{},"f":{"docs":{},"i":{"docs":{},"l":{"docs":{},"e":{"docs":{},"e":{"docs":{},"x":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"s":{"docs":{},"(":{"docs":{},")":{"docs":{},")":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"e":{"docs":{},"r":{"docs":{},"r":{"docs":{},"o":{"docs":{},"r":{"docs":{},")":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}},")":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}},"e":{"docs":{},")":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}},"i":{"docs":{},"s":{"docs":{},"w":{"docs":{},"i":{"docs":{},"n":{"docs":{},")":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}},"r":{"docs":{},"e":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{},"d":{"docs":{},"e":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"l":{"docs":{},".":{"docs":{},"u":{"docs":{},"r":{"docs":{},"l":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}},".":{"docs":{},"i":{"docs":{},"n":{"docs":{},"d":{"docs":{},"e":{"docs":{},"x":{"docs":{},"o":{"docs":{},"f":{"docs":{},"(":{"docs":{},"'":{"docs":{},"h":{"docs":{},"t":{"docs":{},"t":{"docs":{},"p":{"docs":{},":":{"docs":{},"/":{"docs":{},"/":{"docs":{},"h":{"docs":{},"t":{"docs":{},"t":{"docs":{},"p":{"docs":{},"b":{"docs":{},"i":{"docs":{},"n":{"docs":{},".":{"docs":{},"o":{"docs":{},"r":{"docs":{},"g":{"docs":{},"'":{"docs":{},")":{"docs":{"./":{"ref":"./","tf":0.0029476787030213707}}}},"/":{"docs":{},"p":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"'":{"docs":{},")":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}},"u":{"docs":{},"s":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}},"s":{"docs":{},":":{"docs":{},"/":{"docs":{},"/":{"docs":{},"h":{"docs":{},"t":{"docs":{},"t":{"docs":{},"p":{"docs":{},"b":{"docs":{},"i":{"docs":{},"n":{"docs":{},".":{"docs":{},"o":{"docs":{},"r":{"docs":{},"g":{"docs":{},"/":{"docs":{},"u":{"docs":{},"s":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}},"t":{"docs":{},"h":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"*":{"docs":{},"/":{"docs":{"./":{"ref":"./","tf":0.011790714812085483}},"}":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}},"b":{"docs":{},"e":{"docs":{},"f":{"docs":{},"o":{"docs":{},"r":{"docs":{},"e":{"docs":{},"d":{"docs":{},"e":{"docs":{},"a":{"docs":{},"l":{"docs":{},"h":{"docs":{},"t":{"docs":{},"t":{"docs":{},"p":{"docs":{},"s":{"docs":{},"r":{"docs":{},"e":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{},"(":{"docs":{},"r":{"docs":{},"e":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{},"d":{"docs":{},"e":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"l":{"docs":{},")":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"s":{"docs":{},"e":{"docs":{},"n":{"docs":{},"d":{"docs":{},"r":{"docs":{},"e":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{},"(":{"docs":{},"r":{"docs":{},"e":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{},"d":{"docs":{},"e":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"l":{"docs":{},")":{"docs":{"./":{"ref":"./","tf":0.005158437730287398}}}}}}}}}}}}}}}}}}}}}},"s":{"docs":{},"p":{"docs":{},"o":{"docs":{},"n":{"docs":{},"s":{"docs":{},"e":{"docs":{},"(":{"docs":{},"r":{"docs":{},"e":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{},"d":{"docs":{},"e":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"l":{"docs":{},",":{"docs":{"./":{"ref":"./","tf":0.0036845983787767134}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"o":{"docs":{},"n":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"n":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"r":{"docs":{},"o":{"docs":{},"r":{"docs":{},"(":{"docs":{},"r":{"docs":{},"e":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{},"d":{"docs":{},"e":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"l":{"docs":{},",":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"e":{"docs":{},"r":{"docs":{},"r":{"docs":{},"o":{"docs":{},"r":{"docs":{},"(":{"docs":{},"r":{"docs":{},"e":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{},"d":{"docs":{},"e":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"l":{"docs":{},",":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}}}}}}},"t":{"docs":{},"r":{"docs":{},"u":{"docs":{},"e":{"docs":{},"*":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}},"+":{"docs":{},"=":{"docs":{"./":{"ref":"./","tf":0.002210759027266028}}}},".":{"docs":{},"'":{"docs":{},",":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}}}},".":{"docs":{},".":{"docs":{"./":{"ref":"./","tf":0.005158437730287398}},",":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}},"/":{"docs":{},"m":{"docs":{},"y":{"docs":{},"r":{"docs":{},"u":{"docs":{},"l":{"docs":{},"e":{"docs":{},"p":{"docs":{},"k":{"docs":{},"g":{"docs":{},"/":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}},"r":{"docs":{},"u":{"docs":{},"l":{"docs":{},"e":{"docs":{},".":{"docs":{},"j":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}},"c":{"docs":{},"e":{"docs":{},"r":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}},"r":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}},"/":{"docs":{},"*":{"docs":{"./":{"ref":"./","tf":0.012527634487840826}}},"/":{"docs":{"./":{"ref":"./","tf":0.010316875460574797}},"w":{"docs":{},"h":{"docs":{},"e":{"docs":{},"n":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}},"这":{"docs":{},"里":{"docs":{},"也":{"docs":{},"可":{"docs":{},"以":{"docs":{},"同":{"docs":{},"时":{"docs":{},"加":{"docs":{},"上":{"docs":{},"r":{"docs":{},"e":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{},"o":{"docs":{},"p":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}}}}},"^":{"docs":{},"w":{"docs":{},"i":{"docs":{},"n":{"docs":{},"/":{"docs":{},".":{"docs":{},"t":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{},"(":{"docs":{},"p":{"docs":{},"r":{"docs":{},"o":{"docs":{},"c":{"docs":{},"e":{"docs":{},"s":{"docs":{},"s":{"docs":{},".":{"docs":{},"p":{"docs":{},"l":{"docs":{},"a":{"docs":{},"t":{"docs":{},"f":{"docs":{},"o":{"docs":{},"r":{"docs":{},"m":{"docs":{},")":{"docs":{},";":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"=":{"docs":{"./":{"ref":"./","tf":0.03316138540899042}},"=":{"docs":{},"=":{"docs":{"./":{"ref":"./","tf":0.007369196757553427}}}},">":{"docs":{"./":{"ref":"./","tf":0.005158437730287398}}}},">":{"docs":{"./":{"ref":"./","tf":0.0036845983787767134}},"=":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}},"关":{"docs":{},"于":{"docs":{},"本":{"docs":{},"机":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}},"证":{"docs":{},"书":{"docs":{},"信":{"docs":{},"任":{"docs":{},"设":{"docs":{},"置":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}},"通":{"docs":{},"用":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}},"_":{"docs":{},"r":{"docs":{},"e":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}},"q":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}},":":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}},"s":{"docs":{},":":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}},"a":{"docs":{},":":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}}},"g":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.010316875460574797}},"\"":{"docs":{},":":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}}}},"'":{"docs":{"./":{"ref":"./","tf":0.002210759027266028}},")":{"docs":{"./":{"ref":"./","tf":0.0029476787030213707}}},":":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}},"]":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}},"l":{"docs":{},"i":{"docs":{},"v":{"docs":{},"e":{"docs":{},"'":{"docs":{},",":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}},"n":{"docs":{},"d":{"docs":{},"r":{"docs":{},"o":{"docs":{},"i":{"docs":{},"d":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}},"y":{"docs":{},"p":{"docs":{},"r":{"docs":{},"o":{"docs":{},"x":{"docs":{},"i":{"docs":{"./":{"ref":"./","tf":0.023581429624170966}}},"y":{"docs":{},"'":{"docs":{},",":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}},".":{"docs":{},"i":{"docs":{},"o":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}}}},"p":{"docs":{},"r":{"docs":{},"o":{"docs":{},"x":{"docs":{},"y":{"docs":{},"c":{"docs":{},"o":{"docs":{},"r":{"docs":{},"e":{"docs":{},"(":{"docs":{},"o":{"docs":{},"p":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"s":{"docs":{},")":{"docs":{},";":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"v":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}},"e":{"docs":{},"r":{"docs":{},"(":{"docs":{},"o":{"docs":{},"p":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"s":{"docs":{},")":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}},";":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}}}}}},"u":{"docs":{},"t":{"docs":{},"i":{"docs":{},"l":{"docs":{},"s":{"docs":{},".":{"docs":{},"c":{"docs":{},"e":{"docs":{},"r":{"docs":{},"t":{"docs":{},"m":{"docs":{},"g":{"docs":{},"r":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}},".":{"docs":{},"g":{"docs":{},"e":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{},"a":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"o":{"docs":{},"o":{"docs":{},"t":{"docs":{},"c":{"docs":{},"a":{"docs":{},"(":{"docs":{},"(":{"docs":{},"e":{"docs":{},"r":{"docs":{},"r":{"docs":{},"o":{"docs":{},"r":{"docs":{},",":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}},"c":{"docs":{},"a":{"docs":{},"l":{"docs":{},"l":{"docs":{},"b":{"docs":{},"a":{"docs":{},"c":{"docs":{},"k":{"docs":{},")":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}}}}}}}}},"i":{"docs":{},"f":{"docs":{},"r":{"docs":{},"o":{"docs":{},"o":{"docs":{},"t":{"docs":{},"c":{"docs":{},"a":{"docs":{},"f":{"docs":{},"i":{"docs":{},"l":{"docs":{},"e":{"docs":{},"e":{"docs":{},"x":{"docs":{},"i":{"docs":{},"s":{"docs":{},"t":{"docs":{},"s":{"docs":{},"(":{"docs":{},")":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"s":{"docs":{},"y":{"docs":{},"s":{"docs":{},"t":{"docs":{},"e":{"docs":{},"m":{"docs":{},"p":{"docs":{},"r":{"docs":{},"o":{"docs":{},"x":{"docs":{},"y":{"docs":{},"m":{"docs":{},"g":{"docs":{},"r":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}},".":{"docs":{},"d":{"docs":{},"i":{"docs":{},"s":{"docs":{},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{},"e":{"docs":{},"g":{"docs":{},"l":{"docs":{},"o":{"docs":{},"b":{"docs":{},"a":{"docs":{},"l":{"docs":{},"p":{"docs":{},"r":{"docs":{},"o":{"docs":{},"x":{"docs":{},"y":{"docs":{},"(":{"docs":{},")":{"docs":{},";":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}}}}}},"e":{"docs":{},"n":{"docs":{},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{},"e":{"docs":{},"g":{"docs":{},"l":{"docs":{},"o":{"docs":{},"b":{"docs":{},"a":{"docs":{},"l":{"docs":{},"p":{"docs":{},"r":{"docs":{},"o":{"docs":{},"x":{"docs":{},"y":{"docs":{},"(":{"docs":{},"'":{"1":{"2":{"7":{"docs":{},".":{"0":{"docs":{},".":{"0":{"docs":{},".":{"1":{"docs":{},"'":{"docs":{},",":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}},"docs":{}}},"docs":{}}},"docs":{}}},"docs":{}},"docs":{}},"docs":{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"i":{"docs":{},"n":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}},"s":{"docs":{},".":{"docs":{},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{},"(":{"docs":{},")":{"docs":{},";":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}},"使":{"docs":{},"用":{"docs":{},"r":{"docs":{},"e":{"docs":{},"q":{"docs":{},"u":{"docs":{},"i":{"docs":{},"r":{"docs":{},"e":{"docs":{},"(":{"docs":{},")":{"docs":{},"加":{"docs":{},"载":{"docs":{},"本":{"docs":{},"地":{"docs":{},"规":{"docs":{},"则":{"docs":{},",":{"docs":{},"你":{"docs":{},"可":{"docs":{},"以":{"docs":{},"在":{"docs":{},"参":{"docs":{},"数":{"docs":{},"里":{"docs":{},"传":{"docs":{},"入":{"docs":{},"一":{"docs":{},"个":{"docs":{},"本":{"docs":{},"地":{"docs":{},"的":{"docs":{},"n":{"docs":{},"p":{"docs":{},"m":{"docs":{},"包":{"docs":{},"路":{"docs":{},"径":{"docs":{},",":{"docs":{},"或":{"docs":{},"是":{"docs":{},"某":{"docs":{},"个":{"docs":{},"全":{"docs":{},"局":{"docs":{},"安":{"docs":{},"装":{"docs":{},"的":{"docs":{},"n":{"docs":{},"p":{"docs":{},"m":{"docs":{},"包":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"可":{"docs":{},"以":{"docs":{},"作":{"docs":{},"为":{"docs":{},"一":{"docs":{},"个":{"docs":{},"n":{"docs":{},"p":{"docs":{},"m":{"docs":{},"模":{"docs":{},"块":{"docs":{},"使":{"docs":{},"用":{"docs":{},",":{"docs":{},"整":{"docs":{},"合":{"docs":{},"进":{"docs":{},"其":{"docs":{},"他":{"docs":{},"工":{"docs":{},"具":{"docs":{},"。":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}}}}}}},"向":{"docs":{},"客":{"docs":{},"户":{"docs":{},"端":{"docs":{},"发":{"docs":{},"送":{"docs":{},"请":{"docs":{},"求":{"docs":{},"前":{"docs":{},",":{"docs":{},"会":{"docs":{},"调":{"docs":{},"用":{"docs":{},"b":{"docs":{},"e":{"docs":{},"f":{"docs":{},"o":{"docs":{},"r":{"docs":{},"e":{"docs":{},"s":{"docs":{},"e":{"docs":{},"n":{"docs":{},"d":{"docs":{},"r":{"docs":{},"e":{"docs":{},"s":{"docs":{},"p":{"docs":{},"o":{"docs":{},"n":{"docs":{},"s":{"docs":{},"e":{"docs":{},",":{"docs":{},"并":{"docs":{},"带":{"docs":{},"上":{"docs":{},"参":{"docs":{},"数":{"docs":{},"r":{"docs":{},"e":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{},"d":{"docs":{},"e":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"l":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"服":{"docs":{},"务":{"docs":{},"端":{"docs":{},"发":{"docs":{},"送":{"docs":{},"请":{"docs":{},"求":{"docs":{},"前":{"docs":{},",":{"docs":{},"会":{"docs":{},"调":{"docs":{},"用":{"docs":{},"b":{"docs":{},"e":{"docs":{},"f":{"docs":{},"o":{"docs":{},"r":{"docs":{},"e":{"docs":{},"s":{"docs":{},"e":{"docs":{},"n":{"docs":{},"d":{"docs":{},"r":{"docs":{},"e":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{},",":{"docs":{},"并":{"docs":{},"带":{"docs":{},"上":{"docs":{},"参":{"docs":{},"数":{"docs":{},"r":{"docs":{},"e":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{},"d":{"docs":{},"e":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"l":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"在":{"docs":{},"与":{"docs":{},"目":{"docs":{},"标":{"docs":{},"h":{"docs":{},"t":{"docs":{},"t":{"docs":{},"p":{"docs":{},"s":{"docs":{},"服":{"docs":{},"务":{"docs":{},"器":{"docs":{},"建":{"docs":{},"立":{"docs":{},"连":{"docs":{},"接":{"docs":{},"的":{"docs":{},"过":{"docs":{},"程":{"docs":{},"中":{"docs":{},",":{"docs":{},"如":{"docs":{},"果":{"docs":{},"发":{"docs":{},"生":{"docs":{},"错":{"docs":{},"误":{"docs":{},",":{"docs":{},"a":{"docs":{},"n":{"docs":{},"y":{"docs":{},"p":{"docs":{},"r":{"docs":{},"o":{"docs":{},"x":{"docs":{},"y":{"docs":{},"会":{"docs":{},"调":{"docs":{},"用":{"docs":{},"这":{"docs":{},"个":{"docs":{},"方":{"docs":{},"法":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"提":{"docs":{},"供":{"docs":{},"了":{"docs":{},"二":{"docs":{},"次":{"docs":{},"开":{"docs":{},"发":{"docs":{},"的":{"docs":{},"能":{"docs":{},"力":{"docs":{},",":{"docs":{},"你":{"docs":{},"可":{"docs":{},"以":{"docs":{},"用":{"docs":{},"j":{"docs":{},"s":{"docs":{},"编":{"docs":{},"写":{"docs":{},"自":{"docs":{},"己":{"docs":{},"的":{"docs":{},"规":{"docs":{},"则":{"docs":{},"模":{"docs":{},"块":{"docs":{},"(":{"docs":{},"r":{"docs":{},"u":{"docs":{},"l":{"docs":{},"e":{"docs":{},")":{"docs":{},",":{"docs":{},"来":{"docs":{},"自":{"docs":{},"定":{"docs":{},"义":{"docs":{},"网":{"docs":{},"络":{"docs":{},"请":{"docs":{},"求":{"docs":{},"的":{"docs":{},"处":{"docs":{},"理":{"docs":{},"逻":{"docs":{},"辑":{"docs":{},"。":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"收":{"docs":{},"到":{"docs":{},"h":{"docs":{},"t":{"docs":{},"t":{"docs":{},"p":{"docs":{},"s":{"docs":{},"请":{"docs":{},"求":{"docs":{},"时":{"docs":{},",":{"docs":{},"会":{"docs":{},"调":{"docs":{},"用":{"docs":{},"b":{"docs":{},"e":{"docs":{},"f":{"docs":{},"o":{"docs":{},"r":{"docs":{},"e":{"docs":{},"d":{"docs":{},"e":{"docs":{},"a":{"docs":{},"l":{"docs":{},"h":{"docs":{},"t":{"docs":{},"t":{"docs":{},"p":{"docs":{},"s":{"docs":{},"r":{"docs":{},"e":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{},",":{"docs":{},"并":{"docs":{},"带":{"docs":{},"上":{"docs":{},"参":{"docs":{},"数":{"docs":{},"r":{"docs":{},"e":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{},"d":{"docs":{},"e":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"l":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"是":{"docs":{},"一":{"docs":{},"个":{"docs":{},"开":{"docs":{},"放":{"docs":{},"式":{"docs":{},"的":{"docs":{},"h":{"docs":{},"t":{"docs":{},"t":{"docs":{},"p":{"docs":{},"代":{"docs":{},"理":{"docs":{},"服":{"docs":{},"务":{"docs":{},"器":{"docs":{},"。":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}},"调":{"docs":{},"用":{"docs":{},"规":{"docs":{},"则":{"docs":{},"模":{"docs":{},"块":{"docs":{},"b":{"docs":{},"e":{"docs":{},"f":{"docs":{},"o":{"docs":{},"r":{"docs":{},"e":{"docs":{},"s":{"docs":{},"e":{"docs":{},"n":{"docs":{},"d":{"docs":{},"r":{"docs":{},"e":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{},"方":{"docs":{},"法":{"docs":{},",":{"docs":{},"由":{"docs":{},"模":{"docs":{},"块":{"docs":{},"做":{"docs":{},"处":{"docs":{},"理":{"docs":{},",":{"docs":{},"返":{"docs":{},"回":{"docs":{},"新":{"docs":{},"的":{"docs":{},"请":{"docs":{},"求":{"docs":{},"参":{"docs":{},"数":{"docs":{},",":{"docs":{},"或":{"docs":{},"返":{"docs":{},"回":{"docs":{},"响":{"docs":{},"应":{"docs":{},"内":{"docs":{},"容":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"默":{"docs":{},"认":{"docs":{},"不":{"docs":{},"对":{"docs":{},"h":{"docs":{},"t":{"docs":{},"t":{"docs":{},"p":{"docs":{},"s":{"docs":{},"请":{"docs":{},"求":{"docs":{},"做":{"docs":{},"处":{"docs":{},"理":{"docs":{},",":{"docs":{},"如":{"docs":{},"需":{"docs":{},"看":{"docs":{},"到":{"docs":{},"明":{"docs":{},"文":{"docs":{},"信":{"docs":{},"息":{"docs":{},",":{"docs":{},"需":{"docs":{},"要":{"docs":{},"配":{"docs":{},"置":{"docs":{},"c":{"docs":{},"a":{"docs":{},"证":{"docs":{},"书":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"p":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}},"t":{"docs":{},"'":{"docs":{},",":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}},"t":{"docs":{},"a":{"docs":{},"c":{"docs":{},"k":{"docs":{},")":{"docs":{},",":{"docs":{},"需":{"docs":{},"要":{"docs":{},"客":{"docs":{},"户":{"docs":{},"端":{"docs":{},"提":{"docs":{},"前":{"docs":{},"信":{"docs":{},"任":{"docs":{},"a":{"docs":{},"n":{"docs":{},"y":{"docs":{},"p":{"docs":{},"r":{"docs":{},"o":{"docs":{},"x":{"docs":{},"y":{"docs":{},"生":{"docs":{},"成":{"docs":{},"的":{"docs":{},"c":{"docs":{},"a":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"b":{"docs":{},"e":{"docs":{},"f":{"docs":{},"o":{"docs":{},"r":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}},"e":{"docs":{},"d":{"docs":{},"e":{"docs":{},"a":{"docs":{},"l":{"docs":{},"h":{"docs":{},"t":{"docs":{},"t":{"docs":{},"p":{"docs":{},"s":{"docs":{},"r":{"docs":{},"e":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}},"(":{"docs":{},"r":{"docs":{},"e":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{},"d":{"docs":{},"e":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"l":{"docs":{},")":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"s":{"docs":{},"e":{"docs":{},"n":{"docs":{},"d":{"docs":{},"r":{"docs":{},"e":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}},"(":{"docs":{},"r":{"docs":{},"e":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{},"d":{"docs":{},"e":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"l":{"docs":{},")":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}}}}},"s":{"docs":{},"p":{"docs":{},"o":{"docs":{},"n":{"docs":{},"s":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}},"e":{"docs":{},"(":{"docs":{},"r":{"docs":{},"e":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{},"d":{"docs":{},"e":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"l":{"docs":{},",":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"o":{"docs":{},"d":{"docs":{},"y":{"docs":{},":":{"docs":{"./":{"ref":"./","tf":0.0029476787030213707}}},"三":{"docs":{},"个":{"docs":{},"字":{"docs":{},"段":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}},"等":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}},")":{"docs":{},",":{"docs":{},"甚":{"docs":{},"至":{"docs":{},"是":{"docs":{},"请":{"docs":{},"求":{"docs":{},"的":{"docs":{},"目":{"docs":{},"标":{"docs":{},"地":{"docs":{},"址":{"docs":{},"等":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}},"y":{"docs":{},"'":{"docs":{},"]":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}},":":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}},"a":{"docs":{},"n":{"docs":{},"y":{"docs":{},"p":{"docs":{},"r":{"docs":{},"o":{"docs":{},"x":{"docs":{},"i":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}},"c":{"docs":{},"a":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}},"方":{"docs":{},"法":{"docs":{},"。":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}},",":{"docs":{},"按":{"docs":{},"提":{"docs":{},"示":{"docs":{},"扫":{"docs":{},"描":{"docs":{},"二":{"docs":{},"维":{"docs":{},"码":{"docs":{},"即":{"docs":{},"可":{"docs":{},"安":{"docs":{},"装":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}},"e":{"docs":{},"r":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}},"d":{"docs":{},"i":{"docs":{},"r":{"docs":{"./":{"ref":"./","tf":0.002210759027266028}},")":{"docs":{},";":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}},"l":{"docs":{},"a":{"docs":{},"s":{"docs":{},"s":{"docs":{},":":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}},"o":{"docs":{},"s":{"docs":{},"e":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}},"o":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}},"d":{"docs":{},"e":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}},")":{"docs":{},"、":{"docs":{},"响":{"docs":{},"应":{"docs":{},"头":{"docs":{},"(":{"docs":{},"r":{"docs":{},"e":{"docs":{},"s":{"docs":{},"p":{"docs":{},"o":{"docs":{},"n":{"docs":{},"s":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}},"n":{"docs":{},"n":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"'":{"docs":{},":":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}},":":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}},"s":{"docs":{},"o":{"docs":{},"l":{"docs":{},"e":{"docs":{},".":{"docs":{},"e":{"docs":{},"r":{"docs":{},"r":{"docs":{},"o":{"docs":{},"r":{"docs":{},"(":{"docs":{},"'":{"docs":{},"e":{"docs":{},"r":{"docs":{},"r":{"docs":{},"o":{"docs":{},"r":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}},"l":{"docs":{},"o":{"docs":{},"g":{"docs":{},"(":{"docs":{},"'":{"docs":{},"t":{"docs":{},"h":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}},"t":{"docs":{"./":{"ref":"./","tf":0.01400147383935151}}}},"t":{"docs":{},"r":{"docs":{},"o":{"docs":{},"l":{"docs":{},"'":{"docs":{},":":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}},"u":{"docs":{},"r":{"docs":{},"l":{"docs":{"./":{"ref":"./","tf":0.006632277081798084}}}},"s":{"docs":{},"t":{"docs":{},"o":{"docs":{},"m":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}},"w":{"docs":{},"d":{"docs":{},":":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}}}}}},"d":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}},"a":{"docs":{},"n":{"docs":{},"g":{"docs":{},"e":{"docs":{},"r":{"docs":{},"o":{"docs":{},"u":{"docs":{},"s":{"docs":{},"l":{"docs":{},"y":{"docs":{},"i":{"docs":{},"g":{"docs":{},"n":{"docs":{},"o":{"docs":{},"r":{"docs":{},"e":{"docs":{},"u":{"docs":{},"n":{"docs":{},"a":{"docs":{},"u":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"r":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}},"i":{"docs":{},"z":{"docs":{},"e":{"docs":{},"d":{"docs":{},":":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"t":{"docs":{},"a":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}},"\"":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}},"'":{"docs":{"./":{"ref":"./","tf":0.002210759027266028}},",":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}},"e":{"docs":{},"l":{"docs":{},"a":{"docs":{},"y":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}}}}}},"o":{"docs":{},"c":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}},"e":{"docs":{},"n":{"docs":{},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}},"e":{"docs":{},":":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}},"g":{"docs":{},"l":{"docs":{},"i":{"docs":{},"s":{"docs":{},"h":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}},"r":{"docs":{},"r":{"docs":{},"o":{"docs":{},"r":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}},")":{"docs":{"./":{"ref":"./","tf":0.0029476787030213707}},";":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}},"v":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{},":":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}}}}}}},"x":{"docs":{},"e":{"docs":{},"c":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}},"(":{"docs":{},"'":{"docs":{},"o":{"docs":{},"p":{"docs":{},"e":{"docs":{},"n":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}},"p":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.004421518054532056}}}}}}}},"f":{"docs":{},"a":{"docs":{},"l":{"docs":{},"s":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}},"e":{"docs":{},",":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}}},";":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}},"q":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}},"i":{"docs":{},"l":{"docs":{},"e":{"docs":{},":":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}},"n":{"docs":{},"i":{"docs":{},"s":{"docs":{},"h":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}},"o":{"docs":{},"r":{"docs":{},"c":{"docs":{},"e":{"docs":{},"p":{"docs":{},"r":{"docs":{},"o":{"docs":{},"x":{"docs":{},"y":{"docs":{},"h":{"docs":{},"t":{"docs":{},"t":{"docs":{},"p":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}},"s":{"docs":{},":":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}},"w":{"docs":{},"a":{"docs":{},"r":{"docs":{},"d":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}},"u":{"docs":{},"n":{"docs":{},"d":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}},"u":{"docs":{},"n":{"docs":{},"c":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}},"(":{"docs":{},")":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}}}}}}}}}}}},"g":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}},"e":{"docs":{},"n":{"docs":{},"e":{"docs":{},"r":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}}}}}},"i":{"docs":{},"t":{"docs":{},"h":{"docs":{},"u":{"docs":{},"b":{"docs":{},"主":{"docs":{},"页":{"docs":{},":":{"docs":{},"h":{"docs":{},"t":{"docs":{},"t":{"docs":{},"p":{"docs":{},"s":{"docs":{},":":{"docs":{},"/":{"docs":{},"/":{"docs":{},"g":{"docs":{},"i":{"docs":{},"t":{"docs":{},"h":{"docs":{},"u":{"docs":{},"b":{"docs":{},".":{"docs":{},"c":{"docs":{},"o":{"docs":{},"m":{"docs":{},"/":{"docs":{},"a":{"docs":{},"l":{"docs":{},"i":{"docs":{},"b":{"docs":{},"a":{"docs":{},"b":{"docs":{},"a":{"docs":{},"/":{"docs":{},"a":{"docs":{},"n":{"docs":{},"y":{"docs":{},"p":{"docs":{},"r":{"docs":{},"o":{"docs":{},"x":{"docs":{},"i":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"h":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}},"a":{"docs":{},"c":{"docs":{},"k":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}},"e":{"docs":{},"d":{"docs":{},"!":{"docs":{"./":{"ref":"./","tf":0.002210759027266028}},"'":{"docs":{},";":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}},"e":{"docs":{},"a":{"docs":{},"d":{"docs":{},"e":{"docs":{},"r":{"docs":{"./":{"ref":"./","tf":0.002210759027266028}},")":{"docs":{},",":{"docs":{},"请":{"docs":{},"求":{"docs":{},"体":{"docs":{},"(":{"docs":{},"r":{"docs":{},"e":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}},",":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}},":":{"docs":{"./":{"ref":"./","tf":0.0029476787030213707}}},"s":{"docs":{},":":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}},")":{"docs":{},"、":{"docs":{},"响":{"docs":{},"应":{"docs":{},"内":{"docs":{},"容":{"docs":{},"等":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}},":":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}},"n":{"docs":{},"a":{"docs":{},"m":{"docs":{},"e":{"docs":{},":":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}},"t":{"docs":{},"t":{"docs":{},"p":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}},"/":{"1":{"docs":{},".":{"1":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}},"docs":{}}},"docs":{}},":":{"docs":{},"/":{"docs":{},"/":{"1":{"2":{"7":{"docs":{},".":{"0":{"docs":{},".":{"0":{"docs":{},".":{"1":{"docs":{},":":{"8":{"0":{"0":{"1":{"docs":{"./":{"ref":"./","tf":0.007369196757553427}}},"docs":{}},"docs":{}},"docs":{}},"docs":{}}},"docs":{}}},"docs":{}}},"docs":{}}},"docs":{}},"docs":{}},"docs":{},".":{"docs":{},".":{"docs":{},".":{"docs":{},".":{"docs":{},"j":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}},"h":{"docs":{},"t":{"docs":{},"t":{"docs":{},"p":{"docs":{},"b":{"docs":{},"i":{"docs":{},"n":{"docs":{},".":{"docs":{},"o":{"docs":{},"r":{"docs":{},"g":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}},"/":{"docs":{"./":{"ref":"./","tf":0.0029476787030213707}},"p":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.002210759027266028}}}}}},"u":{"docs":{},"s":{"docs":{"./":{"ref":"./","tf":0.007369196757553427}}}}}}}}}}}}}}}},"l":{"docs":{},"o":{"docs":{},"c":{"docs":{},"a":{"docs":{},"l":{"docs":{},"h":{"docs":{},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},":":{"8":{"0":{"0":{"8":{"docs":{},"/":{"docs":{},"i":{"docs":{},"n":{"docs":{},"d":{"docs":{},"e":{"docs":{},"x":{"docs":{},".":{"docs":{},"h":{"docs":{},"t":{"docs":{},"m":{"docs":{},"l":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}},"docs":{}},"docs":{}},"docs":{}},"docs":{}}}}}}}}}}}}}},"b":{"docs":{},"i":{"docs":{},"n":{"docs":{},".":{"docs":{},"o":{"docs":{},"r":{"docs":{},"g":{"docs":{"./":{"ref":"./","tf":0.002210759027266028}},",":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}},"s":{"docs":{},":":{"docs":{},"/":{"docs":{},"/":{"docs":{},"h":{"docs":{},"t":{"docs":{},"t":{"docs":{},"p":{"docs":{},"b":{"docs":{},"i":{"docs":{},"n":{"docs":{},".":{"docs":{},"o":{"docs":{},"r":{"docs":{},"g":{"docs":{},"/":{"docs":{},"u":{"docs":{},"s":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}}}}}}}}}}}}}}}},"s":{"docs":{},"a":{"docs":{},"m":{"docs":{},"p":{"docs":{},"l":{"docs":{},"e":{"docs":{},".":{"docs":{},"c":{"docs":{},"o":{"docs":{},"m":{"docs":{},"/":{"docs":{},"r":{"docs":{},"u":{"docs":{},"l":{"docs":{},"e":{"docs":{},".":{"docs":{},"j":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}}}}},"连":{"docs":{},"接":{"docs":{},"服":{"docs":{},"务":{"docs":{},"器":{"docs":{},"出":{"docs":{},"错":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}},"代":{"docs":{},"理":{"docs":{},"配":{"docs":{},"置":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}}}}}},"的":{"docs":{},"代":{"docs":{},"理":{"docs":{},"模":{"docs":{},"式":{"docs":{},"中":{"docs":{},",":{"docs":{},"这":{"docs":{},"里":{"docs":{},"的":{"docs":{},"r":{"docs":{},"e":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{},"是":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"n":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},"请":{"docs":{},"求":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"i":{"docs":{},"g":{"docs":{},"n":{"docs":{},"o":{"docs":{},"r":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}}}}}},"n":{"docs":{},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"l":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}}}}}},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{},"e":{"docs":{},"p":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.002210759027266028}},"`":{"docs":{},"参":{"docs":{},"数":{"docs":{},",":{"docs":{},"按":{"docs":{},"n":{"docs":{},"p":{"docs":{},"m":{"docs":{},"模":{"docs":{},"块":{"docs":{},"启":{"docs":{},"动":{"docs":{},"时":{"docs":{},"配":{"docs":{},"置":{"docs":{},"`":{"docs":{},"f":{"docs":{},"o":{"docs":{},"r":{"docs":{},"c":{"docs":{},"e":{"docs":{},"p":{"docs":{},"r":{"docs":{},"o":{"docs":{},"x":{"docs":{},"y":{"docs":{},"h":{"docs":{},"t":{"docs":{},"t":{"docs":{},"p":{"docs":{},"s":{"docs":{},"`":{"docs":{},"参":{"docs":{},"数":{"docs":{},",":{"docs":{},"所":{"docs":{},"有":{"docs":{},"h":{"docs":{},"t":{"docs":{},"t":{"docs":{},"p":{"docs":{},"s":{"docs":{},"请":{"docs":{},"求":{"docs":{},"都":{"docs":{},"会":{"docs":{},"被":{"docs":{},"替":{"docs":{},"换":{"docs":{},"证":{"docs":{},"书":{"docs":{},"并":{"docs":{},"解":{"docs":{},"析":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"后":{"docs":{},"才":{"docs":{},"会":{"docs":{},"从":{"docs":{},"界":{"docs":{},"面":{"docs":{},"上":{"docs":{},"看":{"docs":{},"到":{"docs":{},"相":{"docs":{},"应":{"docs":{},"内":{"docs":{},"容":{"docs":{},"。":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}}}}}}},"o":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}},"s":{"docs":{},"系":{"docs":{},"统":{"docs":{},"信":{"docs":{},"任":{"docs":{},"c":{"docs":{},"a":{"docs":{},"证":{"docs":{},"书":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}},"s":{"docs":{},"w":{"docs":{},"i":{"docs":{},"n":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},"p":{"docs":{},"a":{"docs":{},"t":{"docs":{},"h":{"docs":{},")":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}},"n":{"docs":{},"o":{"docs":{},"w":{"docs":{},".":{"docs":{},"c":{"docs":{},"o":{"docs":{},"m":{"docs":{},"'":{"docs":{},")":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}},"l":{"docs":{},"e":{"docs":{},"g":{"docs":{},"a":{"docs":{},"c":{"docs":{},"i":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}}}}}}},"o":{"docs":{},"c":{"docs":{},"a":{"docs":{},"l":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}},"r":{"docs":{},"e":{"docs":{},"s":{"docs":{},"p":{"docs":{},"o":{"docs":{},"n":{"docs":{},"s":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}}}}}}}}}}}}}},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"d":{"docs":{},":":{"docs":{"./":{"ref":"./","tf":0.002210759027266028}}}}}}}},"i":{"docs":{},"d":{"docs":{},"d":{"docs":{},"l":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}},"e":{"docs":{},")":{"docs":{},",":{"docs":{},"用":{"docs":{},"户":{"docs":{},"必":{"docs":{},"须":{"docs":{},"信":{"docs":{},"任":{"docs":{},"a":{"docs":{},"n":{"docs":{},"y":{"docs":{},"p":{"docs":{},"r":{"docs":{},"o":{"docs":{},"x":{"docs":{},"y":{"docs":{},"生":{"docs":{},"成":{"docs":{},"的":{"docs":{},"c":{"docs":{},"a":{"docs":{},"证":{"docs":{},"书":{"docs":{},",":{"docs":{},"才":{"docs":{},"能":{"docs":{},"进":{"docs":{},"行":{"docs":{},"后":{"docs":{},"续":{"docs":{},"流":{"docs":{},"程":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"o":{"docs":{},"d":{"docs":{},"i":{"docs":{},"f":{"docs":{},"i":{"docs":{"./":{"ref":"./","tf":0.0058953574060427415}}}}},"u":{"docs":{},"l":{"docs":{},"e":{"docs":{},".":{"docs":{},"e":{"docs":{},"x":{"docs":{},"p":{"docs":{},"o":{"docs":{},"r":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.008106116433308769}}}}}}}}}}}}}},"y":{"docs":{},"r":{"docs":{},"u":{"docs":{},"l":{"docs":{},"e":{"docs":{},"p":{"docs":{},"k":{"docs":{},"g":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}}}}}}}}}}},"n":{"docs":{},"e":{"docs":{},"w":{"docs":{"./":{"ref":"./","tf":0.004421518054532056}},"o":{"docs":{},"p":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.0029476787030213707}},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},".":{"docs":{},"p":{"docs":{},"a":{"docs":{},"t":{"docs":{},"h":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}},"o":{"docs":{},"r":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}},"r":{"docs":{},"e":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{},"o":{"docs":{},"p":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.0036845983787767134}},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"s":{"docs":{},".":{"docs":{},"h":{"docs":{},"e":{"docs":{},"a":{"docs":{},"d":{"docs":{},"e":{"docs":{},"r":{"docs":{},"s":{"docs":{},"[":{"docs":{},"'":{"docs":{},"u":{"docs":{},"s":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}},"o":{"docs":{},"s":{"docs":{},"t":{"docs":{},"n":{"docs":{},"a":{"docs":{},"m":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}},"m":{"docs":{},"e":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"d":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}},"p":{"docs":{},"a":{"docs":{},"t":{"docs":{},"h":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}},"o":{"docs":{},"r":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}},"r":{"docs":{},"e":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},"u":{"docs":{},"n":{"docs":{},"a":{"docs":{},"u":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"r":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"s":{"docs":{},"p":{"docs":{},"o":{"docs":{},"n":{"docs":{},"s":{"docs":{"./":{"ref":"./","tf":0.008843036109064112}},"e":{"docs":{},".":{"docs":{},"b":{"docs":{},"o":{"docs":{},"d":{"docs":{},"i":{"docs":{"./":{"ref":"./","tf":0.002210759027266028}}}}}},"h":{"docs":{},"e":{"docs":{},"a":{"docs":{},"d":{"docs":{},"e":{"docs":{},"r":{"docs":{},"[":{"docs":{},"'":{"docs":{},"x":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"t":{"docs":{},"u":{"docs":{},"s":{"docs":{},"c":{"docs":{},"o":{"docs":{},"d":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}}}}}}}}}}}}}}}}}}}}}},"o":{"docs":{},"d":{"docs":{},"e":{"docs":{},"j":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}}}}}},"p":{"docs":{},"m":{"docs":{"./":{"ref":"./","tf":0.002210759027266028}}}},"u":{"docs":{},"l":{"docs":{},"l":{"docs":{},";":{"docs":{"./":{"ref":"./","tf":0.002210759027266028}}}}}}},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},".":{"docs":{},"a":{"docs":{},"s":{"docs":{},"s":{"docs":{},"i":{"docs":{},"g":{"docs":{},"n":{"docs":{},"(":{"docs":{},"{":{"docs":{},"}":{"docs":{},",":{"docs":{"./":{"ref":"./","tf":0.002210759027266028}}}}}}}}}}}}}}}}}},"n":{"docs":{},"c":{"docs":{},"o":{"docs":{},"n":{"docs":{},"n":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"r":{"docs":{},"o":{"docs":{},"r":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}},"(":{"docs":{},"r":{"docs":{},"e":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{},"d":{"docs":{},"e":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"l":{"docs":{},",":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"e":{"docs":{},"r":{"docs":{},"r":{"docs":{},"o":{"docs":{},"r":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}},"(":{"docs":{},"r":{"docs":{},"e":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{},"d":{"docs":{},"e":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"l":{"docs":{},",":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}}}}}},"p":{"docs":{},"p":{"docs":{},"o":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{"./":{"ref":"./","tf":0.002210759027266028}}}}}}},"s":{"docs":{},"x":{"docs":{},"系":{"docs":{},"统":{"docs":{},"信":{"docs":{},"任":{"docs":{},"c":{"docs":{},"a":{"docs":{},"证":{"docs":{},"书":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}},"v":{"docs":{},"e":{"docs":{},"r":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}},"p":{"docs":{},"a":{"docs":{},"t":{"docs":{},"h":{"docs":{},":":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}},"o":{"docs":{},"r":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}},":":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}}}}},"s":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.0036845983787767134}}}}},"r":{"docs":{},"i":{"docs":{},"v":{"docs":{},"a":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}},"o":{"docs":{},"m":{"docs":{},"i":{"docs":{},"s":{"docs":{},"e":{"docs":{},"(":{"docs":{},"(":{"docs":{},"r":{"docs":{},"e":{"docs":{},"s":{"docs":{},"o":{"docs":{},"l":{"docs":{},"v":{"docs":{},"e":{"docs":{},",":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}}}}}}}}}}}}}}}},"t":{"docs":{},"o":{"docs":{},"c":{"docs":{},"o":{"docs":{},"l":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}},"\"":{"docs":{},":":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}},":":{"docs":{"./":{"ref":"./","tf":0.002210759027266028}}}}}}}},"x":{"docs":{},"i":{"docs":{"./":{"ref":"./","tf":0.01105379513633014}}},"y":{"docs":{},".":{"docs":{},"c":{"docs":{},"l":{"docs":{},"o":{"docs":{},"s":{"docs":{},"e":{"docs":{},"(":{"docs":{},")":{"docs":{},";":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}},"o":{"docs":{},"n":{"docs":{},"(":{"docs":{},"'":{"docs":{},"e":{"docs":{},"r":{"docs":{},"r":{"docs":{},"o":{"docs":{},"r":{"docs":{},"'":{"docs":{},",":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}},"r":{"docs":{},"e":{"docs":{},"a":{"docs":{},"d":{"docs":{},"y":{"docs":{},"'":{"docs":{},",":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{},"(":{"docs":{},")":{"docs":{},";":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}},"s":{"docs":{},"e":{"docs":{},"r":{"docs":{},"v":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}},"e":{"docs":{},"r":{"docs":{},".":{"docs":{},"c":{"docs":{},"l":{"docs":{},"o":{"docs":{},"s":{"docs":{},"e":{"docs":{},"(":{"docs":{},")":{"docs":{},";":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}},"o":{"docs":{},"n":{"docs":{},"(":{"docs":{},"'":{"docs":{},"e":{"docs":{},"r":{"docs":{},"r":{"docs":{},"o":{"docs":{},"r":{"docs":{},"'":{"docs":{},",":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}},"r":{"docs":{},"e":{"docs":{},"a":{"docs":{},"d":{"docs":{},"y":{"docs":{},"'":{"docs":{},",":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{},"(":{"docs":{},")":{"docs":{},";":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}}}}},"q":{"docs":{},":":{"docs":{"./":{"ref":"./","tf":0.002210759027266028}}}},"r":{"1":{"5":{"docs":{},")":{"docs":{},",":{"docs":{},"a":{"docs":{},"n":{"docs":{},"y":{"docs":{},"p":{"docs":{},"r":{"docs":{},"o":{"docs":{},"x":{"docs":{},"i":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}},"docs":{}},"docs":{},"e":{"docs":{},"a":{"docs":{},"d":{"docs":{},"i":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}},"d":{"docs":{},"i":{"docs":{},"r":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}}}}}}}},"f":{"docs":{},":":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},")":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}}},"u":{"docs":{},"n":{"docs":{},"a":{"docs":{},"u":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"r":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.004421518054532056}},"d":{"docs":{},"a":{"docs":{},"t":{"docs":{},"a":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}},":":{"docs":{"./":{"ref":"./","tf":0.002210759027266028}}}}}},"e":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"l":{"docs":{"./":{"ref":"./","tf":0.0036845983787767134}},".":{"docs":{},"p":{"docs":{},"r":{"docs":{},"o":{"docs":{},"t":{"docs":{},"o":{"docs":{},"c":{"docs":{},"o":{"docs":{},"l":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}},"r":{"docs":{},"e":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{},"o":{"docs":{},"p":{"docs":{},"t":{"docs":{},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"s":{"docs":{},")":{"docs":{},";":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}},";":{"docs":{"./":{"ref":"./","tf":0.0029476787030213707}}}}}}}}}}}}}}}}}},";":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}},"o":{"docs":{},"p":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}},"i":{"docs":{},"o":{"docs":{},"n":{"docs":{},"s":{"docs":{},":":{"docs":{"./":{"ref":"./","tf":0.0036845983787767134}}}}}}}}}}}}},"i":{"docs":{},"r":{"docs":{},"e":{"docs":{},"(":{"docs":{},"'":{"docs":{},"a":{"docs":{},"n":{"docs":{},"y":{"docs":{},"p":{"docs":{},"r":{"docs":{},"o":{"docs":{},"x":{"docs":{},"y":{"docs":{},"'":{"docs":{},")":{"docs":{},";":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}}}}}}}}}}}}},"c":{"docs":{},"h":{"docs":{},"i":{"docs":{},"l":{"docs":{},"d":{"docs":{},"_":{"docs":{},"p":{"docs":{},"r":{"docs":{},"o":{"docs":{},"c":{"docs":{},"e":{"docs":{},"s":{"docs":{},"s":{"docs":{},"'":{"docs":{},")":{"docs":{},".":{"docs":{},"e":{"docs":{},"x":{"docs":{},"e":{"docs":{},"c":{"docs":{},";":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}}}}}},"m":{"docs":{},"y":{"docs":{},"r":{"docs":{},"u":{"docs":{},"l":{"docs":{},"e":{"docs":{},"m":{"docs":{},"o":{"docs":{},"d":{"docs":{},"u":{"docs":{},"l":{"docs":{},"e":{"docs":{},"'":{"docs":{},")":{"docs":{},",":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}},"p":{"docs":{},"a":{"docs":{},"t":{"docs":{},"h":{"docs":{},"'":{"docs":{},")":{"docs":{},".":{"docs":{},"d":{"docs":{},"i":{"docs":{},"r":{"docs":{},"n":{"docs":{},"a":{"docs":{},"m":{"docs":{},"e":{"docs":{},"(":{"docs":{},"k":{"docs":{},"e":{"docs":{},"y":{"docs":{},"p":{"docs":{},"a":{"docs":{},"t":{"docs":{},"h":{"docs":{},")":{"docs":{},";":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"s":{"docs":{},"o":{"docs":{},"l":{"docs":{},"v":{"docs":{},"e":{"docs":{},"(":{"docs":{},"{":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}}}}}}}},"p":{"docs":{},"o":{"docs":{},"n":{"docs":{},"s":{"docs":{"./":{"ref":"./","tf":0.0036845983787767134}},"e":{"docs":{},"\"":{"docs":{},"}":{"docs":{},"'":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}},"'":{"docs":{},",":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}},":":{"docs":{"./":{"ref":"./","tf":0.011790714812085483}}},"d":{"docs":{},"e":{"docs":{},"t":{"docs":{},"a":{"docs":{},"i":{"docs":{},"l":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}},")":{"docs":{"./":{"ref":"./","tf":0.004421518054532056}}},".":{"docs":{},"r":{"docs":{},"e":{"docs":{},"s":{"docs":{},"p":{"docs":{},"o":{"docs":{},"n":{"docs":{},"s":{"docs":{},"e":{"docs":{},")":{"docs":{},";":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}}}},";":{"docs":{"./":{"ref":"./","tf":0.0029476787030213707}}}}}}}}}}}}}}}}}}}}}}}},"t":{"docs":{},"u":{"docs":{},"r":{"docs":{},"n":{"docs":{"./":{"ref":"./","tf":0.015475313190862197}}}}}}},"o":{"docs":{},"o":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}},"c":{"docs":{},"a":{"docs":{},"'":{"docs":{},",":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}},"u":{"docs":{},"l":{"docs":{},"e":{"docs":{"./":{"ref":"./","tf":0.012527634487840826}},":":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}},"_":{"docs":{},"s":{"docs":{},"a":{"docs":{},"m":{"docs":{},"p":{"docs":{},"l":{"docs":{},"e":{"docs":{},"/":{"docs":{},"s":{"docs":{},"a":{"docs":{},"m":{"docs":{},"p":{"docs":{},"l":{"docs":{},"e":{"docs":{},"_":{"docs":{},"m":{"docs":{},"o":{"docs":{},"d":{"docs":{},"i":{"docs":{},"f":{"docs":{},"y":{"docs":{},"_":{"docs":{},"r":{"docs":{},"e":{"docs":{},"q":{"docs":{},"u":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{},"_":{"docs":{},"d":{"docs":{},"a":{"docs":{},"t":{"docs":{},"a":{"docs":{},".":{"docs":{},"j":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}},"h":{"docs":{},"e":{"docs":{},"a":{"docs":{},"d":{"docs":{},"e":{"docs":{},"r":{"docs":{},".":{"docs":{},"j":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}},"p":{"docs":{},"a":{"docs":{},"t":{"docs":{},"h":{"docs":{},".":{"docs":{},"j":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}},"r":{"docs":{},"o":{"docs":{},"t":{"docs":{},"o":{"docs":{},"c":{"docs":{},"o":{"docs":{},"l":{"docs":{},".":{"docs":{},"j":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}},"s":{"docs":{},"p":{"docs":{},"o":{"docs":{},"n":{"docs":{},"s":{"docs":{},"e":{"docs":{},"_":{"docs":{},"d":{"docs":{},"a":{"docs":{},"t":{"docs":{},"a":{"docs":{},".":{"docs":{},"j":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}},"h":{"docs":{},"e":{"docs":{},"a":{"docs":{},"d":{"docs":{},"e":{"docs":{},"r":{"docs":{},".":{"docs":{},"j":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}},"s":{"docs":{},"t":{"docs":{},"a":{"docs":{},"t":{"docs":{},"u":{"docs":{},"s":{"docs":{},"c":{"docs":{},"o":{"docs":{},"d":{"docs":{},"e":{"docs":{},".":{"docs":{},"j":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"u":{"docs":{},"s":{"docs":{},"e":{"docs":{},"_":{"docs":{},"l":{"docs":{},"o":{"docs":{},"c":{"docs":{},"a":{"docs":{},"l":{"docs":{},"_":{"docs":{},"r":{"docs":{},"e":{"docs":{},"s":{"docs":{},"p":{"docs":{},"o":{"docs":{},"n":{"docs":{},"s":{"docs":{},"e":{"docs":{},".":{"docs":{},"j":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"接":{"docs":{},"口":{"docs":{},"文":{"docs":{},"档":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}},"样":{"docs":{},"例":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}},"模":{"docs":{},"块":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}},"s":{"docs":{},"a":{"docs":{},"m":{"docs":{},"p":{"docs":{},"l":{"docs":{},"e":{"docs":{},".":{"docs":{},"j":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}}}},":":{"docs":{"./":{"ref":"./","tf":0.0058953574060427415}}}}}}},"v":{"docs":{},"e":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}},"e":{"docs":{},"t":{"docs":{},"t":{"docs":{},"i":{"docs":{},"m":{"docs":{},"e":{"docs":{},"o":{"docs":{},"u":{"docs":{},"t":{"docs":{},"(":{"docs":{},"(":{"docs":{},")":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}}}}}}}}}}}}}},"i":{"docs":{},"l":{"docs":{},"e":{"docs":{},"n":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}},":":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}},"t":{"docs":{},"e":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}},"s":{"docs":{},"l":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}}}},"t":{"docs":{},"a":{"docs":{},"r":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}},"t":{"docs":{},"u":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}},"s":{"docs":{},"c":{"docs":{},"o":{"docs":{},"d":{"docs":{},"e":{"docs":{},":":{"docs":{"./":{"ref":"./","tf":0.0029476787030213707}}}}}}}}}}},"e":{"docs":{},"p":{"docs":{"./":{"ref":"./","tf":0.0029476787030213707}}}},"r":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}},"u":{"docs":{},"d":{"docs":{},"o":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}},"m":{"docs":{},"m":{"docs":{},"a":{"docs":{},"r":{"docs":{},"i":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}},"y":{"docs":{},"(":{"docs":{},")":{"docs":{},":":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}},":":{"docs":{"./":{"ref":"./","tf":0.002210759027266028}},"s":{"docs":{},"t":{"docs":{},"r":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}},"t":{"docs":{},"e":{"docs":{},"s":{"docs":{},"t":{"docs":{},":":{"docs":{"./":{"ref":"./","tf":0.0058953574060427415}}}}},"x":{"docs":{},"t":{"docs":{},"/":{"docs":{},"p":{"docs":{},"l":{"docs":{},"a":{"docs":{},"i":{"docs":{},"n":{"docs":{},"\"":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}},"h":{"docs":{},"r":{"docs":{},"o":{"docs":{},"t":{"docs":{},"t":{"docs":{},"l":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}},"e":{"docs":{},":":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}},"o":{"docs":{},"w":{"docs":{},"a":{"docs":{},"r":{"docs":{},"d":{"docs":{"./":{"ref":"./","tf":0.002210759027266028}}}}}}},"r":{"docs":{},"u":{"docs":{},"e":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}},",":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}},";":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}},"或":{"docs":{},"者":{"docs":{},"f":{"docs":{},"a":{"docs":{},"l":{"docs":{},"s":{"docs":{},"e":{"docs":{},",":{"docs":{},"表":{"docs":{},"示":{"docs":{},"是":{"docs":{},"否":{"docs":{},"需":{"docs":{},"要":{"docs":{},"a":{"docs":{},"n":{"docs":{},"y":{"docs":{},"p":{"docs":{},"r":{"docs":{},"o":{"docs":{},"x":{"docs":{},"y":{"docs":{},"替":{"docs":{},"换":{"docs":{},"证":{"docs":{},"书":{"docs":{},"并":{"docs":{},"解":{"docs":{},"析":{"docs":{},"h":{"docs":{},"t":{"docs":{},"t":{"docs":{},"p":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"s":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}},")":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}},"y":{"docs":{},"p":{"docs":{},"e":{"docs":{},"'":{"docs":{},":":{"docs":{"./":{"ref":"./","tf":0.0029476787030213707}}}},":":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}},"u":{"docs":{},"i":{"docs":{},"中":{"docs":{},"的":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}},"n":{"docs":{},"a":{"docs":{},"u":{"docs":{},"t":{"docs":{},"h":{"docs":{},"o":{"docs":{},"r":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}}}}}}}}},"r":{"docs":{},"l":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}},":":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}},"s":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}},"e":{"docs":{},"r":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}}}}}},"v":{"docs":{},"a":{"docs":{},"r":{"docs":{"./":{"ref":"./","tf":0.002210759027266028}}}}},"w":{"docs":{},"e":{"docs":{},"b":{"docs":{},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"f":{"docs":{},"a":{"docs":{},"c":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}},"e":{"docs":{},":":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}},"p":{"docs":{},"o":{"docs":{},"r":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}},":":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}},"版":{"docs":{},"界":{"docs":{},"面":{"docs":{},"端":{"docs":{},"口":{"docs":{},"号":{"docs":{},",":{"docs":{},"默":{"docs":{},"认":{"8":{"0":{"0":{"2":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}},"docs":{}},"docs":{}},"docs":{}},"docs":{}}}}}}},"配":{"docs":{},"置":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}},"重":{"docs":{},"构":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}},"i":{"docs":{},"n":{"docs":{},"d":{"docs":{},"o":{"docs":{},"w":{"docs":{},"s":{"docs":{},"系":{"docs":{},"统":{"docs":{},"信":{"docs":{},"任":{"docs":{},"c":{"docs":{},"a":{"docs":{},"证":{"docs":{},"书":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}},"o":{"docs":{},"r":{"docs":{},"l":{"docs":{},"d":{"docs":{},"'":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}},"s":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}},"i":{"docs":{},"n":{"docs":{},"t":{"docs":{},"e":{"docs":{},"r":{"docs":{},"c":{"docs":{},"e":{"docs":{},"p":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}},":":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}},"x":{"docs":{"./":{"ref":"./","tf":0.002210759027266028}}},"y":{"docs":{},"i":{"docs":{},"e":{"docs":{},"l":{"docs":{},"d":{"docs":{},"a":{"docs":{},"b":{"docs":{},"l":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}},"{":{"docs":{"./":{"ref":"./","tf":0.06484893146647015}},"b":{"docs":{},"o":{"docs":{},"o":{"docs":{},"l":{"docs":{},"e":{"docs":{},"a":{"docs":{},"n":{"docs":{},"}":{"docs":{"./":{"ref":"./","tf":0.0036845983787767134}}}}}}}}}},"n":{"docs":{},"u":{"docs":{},"m":{"docs":{},"b":{"docs":{},"e":{"docs":{},"r":{"docs":{},"}":{"docs":{"./":{"ref":"./","tf":0.002210759027266028}}}}}}}}},"o":{"docs":{},"b":{"docs":{},"j":{"docs":{},"e":{"docs":{},"c":{"docs":{},"t":{"docs":{},"}":{"docs":{"./":{"ref":"./","tf":0.0058953574060427415}}}}}}}}},"s":{"docs":{},"t":{"docs":{},"r":{"docs":{},"i":{"docs":{},"n":{"docs":{},"g":{"docs":{},"}":{"docs":{"./":{"ref":"./","tf":0.002210759027266028}}}}}}}}}},"|":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}},"}":{"docs":{"./":{"ref":"./","tf":0.02210759027266028}},")":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}},";":{"docs":{"./":{"ref":"./","tf":0.006632277081798084}}}},",":{"docs":{"./":{"ref":"./","tf":0.014738393515106854}}},";":{"docs":{"./":{"ref":"./","tf":0.020633750921149593}}}},"下":{"docs":{},"载":{"docs":{},"后":{"docs":{},"的":{"docs":{},"证":{"docs":{},"书":{"docs":{},"可":{"docs":{},"以":{"docs":{},"直":{"docs":{},"接":{"docs":{},"单":{"docs":{},"击":{"docs":{},"打":{"docs":{},"开":{"docs":{},"并":{"docs":{},"安":{"docs":{},"装":{"docs":{},",":{"docs":{},"这":{"docs":{},"种":{"docs":{},"方":{"docs":{},"式":{"docs":{},"是":{"docs":{},"最":{"docs":{},"简":{"docs":{},"单":{"docs":{},"的":{"docs":{},",":{"docs":{},"直":{"docs":{},"接":{"docs":{},"安":{"docs":{},"装":{"docs":{},"即":{"docs":{},"可":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"不":{"docs":{},"做":{"docs":{},"任":{"docs":{},"何":{"docs":{},"处":{"docs":{},"理":{"docs":{},"。":{"docs":{},"此":{"docs":{},"时":{"docs":{},"a":{"docs":{},"n":{"docs":{},"y":{"docs":{},"p":{"docs":{},"r":{"docs":{},"o":{"docs":{},"x":{"docs":{},"y":{"docs":{},"会":{"docs":{},"返":{"docs":{},"回":{"docs":{},"一":{"docs":{},"个":{"docs":{},"默":{"docs":{},"认":{"docs":{},"的":{"docs":{},"错":{"docs":{},"误":{"docs":{},"页":{"docs":{},"。":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}}}}}}}},",":{"docs":{},"返":{"docs":{},"回":{"docs":{},"n":{"docs":{},"u":{"docs":{},"l":{"docs":{},"l":{"docs":{"./":{"ref":"./","tf":0.0014738393515106854}}}}}}}}}}}}}},"同":{"docs":{},"安":{"docs":{},"卓":{"docs":{},"系":{"docs":{},"统":{"docs":{},"支":{"docs":{},"持":{"docs":{},"安":{"docs":{},"装":{"docs":{},"的":{"docs":{},"证":{"docs":{},"书":{"docs":{},"文":{"docs":{},"件":{"docs":{},"类":{"docs":{},"型":{"docs":{},"不":{"docs":{},"尽":{"docs":{},"相":{"docs":{},"同":{"docs":{},",":{"docs":{},"大":{"docs":{},"多":{"docs":{},"支":{"docs":{},"持":{"docs":{},"安":{"docs":{},"装":{"docs":{},"拓":{"docs":{},"展":{"docs":{},"名":{"docs":{},"为":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"开":{"docs":{},"启":{"docs":{},"w":{"docs":{},"e":{"docs":{},"b":{"docs":{},"s":{"docs":{},"o":{"docs":{},"c":{"docs":{},"k":{"docs":{},"e":{"docs":{},"t":{"docs":{},"代":{"docs":{},"理":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}},"中":{"docs":{},"把":{"docs":{},"a":{"docs":{},"n":{"docs":{},"y":{"docs":{},"p":{"docs":{},"r":{"docs":{},"o":{"docs":{},"x":{"docs":{},"y":{"docs":{},"证":{"docs":{},"书":{"docs":{},"的":{"docs":{},"开":{"docs":{},"关":{"docs":{},"打":{"docs":{},"开":{"docs":{},",":{"docs":{},"否":{"docs":{},"则":{"docs":{},"s":{"docs":{},"a":{"docs":{},"f":{"docs":{},"a":{"docs":{},"r":{"docs":{},"i":{"docs":{},"将":{"docs":{},"报":{"docs":{},"错":{"docs":{},"。":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"为":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}},"什":{"docs":{},"么":{"docs":{},"h":{"docs":{},"t":{"docs":{},"t":{"docs":{},"p":{"docs":{},"s":{"docs":{},"请":{"docs":{},"求":{"docs":{},"不":{"docs":{},"能":{"docs":{},"进":{"docs":{},"入":{"docs":{},"处":{"docs":{},"理":{"docs":{},"函":{"docs":{},"数":{"docs":{},"?":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}}}},"主":{"docs":{},"要":{"docs":{},"特":{"docs":{},"性":{"docs":{},"包":{"docs":{},"括":{"docs":{},":":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}},"举":{"docs":{},"例":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}},",":{"docs":{},"请":{"docs":{},"求":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}},":":{"docs":{},"请":{"docs":{},"求":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}},"从":{"docs":{},"s":{"docs":{},"d":{"docs":{},"卡":{"docs":{},"安":{"docs":{},"装":{"docs":{},"证":{"docs":{},"书":{"docs":{},"。":{"docs":{},"找":{"docs":{},"到":{"docs":{},"你":{"docs":{},"下":{"docs":{},"载":{"docs":{},"的":{"docs":{},"证":{"docs":{},"书":{"docs":{},"文":{"docs":{},"件":{"docs":{},",":{"docs":{},"进":{"docs":{},"行":{"docs":{},"安":{"docs":{},"装":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}}}}}}}},"存":{"docs":{},"储":{"docs":{},"设":{"docs":{},"备":{"docs":{},"安":{"docs":{},"装":{"docs":{},"。":{"docs":{},"找":{"docs":{},"到":{"docs":{},"你":{"docs":{},"下":{"docs":{},"载":{"docs":{},"的":{"docs":{},"证":{"docs":{},"书":{"docs":{},"文":{"docs":{},"件":{"docs":{},",":{"docs":{},"进":{"docs":{},"行":{"docs":{},"安":{"docs":{},"装":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}}}}}}}},"代":{"docs":{},"理":{"docs":{},"h":{"docs":{},"t":{"docs":{},"t":{"docs":{},"p":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}},"w":{"docs":{},"e":{"docs":{},"b":{"docs":{},"s":{"docs":{},"o":{"docs":{},"c":{"docs":{},"k":{"docs":{},"e":{"docs":{},"t":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}},"服":{"docs":{},"务":{"docs":{},"器":{"docs":{},"发":{"docs":{},"生":{"docs":{},"错":{"docs":{},"误":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}},"启":{"docs":{},"动":{"docs":{},"完":{"docs":{},"成":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}},"都":{"docs":{},"在":{"docs":{},"w":{"docs":{},"i":{"docs":{},"f":{"docs":{},"i":{"docs":{},"设":{"docs":{},"置":{"docs":{},"中":{"docs":{},"配":{"docs":{},"置":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}},"以":{"docs":{},"c":{"docs":{},"h":{"docs":{},"r":{"docs":{},"o":{"docs":{},"m":{"docs":{},"e":{"docs":{},"的":{"docs":{},"s":{"docs":{},"w":{"docs":{},"i":{"docs":{},"t":{"docs":{},"c":{"docs":{},"h":{"docs":{},"y":{"docs":{},"o":{"docs":{},"m":{"docs":{},"e":{"docs":{},"g":{"docs":{},"a":{"docs":{},"插":{"docs":{},"件":{"docs":{},"为":{"docs":{},"例":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}}}}}}}}}}}},"下":{"docs":{},"任":{"docs":{},"意":{"docs":{},"一":{"docs":{},"项":{"docs":{},"都":{"docs":{},"能":{"docs":{},"用":{"docs":{},"来":{"docs":{},"改":{"docs":{},"变":{"docs":{},"h":{"docs":{},"t":{"docs":{},"t":{"docs":{},"p":{"docs":{},"s":{"docs":{},"的":{"docs":{},"处":{"docs":{},"理":{"docs":{},"特":{"docs":{},"性":{"docs":{},":":{"docs":{"./":{"ref":"./","tf":0.0007369196757553427}}}}}}}}}}}}}}
Download .txt
gitextract_zmx3jyvr/

├── .eslintignore
├── .eslintrc
├── .github/
│   └── ISSUE_TEMPLATE.md
├── .gitignore
├── .npmignore
├── .travis.yml
├── CHANGELOG
├── LICENSE
├── README.md
├── babel.config.js
├── bin/
│   ├── anyproxy
│   ├── anyproxy-ca
│   ├── rootCACheck.js
│   └── startServer.js
├── build_scripts/
│   ├── build-doc-site.sh
│   └── prebuild-doc.js
├── docs/
│   ├── CNAME
│   ├── README.md
│   ├── assets/
│   │   ├── auto-lang.js
│   │   ├── main.js
│   │   └── website.css
│   ├── cn/
│   │   ├── index.html
│   │   ├── search_index.json
│   │   └── src_doc.md
│   ├── en/
│   │   ├── index.html
│   │   ├── search_index.json
│   │   └── src_doc.md
│   ├── gitbook/
│   │   ├── fonts/
│   │   │   └── fontawesome/
│   │   │       └── FontAwesome.otf
│   │   ├── gitbook-plugin-fontsettings/
│   │   │   ├── fontsettings.js
│   │   │   └── website.css
│   │   ├── gitbook-plugin-highlight/
│   │   │   ├── ebook.css
│   │   │   └── website.css
│   │   ├── gitbook-plugin-lunr/
│   │   │   └── search-lunr.js
│   │   ├── gitbook-plugin-search/
│   │   │   ├── search-engine.js
│   │   │   ├── search.css
│   │   │   └── search.js
│   │   ├── gitbook-plugin-sharing/
│   │   │   └── buttons.js
│   │   ├── gitbook.js
│   │   ├── style.css
│   │   └── theme.js
│   ├── index.html
│   └── search_index.json
├── docs-src/
│   ├── CNAME
│   ├── LANGS.md
│   ├── README.md
│   ├── _layouts/
│   │   └── layout.html
│   ├── assets/
│   │   ├── auto-lang.js
│   │   ├── main.js
│   │   └── website.css
│   ├── book.json
│   ├── cn/
│   │   ├── README.md
│   │   ├── SUMMARY.md
│   │   ├── _layouts/
│   │   │   ├── layout.html
│   │   │   └── website/
│   │   │       └── summary.html
│   │   └── src_doc.md
│   └── en/
│       ├── README.md
│       ├── SUMMARY.md
│       ├── _layouts/
│       │   ├── layout.html
│       │   └── website/
│       │       └── summary.html
│       ├── book.json
│       └── src_doc.md
├── jest.config.js
├── lib/
│   ├── certMgr.js
│   ├── configUtil.js
│   ├── httpsServerMgr.js
│   ├── log.js
│   ├── recorder.js
│   ├── requestErrorHandler.js
│   ├── requestHandler.js
│   ├── ruleLoader.js
│   ├── rule_default.js
│   ├── systemProxyMgr.js
│   ├── util.js
│   ├── webInterface.js
│   ├── wsServer.js
│   └── wsServerMgr.js
├── module_sample/
│   ├── core_reload.js
│   ├── https_config.js
│   ├── normal_use.js
│   └── simple_use.js
├── package.json
├── proxy.js
├── resource/
│   ├── 502.pug
│   ├── cert_download.pug
│   └── cert_error.pug
├── rule_sample/
│   ├── sample_modify_request_data.js
│   ├── sample_modify_request_header.js
│   ├── sample_modify_request_path.js
│   ├── sample_modify_request_protocol.js
│   ├── sample_modify_response_data.js
│   ├── sample_modify_response_header.js
│   ├── sample_modify_response_statuscode.js
│   └── sample_use_local_response.js
├── test/
│   ├── __snapshots__/
│   │   └── basic.spec.js.snap
│   ├── basic.spec.js
│   ├── fixtures/
│   │   ├── someRule.js
│   │   └── upload.txt
│   ├── lib/
│   │   ├── httpsServerMgr.spec.js
│   │   ├── ruleLoader.spec.js
│   │   └── util.spec.js
│   ├── rule/
│   │   ├── beforeDealHttpsRequest.spec.js
│   │   ├── beforeSendRequest.spec.js
│   │   ├── beforeSendResponse.js
│   │   └── onError.spec.js
│   ├── util.js
│   └── web/
│       ├── curlUtil.spec.js
│       └── webInterface.spec.js
└── web/
    ├── index.html
    ├── postcss.config.js
    ├── src/
    │   ├── action/
    │   │   ├── globalStatusAction.js
    │   │   └── recordAction.js
    │   ├── common/
    │   │   ├── ApiUtil.js
    │   │   ├── Constant.js
    │   │   ├── WsUtil.js
    │   │   ├── apiUtil.js
    │   │   ├── commonUtil.js
    │   │   ├── constant.js
    │   │   ├── curlUtil.js
    │   │   ├── promiseUtil.js
    │   │   └── wsUtil.js
    │   ├── component/
    │   │   ├── download-root-ca.jsx
    │   │   ├── download-root-ca.less
    │   │   ├── header-menu.jsx
    │   │   ├── header-menu.less
    │   │   ├── json-viewer.jsx
    │   │   ├── json-viewer.less
    │   │   ├── left-menu.jsx
    │   │   ├── left-menu.less
    │   │   ├── map-local.jsx
    │   │   ├── map-local.less
    │   │   ├── modal-panel.jsx
    │   │   ├── modal-panel.less
    │   │   ├── record-detail.jsx
    │   │   ├── record-detail.less
    │   │   ├── record-filter.jsx
    │   │   ├── record-filter.less
    │   │   ├── record-list-diff-worker.jsx
    │   │   ├── record-panel.jsx
    │   │   ├── record-panel.less
    │   │   ├── record-request-detail.jsx
    │   │   ├── record-response-detail.jsx
    │   │   ├── record-row.jsx
    │   │   ├── record-row.less
    │   │   ├── record-worker.jsx
    │   │   ├── record-ws-message-detail.jsx
    │   │   ├── record-ws-message-detail.less
    │   │   ├── resizable-panel.jsx
    │   │   ├── resizable-panel.less
    │   │   ├── table-panel.jsx
    │   │   ├── table-panel.less
    │   │   ├── title-bar.jsx
    │   │   ├── title-bar.less
    │   │   └── ws-listener.jsx
    │   ├── index.jsx
    │   ├── index.less
    │   ├── reducer/
    │   │   ├── globalStatusReducer.js
    │   │   ├── requestRecordReducer.js
    │   │   └── rootReducer.js
    │   ├── saga/
    │   │   └── rootSaga.js
    │   └── style/
    │       ├── animate.less
    │       ├── antd-constant.less
    │       ├── antd-reset.global.less
    │       ├── common.less
    │       └── constant.less
    └── webpack.config.js
Download .txt
SYMBOL INDEX (670 symbols across 70 files)

FILE: bin/rootCACheck.js
  function checkRootCAExists (line 12) | function checkRootCAExists() {

FILE: build_scripts/prebuild-doc.js
  function mergeMdWithRuleFile (line 19) | function mergeMdWithRuleFile(config) {

FILE: docs-src/assets/auto-lang.js
  function isUTF8Zone (line 6) | function isUTF8Zone() {
  function isInLocaleView (line 13) | function isInLocaleView() {
  function initDefaultLocaleAndStatic (line 17) | function initDefaultLocaleAndStatic() {

FILE: docs-src/assets/main.js
  function injectBaiduStatic (line 2) | function injectBaiduStatic() {

FILE: docs/assets/auto-lang.js
  function isUTF8Zone (line 6) | function isUTF8Zone() {
  function isInLocaleView (line 13) | function isInLocaleView() {
  function initDefaultLocaleAndStatic (line 17) | function initDefaultLocaleAndStatic() {

FILE: docs/assets/main.js
  function injectBaiduStatic (line 2) | function injectBaiduStatic() {

FILE: docs/gitbook/gitbook-plugin-fontsettings/fontsettings.js
  function getThemes (line 44) | function getThemes() {
  function setThemes (line 49) | function setThemes(themes) {
  function getFamilies (line 55) | function getFamilies() {
  function setFamilies (line 60) | function setFamilies(families) {
  function saveFontSettings (line 66) | function saveFontSettings() {
  function enlargeFontSize (line 72) | function enlargeFontSize(e) {
  function reduceFontSize (line 81) | function reduceFontSize(e) {
  function changeFontFamily (line 90) | function changeFontFamily(configName, e) {
  function changeColorTheme (line 101) | function changeColorTheme(configName, e) {
  function getFontFamilyId (line 123) | function getFontFamilyId(configName) {
  function getThemeId (line 134) | function getThemeId(configName) {
  function update (line 143) | function update() {
  function init (line 159) | function init(config) {
  function updateButtons (line 174) | function updateButtons() {

FILE: docs/gitbook/gitbook-plugin-lunr/search-lunr.js
  function LunrSearchEngine (line 6) | function LunrSearchEngine() {

FILE: docs/gitbook/gitbook-plugin-search/search-engine.js
  function setEngine (line 10) | function setEngine(Engine, config) {
  function init (line 18) | function init(config) {
  function query (line 29) | function query(q, offset, length) {
  function getEngine (line 35) | function getEngine() {
  function isInitialized (line 39) | function isInitialized() {

FILE: docs/gitbook/gitbook-plugin-search/search.js
  function throttle (line 20) | function throttle(fn, wait) {
  function displayResults (line 34) | function displayResults(res) {
  function launchSearch (line 73) | function launchSearch(q) {
  function closeSearch (line 88) | function closeSearch() {
  function launchSearchFromQueryString (line 93) | function launchSearchFromQueryString() {
  function bindSearch (line 104) | function bindSearch() {
  function getParameterByName (line 172) | function getParameterByName(name) {
  function updateQueryString (line 182) | function updateQueryString(key, value) {

FILE: docs/gitbook/gitbook.js
  function o (line 1) | function o(s,a){if(!n[s]){if(!t[s]){var u="function"==typeof require&&re...
  function n (line 1) | function n(e,t){t=t||te;var n=t.createElement("script");n.text=e,t.head....
  function r (line 1) | function r(e){var t=!!e&&"length"in e&&e.length,n=de.type(e);return"func...
  function o (line 1) | function o(e,t,n){return de.isFunction(t)?de.grep(e,function(e,r){return...
  function i (line 1) | function i(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}
  function s (line 1) | function s(e){var t={};return de.each(e.match(qe)||[],function(e,n){t[n]...
  function a (line 1) | function a(e){return e}
  function u (line 1) | function u(e){throw e}
  function c (line 1) | function c(e,t,n){var r;try{e&&de.isFunction(r=e.promise)?r.call(e).done...
  function l (line 1) | function l(){te.removeEventListener("DOMContentLoaded",l),e.removeEventL...
  function f (line 1) | function f(){this.expando=de.expando+f.uid++}
  function p (line 1) | function p(e){return"true"===e||"false"!==e&&("null"===e?null:e===+e+""?...
  function h (line 1) | function h(e,t,n){var r;if(void 0===n&&1===e.nodeType)if(r="data-"+t.rep...
  function d (line 1) | function d(e,t,n,r){var o,i=1,s=20,a=r?function(){return r.cur()}:functi...
  function g (line 1) | function g(e){var t,n=e.ownerDocument,r=e.nodeName,o=Ue[r];return o?o:(t...
  function m (line 1) | function m(e,t){for(var n,r,o=[],i=0,s=e.length;i<s;i++)r=e[i],r.style&&...
  function v (line 1) | function v(e,t){var n;return n="undefined"!=typeof e.getElementsByTagNam...
  function y (line 1) | function y(e,t){for(var n=0,r=e.length;n<r;n++)Fe.set(e[n],"globalEval",...
  function x (line 1) | function x(e,t,n,r,o){for(var i,s,a,u,c,l,f=t.createDocumentFragment(),p...
  function b (line 1) | function b(){return!0}
  function w (line 1) | function w(){return!1}
  function T (line 1) | function T(){try{return te.activeElement}catch(e){}}
  function C (line 1) | function C(e,t,n,r,o,i){var s,a;if("object"==typeof t){"string"!=typeof ...
  function j (line 1) | function j(e,t){return de.nodeName(e,"table")&&de.nodeName(11!==t.nodeTy...
  function k (line 1) | function k(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}
  function E (line 1) | function E(e){var t=rt.exec(e.type);return t?e.type=t[1]:e.removeAttribu...
  function S (line 1) | function S(e,t){var n,r,o,i,s,a,u,c;if(1===t.nodeType){if(Fe.hasData(e)&...
  function N (line 1) | function N(e,t){var n=t.nodeName.toLowerCase();"input"===n&&ze.test(e.ty...
  function A (line 1) | function A(e,t,r,o){t=oe.apply([],t);var i,s,a,u,c,l,f=0,p=e.length,h=p-...
  function q (line 1) | function q(e,t,n){for(var r,o=t?de.filter(t,e):e,i=0;null!=(r=o[i]);i++)...
  function D (line 1) | function D(e,t,n){var r,o,i,s,a=e.style;return n=n||at(e),n&&(s=n.getPro...
  function O (line 1) | function O(e,t){return{get:function(){return e()?void delete this.get:(t...
  function L (line 1) | function L(e){if(e in pt)return e;for(var t=e[0].toUpperCase()+e.slice(1...
  function H (line 1) | function H(e,t,n){var r=$e.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3...
  function F (line 1) | function F(e,t,n,r,o){var i,s=0;for(i=n===(r?"border":"content")?4:"widt...
  function R (line 1) | function R(e,t,n){var r,o=!0,i=at(e),s="border-box"===de.css(e,"boxSizin...
  function I (line 1) | function I(e,t,n,r,o){return new I.prototype.init(e,t,n,r,o)}
  function P (line 1) | function P(){dt&&(e.requestAnimationFrame(P),de.fx.tick())}
  function M (line 1) | function M(){return e.setTimeout(function(){ht=void 0}),ht=de.now()}
  function $ (line 1) | function $(e,t){var n,r=0,o={height:e};for(t=t?1:0;r<4;r+=2-t)n=We[r],o[...
  function W (line 1) | function W(e,t,n){for(var r,o=(U.tweeners[t]||[]).concat(U.tweeners["*"]...
  function B (line 1) | function B(e,t,n){var r,o,i,s,a,u,c,l,f="width"in t||"height"in t,p=this...
  function _ (line 1) | function _(e,t){var n,r,o,i,s;for(n in e)if(r=de.camelCase(n),o=t[r],i=e...
  function U (line 1) | function U(e,t,n){var r,o,i=0,s=U.prefilters.length,a=de.Deferred().alwa...
  function z (line 1) | function z(e){var t=e.match(qe)||[];return t.join(" ")}
  function X (line 1) | function X(e){return e.getAttribute&&e.getAttribute("class")||""}
  function V (line 1) | function V(e,t,n,r){var o;if(de.isArray(t))de.each(t,function(t,o){n||Et...
  function G (line 1) | function G(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r...
  function Y (line 1) | function Y(e,t,n,r){function o(a){var u;return i[a]=!0,de.each(e[a]||[],...
  function Q (line 1) | function Q(e,t){var n,r,o=de.ajaxSettings.flatOptions||{};for(n in t)voi...
  function J (line 1) | function J(e,t,n){for(var r,o,i,s,a=e.contents,u=e.dataTypes;"*"===u[0];...
  function K (line 1) | function K(e,t,n,r){var o,i,s,a,u,c={},l=e.dataTypes.slice();if(l[1])for...
  function Z (line 1) | function Z(e){return de.isWindow(e)?e:9===e.nodeType&&e.defaultView}
  function t (line 1) | function t(e,t,n,r){var o,i,s,a,u,c,l,p=t&&t.ownerDocument,d=t?t.nodeTyp...
  function n (line 1) | function n(){function e(n,r){return t.push(n+" ")>C.cacheLength&&delete ...
  function r (line 1) | function r(e){return e[$]=!0,e}
  function o (line 1) | function o(e){var t=L.createElement("fieldset");try{return!!e(t)}catch(e...
  function i (line 1) | function i(e,t){for(var n=e.split("|"),r=n.length;r--;)C.attrHandle[n[r]...
  function s (line 1) | function s(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.source...
  function a (line 1) | function a(e){return function(t){var n=t.nodeName.toLowerCase();return"i...
  function u (line 1) | function u(e){return function(t){var n=t.nodeName.toLowerCase();return("...
  function c (line 1) | function c(e){return function(t){return"form"in t?t.parentNode&&t.disabl...
  function l (line 1) | function l(e){return r(function(t){return t=+t,r(function(n,r){for(var o...
  function f (line 1) | function f(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}
  function p (line 1) | function p(){}
  function h (line 1) | function h(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}
  function d (line 1) | function d(e,t,n){var r=t.dir,o=t.next,i=o||r,s=n&&"parentNode"===i,a=_+...
  function g (line 1) | function g(e){return e.length>1?function(t,n,r){for(var o=e.length;o--;)...
  function m (line 1) | function m(e,n,r){for(var o=0,i=n.length;o<i;o++)t(e,n[o],r);return r}
  function v (line 1) | function v(e,t,n,r,o){for(var i,s=[],a=0,u=e.length,c=null!=t;a<u;a++)(i...
  function y (line 1) | function y(e,t,n,o,i,s){return o&&!o[$]&&(o=y(o)),i&&!i[$]&&(i=y(i,s)),r...
  function x (line 1) | function x(e){for(var t,n,r,o=e.length,i=C.relative[e[0].type],s=i||C.re...
  function b (line 1) | function b(e,n){var o=n.length>0,i=e.length>0,s=function(r,s,a,u,c){var ...
  function i (line 2) | function i(t,n,r,o){return function(){var c=this,l=arguments,f=function(...
  function t (line 2) | function t(){if(a){a.style.cssText="box-sizing:border-box;position:relat...
  function r (line 3) | function r(t,n,r,a){var c,p,h,b,w,T=n;l||(l=!0,u&&e.clearTimeout(u),o=vo...
  function t (line 3) | function t(e,t){for(var n=0,r=e.length-1;r>=0;r--){var o=e[r];"."===o?e....
  function r (line 3) | function r(e,t){if(e.filter)return e.filter(t);for(var n=[],r=0;r<e.leng...
  function r (line 3) | function r(e){for(var t=0;t<e.length&&""===e[t];t++);for(var n=e.length-...
  function r (line 3) | function r(){throw new Error("setTimeout has not been defined")}
  function o (line 3) | function o(){throw new Error("clearTimeout has not been defined")}
  function i (line 3) | function i(e){if(f===setTimeout)return setTimeout(e,0);if((f===r||!f)&&s...
  function s (line 3) | function s(e){if(p===clearTimeout)return clearTimeout(e);if((p===o||!p)&...
  function a (line 3) | function a(){m&&d&&(m=!1,d.length?g=d.concat(g):v=-1,g.length&&u())}
  function u (line 3) | function u(){if(!m){var e=i(a);m=!0;for(var t=g.length;t;){for(d=g,g=[];...
  function c (line 3) | function c(e,t){this.fun=e,this.array=t}
  function l (line 3) | function l(){}
  function o (line 3) | function o(e){throw new RangeError(L[e])}
  function i (line 3) | function i(e,t){for(var n=e.length,r=[];n--;)r[n]=t(e[n]);return r}
  function s (line 3) | function s(e,t){var n=e.split("@"),r="";n.length>1&&(r=n[0]+"@",e=n[1]),...
  function a (line 3) | function a(e){for(var t,n,r=[],o=0,i=e.length;o<i;)t=e.charCodeAt(o++),t...
  function u (line 3) | function u(e){return i(e,function(e){var t="";return e>65535&&(e-=65536,...
  function c (line 3) | function c(e){return e-48<10?e-22:e-65<26?e-65:e-97<26?e-97:T}
  function l (line 3) | function l(e,t){return e+22+75*(e<26)-((0!=t)<<5)}
  function f (line 3) | function f(e,t,n){var r=0;for(e=n?F(e/E):e>>1,e+=F(e/t);e>H*j>>1;r+=T)e=...
  function p (line 3) | function p(e){var t,n,r,i,s,a,l,p,h,d,g=[],m=e.length,v=0,y=N,x=S;for(n=...
  function h (line 3) | function h(e){var t,n,r,i,s,u,c,p,h,d,g,m,v,y,x,b=[];for(e=a(e),m=e.leng...
  function d (line 3) | function d(e){return s(e,function(e){return q.test(e)?p(e.slice(4).toLow...
  function g (line 3) | function g(e){return s(e,function(e){return D.test(e)?"xn--"+h(e):e})}
  function r (line 3) | function r(e,t){return Object.prototype.hasOwnProperty.call(e,t)}
  function r (line 3) | function r(e,t){if(e.map)return e.map(t);for(var n=[],r=0;r<e.length;r++...
  function r (line 3) | function r(){this.protocol=null,this.slashes=null,this.auth=null,this.ho...
  function o (line 3) | function o(e,t,n){if(e&&c.isObject(e)&&e instanceof r)return e;var o=new...
  function i (line 4) | function i(e){return c.isString(e)&&(e=o(e)),e instanceof r?e.format():r...
  function s (line 4) | function s(e,t){return o(e,!1,!0).resolve(t)}
  function a (line 4) | function a(e,t){return e?o(e,!1,!0).resolveObject(t):t}
  function r (line 4) | function r(e){console.log("page has changed",e),o(e),l||(l=!0,c.trigger(...
  function o (line 4) | function o(e){f.page=e.page,f.file=e.file,f.gitbook=e.gitbook,f.config=e...
  function i (line 4) | function i(){return f}

FILE: docs/gitbook/theme.js
  function o (line 1) | function o(a,s){if(!n[a]){if(!t[a]){var u="function"==typeof require&&re...
  function n (line 1) | function n(e,t){t=t||te;var n=t.createElement("script");n.text=e,t.head....
  function r (line 1) | function r(e){var t=!!e&&"length"in e&&e.length,n=de.type(e);return"func...
  function o (line 1) | function o(e,t,n){return de.isFunction(t)?de.grep(e,function(e,r){return...
  function i (line 1) | function i(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}
  function a (line 1) | function a(e){var t={};return de.each(e.match(qe)||[],function(e,n){t[n]...
  function s (line 1) | function s(e){return e}
  function u (line 1) | function u(e){throw e}
  function l (line 1) | function l(e,t,n){var r;try{e&&de.isFunction(r=e.promise)?r.call(e).done...
  function c (line 1) | function c(){te.removeEventListener("DOMContentLoaded",c),e.removeEventL...
  function f (line 1) | function f(){this.expando=de.expando+f.uid++}
  function p (line 1) | function p(e){return"true"===e||"false"!==e&&("null"===e?null:e===+e+""?...
  function h (line 1) | function h(e,t,n){var r;if(void 0===n&&1===e.nodeType)if(r="data-"+t.rep...
  function d (line 1) | function d(e,t,n,r){var o,i=1,a=20,s=r?function(){return r.cur()}:functi...
  function g (line 1) | function g(e){var t,n=e.ownerDocument,r=e.nodeName,o=Ue[r];return o?o:(t...
  function m (line 1) | function m(e,t){for(var n,r,o=[],i=0,a=e.length;i<a;i++)r=e[i],r.style&&...
  function v (line 1) | function v(e,t){var n;return n="undefined"!=typeof e.getElementsByTagNam...
  function y (line 1) | function y(e,t){for(var n=0,r=e.length;n<r;n++)Fe.set(e[n],"globalEval",...
  function b (line 1) | function b(e,t,n,r,o){for(var i,a,s,u,l,c,f=t.createDocumentFragment(),p...
  function x (line 1) | function x(){return!0}
  function w (line 1) | function w(){return!1}
  function C (line 1) | function C(){try{return te.activeElement}catch(e){}}
  function T (line 1) | function T(e,t,n,r,o,i){var a,s;if("object"==typeof t){"string"!=typeof ...
  function k (line 1) | function k(e,t){return de.nodeName(e,"table")&&de.nodeName(11!==t.nodeTy...
  function j (line 1) | function j(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}
  function E (line 1) | function E(e){var t=rt.exec(e.type);return t?e.type=t[1]:e.removeAttribu...
  function N (line 1) | function N(e,t){var n,r,o,i,a,s,u,l;if(1===t.nodeType){if(Fe.hasData(e)&...
  function S (line 1) | function S(e,t){var n=t.nodeName.toLowerCase();"input"===n&&ze.test(e.ty...
  function A (line 1) | function A(e,t,r,o){t=oe.apply([],t);var i,a,s,u,l,c,f=0,p=e.length,h=p-...
  function q (line 1) | function q(e,t,n){for(var r,o=t?de.filter(t,e):e,i=0;null!=(r=o[i]);i++)...
  function D (line 1) | function D(e,t,n){var r,o,i,a,s=e.style;return n=n||st(e),n&&(a=n.getPro...
  function O (line 1) | function O(e,t){return{get:function(){return e()?void delete this.get:(t...
  function L (line 1) | function L(e){if(e in pt)return e;for(var t=e[0].toUpperCase()+e.slice(1...
  function H (line 1) | function H(e,t,n){var r=$e.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3...
  function F (line 1) | function F(e,t,n,r,o){var i,a=0;for(i=n===(r?"border":"content")?4:"widt...
  function P (line 1) | function P(e,t,n){var r,o=!0,i=st(e),a="border-box"===de.css(e,"boxSizin...
  function I (line 1) | function I(e,t,n,r,o){return new I.prototype.init(e,t,n,r,o)}
  function R (line 1) | function R(){dt&&(e.requestAnimationFrame(R),de.fx.tick())}
  function M (line 1) | function M(){return e.setTimeout(function(){ht=void 0}),ht=de.now()}
  function $ (line 1) | function $(e,t){var n,r=0,o={height:e};for(t=t?1:0;r<4;r+=2-t)n=_e[r],o[...
  function _ (line 1) | function _(e,t,n){for(var r,o=(U.tweeners[t]||[]).concat(U.tweeners["*"]...
  function W (line 1) | function W(e,t,n){var r,o,i,a,s,u,l,c,f="width"in t||"height"in t,p=this...
  function B (line 1) | function B(e,t){var n,r,o,i,a;for(n in e)if(r=de.camelCase(n),o=t[r],i=e...
  function U (line 1) | function U(e,t,n){var r,o,i=0,a=U.prefilters.length,s=de.Deferred().alwa...
  function z (line 1) | function z(e){var t=e.match(qe)||[];return t.join(" ")}
  function X (line 1) | function X(e){return e.getAttribute&&e.getAttribute("class")||""}
  function K (line 1) | function K(e,t,n,r){var o;if(de.isArray(t))de.each(t,function(t,o){n||Et...
  function V (line 1) | function V(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r...
  function G (line 1) | function G(e,t,n,r){function o(s){var u;return i[s]=!0,de.each(e[s]||[],...
  function Y (line 1) | function Y(e,t){var n,r,o=de.ajaxSettings.flatOptions||{};for(n in t)voi...
  function Q (line 1) | function Q(e,t,n){for(var r,o,i,a,s=e.contents,u=e.dataTypes;"*"===u[0];...
  function J (line 1) | function J(e,t,n,r){var o,i,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for...
  function Z (line 1) | function Z(e){return de.isWindow(e)?e:9===e.nodeType&&e.defaultView}
  function t (line 1) | function t(e,t,n,r){var o,i,a,s,u,l,c,p=t&&t.ownerDocument,d=t?t.nodeTyp...
  function n (line 1) | function n(){function e(n,r){return t.push(n+" ")>T.cacheLength&&delete ...
  function r (line 1) | function r(e){return e[$]=!0,e}
  function o (line 1) | function o(e){var t=L.createElement("fieldset");try{return!!e(t)}catch(e...
  function i (line 1) | function i(e,t){for(var n=e.split("|"),r=n.length;r--;)T.attrHandle[n[r]...
  function a (line 1) | function a(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.source...
  function s (line 1) | function s(e){return function(t){var n=t.nodeName.toLowerCase();return"i...
  function u (line 1) | function u(e){return function(t){var n=t.nodeName.toLowerCase();return("...
  function l (line 1) | function l(e){return function(t){return"form"in t?t.parentNode&&t.disabl...
  function c (line 1) | function c(e){return r(function(t){return t=+t,r(function(n,r){for(var o...
  function f (line 1) | function f(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}
  function p (line 1) | function p(){}
  function h (line 1) | function h(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}
  function d (line 1) | function d(e,t,n){var r=t.dir,o=t.next,i=o||r,a=n&&"parentNode"===i,s=B+...
  function g (line 1) | function g(e){return e.length>1?function(t,n,r){for(var o=e.length;o--;)...
  function m (line 1) | function m(e,n,r){for(var o=0,i=n.length;o<i;o++)t(e,n[o],r);return r}
  function v (line 1) | function v(e,t,n,r,o){for(var i,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(i...
  function y (line 1) | function y(e,t,n,o,i,a){return o&&!o[$]&&(o=y(o)),i&&!i[$]&&(i=y(i,a)),r...
  function b (line 1) | function b(e){for(var t,n,r,o=e.length,i=T.relative[e[0].type],a=i||T.re...
  function x (line 1) | function x(e,n){var o=n.length>0,i=e.length>0,a=function(r,a,s,u,l){var ...
  function i (line 2) | function i(t,n,r,o){return function(){var l=this,c=arguments,f=function(...
  function t (line 2) | function t(){if(s){s.style.cssText="box-sizing:border-box;position:relat...
  function r (line 3) | function r(t,n,r,s){var l,p,h,x,w,C=n;c||(c=!0,u&&e.clearTimeout(u),o=vo...
  function o (line 3) | function o(e,t,n){return e.addEventListener?void e.addEventListener(t,n,...
  function i (line 3) | function i(e){if("keypress"==e.type){var t=String.fromCharCode(e.which);...
  function a (line 3) | function a(e,t){return e.sort().join(",")===t.sort().join(",")}
  function s (line 3) | function s(e){var t=[];return e.shiftKey&&t.push("shift"),e.altKey&&t.pu...
  function u (line 3) | function u(e){return e.preventDefault?void e.preventDefault():void(e.ret...
  function l (line 3) | function l(e){return e.stopPropagation?void e.stopPropagation():void(e.c...
  function c (line 3) | function c(e){return"shift"==e||"ctrl"==e||"alt"==e||"meta"==e}
  function f (line 3) | function f(){if(!v){v={};for(var e in y)e>95&&e<112||y.hasOwnProperty(e)...
  function p (line 3) | function p(e,t,n){return n||(n=f()[e]?"keydown":"keypress"),"keypress"==...
  function h (line 3) | function h(e){return"+"===e?["+"]:(e=e.replace(/\+{2}/g,"+plus"),e.split...
  function d (line 3) | function d(e,t){var n,r,o,i=[];for(n=h(e),o=0;o<n.length;++o)r=n[o],w[r]...
  function g (line 3) | function g(e,t){return null!==e&&e!==n&&(e===t||g(e.parentNode,t))}
  function m (line 3) | function m(e){function t(e){e=e||{};var t,n=!1;for(t in x)e[t]?n=!0:x[t]...
  function o (line 3) | function o(e){throw new RangeError(L[e])}
  function i (line 3) | function i(e,t){for(var n=e.length,r=[];n--;)r[n]=t(e[n]);return r}
  function a (line 3) | function a(e,t){var n=e.split("@"),r="";n.length>1&&(r=n[0]+"@",e=n[1]),...
  function s (line 3) | function s(e){for(var t,n,r=[],o=0,i=e.length;o<i;)t=e.charCodeAt(o++),t...
  function u (line 3) | function u(e){return i(e,function(e){var t="";return e>65535&&(e-=65536,...
  function l (line 3) | function l(e){return e-48<10?e-22:e-65<26?e-65:e-97<26?e-97:C}
  function c (line 3) | function c(e,t){return e+22+75*(e<26)-((0!=t)<<5)}
  function f (line 3) | function f(e,t,n){var r=0;for(e=n?F(e/E):e>>1,e+=F(e/t);e>H*k>>1;r+=C)e=...
  function p (line 3) | function p(e){var t,n,r,i,a,s,c,p,h,d,g=[],m=e.length,v=0,y=S,b=N;for(n=...
  function h (line 3) | function h(e){var t,n,r,i,a,u,l,p,h,d,g,m,v,y,b,x=[];for(e=s(e),m=e.leng...
  function d (line 3) | function d(e){return a(e,function(e){return q.test(e)?p(e.slice(4).toLow...
  function g (line 3) | function g(e){return a(e,function(e){return D.test(e)?"xn--"+h(e):e})}
  function r (line 3) | function r(e,t){return Object.prototype.hasOwnProperty.call(e,t)}
  function r (line 4) | function r(e,t){if(e.map)return e.map(t);for(var n=[],r=0;r<e.length;r++...
  function r (line 4) | function r(){this.protocol=null,this.slashes=null,this.auth=null,this.ho...
  function o (line 4) | function o(e,t,n){if(e&&l.isObject(e)&&e instanceof r)return e;var o=new...
  function i (line 4) | function i(e){return l.isString(e)&&(e=o(e)),e instanceof r?e.format():r...
  function a (line 4) | function a(e,t){return o(e,!1,!0).resolve(t)}
  function s (line 4) | function s(e,t){return e?o(e,!1,!0).resolveObject(t):t}
  function r (line 4) | function r(e){var t=a(e.currentTarget).parent().find(".dropdown-menu");t...
  function o (line 4) | function o(e){a(".dropdown-menu").removeClass("open")}
  function i (line 4) | function i(){a(document).on("click",".toggle-dropdown",r),a(document).on...
  function r (line 4) | function r(){s.init(),i.init(),o.init(),a.init(),u.createButton({index:0...
  function r (line 4) | function r(e,t){i.bind(e,function(e){return t(),!1})}
  function o (line 4) | function o(){r(["right"],function(e){a.goNext()}),r(["left"],function(e)...
  function r (line 4) | function r(e){return o.state.$book.addClass("is-loading"),e.always(funct...
  function r (line 4) | function r(){return w(k.isSmallScreen()?".book-body":".body-inner")}
  function o (line 4) | function o(e){var t=r(),n=0;i(e)&&(e&&(n=a(e)),t.unbind("scroll"),t.anim...
  function i (line 4) | function i(e){var t=r(),n=t.find(e);return!!n.length}
  function a (line 4) | function a(e){var t=r(),n=t.find(".page-inner"),o=t.find(e),i=o.offsetPa...
  function s (line 4) | function s(e,t){if(e||t||(e=b.first()),t&&(e=b.length>1?b.filter(functio...
  function u (line 4) | function u(e){var t=e.children("a"),n=t.attr("href").split("#")[1];retur...
  function l (line 4) | function l(){var e=r(),t=e.scrollTop(),n=e.prop("scrollHeight"),o=e.prop...
  function c (line 4) | function c(e,t){var n=C.parse(N),r=C.resolve(window.location.pathname,e)...
  function f (line 4) | function f(){var e,t;e=parseInt(w(".body-inner").css("width"),10),t=pars...
  function p (line 4) | function p(e){var t=w(".book-body"),n=t.find(".body-inner"),o=n.find(".p...
  function h (line 4) | function h(e){return 0===e.button}
  function d (line 4) | function d(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}
  function g (line 4) | function g(e){var t=w(this),n=t.attr("target");if(!d(e)&&h(e)&&!n){e.sto...
  function m (line 4) | function m(){var e=w(".navigation-next").attr("href");e&&c(e,!0)}
  function v (line 4) | function v(){var e=w(".navigation-prev").attr("href");e&&c(e,!0)}
  function y (line 4) | function y(){w.ajaxSetup({cache:!1}),history.replaceState({path:window.l...
  function r (line 4) | function r(e,t){null!=l.state&&o()==e||(null==t&&(t=!0),l.state.$book.to...
  function o (line 4) | function o(){return l.state.$book.hasClass("with-summary")}
  function i (line 4) | function i(){u.isMobile()||r(l.storage.get("sidebar",!0),!1),s(document)...
  function a (line 4) | function a(e){var t=s(".book-summary");t.find("li").each(function(){var ...
  function r (line 4) | function r(){return"btn-"+g++}
  function o (line 4) | function o(e,t,n,r){var o=e.children(t).length;n<0&&(n=Math.max(0,o+1+n)...
  function i (line 4) | function i(e){e.preventDefault()}
  function a (line 4) | function a(e){var t=p("<div>",{class:"dropdown-menu",html:'<div class="d...
  function s (line 4) | function s(e){return e=p.extend({label:"",icon:"",text:"",position:"left...
  function u (line 4) | function u(e){var t,n=p(".book-header"),r=n.find("h1"),i="pull-"+e.posit...
  function l (line 4) | function l(){p(".js-toolbar-action").remove(),d.forEach(u)}
  function c (line 4) | function c(e){d=p.grep(d,function(t){return t.id!=e}),l()}
  function f (line 4) | function f(e){d=p.grep(d,function(t){return e.indexOf(t.id)==-1}),l()}

FILE: lib/certMgr.js
  function doGenerate (line 32) | function doGenerate(overwrite) {

FILE: lib/configUtil.js
  constant USER_HOME (line 7) | const USER_HOME = process.env.HOME || process.env.USERPROFILE;
  constant DEFAULT_ANYPROXY_HOME (line 8) | const DEFAULT_ANYPROXY_HOME = path.join(USER_HOME, '/.anyproxy/');

FILE: lib/httpsServerMgr.js
  function createHttpsSNIServer (line 24) | function createHttpsSNIServer(port, handler) {
  function createHttpsIPServer (line 78) | function createHttpsIPServer(ip, port, handler) {
  class httpsServerMgr (line 95) | class httpsServerMgr {
    method constructor (line 96) | constructor(config) {
    method getSharedHttpsServer (line 107) | getSharedHttpsServer(hostname) {
    method close (line 158) | close() {

FILE: lib/log.js
  function setPrintStatus (line 16) | function setPrintStatus(status) {
  function setLogLevel (line 20) | function setLogLevel(level) {
  function printLog (line 24) | function printLog(content, type) {

FILE: lib/recorder.js
  constant BODY_FILE_PRFIX (line 29) | const BODY_FILE_PRFIX = 'res_body_';
  constant WS_MESSAGE_FILE_PRFIX (line 30) | const WS_MESSAGE_FILE_PRFIX = 'ws_message_';
  constant CACHE_DIR_PREFIX (line 31) | const CACHE_DIR_PREFIX = 'cache_r';
  function getCacheDir (line 32) | function getCacheDir() {
  function normalizeInfo (line 40) | function normalizeInfo(id, info) {
  class Recorder (line 83) | class Recorder extends events.EventEmitter {
    method constructor (line 84) | constructor(config) {
    method setDbAutoCompact (line 93) | setDbAutoCompact() {
    method stopDbAutoCompact (line 97) | stopDbAutoCompact() {
    method emitUpdate (line 105) | emitUpdate(id, info) {
    method emitUpdateLatestWsMessage (line 118) | emitUpdateLatestWsMessage(id, message) {
    method updateRecord (line 122) | updateRecord(id, info) {
    method updateRecordWsMessage (line 139) | updateRecordWsMessage(id, message) {
    method updateExtInfo (line 157) | updateExtInfo(id, extInfo) {
    method appendRecord (line 168) | appendRecord(info) {
    method updateRecordBody (line 184) | updateRecordBody(id, info) {
    method getBody (line 202) | getBody(id, cb) {
    method getDecodedBody (line 224) | getDecodedBody(id, cb) {
    method getDecodedWsMessage (line 286) | getDecodedWsMessage(id, cb) {
    method getSingleRecord (line 323) | getSingleRecord(id, cb) {
    method getSummaryList (line 329) | getSummaryList(cb) {
    method getRecords (line 335) | getRecords(idStart, limit, cb) {
    method clear (line 346) | clear() {
    method getCacheFile (line 352) | getCacheFile(fileName, cb) {

FILE: lib/requestErrorHandler.js
  function getCertErrorContent (line 16) | function getCertErrorContent(error, fullUrl) {
  function getDefaultErrorCotent (line 50) | function getDefaultErrorCotent(error, fullUrl) {

FILE: lib/requestHandler.js
  constant DEFAULT_CHUNK_COLLECT_THRESHOLD (line 24) | const DEFAULT_CHUNK_COLLECT_THRESHOLD = 20 * 1024 * 1024;
  class CommonReadableStream (line 26) | class CommonReadableStream extends Readable {
    method constructor (line 27) | constructor(config) {
    method _read (line 32) | _read(size) {
  function fetchRemoteResponse (line 66) | function fetchRemoteResponse(protocol, options, reqData, config) {
  function getWsReqInfo (line 215) | function getWsReqInfo(wsReq) {
  function getUserReqHandler (line 262) | function getUserReqHandler(userRule, recorder) {
  function getConnectReqHandler (line 525) | function getConnectReqHandler(userRule, recorder, httpsServerMgr) {
  function getWsHandler (line 704) | function getWsHandler(userRule, recorder, wsClient, wsReq) {
  class RequestHandler (line 855) | class RequestHandler {
    method constructor (line 868) | constructor(config, rule, recorder) {

FILE: lib/ruleLoader.js
  function cacheRemoteFile (line 16) | function cacheRemoteFile(url) {
  function loadLocalPath (line 42) | function loadLocalPath(filePath) {
  function requireModule (line 60) | function requireModule(urlOrPath) {

FILE: lib/rule_default.js
  method beforeSendRequest (line 20) | *beforeSendRequest(requestDetail) {
  method beforeSendResponse (line 31) | *beforeSendResponse(requestDetail, responseDetail) {
  method beforeDealHttpsRequest (line 43) | *beforeDealHttpsRequest(requestDetail) {
  method onError (line 54) | *onError(requestDetail, error) {
  method onConnectError (line 66) | *onConnectError(requestDetail, error) {
  method onClientSocketError (line 78) | *onClientSocketError(requestDetail, error) {

FILE: lib/systemProxyMgr.js
  function execSync (line 7) | function execSync(cmd) {

FILE: lib/util.js
  function getUserHome (line 34) | function getUserHome() {
  function getAnyProxyHome (line 39) | function getAnyProxyHome() {
  function deleteFolderContentsRecursive (line 224) | function deleteFolderContentsRecursive(dirPath, ifClearFolderItself) {

FILE: lib/webInterface.js
  constant DEFAULT_WEB_PORT (line 18) | const DEFAULT_WEB_PORT = 8002;
  constant MAX_CONTENT_SIZE (line 22) | const MAX_CONTENT_SIZE = 1024 * 2000;
  class webInterface (line 31) | class webInterface extends events.EventEmitter {
    method constructor (line 41) | constructor(config, recorder) {
    method getServer (line 59) | getServer() {
    method start (line 297) | start() {
    method close (line 309) | close() {

FILE: lib/wsServer.js
  function resToMsg (line 8) | function resToMsg(msg, recorder, cb) {
  class wsServer (line 51) | class wsServer {
    method constructor (line 52) | constructor(config, recorder) {
    method start (line 65) | start() {
    method closeAll (line 163) | closeAll() {

FILE: lib/wsServerMgr.js
  function getWsServer (line 16) | function getWsServer(config) {

FILE: proxy.js
  constant T_TYPE_HTTP (line 17) | const T_TYPE_HTTP = 'http',
  constant T_TYPE_HTTPS (line 17) | const T_TYPE_HTTP = 'http',
  constant DEFAULT_TYPE (line 17) | const T_TYPE_HTTP = 'http',
  constant PROXY_STATUS_INIT (line 21) | const PROXY_STATUS_INIT = 'INIT';
  constant PROXY_STATUS_READY (line 22) | const PROXY_STATUS_READY = 'READY';
  constant PROXY_STATUS_CLOSED (line 23) | const PROXY_STATUS_CLOSED = 'CLOSED';
  class ProxyCore (line 30) | class ProxyCore extends events.EventEmitter {
    method constructor (line 48) | constructor(config) {
    method handleExistConnections (line 116) | handleExistConnections(socket) {
    method start (line 134) | start() {
    method close (line 238) | close() {
  class ProxyServer (line 289) | class ProxyServer extends ProxyCore {
    method constructor (line 297) | constructor(config) {
    method start (line 311) | start() {
    method close (line 333) | close() {

FILE: rule_sample/sample_modify_request_data.js
  method beforeSendRequest (line 11) | *beforeSendRequest(requestDetail) {

FILE: rule_sample/sample_modify_request_header.js
  method beforeSendRequest (line 8) | *beforeSendRequest(requestDetail) {

FILE: rule_sample/sample_modify_request_path.js
  method beforeSendRequest (line 10) | *beforeSendRequest(requestDetail) {
  method beforeDealHttpsRequest (line 21) | *beforeDealHttpsRequest(requestDetail) {

FILE: rule_sample/sample_modify_request_protocol.js
  method beforeSendRequest (line 10) | *beforeSendRequest(requestDetail) {

FILE: rule_sample/sample_modify_response_data.js
  method beforeSendResponse (line 11) | *beforeSendResponse(requestDetail, responseDetail) {

FILE: rule_sample/sample_modify_response_header.js
  method beforeSendResponse (line 10) | *beforeSendResponse(requestDetail, responseDetail) {

FILE: rule_sample/sample_modify_response_statuscode.js
  method beforeSendResponse (line 10) | *beforeSendResponse(requestDetail, responseDetail) {

FILE: rule_sample/sample_use_local_response.js
  method beforeSendRequest (line 8) | *beforeSendRequest(requestDetail) {

FILE: test/basic.spec.js
  function doProxyWebSocket (line 29) | function doProxyWebSocket(url, headers = {}) {

FILE: test/rule/beforeDealHttpsRequest.spec.js
  constant RULE_PAYLOAD (line 5) | const RULE_PAYLOAD = 'this is something in rule';
  method beforeSendRequest (line 8) | *beforeSendRequest(requestDetail) {
  method beforeDealHttpsRequest (line 16) | *beforeDealHttpsRequest(requestDetail) {

FILE: test/rule/beforeSendRequest.spec.js
  constant RULE_PAYLOAD (line 5) | const RULE_PAYLOAD = 'this is something in rule';
  constant RULE_REPLACE_HEADER_KEY (line 6) | const RULE_REPLACE_HEADER_KEY = 'rule_replace_header_key';
  constant RULE_REPLACE_HEADER_VALUE (line 7) | const RULE_REPLACE_HEADER_VALUE = 'rule_replace_header_value';
  method beforeSendRequest (line 10) | *beforeSendRequest(requestDetail) {

FILE: test/rule/beforeSendResponse.js
  constant RULE_REPLACE_HEADER_KEY (line 3) | const RULE_REPLACE_HEADER_KEY = 'rule_replace_header_key';
  constant RULE_REPLACE_HEADER_VALUE (line 4) | const RULE_REPLACE_HEADER_VALUE = 'rule_replace_header_value';
  constant RULE_REPLACE_BODY (line 5) | const RULE_REPLACE_BODY = 'RULE_REPLACE_BODY';
  method beforeSendResponse (line 7) | *beforeSendResponse(requestDetail, responseDetail) {

FILE: test/rule/onError.spec.js
  constant ERROR_PAGE_IN_RULE (line 6) | const ERROR_PAGE_IN_RULE = 'this is my error page';
  method onError (line 9) | *onError(requestDetail, error) {
  method beforeDealHttpsRequest (line 19) | *beforeDealHttpsRequest(requestDetail) {

FILE: test/util.js
  function basicProxyRequest (line 6) | function basicProxyRequest(proxyHost, method, url, headers, qs, payload) {
  constant DEFAULT_OPTIONS (line 42) | const DEFAULT_OPTIONS = {
  function proxyServerWithRule (line 53) | async function proxyServerWithRule(rule, overrideConfig) {

FILE: web/src/action/globalStatusAction.js
  constant STOP_RECORDING (line 1) | const STOP_RECORDING = 'STOP_RECORDING';
  constant RESUME_RECORDING (line 2) | const RESUME_RECORDING = 'RESUME_RECORDING';
  constant SHOW_FILTER (line 3) | const SHOW_FILTER = 'SHOW_FILTER';
  constant HIDE_FILTER (line 4) | const HIDE_FILTER = 'HIDE_FILTER';
  constant UPDATE_FILTER (line 5) | const UPDATE_FILTER = 'UPDATE_FILTER';
  constant SHOW_MAP_LOCAL (line 6) | const SHOW_MAP_LOCAL = 'SHOW_MAP_LOCAL';
  constant HIDE_MAP_LOCAL (line 7) | const HIDE_MAP_LOCAL = 'HIDE_MAP_LOCAL';
  constant FETCH_DIRECTORY (line 8) | const FETCH_DIRECTORY = 'FETCH_DIRECTORY';
  constant UPDATE_LOCAL_DIRECTORY (line 9) | const UPDATE_LOCAL_DIRECTORY = 'UPDATE_LOCAL_DIRECTORY';
  constant FETCH_MAPPED_CONFIG (line 10) | const FETCH_MAPPED_CONFIG = 'FETCH_MAPPED_CONFIG';
  constant UPDATE_LOCAL_MAPPED_CONFIG (line 11) | const UPDATE_LOCAL_MAPPED_CONFIG = 'UPDATE_LOCAL_MAPPED_CONFIG';
  constant UPDATE_REMOTE_MAPPED_CONFIG (line 12) | const UPDATE_REMOTE_MAPPED_CONFIG = 'UPDATE_REMOTE_MAPPED_CONFIG';
  constant UPDATE_ACTIVE_RECORD_ITEM (line 13) | const UPDATE_ACTIVE_RECORD_ITEM = 'UPDATE_ACTIVE_RECORD_ITEM';
  constant TOGGLE_REMOTE_INTERCEPT_HTTPS (line 15) | const TOGGLE_REMOTE_INTERCEPT_HTTPS = 'TOGGLE_REMOTE_INTERCEPT_HTTPS';
  constant UPDATE_LOCAL_INTERCEPT_HTTPS_FLAG (line 16) | const UPDATE_LOCAL_INTERCEPT_HTTPS_FLAG = 'UPDATE_LOCAL_INTERCEPT_HTTPS_...
  constant TOGGLE_REMORE_GLOBAL_PROXY_FLAG (line 18) | const TOGGLE_REMORE_GLOBAL_PROXY_FLAG = 'TOGGLE_REMORE_GLOBAL_PROXY_FLAG';
  constant UPDATE_LOCAL_GLOBAL_PROXY_FLAG (line 19) | const UPDATE_LOCAL_GLOBAL_PROXY_FLAG = 'UPDATE_LOCAL_GLOBAL_PROXY_FLAG';
  constant SHOW_ROOT_CA (line 21) | const SHOW_ROOT_CA = 'SHOW_ROOT_CA';
  constant HIDE_ROOT_CA (line 22) | const HIDE_ROOT_CA = 'HIDE_ROOT_CA';
  constant UPDATE_CAN_LOAD_MORE (line 24) | const UPDATE_CAN_LOAD_MORE = 'UPDATE_CAN_LOAD_MORE';
  constant INCREASE_DISPLAY_RECORD_LIST (line 25) | const INCREASE_DISPLAY_RECORD_LIST = 'INCREASE_DISPLAY_RECORD_LIST';
  constant UPDATE_SHOULD_CLEAR_RECORD (line 26) | const UPDATE_SHOULD_CLEAR_RECORD = 'UPDATE_SHOULD_CLEAR_RECORD';
  constant UPDATE_APP_VERSION (line 27) | const UPDATE_APP_VERSION = 'UPDATE_APP_VERSION';
  constant UPDATE_IS_ROOTCA_EXISTS (line 28) | const UPDATE_IS_ROOTCA_EXISTS = 'UPDATE_IS_ROOTCA_EXISTS';
  constant UPDATE_SHOW_NEW_RECORD_TIP (line 31) | const UPDATE_SHOW_NEW_RECORD_TIP = 'UPDATE_SHOW_NEW_RECORD_TIP';
  constant UPDATE_FETCHING_RECORD_STATUS (line 33) | const UPDATE_FETCHING_RECORD_STATUS = 'UPDATE_FETCHING_RECORD_STATUS';
  function stopRecording (line 35) | function stopRecording() {
  function resumeRecording (line 41) | function resumeRecording() {
  function showFilter (line 47) | function showFilter() {
  function hideFilter (line 53) | function hideFilter() {
  function updateFilter (line 59) | function updateFilter(filterStr) {
  function showMapLocal (line 66) | function showMapLocal() {
  function hideMapLocal (line 72) | function hideMapLocal() {
  function fetchDirectory (line 78) | function fetchDirectory(path) {
  function updateLocalDirectory (line 85) | function updateLocalDirectory(path, sub) {
  function fetchMappedConfig (line 95) | function fetchMappedConfig() {
  function updateLocalMappedConfig (line 101) | function updateLocalMappedConfig(config) {
  function updateRemoteMappedConfig (line 108) | function updateRemoteMappedConfig(config) {
  function updateActiveRecordItem (line 115) | function updateActiveRecordItem(id) {
  function updateLocalInterceptHttpsFlag (line 122) | function updateLocalInterceptHttpsFlag(flag) {
  function toggleRemoteInterceptHttpsFlag (line 129) | function toggleRemoteInterceptHttpsFlag(flag) {
  function toggleRemoteGlobalProxyFlag (line 136) | function toggleRemoteGlobalProxyFlag(flag) {
  function updateLocalGlobalProxyFlag (line 143) | function updateLocalGlobalProxyFlag(flag) {
  function showRootCA (line 150) | function showRootCA() {
  function hideRootCA (line 156) | function hideRootCA() {
  function updateCanLoadMore (line 162) | function updateCanLoadMore(canLoadMore) {
  function increaseDisplayRecordLimit (line 169) | function increaseDisplayRecordLimit(moreToAdd) {
  function updateShouldClearRecord (line 176) | function updateShouldClearRecord(shouldClear) {
  function updateLocalAppVersion (line 183) | function updateLocalAppVersion(version) {
  function updateShowNewRecordTip (line 190) | function updateShowNewRecordTip(shouldShow) {
  function updateIsRootCAExists (line 197) | function updateIsRootCAExists(exists) {
  function updateFechingRecordStatus (line 204) | function updateFechingRecordStatus(isFetching) {

FILE: web/src/action/recordAction.js
  constant FETCH_REQUEST_LOG (line 1) | const FETCH_REQUEST_LOG = 'FETCH_REQUEST_LOG';
  constant UPDATE_WHOLE_REQUEST (line 2) | const UPDATE_WHOLE_REQUEST = 'UPDATE_WHOLE_REQUEST';
  constant UPDATE_SINGLE_RECORD (line 3) | const UPDATE_SINGLE_RECORD = 'UPDATE_SINGLE_RECORD';
  constant CLEAR_ALL_RECORD (line 4) | const CLEAR_ALL_RECORD = 'CLEAR_ALL_RECORD';
  constant CLEAR_ALL_LOCAL_RECORD (line 5) | const CLEAR_ALL_LOCAL_RECORD = 'CLEAR_ALL_LOCAL_RECORD';
  constant FETCH_RECORD_DETAIL (line 6) | const FETCH_RECORD_DETAIL = 'FETCH_RECORD_DETAIL';
  constant SHOW_RECORD_DETAIL (line 7) | const SHOW_RECORD_DETAIL = 'SHOW_RECORD_DETAIL';
  constant HIDE_RECORD_DETAIL (line 8) | const HIDE_RECORD_DETAIL = 'HIDE_RECORD_DETAIL';
  constant UPDATE_MULTIPLE_RECORDS (line 9) | const UPDATE_MULTIPLE_RECORDS = 'UPDATE_MULTIPLE_RECORDS';
  function fetchRequestLog (line 11) | function fetchRequestLog() {
  function updateWholeRequest (line 17) | function updateWholeRequest(data) {
  function updateRecord (line 24) | function updateRecord(record) {
  function clearAllRecord (line 31) | function clearAllRecord () {
  function clearAllLocalRecord (line 37) | function clearAllLocalRecord () {
  function fetchRecordDetail (line 43) | function fetchRecordDetail (recordId) {
  function showRecordDetail (line 50) | function showRecordDetail (record) {
  function hideRecordDetail (line 57) | function hideRecordDetail () {
  function updateMultipleRecords (line 63) | function updateMultipleRecords (records) {

FILE: web/src/common/ApiUtil.js
  function getJSON (line 5) | function getJSON(url, data) {
  function postJSON (line 18) | function postJSON(url, data) {
  function serializeQuery (line 39) | function serializeQuery (data = {}) {
  function isApiSuccess (line 52) | function isApiSuccess (response) {

FILE: web/src/common/WsUtil.js
  function initWs (line 16) | function initWs(wsPort = location.port, path = 'do-not-proxy') {

FILE: web/src/common/apiUtil.js
  function getJSON (line 5) | function getJSON(url, data) {
  function postJSON (line 18) | function postJSON(url, data) {
  function serializeQuery (line 39) | function serializeQuery (data = {}) {
  function isApiSuccess (line 52) | function isApiSuccess (response) {

FILE: web/src/common/commonUtil.js
  function formatDate (line 10) | function formatDate(date, formatter) {
  function selectText (line 38) | function selectText(element) {
  function getQueryParameter (line 54) | function getQueryParameter (name) {

FILE: web/src/common/curlUtil.js
  method curlify (line 2) | curlify(recordDetail) {

FILE: web/src/common/promiseUtil.js
  function defer (line 5) | function defer() {

FILE: web/src/common/wsUtil.js
  function initWs (line 16) | function initWs(wsPort = location.port, path = 'do-not-proxy') {

FILE: web/src/component/download-root-ca.jsx
  class DownloadRootCA (line 19) | class DownloadRootCA extends React.Component {
    method constructor (line 20) | constructor () {
    method fetchData (line 36) | fetchData () {
    method onClose (line 56) | onClose () {
    method getQrCodeContent (line 60) | getQrCodeContent () {
    method getGenerateRootCADiv (line 73) | getGenerateRootCADiv () {
    method getDownloadDiv (line 117) | getDownloadDiv () {
    method componentDidMount (line 139) | componentDidMount () {
    method render (line 143) | render() {
  function select (line 155) | function select (state) {

FILE: web/src/component/header-menu.jsx
  class HeaderMenu (line 36) | class HeaderMenu extends React.Component {
    method constructor (line 37) | constructor() {
    method stopRecording (line 63) | stopRecording() {
    method resumeRecording (line 67) | resumeRecording() {
    method clearAllRecord (line 72) | clearAllRecord() {
    method handleRuningInfoVisibleChange (line 77) | handleRuningInfoVisibleChange(visible) {
    method showRunningInfo (line 83) | showRunningInfo() {
    method showFilter (line 89) | showFilter() {
    method togglerHttpsIntercept (line 93) | togglerHttpsIntercept() {
    method toggleGlobalProxyFlag (line 123) | toggleGlobalProxyFlag() {
    method initEvent (line 128) | initEvent() {
    method fetchData (line 136) | fetchData() {
    method componentDidMount (line 156) | componentDidMount() {
    method render (line 161) | render() {
  function select (line 283) | function select(state) {

FILE: web/src/component/json-viewer.jsx
  class JsonViewer (line 37) | class JsonViewer extends React.Component {
    method constructor (line 38) | constructor () {
    method handleMenuClick (line 53) | handleMenuClick(e) {
    method getMenuDiv (line 59) | getMenuDiv () {
    method render (line 68) | render () {

FILE: web/src/component/left-menu.jsx
  class LeftMenu (line 26) | class LeftMenu extends React.Component {
    method constructor (line 27) | constructor() {
    method showFilter (line 48) | showFilter() {
    method showRootCA (line 52) | showRootCA() {
    method render (line 56) | render() {
  function select (line 129) | function select(state) {

FILE: web/src/component/map-local.jsx
  class MapLocal (line 21) | class MapLocal extends React.Component {
    method constructor (line 22) | constructor () {
    method loadTreeNode (line 45) | loadTreeNode(node) {
    method loadMappedConfig (line 57) | loadMappedConfig() {
    method addMappedConfig (line 61) | addMappedConfig () {
    method removeMappedConfig (line 72) | removeMappedConfig (index) {
    method loopTreeNode (line 78) | loopTreeNode(nodes) {
    method onClose (line 94) | onClose () {
    method onNodeSelect (line 98) | onNodeSelect (selectedKeys, { selected, selectedNodes }) {
    method getFormDiv (line 109) | getFormDiv () {
    method getMappedConfigDiv (line 169) | getMappedConfigDiv () {
    method componentDidMount (line 205) | componentDidMount () {
    method render (line 210) | render() {
  function select (line 246) | function select (state) {

FILE: web/src/component/modal-panel.jsx
  class ModalPanel (line 14) | class ModalPanel extends React.Component {
    method constructor (line 15) | constructor () {
    method onDragbarMove (line 40) | onDragbarMove (event) {
    method onKeyUp (line 46) | onKeyUp (e) {
    method addKeyEvent (line 52) | addKeyEvent () {
    method removeKeyEvent (line 56) | removeKeyEvent () {
    method onDragbarMoveUp (line 60) | onDragbarMoveUp (event) {
    method onDragbarMoveDown (line 69) | onDragbarMoveDown (event) {
    method onClose (line 75) | onClose (event) {
    method doClose (line 81) | doClose () {
    method render (line 85) | render () {

FILE: web/src/component/record-detail.jsx
  class RecordDetail (line 24) | class RecordDetail extends React.Component {
    method constructor (line 25) | constructor() {
    method onClose (line 41) | onClose() {
    method onMenuChange (line 45) | onMenuChange(e) {
    method hasWebSocket (line 51) | hasWebSocket (recordDetail = {}) {
    method getRequestDiv (line 55) | getRequestDiv(recordDetail) {
    method getResponseDiv (line 59) | getResponseDiv(recordDetail) {
    method getWsMessageDiv (line 63) | getWsMessageDiv(recordDetail) {
    method getRecordContentDiv (line 67) | getRecordContentDiv(recordDetail = {}, fetchingRecord) {
    method getLoaingDiv (line 109) | getLoaingDiv() {
    method getRecordDetailDiv (line 118) | getRecordDetailDiv() {
    method componentWillReceiveProps (line 129) | componentWillReceiveProps(nextProps) {
    method render (line 140) | render() {

FILE: web/src/component/record-filter.jsx
  class RecordFilter (line 19) | class RecordFilter extends React.Component {
    method constructor (line 20) | constructor () {
    method onChange (line 32) | onChange (event) {
    method onClose (line 36) | onClose () {
    method render (line 40) | render() {
  function select (line 83) | function select (state) {

FILE: web/src/component/record-panel.jsx
  class RecordPanel (line 14) | class RecordPanel extends React.Component {
    method constructor (line 15) | constructor() {
    method getRecordDetail (line 38) | getRecordDetail(id) {
    method getNextDetail (line 44) | getNextDetail(cursor) {
    method onKeyUp (line 49) | onKeyUp(e) {
    method addKeyEvent (line 63) | addKeyEvent() {
    method getTrs (line 67) | getTrs() {
    method getLoadingPreviousDiv (line 104) | getLoadingPreviousDiv() {
    method getLoadingNextDiv (line 120) | getLoadingNextDiv() {
    method shouldComponentUpdate (line 134) | shouldComponentUpdate(nextProps) {
    method componentDidMount (line 146) | componentDidMount() {
    method render (line 150) | render() {

FILE: web/src/component/record-request-detail.jsx
  constant MAXIMUM_REQ_BODY_LENGTH (line 26) | const MAXIMUM_REQ_BODY_LENGTH = 10000;
  class RecordRequestDetail (line 28) | class RecordRequestDetail extends React.Component {
    method constructor (line 29) | constructor() {
    method onSelectText (line 41) | onSelectText(e) {
    method getLiDivs (line 45) | getLiDivs(targetObj) {
    method getCookieDiv (line 58) | getCookieDiv(cookies) {
    method getReqBodyDiv (line 109) | getReqBodyDiv() {
    method notify (line 130) | notify(message, type = 'info', duration = 1.6, opts = {}) {
    method copyCurlCmd (line 134) | copyCurlCmd() {
    method getRequestDiv (line 142) | getRequestDiv() {
    method render (line 208) | render() {

FILE: web/src/component/record-response-detail.jsx
  constant MAXIMUM_REQ_BODY_LENGTH (line 22) | const MAXIMUM_REQ_BODY_LENGTH = 10000;
  class RecordResponseDetail (line 24) | class RecordResponseDetail extends React.Component {
    method constructor (line 25) | constructor() {
    method onSelectText (line 37) | onSelectText(e) {
    method getLiDivs (line 41) | getLiDivs(targetObj) {
    method getImageBody (line 54) | getImageBody(recordDetail) {
    method getJsonBody (line 58) | getJsonBody(recordDetail) {
    method getResBodyDiv (line 62) | getResBodyDiv() {
    method getResponseDiv (line 94) | getResponseDiv(recordDetail) {
    method render (line 132) | render() {

FILE: web/src/component/record-row.jsx
  class RecordRow (line 14) | class RecordRow extends React.Component {
    method constructor (line 15) | constructor() {
    method getMethodDiv (line 28) | getMethodDiv(item) {
    method getCodeDiv (line 33) | getCodeDiv(item) {
    method shouldComponentUpdate (line 39) | shouldComponentUpdate(nextProps) {
    method render (line 48) | render() {

FILE: web/src/component/record-ws-message-detail.jsx
  class RecordWsMessageDetail (line 35) | class RecordWsMessageDetail extends React.Component {
    method constructor (line 36) | constructor() {
    method toggleRefresh (line 55) | toggleRefresh () {
    method receiveNewMessage (line 63) | receiveNewMessage (message) {
    method getMessageList (line 74) | getMessageList () {
    method refreshPage (line 87) | refreshPage () {
    method onMessageHandler (line 94) | onMessageHandler (event) {
    method componentDidUpdate (line 105) | componentDidUpdate () {
    method componentWillUnmount (line 109) | componentWillUnmount () {
    method componentDidMount (line 113) | componentDidMount () {
    method render (line 122) | render() {

FILE: web/src/component/resizable-panel.jsx
  class ResizablePanel (line 14) | class ResizablePanel extends React.Component {
    method constructor (line 15) | constructor () {
    method onDragbarMove (line 37) | onDragbarMove (event) {
    method onKeyUp (line 43) | onKeyUp (e) {
    method addKeyEvent (line 49) | addKeyEvent () {
    method removeKeyEvent (line 53) | removeKeyEvent () {
    method onDragbarMoveUp (line 57) | onDragbarMoveUp (event) {
    method onDragbarMoveDown (line 66) | onDragbarMoveDown (event) {
    method doClose (line 72) | doClose () {
    method render (line 76) | render () {

FILE: web/src/component/table-panel.jsx
  class TablePanel (line 16) | class TablePanel extends React.Component {
    method constructor (line 17) | constructor () {
    method getTr (line 27) | getTr () {
    method render (line 30) | render () {

FILE: web/src/component/title-bar.jsx
  class TitleBar (line 12) | class TitleBar extends React.Component {
    method constructor (line 13) | constructor () {
    method render (line 25) | render() {

FILE: web/src/component/ws-listener.jsx
  class WsListener (line 33) | class WsListener extends React.Component {
    method constructor (line 34) | constructor() {
    method loadPrevious (line 57) | loadPrevious() {
    method loadNext (line 65) | loadNext() {
    method stopPanelRefreshing (line 73) | stopPanelRefreshing() {
    method resumePanelRefreshing (line 81) | resumePanelRefreshing() {
    method onWsMessage (line 91) | onWsMessage(event) {
    method initWs (line 142) | initWs() {
    method componentDidMount (line 151) | componentDidMount() {
    method componentWillReceiveProps (line 176) | componentWillReceiveProps(nextProps) {
    method render (line 192) | render() {

FILE: web/src/index.jsx
  class App (line 36) | class App extends React.Component {
    method constructor (line 37) | constructor() {
    method stopRefresh (line 70) | stopRefresh() {
    method resumeFresh (line 78) | resumeFresh() {
    method onResizePanelClose (line 86) | onResizePanelClose() {
    method detectIfToStopRefreshing (line 93) | detectIfToStopRefreshing(currentScrollTop) {
    method initRecrodPanelWrapperRef (line 107) | initRecrodPanelWrapperRef(ref) {
    method scrollHandler (line 112) | scrollHandler() {
    method onRecordScroll (line 154) | onRecordScroll() {
    method getResumeFreshDiv (line 161) | getResumeFreshDiv() {
    method getMiddlePanel (line 176) | getMiddlePanel() {
    method componentWillReceiveProps (line 206) | componentWillReceiveProps(nextProps) {
    method componentDidUpdate (line 237) | componentDidUpdate() {
    method componentDidMount (line 243) | componentDidMount() {
    method render (line 249) | render() {
  function select (line 298) | function select(state) {

FILE: web/src/reducer/globalStatusReducer.js
  function getTreeMap (line 56) | function getTreeMap(path, sub) {
  function requestListReducer (line 84) | function requestListReducer(state = defaultStatus, action) {

FILE: web/src/reducer/requestRecordReducer.js
  function requestListReducer (line 25) | function requestListReducer (state = defaultState, action) {
Condensed preview — 165 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,706K chars).
[
  {
    "path": ".eslintignore",
    "chars": 45,
    "preview": "node_modules\ndist\nweb\nweb2\nresource\n*.sh\ndocs"
  },
  {
    "path": ".eslintrc",
    "chars": 2083,
    "preview": "{\n  \"extends\": \"airbnb\",\n  \"parser\": \"babel-eslint\",\n  \"env\": {\n    \"browser\": true,\n    \"node\": true,\n    \"es6\": true,\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE.md",
    "chars": 466,
    "preview": "<!-- Issue Template -->\nPlese fill the template when you reporting a new issue, thanks!\n<!-- 请在提交Issue的同时,附带如下信息,方便我们定位,"
  },
  {
    "path": ".gitignore",
    "chars": 430,
    "preview": "cert/**/*.srl\ncert/**/*.key\ncert/**/*.crt\ncert/**/*.csr\nweb/build/.module-cache/\ntest/report/*.txt\ntmp.txt\n.*.swp\n._*\n.D"
  },
  {
    "path": ".npmignore",
    "chars": 285,
    "preview": "cert/**/*.srl\ncert/**/*.key\ncert/**/*.crt\ncert/**/*.csr\nweb/build/.module-cache/\ntmp.txt\n.*.swp\n._*\n.DS_Store\n.git\n.hg\n."
  },
  {
    "path": ".travis.yml",
    "chars": 78,
    "preview": "language: node_js\nnode_js:\n  - 12\nbefore_script:\n  - node ./bin/anyproxy-ca -g"
  },
  {
    "path": "CHANGELOG",
    "chars": 3242,
    "preview": "22 Dec 2016: AnyProxy 4.0.0-beta:\n\n    * to AnyProxy rules: all the rule interfaces are asynchronous now, you can write "
  },
  {
    "path": "LICENSE",
    "chars": 11357,
    "preview": "\n                                 Apache License\n                           Version 2.0, January 2004\n                  "
  },
  {
    "path": "README.md",
    "chars": 1083,
    "preview": "AnyProxy\n----------------\n\n[![NPM version][npm-image]][npm-url]\n[![node version][node-image]][node-url]\n[![npm download]"
  },
  {
    "path": "babel.config.js",
    "chars": 153,
    "preview": "if (process.env.NODE_ENV === 'test') {\n  module.exports = {};\n} else {\n  module.exports = {\n    presets: [\n      'es2015"
  },
  {
    "path": "bin/anyproxy",
    "chars": 1562,
    "preview": "#!/usr/bin/env node\n\n'use strict';\n\nconst program = require('commander'),\n  color = require('colorful'),\n  co = require("
  },
  {
    "path": "bin/anyproxy-ca",
    "chars": 2916,
    "preview": "#!/usr/bin/env node\n\n'use strict'\n\n// exist-false, trusted-false : create CA\n// exist-true,  trusted-false : trust CA\n//"
  },
  {
    "path": "bin/rootCACheck.js",
    "chars": 782,
    "preview": "/**\n* check if root CA exists and installed\n* will prompt to generate when needed\n*/\n\nconst thunkify = require('thunkify"
  },
  {
    "path": "bin/startServer.js",
    "chars": 2161,
    "preview": "/**\n* start the AnyProxy server\n*/\n\nconst ruleLoader = require('../lib/ruleLoader');\nconst logUtil = require('../lib/log"
  },
  {
    "path": "build_scripts/build-doc-site.sh",
    "chars": 357,
    "preview": "#!/bin/bash\n\n## get into the \"build_scripts\" folder regardless of the excution directory\nparent_path=$( cd \"$(dirname \"$"
  },
  {
    "path": "build_scripts/prebuild-doc.js",
    "chars": 1959,
    "preview": "const fs = require('fs');\nconst path = require('path');\n\nconst textTpl = [\n  '```bash',\n  'anyproxy --rule {{url}}',\n  '"
  },
  {
    "path": "docs/CNAME",
    "chars": 11,
    "preview": "anyproxy.io"
  },
  {
    "path": "docs/README.md",
    "chars": 106,
    "preview": "# THIS IS AUTO GENERATED FILE, DO NOT EDIT THE HTML DIRECTLY.\n# YOU CAN EDIT THE SOURCE IN docs-md FOLDER\n"
  },
  {
    "path": "docs/assets/auto-lang.js",
    "chars": 452,
    "preview": "/* eslint no-var: off */\n/**\n* detect if the browser is in UTF-8 zone\n* @return boolean\n*/\nfunction isUTF8Zone() {\n  ret"
  },
  {
    "path": "docs/assets/main.js",
    "chars": 310,
    "preview": "/* eslint no-var: off */\nfunction injectBaiduStatic() {\n  var _hmt = _hmt || [];\n  var hm = document.createElement('scri"
  },
  {
    "path": "docs/assets/website.css",
    "chars": 738,
    "preview": ".book .book-summary ul.summary li.active>a, .book .book-summary ul.summary li a:hover {\n  color: #008cff;\n  background: "
  },
  {
    "path": "docs/cn/index.html",
    "chars": 79182,
    "preview": "\n<!DOCTYPE HTML>\n<html lang=\"cn\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=u"
  },
  {
    "path": "docs/cn/search_index.json",
    "chars": 174919,
    "preview": "{\"index\":{\"version\":\"0.5.12\",\"fields\":[{\"name\":\"title\",\"boost\":10},{\"name\":\"keywords\",\"boost\":15},{\"name\":\"body\",\"boost\""
  },
  {
    "path": "docs/cn/src_doc.md",
    "chars": 15197,
    "preview": "AnyProxy\n===================\n\n> 本文档的适用范围是AnyProxy 4.0,欢迎提供反馈\n\nRef: [English Doc](../en)\n\nAnyProxy是一个开放式的HTTP代理服务器。\n\nGith"
  },
  {
    "path": "docs/en/index.html",
    "chars": 62617,
    "preview": "\n<!DOCTYPE HTML>\n<html lang=\"en\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=u"
  },
  {
    "path": "docs/en/search_index.json",
    "chars": 216924,
    "preview": "{\"index\":{\"version\":\"0.5.12\",\"fields\":[{\"name\":\"title\",\"boost\":10},{\"name\":\"keywords\",\"boost\":15},{\"name\":\"body\",\"boost\""
  },
  {
    "path": "docs/en/src_doc.md",
    "chars": 20886,
    "preview": "AnyProxy\n===================\n\nAnyProxy is a fully configurable http/https proxy in NodeJS.\n\nRef: [中文文档](../cn)\n\nGithub:\n"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-fontsettings/fontsettings.js",
    "chars": 6447,
    "preview": "require(['gitbook', 'jquery'], function(gitbook, $) {\n    // Configuration\n    var MAX_SIZE       = 4,\n        MIN_SIZE "
  },
  {
    "path": "docs/gitbook/gitbook-plugin-fontsettings/website.css",
    "chars": 8596,
    "preview": "/*\n * Theme 1\n */\n.color-theme-1 .dropdown-menu {\n  background-color: #111111;\n  border-color: #7e888b;\n}\n.color-theme-1"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-highlight/ebook.css",
    "chars": 2865,
    "preview": "pre,\ncode {\n  /* http://jmblog.github.io/color-themes-for-highlightjs */\n  /* Tomorrow Comment */\n  /* Tomorrow Red */\n "
  },
  {
    "path": "docs/gitbook/gitbook-plugin-highlight/website.css",
    "chars": 31446,
    "preview": ".book .book-body .page-wrapper .page-inner section.normal pre,\n.book .book-body .page-wrapper .page-inner section.normal"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-lunr/search-lunr.js",
    "chars": 1616,
    "preview": "require([\n    'gitbook',\n    'jquery'\n], function(gitbook, $) {\n    // Define global search engine\n    function LunrSear"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-search/search-engine.js",
    "chars": 1268,
    "preview": "require([\n    'gitbook',\n    'jquery'\n], function(gitbook, $) {\n    // Global search objects\n    var engine      = null;"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-search/search.css",
    "chars": 974,
    "preview": "/*\n    This CSS only styled the search results section, not the search input\n    It defines the basic interraction to hi"
  },
  {
    "path": "docs/gitbook/gitbook-plugin-search/search.js",
    "chars": 6368,
    "preview": "require([\n    'gitbook',\n    'jquery'\n], function(gitbook, $) {\n    var MAX_RESULTS = 15;\n    var MAX_DESCRIPTION_SIZE ="
  },
  {
    "path": "docs/gitbook/gitbook-plugin-sharing/buttons.js",
    "chars": 2875,
    "preview": "require(['gitbook', 'jquery'], function(gitbook, $) {\n    var SITES = {\n        'facebook': {\n            'label': 'Face"
  },
  {
    "path": "docs/gitbook/gitbook.js",
    "chars": 105321,
    "preview": "!function e(t,n,r){function o(s,a){if(!n[s]){if(!t[s]){var u=\"function\"==typeof require&&require;if(!a&&u)return u(s,!0)"
  },
  {
    "path": "docs/gitbook/style.css",
    "chars": 52701,
    "preview": "/*! normalize.css v2.1.0 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup"
  },
  {
    "path": "docs/gitbook/theme.js",
    "chars": 113097,
    "preview": "!function e(t,n,r){function o(a,s){if(!n[a]){if(!t[a]){var u=\"function\"==typeof require&&require;if(!s&&u)return u(a,!0)"
  },
  {
    "path": "docs/index.html",
    "chars": 1579,
    "preview": "\n<!DOCTYPE HTML>\n<html lang=\"\" >\n    <head>\n        <meta charset=\"UTF-8\">\n        <meta content=\"text/html; charset=utf"
  },
  {
    "path": "docs/search_index.json",
    "chars": 216924,
    "preview": "{\"index\":{\"version\":\"0.5.12\",\"fields\":[{\"name\":\"title\",\"boost\":10},{\"name\":\"keywords\",\"boost\":15},{\"name\":\"body\",\"boost\""
  },
  {
    "path": "docs-src/CNAME",
    "chars": 11,
    "preview": "anyproxy.io"
  },
  {
    "path": "docs-src/LANGS.md",
    "chars": 42,
    "preview": "# Languages\n\n* [中文](cn/)\n* [English](en/)\n"
  },
  {
    "path": "docs-src/README.md",
    "chars": 106,
    "preview": "# THIS IS AUTO GENERATED FILE, DO NOT EDIT THE HTML DIRECTLY.\n# YOU CAN EDIT THE SOURCE IN docs-md FOLDER\n"
  },
  {
    "path": "docs-src/_layouts/layout.html",
    "chars": 1315,
    "preview": "<!DOCTYPE HTML>\n<html lang=\"{{ config.language }}\" {% if page.dir == \"rtl\" %}dir=\"rtl\"{% endif %}>\n    <head>\n        <m"
  },
  {
    "path": "docs-src/assets/auto-lang.js",
    "chars": 452,
    "preview": "/* eslint no-var: off */\n/**\n* detect if the browser is in UTF-8 zone\n* @return boolean\n*/\nfunction isUTF8Zone() {\n  ret"
  },
  {
    "path": "docs-src/assets/main.js",
    "chars": 310,
    "preview": "/* eslint no-var: off */\nfunction injectBaiduStatic() {\n  var _hmt = _hmt || [];\n  var hm = document.createElement('scri"
  },
  {
    "path": "docs-src/assets/website.css",
    "chars": 738,
    "preview": ".book .book-summary ul.summary li.active>a, .book .book-summary ul.summary li a:hover {\n  color: #008cff;\n  background: "
  },
  {
    "path": "docs-src/book.json",
    "chars": 170,
    "preview": "{\n  \"title\": \"AnyProxy\",\n  \"author\": \"AnyProxy\",\n  \"description\": \"A fully configurable http/https proxy in NodeJS\",\n  \""
  },
  {
    "path": "docs-src/cn/README.md",
    "chars": 19905,
    "preview": "AnyProxy\n===================\n\n> 本文档的适用范围是AnyProxy 4.0,欢迎提供反馈\n\nRef: [English Doc](../en)\n\nAnyProxy是一个开放式的HTTP代理服务器。\n\nGith"
  },
  {
    "path": "docs-src/cn/SUMMARY.md",
    "chars": 1601,
    "preview": "# Summary\n\n\n* [简介](README.md)\n* [快速开始](README.md#快速开始)\n  * [安装](README.md#安装)\n  * [启动](README.md#启动)\n  * [其他命令](README.m"
  },
  {
    "path": "docs-src/cn/_layouts/layout.html",
    "chars": 1476,
    "preview": "<!DOCTYPE HTML>\n<html lang=\"{{ config.language }}\" {% if page.dir == \"rtl\" %}dir=\"rtl\"{% endif %}>\n    <head>\n        <m"
  },
  {
    "path": "docs-src/cn/_layouts/website/summary.html",
    "chars": 2199,
    "preview": "{% macro articles(_articles) %}\n    {% for article in _articles %}\n        <li class=\"chapter {% if article.path == file"
  },
  {
    "path": "docs-src/cn/src_doc.md",
    "chars": 15197,
    "preview": "AnyProxy\n===================\n\n> 本文档的适用范围是AnyProxy 4.0,欢迎提供反馈\n\nRef: [English Doc](../en)\n\nAnyProxy是一个开放式的HTTP代理服务器。\n\nGith"
  },
  {
    "path": "docs-src/en/README.md",
    "chars": 25594,
    "preview": "AnyProxy\n===================\n\nAnyProxy is a fully configurable http/https proxy in NodeJS.\n\nRef: [中文文档](../cn)\n\nGithub:\n"
  },
  {
    "path": "docs-src/en/SUMMARY.md",
    "chars": 2312,
    "preview": "# Summary\n\n* [Introduction](README.md)\n* [Getting-Start](README.md#getting-start)\n  * [Install](README.md#install)\n  * ["
  },
  {
    "path": "docs-src/en/_layouts/layout.html",
    "chars": 1408,
    "preview": "<!DOCTYPE HTML>\n<html lang=\"{{ config.language }}\" {% if page.dir == \"rtl\" %}dir=\"rtl\"{% endif %}>\n    <head>\n        <m"
  },
  {
    "path": "docs-src/en/_layouts/website/summary.html",
    "chars": 2199,
    "preview": "{% macro articles(_articles) %}\n    {% for article in _articles %}\n        <li class=\"chapter {% if article.path == file"
  },
  {
    "path": "docs-src/en/book.json",
    "chars": 57,
    "preview": "{\n  \"styles\": {\n    \"website\": \"styles/website.css\"\n  }\n}"
  },
  {
    "path": "docs-src/en/src_doc.md",
    "chars": 20886,
    "preview": "AnyProxy\n===================\n\nAnyProxy is a fully configurable http/https proxy in NodeJS.\n\nRef: [中文文档](../cn)\n\nGithub:\n"
  },
  {
    "path": "jest.config.js",
    "chars": 6334,
    "preview": "// For a detailed explanation regarding each configuration property, visit:\n// https://jestjs.io/docs/en/configuration.h"
  },
  {
    "path": "lib/certMgr.js",
    "chars": 2812,
    "preview": "'use strict'\n\nconst EasyCert = require('node-easy-cert');\nconst co = require('co');\nconst os = require('os');\nconst inqu"
  },
  {
    "path": "lib/configUtil.js",
    "chars": 420,
    "preview": "/**\n* a util to set and get all configuable constant\n*\n*/\nconst path = require('path');\n\nconst USER_HOME = process.env.H"
  },
  {
    "path": "lib/httpsServerMgr.js",
    "chars": 4495,
    "preview": "'use strict'\n\n//manage https servers\nconst async = require('async'),\n  https = require('https'),\n  tls = require('tls'),"
  },
  {
    "path": "lib/log.js",
    "chars": 2255,
    "preview": "'use strict'\n\nconst color = require('colorful');\nconst util = require('./util');\n\nlet ifPrint = true;\nlet logLevel = 0;\n"
  },
  {
    "path": "lib/recorder.js",
    "chars": 9203,
    "preview": "'use strict'\n\n//start recording and share a list when required\nconst Datastore = require('nedb'),\n  path = require('path"
  },
  {
    "path": "lib/requestErrorHandler.js",
    "chars": 1872,
    "preview": "'use strict';\n\n/*\n* handle all request error here,\n*\n*/\nconst pug = require('pug');\nconst path = require('path');\n\nconst"
  },
  {
    "path": "lib/requestHandler.js",
    "chars": 28998,
    "preview": "'use strict';\n\nconst http = require('http'),\n  https = require('https'),\n  net = require('net'),\n  url = require('url'),"
  },
  {
    "path": "lib/ruleLoader.js",
    "chars": 1766,
    "preview": "'use strict';\n\nconst proxyUtil = require('./util');\nconst path = require('path');\nconst fs = require('fs');\nconst reques"
  },
  {
    "path": "lib/rule_default.js",
    "chars": 1436,
    "preview": "'use strict';\n\nmodule.exports = {\n\n  summary: 'the default rule for AnyProxy',\n\n  /**\n   *\n   *\n   * @param {object} req"
  },
  {
    "path": "lib/systemProxyMgr.js",
    "chars": 4570,
    "preview": "'use strict'\n\nconst child_process = require('child_process');\n\nconst networkTypes = ['Ethernet', 'Thunderbolt Ethernet',"
  },
  {
    "path": "lib/util.js",
    "chars": 8554,
    "preview": "'use strict';\n\nconst fs = require('fs'),\n  path = require('path'),\n  mime = require('mime-types'),\n  color = require('co"
  },
  {
    "path": "lib/webInterface.js",
    "chars": 9326,
    "preview": "'use strict';\n\nconst express = require('express'),\n  url = require('url'),\n  bodyParser = require('body-parser'),\n  fs ="
  },
  {
    "path": "lib/wsServer.js",
    "chars": 4218,
    "preview": "'use strict';\n\n//websocket server manager\n\nconst WebSocketServer = require('ws').Server;\nconst logUtil = require('./log'"
  },
  {
    "path": "lib/wsServerMgr.js",
    "chars": 843,
    "preview": "/**\n* manage the websocket server\n*\n*/\nconst ws = require('ws');\nconst logUtil = require('./log.js');\n\nconst WsServer = "
  },
  {
    "path": "module_sample/core_reload.js",
    "chars": 1290,
    "preview": "const AnyProxy = require('../proxy');\nconst exec = require('child_process').exec;\n\nconst AnyProxyRecorder = require('../"
  },
  {
    "path": "module_sample/https_config.js",
    "chars": 727,
    "preview": "const AnyProxy = require('../proxy');\nconst exec = require('child_process').exec;\n\nif (!AnyProxy.utils.certMgr.ifRootCAF"
  },
  {
    "path": "module_sample/normal_use.js",
    "chars": 1459,
    "preview": "const AnyProxy = require('../proxy');\n\nconst options = {\n  type: 'http',\n  port: 8001,\n  rule: null,\n  webInterface: {\n "
  },
  {
    "path": "module_sample/simple_use.js",
    "chars": 189,
    "preview": "const AnyProxy = require('../proxy');\n\nconst options = {\n  port: 8001,\n  webInterface: {\n    enable: true\n  }\n};\nconst p"
  },
  {
    "path": "package.json",
    "chars": 3327,
    "preview": "{\n  \"name\": \"anyproxy\",\n  \"version\": \"4.1.3\",\n  \"description\": \"A fully configurable HTTP/HTTPS proxy in Node.js\",\n  \"ma"
  },
  {
    "path": "proxy.js",
    "chars": 11477,
    "preview": "'use strict';\n\nconst http = require('http'),\n  https = require('https'),\n  async = require('async'),\n  color = require('"
  },
  {
    "path": "resource/502.pug",
    "chars": 1743,
    "preview": "doctype html\nhtml(lang=\"en\")\n  head\n    title AnyProxy Inner Error\n  style.\n    body {\n      color: #666;\n      line-hei"
  },
  {
    "path": "resource/cert_download.pug",
    "chars": 2195,
    "preview": "doctype html\nhtml(lang=\"en\")\n  head\n    title Download rootCA\n    meta(name='viewport', content='initial-scale=1, maximu"
  },
  {
    "path": "resource/cert_error.pug",
    "chars": 850,
    "preview": "doctype html\nhtml(lang=\"en\")\n  head\n    title Security Vulnerable\n  style.\n    body {\n      color: #666;\n      line-heig"
  },
  {
    "path": "rule_sample/sample_modify_request_data.js",
    "chars": 541,
    "preview": "/*\n  sample:\n    modify the post data towards http://httpbin.org/post\n  test:\n    curl -H \"Content-Type: text/plain\" -X "
  },
  {
    "path": "rule_sample/sample_modify_request_header.js",
    "chars": 482,
    "preview": "/* \n  sample: \n    modify the user-agent in requests toward httpbin.org\n  test:\n    curl http://httpbin.org/user-agent -"
  },
  {
    "path": "rule_sample/sample_modify_request_path.js",
    "chars": 770,
    "preview": "/*\n  sample:\n    redirect all https://httpbin.org/user-agent requests to http://localhost:8008/index.html\n  test:\n    cu"
  },
  {
    "path": "rule_sample/sample_modify_request_protocol.js",
    "chars": 519,
    "preview": "/* \n  sample: \n    redirect all http requests of httpbin.org to https\n  test:\n    curl 'http://httpbin.org/get?show_env="
  },
  {
    "path": "rule_sample/sample_modify_response_data.js",
    "chars": 670,
    "preview": "/* \n  sample: \n    modify response data of http://httpbin.org/user-agent\n  test:\n    curl 'http://httpbin.org/user-agent"
  },
  {
    "path": "rule_sample/sample_modify_response_header.js",
    "chars": 527,
    "preview": "/* \n  sample: \n    modify response header of http://httpbin.org/user-agent\n  test:\n    curl -I 'http://httpbin.org/user-"
  },
  {
    "path": "rule_sample/sample_modify_response_statuscode.js",
    "chars": 498,
    "preview": "/* \n  sample: \n    modify all status code of http://httpbin.org/ to 404\n  test:\n    curl -I 'http://httpbin.org/user-age"
  },
  {
    "path": "rule_sample/sample_use_local_response.js",
    "chars": 517,
    "preview": "/* \n  sample: \n    intercept all requests toward httpbin.org, use a local response\n  test:\n    curl http://httpbin.org/u"
  },
  {
    "path": "test/__snapshots__/basic.spec.js.snap",
    "chars": 1337,
    "preview": "// Jest Snapshot v1, https://goo.gl/fbAQLP\n\nexports[`http - HTTP verbs DELETE: args 1`] = `\nObject {\n  \"foo\": \"bar\",\n}\n`"
  },
  {
    "path": "test/basic.spec.js",
    "chars": 7428,
    "preview": "\nprocess.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';\nconst path = require('path');\nconst fs = require('fs');\nconst urllib = "
  },
  {
    "path": "test/fixtures/someRule.js",
    "chars": 36,
    "preview": "module.exports = {\n  foo: 'bar',\n};\n"
  },
  {
    "path": "test/fixtures/upload.txt",
    "chars": 2,
    "preview": "1\n"
  },
  {
    "path": "test/lib/httpsServerMgr.spec.js",
    "chars": 2341,
    "preview": "const tls = require('tls');\nconst httpsServerMgr = require('../../lib/httpsServerMgr');\n\ndescribe('httpsServerMgr', () ="
  },
  {
    "path": "test/lib/ruleLoader.spec.js",
    "chars": 1305,
    "preview": "const ruleLoader = require('../../lib/ruleLoader');\nconst fs = require('fs');\nconst path = require('path');\n\nconst local"
  },
  {
    "path": "test/lib/util.spec.js",
    "chars": 516,
    "preview": "const util = require('../../lib/util');\n\ndescribe('utils', () => {\n  it('getFreePort', async () => {\n    const count = 1"
  },
  {
    "path": "test/rule/beforeDealHttpsRequest.spec.js",
    "chars": 1459,
    "preview": "const fs = require('fs');\nconst path = require('path');\nconst { basicProxyRequest, proxyServerWithRule, } = require('../"
  },
  {
    "path": "test/rule/beforeSendRequest.spec.js",
    "chars": 3031,
    "preview": "const fs = require('fs');\nconst path = require('path');\nconst { basicProxyRequest, proxyServerWithRule, } = require('../"
  },
  {
    "path": "test/rule/beforeSendResponse.js",
    "chars": 1428,
    "preview": "const { basicProxyRequest, proxyServerWithRule, } = require('../util.js');\n\nconst RULE_REPLACE_HEADER_KEY = 'rule_replac"
  },
  {
    "path": "test/rule/onError.spec.js",
    "chars": 1657,
    "preview": "const { basicProxyRequest, proxyServerWithRule, } = require('../util.js');\n\nconst jestMockErrorFn = jest.fn();\nconst jes"
  },
  {
    "path": "test/util.js",
    "chars": 1963,
    "preview": "const request = require('request');\nconst assert = require('assert');\n// TODO\nconst { freshRequire, getFreePort } = requ"
  },
  {
    "path": "test/web/curlUtil.spec.js",
    "chars": 1610,
    "preview": "const { curlify } = require('../../web/src/common/curlUtil');\n\ndescribe('Test the curlify function', () => {\n  it('reque"
  },
  {
    "path": "test/web/webInterface.spec.js",
    "chars": 791,
    "preview": "const WebInterface = require('../../lib/webInterface.js');\nconst Recorder = require('../../lib/recorder');\nconst urllib "
  },
  {
    "path": "web/index.html",
    "chars": 463,
    "preview": "<!DOCTYPE html>\n<html>\n<head>\n    <title>AnyProxy</title>\n    <meta charset=\"UTF-8\" />\n    <link rel=\"icon\" type=\"image/"
  },
  {
    "path": "web/postcss.config.js",
    "chars": 65,
    "preview": "module.exports = {\n  plugins: [\n    require('autoprefixer')\n  ]\n}"
  },
  {
    "path": "web/src/action/globalStatusAction.js",
    "chars": 4549,
    "preview": "export const STOP_RECORDING = 'STOP_RECORDING';\nexport const RESUME_RECORDING = 'RESUME_RECORDING';\nexport const SHOW_FI"
  },
  {
    "path": "web/src/action/recordAction.js",
    "chars": 1528,
    "preview": "export const FETCH_REQUEST_LOG = 'FETCH_REQUEST_LOG';\nexport const UPDATE_WHOLE_REQUEST = 'UPDATE_WHOLE_REQUEST';\nexport"
  },
  {
    "path": "web/src/common/ApiUtil.js",
    "chars": 1314,
    "preview": "/**\n* AJAX操作工具类\n*/\nimport PromiseUtil from './promiseUtil';\nexport function getJSON(url, data) {\n    const d = PromiseUt"
  },
  {
    "path": "web/src/common/Constant.js",
    "chars": 165,
    "preview": "/**\n* define all constant variables here\n*/\n\nmodule.exports.MenuKeyMap = {\n    RECORD_FILTER: 'RECORD_FILTER',\n    MAP_L"
  },
  {
    "path": "web/src/common/WsUtil.js",
    "chars": 992,
    "preview": "/*\n* Utility for websocket\n*\n*/\nimport { message } from 'antd';\n\n/**\n* Initiate a ws connection.\n* The default path `do-"
  },
  {
    "path": "web/src/common/apiUtil.js",
    "chars": 1314,
    "preview": "/**\n* AJAX操作工具类\n*/\nimport PromiseUtil from './promiseUtil';\nexport function getJSON(url, data) {\n    const d = PromiseUt"
  },
  {
    "path": "web/src/common/commonUtil.js",
    "chars": 1778,
    "preview": "/*\n * 存放常用工具类\n */\n\n/*\n * 格式化日期\n * @param date Date or timestamp\n * @param formatter yyyyMMddHHmmss\n */\nexport function f"
  },
  {
    "path": "web/src/common/constant.js",
    "chars": 165,
    "preview": "/**\n* define all constant variables here\n*/\n\nmodule.exports.MenuKeyMap = {\n    RECORD_FILTER: 'RECORD_FILTER',\n    MAP_L"
  },
  {
    "path": "web/src/common/curlUtil.js",
    "chars": 776,
    "preview": "module.exports = {\n  curlify(recordDetail) {\n    const headers = { ...recordDetail.reqHeader };\n    const acceptEncoding"
  },
  {
    "path": "web/src/common/promiseUtil.js",
    "chars": 230,
    "preview": "/*\n *  Promise的工具类\n */\n\nexport function defer() {\n    const d = {};\n    d.promise = new Promise((resolve, reject) => {\n "
  },
  {
    "path": "web/src/common/wsUtil.js",
    "chars": 992,
    "preview": "/*\n* Utility for websocket\n*\n*/\nimport { message } from 'antd';\n\n/**\n* Initiate a ws connection.\n* The default path `do-"
  },
  {
    "path": "web/src/component/download-root-ca.jsx",
    "chars": 4992,
    "preview": "/**\n * The panel to edit the filter\n *\n */\n\nimport React, { PropTypes } from 'react';\nimport ReactDOM from 'react-dom';\n"
  },
  {
    "path": "web/src/component/download-root-ca.less",
    "chars": 840,
    "preview": "@import '../style/constant.less';\n.wrapper {\n  position: relative;\n  height: 100%;\n  width: 100%;\n  padding: 10px 13px 1"
  },
  {
    "path": "web/src/component/header-menu.jsx",
    "chars": 8344,
    "preview": "/*\n* 页面顶部菜单的组件\n*/\n\nimport React, { PropTypes } from 'react';\nimport ClassBind from 'classnames/bind';\nimport { connect }"
  },
  {
    "path": "web/src/component/header-menu.less",
    "chars": 2982,
    "preview": "@import '../style/constant.less';\n\n@svg-default-color: #3A3A3A;\n.wrapper {\n    width: 100%;\n}\n\n.menuList {\n  overflow: h"
  },
  {
    "path": "web/src/component/json-viewer.jsx",
    "chars": 2420,
    "preview": "/*\n* A copoment to display content in the a modal\n*/\n\nimport React, { PropTypes } from 'react';\nimport { Menu } from 'an"
  },
  {
    "path": "web/src/component/json-viewer.less",
    "chars": 134,
    "preview": "@import '../style/constant.less';\n.wrapper {\n  border: 1px solid #d9d9d9;\n}\n.contentDiv {\n  padding: 20px 25px;\n  backgr"
  },
  {
    "path": "web/src/component/left-menu.jsx",
    "chars": 3845,
    "preview": "/*\n* A copoment to for left main menu\n*/\n\nimport React, { PropTypes } from 'react';\nimport { connect } from 'react-redux"
  },
  {
    "path": "web/src/component/left-menu.less",
    "chars": 4805,
    "preview": "@import '../style/constant.less';\n\n@keyframes lightBulb{\n    from { opacity: 1 }\n    to { opacity: 0.1 }\n}\n\n@total-durat"
  },
  {
    "path": "web/src/component/map-local.jsx",
    "chars": 7856,
    "preview": "/**\n * The panel map request to local\n *\n */\n\nimport React, { PropTypes } from 'react';\nimport { connect } from 'react-r"
  },
  {
    "path": "web/src/component/map-local.less",
    "chars": 881,
    "preview": "@import '../style/constant.less';\n@panel-width: 100%;\n.mapLocalWrapper {\n    padding: 10px 15px 30px;\n}\n\n.title {\n  font"
  },
  {
    "path": "web/src/component/modal-panel.jsx",
    "chars": 3855,
    "preview": "/*\n* A copoment to display content in the a modal\n*/\n\nimport React, { PropTypes } from 'react';\nimport ReactDOM from 're"
  },
  {
    "path": "web/src/component/modal-panel.less",
    "chars": 1192,
    "preview": "@import '../style/constant.less';\n.wrapper {\n  display: block;\n  position: absolute;\n  z-index: 1000;\n  top: 0;\n  bottom"
  },
  {
    "path": "web/src/component/record-detail.jsx",
    "chars": 4179,
    "preview": "/**\n * The panel to display the detial of the record\n *\n */\n\nimport React, { PropTypes } from 'react';\nimport ClassBind "
  },
  {
    "path": "web/src/component/record-detail.less",
    "chars": 1478,
    "preview": "@import '../style/constant.less';\n\n.wrapper {\n  padding: 5px 15px;\n  height: 100%;\n  word-wrap: break-word;\n}\n\n.loading "
  },
  {
    "path": "web/src/component/record-filter.jsx",
    "chars": 2761,
    "preview": "/**\n * The panel to edit the filter\n *\n */\n\nimport React, { PropTypes } from 'react';\nimport ReactDOM from 'react-dom';\n"
  },
  {
    "path": "web/src/component/record-filter.less",
    "chars": 369,
    "preview": "@import '../style/constant.less';\n\n.filterWrapper {\n  padding: 10px 15px 15px;\n}\n\n.title {\n  font-size: @middlepanel-fon"
  },
  {
    "path": "web/src/component/record-list-diff-worker.jsx",
    "chars": 2142,
    "preview": "/*\n* A webworker to identify whether the component need to be re-rendered\n*/\nconst getFilterReg = function (filterStr) {"
  },
  {
    "path": "web/src/component/record-panel.jsx",
    "chars": 5128,
    "preview": "/*\n* A copoment for the request log table\n*/\n\nimport React, { PropTypes } from 'react';\nimport { Icon } from 'antd';\nimp"
  },
  {
    "path": "web/src/component/record-panel.less",
    "chars": 1205,
    "preview": "@import '../style/constant.less';\n\n.wrapper {\n  position: relative;\n  -webkit-user-select: none;\n  :global {\n    .ant-ta"
  },
  {
    "path": "web/src/component/record-request-detail.jsx",
    "chars": 5825,
    "preview": "/**\n * The panel to display the detial of the record\n *\n */\n\nimport React, { PropTypes } from 'react';\nimport ClassBind "
  },
  {
    "path": "web/src/component/record-response-detail.jsx",
    "chars": 3430,
    "preview": "/**\n * The panel to display the response detial of the record\n *\n */\n\nimport React, { PropTypes } from 'react';\nimport C"
  },
  {
    "path": "web/src/component/record-row.jsx",
    "chars": 1895,
    "preview": "/*\n* A copoment for the request log table\n*/\n\nimport React, { PropTypes } from 'react';\nimport { formatDate } from 'comm"
  },
  {
    "path": "web/src/component/record-row.less",
    "chars": 919,
    "preview": "@import '../style/constant.less';\n\n.tableRow {\n  display: block;\n  cursor: pointer;\n  font-size: @font-size-sm;\n  td {\n "
  },
  {
    "path": "web/src/component/record-worker.jsx",
    "chars": 8327,
    "preview": "/*\n* A webworker to identify whether the component need to be re-rendered\n*\n* the core idea is that, we do the caclulati"
  },
  {
    "path": "web/src/component/record-ws-message-detail.jsx",
    "chars": 4052,
    "preview": "/**\n * The panel to display the detial of the record\n *\n */\n\nimport React, { PropTypes } from 'react';\nimport { message,"
  },
  {
    "path": "web/src/component/record-ws-message-detail.less",
    "chars": 810,
    "preview": "@import '../style/constant.less';\n.wrapper {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n "
  },
  {
    "path": "web/src/component/resizable-panel.jsx",
    "chars": 3185,
    "preview": "/*\n* A copoment to display content in the a resizable panel\n*/\n\nimport React, { PropTypes } from 'react';\nimport ReactDO"
  },
  {
    "path": "web/src/component/resizable-panel.less",
    "chars": 702,
    "preview": "@import '../style/constant.less';\n.wrapper {\n  display: block;\n  background-color: #fff;\n  position: relative;\n  width: "
  },
  {
    "path": "web/src/component/table-panel.jsx",
    "chars": 2595,
    "preview": "/*\n* A copoment for the request log table\n*/\n\nimport React, { PropTypes } from 'react';\nimport ReactDOM from 'react-dom'"
  },
  {
    "path": "web/src/component/table-panel.less",
    "chars": 561,
    "preview": "@import '../style/constant.less';\n\n.tableWrapper {\n  clear: both;\n  margin-top: 30px;\n  :global {\n    th {\n      padding"
  },
  {
    "path": "web/src/component/title-bar.jsx",
    "chars": 1677,
    "preview": "/**\n * The panel to edit the filter\n *\n */\n\nimport React, { PropTypes } from 'react';\nimport { Icon } from 'antd';\nimpor"
  },
  {
    "path": "web/src/component/title-bar.less",
    "chars": 699,
    "preview": "@import '../style/constant.less';\n.wrapper {\n    position: relative;\n}\n.iconButtons {\n    overflow: hidden;\n    span {\n "
  },
  {
    "path": "web/src/component/ws-listener.jsx",
    "chars": 5180,
    "preview": "/*\n* listen on the websocket event\n*\n*/\n\nimport React, { PropTypes } from 'react';\nimport { message } from 'antd';\nimpor"
  },
  {
    "path": "web/src/index.jsx",
    "chars": 9207,
    "preview": "import React, { PropTypes } from 'react';\nimport ReactDOM from 'react-dom';\nimport { createStore, applyMiddleware } from"
  },
  {
    "path": "web/src/index.less",
    "chars": 1350,
    "preview": "@import './style/constant.less';\n\n.indexWrapper {\n  display: block;\n  position: relative;\n  height: 100%;\n}\n\n.leftPanel "
  },
  {
    "path": "web/src/reducer/globalStatusReducer.js",
    "chars": 5584,
    "preview": "const defaultStatus = {\n  recording: true,\n  panelRefreshing: true,  // indicate whether the record panel should be refr"
  },
  {
    "path": "web/src/reducer/requestRecordReducer.js",
    "chars": 3308,
    "preview": "const defaultState = {\n    recordList: [],\n    recordDetail: null\n};\n\nimport {\n    UPDATE_WHOLE_REQUEST,\n    UPDATE_SING"
  },
  {
    "path": "web/src/reducer/rootReducer.js",
    "chars": 367,
    "preview": "import requestRecordReducer from './requestRecordReducer';\nimport globalStatusReducer from './globalStatusReducer';\n\ncon"
  },
  {
    "path": "web/src/saga/rootSaga.js",
    "chars": 4222,
    "preview": "import {\n  take,\n  put,\n  call,\n  fork\n} from 'redux-saga/effects';\nimport { message } from 'antd';\n\nimport {\n  FETCH_RE"
  },
  {
    "path": "web/src/style/animate.less",
    "chars": 452,
    "preview": "@keyframes rotation {\n        0% {\n            -webkit-transform: rotate(0deg);\n            opacity: 0.1;\n        }\n\n   "
  },
  {
    "path": "web/src/style/antd-constant.less",
    "chars": 4997,
    "preview": "@primary-color          : #2db7f5;\n@info-color             : #2db7f5;\n@success-color          : #87d068;\n@error-color   "
  },
  {
    "path": "web/src/style/antd-reset.global.less",
    "chars": 1908,
    "preview": "@import \"~antd/lib/style/themes/default.less\";\n@import \"./constant.less\";\n@import \"~antd/lib/style/core/index.less\";\n@im"
  },
  {
    "path": "web/src/style/common.less",
    "chars": 977,
    "preview": "@import './constant.less';\n@import './animate.less';\n\nbody {\n  line-height: 1.5;\n  font-size: @font-size-reg;\n  position"
  },
  {
    "path": "web/src/style/constant.less",
    "chars": 1059,
    "preview": "\n@import \"./antd-constant\";\n\n@primary-color: #108ee9;\n@default-color: #1a1a1a;\n@tip-color: #999;\n@hint-color: #ddd;\n@err"
  },
  {
    "path": "web/webpack.config.js",
    "chars": 2905,
    "preview": "const webpack = require('webpack');\nconst path = require('path');\nconst autoprefixer = require('autoprefixer');\nconst Ex"
  }
]

// ... and 1 more files (download for full content)

About this extraction

This page contains the full source code of the alibaba/anyproxy GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 165 files (1.5 MB), approximately 510.7k tokens, and a symbol index with 670 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!