{"_id":"hc-proxy","_rev":"47-1b0f295367f9b0cafc94a1f3d56a6902","name":"hc-proxy","dist-tags":{"alpha":"1.0.10","2.0-alpha":"2.0.0","2.0-beta":"2.0.1","2.0-2":"2.0.2","beta":"2.0.18-alpha.0","latest":"2.0.19"},"versions":{"1.0.0":{"name":"hc-proxy","version":"1.0.0","keywords":["api","proxy","middleware"],"author":{"name":"albin"},"license":"ISC","_id":"hc-proxy@1.0.0","maintainers":[{"name":"albin3","email":"binwei.zeng3@gmail.com"}],"dist":{"shasum":"0dc4fde7d24c9a6674fd995f84187383e21fcf5f","tarball":"https://registry.npmjs.org/hc-proxy/-/hc-proxy-1.0.0.tgz","fileCount":12,"integrity":"sha512-Kd0k5jrel16ASkkM923UlnAO9eDzPGFvZzMFgl6+L+nMboNueJrtYdjuI4F72seCg867L7JssN/rTHZNeIm18w==","signatures":[{"sig":"MEYCIQDw1oTKJPGoGrO9/w1UCKpS0QUQe+Ayz2erDyolQO/0pgIhAOKQoEex/t7Ue8qCm7V53yxC4fqyFH6EftMsVgqmqF+o","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":39538,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa1dCYCRA9TVsSAnZWagAAiM8QAIQLsh+Bq/03JT3FM/i8\nqHdGzNJ/Wgo93WcbHPhGhr32MXYzkiysVYdSWlTztovzG7F+qWB78JpProUU\nAyEVE8+n4inPKVYihBrgakl0zOpLPyhMcWcD/Yi09v0zVJlWSnaf1gpot91g\nSAMUgALf1ieKdUrsJt/YWrCK6z6OqRY1p3exh38+cJkI5FNDpxadt1xPCju5\neZZXEU5ZLCmLfMqcpSfPAL2xob8VPLjmXcispW8wfOUM3G4urowSJKST8ruE\nR2L3VSWPHEum4ppiHFz2wZcYNEHvYb/bH1mcHXRHQSEfTdTsJ+t96LpPBqjS\n0A+eL7Q/BMojf2x+ZMNAHaoTVLlu3aaUKt9CHfJ0N3xzXz2O8A6wG6v82zzh\nYh2Gonp/E/JWMqUPggTKByJqsV43pJ9I1ZbFPB3H0tbcmKImcnfMta5zQR0Z\nBbIxZattwCtqySMeqDUFQrnB0PQXHE/DDeeYVFtvACH043BlCKW+w/IiPuOa\nPaxNTRY1EO04pU4ZgrF5inayj6wBEs/IogyHxwou1DSDy44YU47MWKpv67XC\nfO69ORHNjeokbDMbLzdz9GFmHcNhc5NWq9Zw6jhpawloAW5MDt1ewWn1VAZR\nwwOMI9G/2e2IySKLv0FzLhBwvCdOmc5jjcvvyLDUAxo1RxzkHLwJsZ8M/HwY\nZc8E\r\n=3ZK6\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","gitHead":"1eb9a1ba3d4fd7c1f72ca55951fe18a3f1947178","scripts":{"test":"make test"},"_npmUser":{"name":"albin3","email":"binwei.zeng3@gmail.com"},"_npmVersion":"5.5.1","description":"honeycomb api proxy express middleware.","directories":{},"_nodeVersion":"8.9.1","dependencies":{"debug":"3.1.0","lodash":"4.15.0","multer":"1.3.0","urllib":"^2.27.0","formstream":"1.1.0","path-to-regexp":"1.6.0","hc-service-client":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"^4.0.1","express":"4.16.2","supertest":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/hc-proxy_1.0.0_1523962007871_0.00961348568714393","host":"s3://npm-registry-packages"}},"1.0.1":{"name":"hc-proxy","version":"1.0.1","keywords":["api","proxy","middleware"],"author":{"name":"albin"},"license":"ISC","_id":"hc-proxy@1.0.1","maintainers":[{"name":"albin3","email":"binwei.zeng3@gmail.com"}],"dist":{"shasum":"a1f54713d3497f612bb938f60a70bc437b8dc0e9","tarball":"https://registry.npmjs.org/hc-proxy/-/hc-proxy-1.0.1.tgz","fileCount":12,"integrity":"sha512-v/TPPQfH1cHKYRY2mt7ehJh6WVqvPrzizlxe35nq7gqNiN7bJOXBKAPQZABXa4GSdoZP0vOdeImUCuOQQlqE6g==","signatures":[{"sig":"MEQCICxwhTPRZIrqpP6ibMZXYYcTlQA5Y4XE74pkZas4oLUaAiB43CArk39sDtomC9qd7PAtLKwOniZCAAFrcmlhv5X2qA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":39631,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa1u9HCRA9TVsSAnZWagAALAoP/At2iQ02P8cfDuYhHVi3\nxnLMugh4wU5JpKY/O7gzMb0FijJ0HWBJ4Oc3jhUkUrAnjXCghcsKGxz+Kv9V\ntVjeOqj8OasVqzMa1zuvTraiXrJeMWAUsOABtVeaXZQTdHHikytcSdLCIP43\nmGd8kf1pwfsImUlhVVREaKzV10RszbWY9YgNvesXHKKJwb+/ufXlqDC/BeH9\n/YgKzJEx+3V+GdWr6TJnSua6+XVr8iVNB1IajrLnFWlXLxkzYmpYT4dvD33r\nWQdSh0BWxZfDo4SefWJ3Ye0UfUsH9esAWsMaGMLwQG3HShTtCAsS3xrSrVrn\ny4010CdnAx5ZfNSrfcp7ENp5iua9q0eCfgm8SRESj4Ok+kHVwwknD2RVN+Ez\nSGYK0f7mhx+S14nsuJvl9iVNCKY2TSaaK/QKOK6VEBcdTgKbayNYzvs+ZSyz\ncV1RTftAi8m4+bfIuDzSGYQHmV4QvtGrFm8M0jsCBDbmzdZW86haRXZdDXRy\nsbKrN7m8h7MwqwomYNZPrrE0F6Oa/55FMtBn9min1dW7YBcEQnl56Ri2pAVb\nVfYJSZlDkOb2n+gK3QfcyuWP9BI2UPdj9s4n56Ugvz+zNp9OtF8B0LtHe1HF\nVwc0MHlviAYZUlT9nUfP9bQX5I6TFyQPiLOMAhnzefOvG/oa9uQgEH9Zwtte\nq6tD\r\n=eVkG\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","gitHead":"ddb59b46bd0572aa6c72da58da1aacbd49abb7f7","scripts":{"test":"make test"},"_npmUser":{"name":"albin3","email":"binwei.zeng3@gmail.com"},"_npmVersion":"5.5.1","description":"honeycomb api proxy express middleware.","directories":{},"_nodeVersion":"8.9.1","dependencies":{"debug":"3.1.0","lodash":"4.15.0","multer":"1.3.0","urllib":"^2.27.0","formstream":"1.1.0","path-to-regexp":"1.6.0","hc-service-client":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"^4.0.1","express":"4.16.2","supertest":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/hc-proxy_1.0.1_1524035398665_0.7497010776585695","host":"s3://npm-registry-packages"}},"1.0.2":{"name":"hc-proxy","version":"1.0.2","keywords":["api","proxy","middleware"],"author":{"name":"albin"},"license":"ISC","_id":"hc-proxy@1.0.2","maintainers":[{"name":"albin3","email":"binwei.zeng3@gmail.com"}],"dist":{"shasum":"46cc384441d83f472cff90a152983f2a66ba2325","tarball":"https://registry.npmjs.org/hc-proxy/-/hc-proxy-1.0.2.tgz","fileCount":13,"integrity":"sha512-jaFI47Mj6nGhPzg72hE8ZmrYX9v9C6HXPZTMbk5dT9Q+VC0wrR9OAP1jit7pimSdky5QUB3wtiZUIe+Z4kpDAA==","signatures":[{"sig":"MEQCIGl5lUZEfKq9SLiUWgxfNRj/mkvqrc9FF5qWyApqse/YAiAiDFQCyMSaWZdHXWlxiKjqbzUl8z8LeAjJUpygLtEEHg==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":39846,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbDiT+CRA9TVsSAnZWagAAlCAP/1Tw6OLcTiamJVHKS0Wt\n0IvV6KCKLOvRfnAY8OLRcLfz7IsSNsxv/4vtMK8MpfZ23eTBNsT5oOtD4rEC\nYwUOX3thWpxDK93xlIc0xSKR9NCI3ERR+S3mlItHHLM4hbVW7LkW0HrhYky1\nwi3xP8sWxqrwVc6u2BM+3RyWzvHJSvz/zCSFuTKzRRm4rko2zsio/25l5S1R\nHPnPvJDAkczWoGiXqZcm5pv4rp1EnB2LBcy1s/M3zP41eflNABlvPIjxIemG\noCQjkWoDs/F0ekW7OD4z3TjTFsiBPDfxHswqZpwqV2OzBMmrroeFq4Hckf6P\n4ynqQwYNbiCFgwV0aqx9TfyNRGJzXJ93jJbDMMwyRjp+bN9kKsbQzVBtIsgf\no0e9mz4aXkTdRP0rGke5V85lA9K/JzSiyU8T7Zi/3mj8nVYFXY5y7nPCDZuK\nfYwN8o4wDFuXltKmr8KpyGRvjRgJ2baR/tcBb3YOKiWXHYz2Ty+dFU9FWM2v\nqxszjt3/mu8tcxRFSMAJqmAt7uM2YQR39Cz5M792UhckERhjo8f7IsnkFNwm\nn69BbQf1zE5k0wi4Aq6HoFtB7bwF9VqGVEJnATszPOceZ/2Xzc0/K0sR5r3i\n48GqQ3qKobx3akvxaPgWgxzNJ7cnQe5n73/xWyjh9l8OxC+Z29PnN8uzMye6\nFJun\r\n=Y5Gk\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","gitHead":"d6595703929a830757680973382884759cba28e1","scripts":{"test":"make test"},"_npmUser":{"name":"albin3","email":"binwei.zeng3@gmail.com"},"_npmVersion":"5.6.0","description":"honeycomb api proxy express middleware.","directories":{},"_nodeVersion":"8.11.1","dependencies":{"debug":"3.1.0","lodash":"4.15.0","multer":"1.3.0","urllib":"^2.27.0","formstream":"1.1.0","path-to-regexp":"1.6.0","hc-service-client":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"^4.0.1","express":"4.16.2","supertest":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/hc-proxy_1.0.2_1527653630014_0.5422466120905893","host":"s3://npm-registry-packages"}},"1.0.3":{"name":"hc-proxy","version":"1.0.3","keywords":["api","proxy","middleware"],"author":{"name":"albin"},"license":"ISC","_id":"hc-proxy@1.0.3","maintainers":[{"name":"albin3","email":"binwei.zeng3@gmail.com"},{"name":"fishbar","email":"zhengxinlin@gmail.com"}],"dist":{"shasum":"fc7676ee1cd41c06b3cd369ae6050df7234e3911","tarball":"https://registry.npmjs.org/hc-proxy/-/hc-proxy-1.0.3.tgz","fileCount":13,"integrity":"sha512-KR+s1ISfipsvksbMI/IG1+V8ehtY09W2Qdd7IuMllxPN9tQUifj8kYN+9ngv8iw2p0eTpcM9WfwIjrq9MNpGrQ==","signatures":[{"sig":"MEQCIHj9X5lRCZyYOhoS7XcoviYA8k46kW94ue7Gi0w7fN3HAiAXINGSwICqbzY+fYvEJlMYjUrcVdjv+2Q3z8uZtnzLEA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":40183,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbDlwaCRA9TVsSAnZWagAAxW4P/29rWLMtWk+AMeG2+wc7\nf76my5Q/cWbmPrdDSK7FOJwiY2pgzIYw1ubIc5qw3rr3BudX7WIUW6fa87F7\nLLxFnDMFzRDaS65WUtyhEYDqKMWpLmBVTMbKvvhEldtuLxM6+eYKc8+FHbCX\nIP9oJmuzbeN2AaW6UqTbzHGRETVw9yGS/m94EFYsew8qurp5Ot8TtxJVt+qg\nOLjykijZKi4GI575caUZpIuPOdDcOSOmXYI4ufbMs08LF2biAKMBk/sU+uaB\nxni0CEQuIoyGOPBGpEJfsnWBC7N2zjMFIi4L2JIzUhlGeoMsCaTdpZdSzp/C\nxHJn5AwPggV8WyJokWIX/mTbBkEVXBrxuCu5Y5NL8fVzvK1eLIBV4OcDZuh2\ndkV1F6aWqGPi240/Y0t9CHkJmPpBv6bb0woeRMjkQb/jb2Mj6L+b/tMuojcv\nTJJSKusM86N1ibYr8p6fyG7yLGdK5ny4hST8HoQz/69YyWVOjaIRMTQCAXa8\nZQZY9XFrM7Aom1chflsmpSZ/fMzGOEYOgLr8pFlLXmuwr8dwqKXG6AqE4B0Z\nj3GpU00myqIMwcNC0ODGZCJFMRnqUxe8eX5J70jEqcVtql7oltr/srlF/0E7\nVqXgB5Ct8BBt1UN4MGIDboVNsr2ulLRPQpngmqIa67aohzT+Lb8dMjxOpPg2\nYrbh\r\n=HRc2\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","gitHead":"85532328d6f9c805a6cb008947924169dbdfbfa1","scripts":{"test":"make test"},"_npmUser":{"name":"albin3","email":"binwei.zeng3@gmail.com"},"_npmVersion":"5.6.0","description":"honeycomb api proxy express middleware.","directories":{},"_nodeVersion":"8.11.1","dependencies":{"debug":"3.1.0","lodash":"4.15.0","multer":"1.3.0","urllib":"^2.27.0","formstream":"1.1.0","path-to-regexp":"1.6.0","hc-service-client":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"^4.0.1","express":"4.16.2","supertest":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/hc-proxy_1.0.3_1527667738321_0.3645129894180612","host":"s3://npm-registry-packages"}},"1.0.4":{"name":"hc-proxy","version":"1.0.4","keywords":["api","proxy","middleware"],"author":{"name":"albin"},"license":"ISC","_id":"hc-proxy@1.0.4","maintainers":[{"name":"albin3","email":"binwei.zeng3@gmail.com"},{"name":"fishbar","email":"zhengxinlin@gmail.com"}],"dist":{"shasum":"67c692073aba7ac601182cd87a8df2962528e6bb","tarball":"https://registry.npmjs.org/hc-proxy/-/hc-proxy-1.0.4.tgz","fileCount":13,"integrity":"sha512-/Vsgs6mRA9KEKHYBawWKhjuQ0HA3JHscbRbFFONaxzp5wocCoHoPy78A9FRXWy054pujMuJPAkeVqfzgvqMzig==","signatures":[{"sig":"MEYCIQCErqt0mGWpyiDEzqsEUuWCv5wGsaGoS4xDoTHiuaHUsQIhAO4FD/l9juvuZBne4f6BUXlBGQcVVF/UbxFfPv32TXdm","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":44935,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbEPVZCRA9TVsSAnZWagAAgd4P/2nWD5GpoJU3NOkEgTM8\nJLz8LGFFT4RFHpRdgW6rfzo06rmQIi/rgSO3iEILAk/FKK7fQyk21qORcrj1\n/NAQnfNzUjaO7YyUAqL4v0hJHZaFe0e522IGNGW4zwxncMklYHgJrj2Zh+Lt\nS/m2btaij/D8sk4R09BCTxk6pXw2j0RKR2HnrTU7luXZiVLBxSViXZkTmheo\nrDxFfjt87zPMc1e4f0V8E1XlqoEtzWr+9/Ma3RJfmkH+kL5CiRMFBR5lV3EZ\nl89Haj+hJB9X2ef5IklHzA2GeM6hGa+t+kTj+QQ6o22KAG+mBg0Iz8HbQ80+\nqjF9Ocn0G0QPEzT25ZcNgbXn0lqn2Ho7jm/y38isw3ee6OxJiqAnHthSwb5I\nJODTyx86c3EOyfTyPLO7vJ8VB5H5HLkmhC+EAwAfWTTItR3q1A8v150paZZn\nOBETJRkFICO2qr8ycTNegxW/3wznPrp3OfET7TDQI+bYN/hTz2Cwn96gu/dY\n8nAypzYwDvZjBf6PJdyzRvrBGlQpJeIBPsYa50Kl00ljYb0ljexrEgw+2bUi\nA8VqDao4wD2tNNFk9xFVE/hBsGgm6jiYc7ONyzoz0/MEnTIum1TaMmxOYe/o\nVI2T8kZpi1gunbae+VRQwny+GTqvUz5B21SIyuYbQi8QX3Q/IlMUBI85s9Z6\n7eTY\r\n=YEq9\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","gitHead":"39bfed39cb803b17905ac9cab53cf82529b8961c","scripts":{"test":"make test"},"_npmUser":{"name":"albin3","email":"binwei.zeng3@gmail.com"},"_npmVersion":"5.5.1","description":"honeycomb api proxy express middleware.","directories":{},"_nodeVersion":"8.9.1","dependencies":{"qs":"^6.5.2","debug":"3.1.0","lodash":"4.15.0","multer":"1.3.0","urllib":"^2.27.0","formstream":"1.1.0","path-to-regexp":"1.6.0","hc-service-client":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"^4.0.1","express":"4.16.2","supertest":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/hc-proxy_1.0.4_1527838040844_0.38096979029743006","host":"s3://npm-registry-packages"}},"1.0.5":{"name":"hc-proxy","version":"1.0.5","keywords":["api","proxy","middleware"],"author":{"name":"albin"},"license":"ISC","_id":"hc-proxy@1.0.5","maintainers":[{"name":"albin3","email":"binwei.zeng3@gmail.com"},{"name":"fishbar","email":"zhengxinlin@gmail.com"}],"dist":{"shasum":"46b84b8ff786fbe07b10751a2a0fde5d8e9544bf","tarball":"https://registry.npmjs.org/hc-proxy/-/hc-proxy-1.0.5.tgz","fileCount":13,"integrity":"sha512-AWEa7QG8T02Ued962Tot7eskmPIU9cHfSLvZwFCLW4Sg/EFcBxB9mAiuTTiCxRHj97hX9khuA7bhu4ouyRYcQg==","signatures":[{"sig":"MEUCIEW6K/Lk09B9SW/UERkRa/87qL1o3gE4xql5pVf54URGAiEA34103Ow4sY9uOxS87ahFvphVDzkp7Ea9Vdx/5mqj9pE=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":45335,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbIL5JCRA9TVsSAnZWagAAg6wP/it1v4A3a8WCSU72Dx7c\n5v+/CV3SkQDawLD9iiZ6vF3QZwf+kWws+Mxr/ZM08ZaHdXhx1viPPbjvHDLD\nVYrQUUM/JmhDepSgdh6c1WhDFhxnMUwearLhzkPlAtirV4gEe1Je3S/5kjcm\nQ3DDMNDtHZOdHiGzr/DHGj1YPGN7ZUEj2ZCteEUBB842/tTHamURl+gE62Mf\nOCJCYxPcjoAtCU8Zzt64E14NQYHuejCrNiaiV4l1Ho9sas1zOJvrqbALRw4i\nrwkgMCyPO16KgVxUIVZVwk7S5zGQrf+TpbXlO8UMF8B4iYMGGRCpXNwmiQQq\nEqTxiYaN9itQbde3bpEjT+6HkOftHeIt0cXE58k2UqiTBLP15AgPI/uztbtb\nvvG1V0nKQknk4xo1EoLOSq2tW2RVD3mfmyfiLheQJUG25ELklHB66HLHA23k\nqE8/TQbmhQMwdTxzUkQQTuC+OmuUHnBBiHhi3CZ8FrHsaau7tIQWZ89HQzwK\n6zqSvm0Gu1r1425jITEteJlCB1TBIxKGIfNcpspW5+pYV5ji7/+hsuB9U0+M\nl3iesUHcCFG3rBikkYCxN4salMesFTaVSnfJr+3vAl1w+odTY55b7AyMg6tu\nw3rUCFRBLSIDjBBiPPcx0ysfk7m41A2y7uuoBdX1lKxk4om60dO6+qL2Eqtv\nWTk0\r\n=Lxl7\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","gitHead":"bc948760e7884a03dd7720443188c7f671a86376","scripts":{"test":"make test"},"_npmUser":{"name":"albin3","email":"binwei.zeng3@gmail.com"},"_npmVersion":"5.5.1","description":"honeycomb api proxy express middleware.","directories":{},"_nodeVersion":"8.9.1","dependencies":{"qs":"^6.5.2","debug":"3.1.0","lodash":"4.15.0","multer":"1.3.0","urllib":"^2.27.0","formstream":"1.1.0","path-to-regexp":"1.6.0","hc-service-client":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"^4.0.1","express":"4.16.2","supertest":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/hc-proxy_1.0.5_1528872520597_0.96642508934513","host":"s3://npm-registry-packages"}},"1.0.6":{"name":"hc-proxy","version":"1.0.6","keywords":["api","proxy","middleware"],"author":{"name":"albin"},"license":"ISC","_id":"hc-proxy@1.0.6","maintainers":[{"name":"albin3","email":"binwei.zeng3@gmail.com"},{"name":"fishbar","email":"zhengxinlin@gmail.com"}],"dist":{"shasum":"25c78e50de7e73f76f8ab6ecc7ad7f8887a52ce2","tarball":"https://registry.npmjs.org/hc-proxy/-/hc-proxy-1.0.6.tgz","fileCount":13,"integrity":"sha512-dmCQG36WOO7vA05DLt4wjlRpNmSM2h2lhIC/TR9sEms42Uo0LDo87hahursXEqtSc4hzww7xqaI8Js4MidCGCQ==","signatures":[{"sig":"MEQCIEwMBSxCL0GEM6S57OMVjo6u077CdJYnrOBMotgOynkwAiBYuO3w0cDWE4RY9eU5IEw414As3lCcEP85z/RWhBxPDA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":45781,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbI2K/CRA9TVsSAnZWagAAmaYP/2vaE/ZDmR9uQFiSXyhX\nPlOGlz3ZHW+7T9bUjWWQld+ZKpKfEesdtoNr+mvVxq/KJqdcr956eeoRkfYG\nBs6Y8Vwu8TlnZIpdvCdz3HZNB4CZJPN5jDHb+uI97NWQ7md2TtDUOSuQEUqr\n5rc4QRXcyz9B3/lCkDYnZMomInfROt/V8enPCYwm5hF7UNEjpSZXHwoySvaD\n980rdIXGFGWf/TQnpIe+dDiB/SZGowJwV5RFmze0Dik4h/G3w37tydq0feiZ\nPoh8HR9o2IqKsFsZlpBEkOVTxPh4r2oEP12RR601CHVdwESrW3nuXpaI5WF/\nG8tdGQzMrsP7sP/KXzCcbZO2DJ+vVo5UF/Jlj2QT32w8I9iy4s1QlbnT9W+W\nUWTD5zaLNB/Q3DWnEu0xDGQgO0MxM2btu1mVYp1ZXOAwFa/edcCghBHV6Lbm\nVKrZJTrw4oO56ydIf8I4y5RRRI+vnIXSNUIaFVn96AUo6hkKZ00FLBUZvRGr\nr4pd8zFemxLC3wG3Ju/mHDBjV+5yUyrp24DrgvxWoOYuRI5aSGYIhQ36uD0g\n63e/VfQL5gIpG2eRGG0klfNUwdm3dnGN5CokF7Q8m5chbYuJ02VFYZWP6TKN\n/hFY1Tvof1aZXhOZIIEmufLbmgsmkVoQ+6wiFwEaNtvhJAt6xd5qQ30+iQVS\nku+q\r\n=N+0U\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","gitHead":"15a37aa882df699dc1f4ddbe8eb3cdbc2acbbf98","scripts":{"test":"make test"},"_npmUser":{"name":"albin3","email":"binwei.zeng3@gmail.com"},"_npmVersion":"5.5.1","description":"honeycomb api proxy express middleware.","directories":{},"_nodeVersion":"8.9.1","dependencies":{"qs":"^6.5.2","debug":"3.1.0","lodash":"4.15.0","multer":"1.3.0","urllib":"^2.27.0","formstream":"1.1.0","path-to-regexp":"1.6.0","hc-service-client":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"^4.0.1","express":"4.16.2","supertest":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/hc-proxy_1.0.6_1529045694752_0.0507641155857943","host":"s3://npm-registry-packages"}},"1.0.7":{"name":"hc-proxy","version":"1.0.7","keywords":["api","proxy","middleware"],"author":{"name":"albin"},"license":"ISC","_id":"hc-proxy@1.0.7","maintainers":[{"name":"albin3","email":"binwei.zeng3@gmail.com"},{"name":"fishbar","email":"zhengxinlin@gmail.com"}],"dist":{"shasum":"70216805a50642e2ef09af4f29cf7a212b3db03b","tarball":"https://registry.npmjs.org/hc-proxy/-/hc-proxy-1.0.7.tgz","fileCount":13,"integrity":"sha512-q9NHvx8o+LN7e8f74ppYU9VQRIsop79ABst028i037KzNYcs7ncJoar44fmgZIkhKJkHPN7qQr3uHuK5J3LxDQ==","signatures":[{"sig":"MEUCIQCLVB9Ny5MVvrEQu11P0RZASLRywBVU6iGXoLa4PLvHMAIgappAexkY8s25SxRIKMUbjfK0yH6gF/Q+9Q2Z/1y59Z4=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":45857,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbMI0+CRA9TVsSAnZWagAA+ZkP/3+EsB6kVnhpa6KZKaP7\npA68aLbYZK85kIFb4DgjqJjtITY+zL8TKcaTpf5g2Vy9li+n8Rq4fN+aZKm2\n7zzTBQs44sdHRvFRq/RVNqzZaCvajZln+J3tbXFg2cLxqM+Aq04FIlPkcNJe\nHCaWgSVFrBoERbPqfToHEPTiGl3UJJGBfAg0fgGZ657ZoXUHYV1GiMZaY6bd\nC6qf+gBG3MZnX9fGcz7HQHIW9ocMKOH95nwdrNd7rZqkAuLdPlynIL105pmk\nLU2k+B/NrBlaKV754K7dF/TiEkvPSAng3F9fy4RqfO6t8YveJKf3N79+y/Cd\nGJvwcD2zUufPJ0Ql1fvTWMkcLQpAzNMaIk7slTF5DEUFxCnpZoXVITlzj9NC\nPUS1vhf+16L78dH7x7Y0W0kZSxRKm+x2z8eA273/eAk671duHCtZUpy6EzJS\nfSYkocMWMzE1RnTR4jirqF8/SFqIa4/KqBz2LIoiNqqepxJBwc9xsGA5ECh/\nK0Z4+pXeshkCsl/9KRD2xcLptpmlH+1yJNCPy63VmU9UABUYM5VoDi5MLaxZ\n4AbniaoiU+3v3lzNlFrA+kTg7D3ti7u2YgvTbzKgcOBJvHytQGC07AUisd9v\nuvKlSlstkoDn1ZcrWydhDwxrI4ERvVvY5n02UQjQwY4o5XwFlDu0WqQQSv0p\npUHn\r\n=Ii9u\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","gitHead":"819e7909ce8b798eb703a6669a3b39ccdfb95648","scripts":{"test":"make test"},"_npmUser":{"name":"albin3","email":"binwei.zeng3@gmail.com"},"_npmVersion":"5.5.1","description":"honeycomb api proxy express middleware.","directories":{},"_nodeVersion":"8.9.1","dependencies":{"qs":"^6.5.2","debug":"3.1.0","lodash":"4.15.0","multer":"1.3.0","urllib":"^2.27.0","formstream":"1.1.0","path-to-regexp":"1.6.0","hc-service-client":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"^4.0.1","express":"4.16.2","supertest":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/hc-proxy_1.0.7_1529908542000_0.5692627618494659","host":"s3://npm-registry-packages"}},"1.0.8":{"name":"hc-proxy","version":"1.0.8","keywords":["api","proxy","middleware"],"author":{"name":"albin"},"license":"ISC","_id":"hc-proxy@1.0.8","maintainers":[{"name":"albin3","email":"binwei.zeng3@gmail.com"},{"name":"fishbar","email":"zhengxinlin@gmail.com"},{"name":"hqidea","email":"hqidea@yahoo.com"},{"name":"noonnightstorm","email":"noonnightstorm@gmail.com"}],"dist":{"shasum":"b0b8136e878ba3f9a8ebc1b0676c982ab897188b","tarball":"https://registry.npmjs.org/hc-proxy/-/hc-proxy-1.0.8.tgz","fileCount":13,"integrity":"sha512-fdI/YP6s0mkG9umNEJAw9yEehvSW7HkCOGulh1LJ4kqauHFaeHL1i1Y9Xle8Q5F2apSde1PJ3dDQ/duz5vo1Iw==","signatures":[{"sig":"MEUCIDbcEduyBgpEPMyPDrd2tyaXgrA9O+i+Am5HiA1n7RurAiEA0xTupxbPbaIpH0gQM2k7b1QDBJ4uoHeyvg+mEJ6E3YA=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":46171,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbqe6pCRA9TVsSAnZWagAASrwQAKHd4PiEyWAhikwRQoLn\nCAhKnIf/axWa9jJ+tM8KMwaMhr5ESHqSAWVOO6ZPDorfAT/XzmSoFoOE5q5N\nuseqeST4XjqS/u7M49tKDYtloDg9VHX6LbM+smA5pnX3cGEbBI1cI6gr19WB\nu/WkFR8Mru2v+VQDuiGX5XJzql9yldbpW9PLNg4yiuJr8I9xkpKUX1lYFqyn\nULO3mTA8gHWjGxFWmNgSFAFkMsHluNR3fDV9I1LNzsWm9uPRvkn0lc/JwLpm\nd7ePLUZpHar3H/z827uZoizPibKjJl3OC1J8ZuQiAW1yesJBL5vT36VcWdCI\nOJFkokYTjnk5yD8YQQSHZEgI6XR8NMCJuYGrgprmzek90PNs9/U5qcsOz7ox\n4gXChpWDEEeKwIruE5QJsSHK9Me+S3QG3gZBQxq1tW3J9IJWoLgrxln2JuwQ\nVei8ri62RAPkL3xf6oVh6aSfBiuXZJL2dLrzhS7zFYPs8vYKadxGzGMPFIMT\nm77kNgs+Ic7jaz/FaRhQn9sCvFMwswCYvuepMZjdkqcjUdyL8xSQhB3RPbcg\nsSzkgbWDkw1xl7NzoPz6Ts6JNGVkUyC/33tBUE/al8SShqdWreXufFBsSkoh\nnRtNdWb594UXDNW+D92g5GuGlcZsS/Y+djHlQmXzrzRibg90hEFYUMZWQB3T\nnC6Y\r\n=oLBc\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","gitHead":"d148e0b256212b24a7a712015aaeda7d5dc7a5e5","scripts":{"test":"make test"},"_npmUser":{"name":"noonnightstorm","email":"noonnightstorm@gmail.com"},"_npmVersion":"5.6.0","description":"honeycomb api proxy express middleware.","directories":{},"_nodeVersion":"8.5.0","dependencies":{"qs":"^6.5.2","debug":"3.1.0","lodash":"4.15.0","multer":"1.3.0","urllib":"^2.27.0","formstream":"1.1.0","path-to-regexp":"1.6.0","hc-service-client":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"^4.0.1","express":"4.16.2","supertest":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/hc-proxy_1.0.8_1537863337085_0.93304142422306","host":"s3://npm-registry-packages"}},"1.0.9":{"name":"hc-proxy","version":"1.0.9","keywords":["api","proxy","middleware"],"author":{"name":"albin"},"license":"ISC","_id":"hc-proxy@1.0.9","maintainers":[{"name":"albin3","email":"binwei.zeng3@gmail.com"},{"name":"fishbar","email":"zhengxinlin@gmail.com"},{"name":"hqidea","email":"hqidea@yahoo.com"},{"name":"noonnightstorm","email":"noonnightstorm@gmail.com"}],"dist":{"shasum":"32e98d71f32d0cf118bb470cee771a77d815907f","tarball":"https://registry.npmjs.org/hc-proxy/-/hc-proxy-1.0.9.tgz","fileCount":13,"integrity":"sha512-UJrW9RQ/vW7XFHUPi/e4/AuvhB0m/eo2xq8AcPCp0+CDG+nR9fLQzRGMi8GzFC5ultoiJ2qeRf76jtA9vowegw==","signatures":[{"sig":"MEYCIQCET0z8OcsfXFIm+svknqz0WlejNHuqfr6Y4YILN96b7AIhANPdawXe2jR3xJVdF1yx2sOc/f+LhNvqs0T4Ph8MeanQ","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":46578,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbq21XCRA9TVsSAnZWagAACQkP/3NNcG3WYX3HYcxJdOWW\n5o3emKa/gSo+KmvNKUHa2N2MhaVadBRH4pfA/WxJxNkWKDUAK3Zl0R5d6LSN\naRmektRnxVaTynvM4veuXCYzJvTDkFnRH3q2pwkc7D51vusuZehr1W59zPYT\nxCIQwQr5Wf8UUaQATSQy7vdlo6p/kicNvhvjhQvwI6MMZcpWRNcvGygV0DHn\nbPR6276lCKwF0AbNumAmg4ufNF0b/uXbz0wHxLgJ1jsyts8OPVvHx+qdaXAM\nQzcI1eTF69ZrGQny0t8TED+F5p5DRurkxCpMu6ZYbj4ijdEDSlz1pBMjjeh6\niJ1cEUJT+nXPrPFWGl5T5aJjxGab9ZOG5MigjolU4+QRqrU40B2T6VZxtQoz\ntVSHuVO+zDugahEPt8NjK77PXFINOKsAkib0FbNN4p8p1+zf5OjcO62S+xst\nxSDkEFYiyA8hT9G+UP6v+2F0/TtKQR+fhY6yph+QFAsy0A4Q5O3/GKcdxuId\n80jwVg25kglcZmA0i6M+0A8xg2tNINuFBPuDs0T/gl8QSTHaIbXy7rmCQ285\nG2l+quftWOj+E96xwcal8LO+ySiTgvt5LJoGb40zKOeC3fYaCU9LiGAmu1Ft\n7YAj2FylLxKjWz3OF0VlqZNLvvZIbnzIg46HPbtu/mDIVy9Ocn6H65E47DDm\nciOB\r\n=rRm1\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","gitHead":"2afc7f552231475a984d13d900fc26554a3e211e","scripts":{"test":"make test"},"_npmUser":{"name":"noonnightstorm","email":"noonnightstorm@gmail.com"},"_npmVersion":"5.6.0","description":"honeycomb api proxy express middleware.","directories":{},"_nodeVersion":"8.5.0","dependencies":{"qs":"^6.5.2","debug":"3.1.0","lodash":"4.15.0","multer":"1.3.0","urllib":"^2.27.0","formstream":"1.1.0","path-to-regexp":"1.6.0","hc-service-client":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"^4.0.1","express":"4.16.2","supertest":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/hc-proxy_1.0.9_1537961302904_0.6306518471528122","host":"s3://npm-registry-packages"}},"1.0.10":{"name":"hc-proxy","version":"1.0.10","keywords":["api","proxy","middleware"],"author":{"name":"albin"},"license":"ISC","_id":"hc-proxy@1.0.10","maintainers":[{"name":"albin3","email":"binwei.zeng3@gmail.com"},{"name":"fishbar","email":"zhengxinlin@gmail.com"},{"name":"hqidea","email":"hqidea@yahoo.com"},{"name":"noonnightstorm","email":"noonnightstorm@gmail.com"}],"dist":{"shasum":"120f14c4fdd3e5d84d5a03d015cb9ebe9dfe89a4","tarball":"https://registry.npmjs.org/hc-proxy/-/hc-proxy-1.0.10.tgz","fileCount":13,"integrity":"sha512-lsKS3EtEQmLteK9qp56BzeOeZL0sq0+bSvZ0E+5/6gzrVftTjwknAMLXhLs2HUGSbmJIj7mn6EOcARgJNSR5BQ==","signatures":[{"sig":"MEQCIGNbQq7A+MkTKoTQzJZvursMS8t8X4NHFDwh6ub5XW1nAiA6S6BooxQ/ymu1BrYTMoQnqxstosCISB7xkK0+Aw6gjQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":46216,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbzuYaCRA9TVsSAnZWagAAxUAP/1dZuHJC0sPYyT+fBYsp\nZKtg7cXUq1p6QoWKuKTaanl6jfaEAy7pCN+z20layYzt4qI9l8E84NuYJcoH\nlkabGL2pyMyoD6Fo4feYeGcZtaYYZGVc1oB5CHha9sKywvoIrkqpv9e0cfj7\ntL5gE3TniECyxVgTrc7Oz4MHLKOsRQWq5yHcmpNWLXccHiYQ0IvPg8wSjUVo\n2BQKhzM8pZHnQrLM5mKVw/quwc7TZ6EQ4sVOtRGKT1LZISr3JabYYq3WVJeR\nxwyzvvDD1nz4ZV2w9ZpdO8qWaYuq0LLVA3+6p5+On91/S4XTxObYeWg0Vb1g\n7A4lxSCluSrNDkZnxcapVL/Pjd8WaLjDMNfIV9UE/bsht6ZsU6sx5iIufAO6\nmurUUuUBY0ab1PYAba1KPYxEmN0y9hKJzki2AqFwgeSAvgruvFhzX6PBEujo\nEXYNta5ci0VmUMxFgh7gDdaArp+6KMnyTEYqzIVWFlRixepV+I/rgeXYGcvY\n/qNnt6MpCQo+AVlwapMALKqey63e0XmoK8+PnwZMBJigyzMpel4Ibcv4MiU2\nzy8l5tYF7JMYnHgeJ4dV2nH2Bnf1cd6y2UwxIih26qWDNWxBHAS4itLXJt8p\nMRp7G/P5wTWwf5HWlQl2axGPDCZ6nIKm8/KJIjnX/yUsE6rRmBiibmun9y+H\nuS/p\r\n=7Ac9\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","readme":"# service proxy\n\n> api代理模块，解决跨域、权限问题\n\n## 场景案例\n\n远程需要被代理转发的服务:\n\n```\nhttp://localhost:7001/api/aaa         // 视频服务接口\nhttp://localhost:7001/api/c/*         // 视频服务接口\nhttp://192.168.1.1:7001/api/bbb       // 音乐服务接口\nhttp://localhost:7001/ws/*            // 聊天服务接口 (使用websocket)\n```\n\n### 以honeycomb项目为例进行配置\n\n1. 确定honeycomb项目的启动端口和prefix，比如： 项目的启动端口为8001，prefix为 'example'\n2. 整理远程调用的服务，给每个服务起个英文名称，比如： 上面的两个服务  视频服务(video)  音乐服务(music)  聊天服务(chat)\n3. 配置在router.js中，进行如下配置\n\n```js\n// router.js\nconst app = require('./app');\nconst Proxy = require('hc-proxy');\nconst proxyInstance = new Proxy({\n  service: {\n    video: {\n      endpoint: 'http://localhost:7001/',\n      client: 'http',\n      api: [\n        '/api/aaa',\n        '/api/c/*'\n      ]\n    },\n    music: {\n      endpoint: 'http://192.168.1.1:7001/',\n      client: 'http',\n      api: [\n        '/api/bbb'\n      ]\n    }\n  },\n  headers: [\n    'x-csrf-token',\n    'X-Operator'\n  ]\n});\n\nproxyInstance.setProxyPrefix('/api/proxy');\n\nmodule.exports = function (router) {\n  proxyInstance.mount(router, app);\n};\n```\n\n### 配置完成后访问地址\n\n访问地址为 ${honeycomb服务地址:honeycomb服务端口/honeycomb的prefix} + ${proxyPrefix} + ${被代理服务名} + ${具体api}\n\n```shell\n1. 视频服务:   curl http://localhost:8001/example/api/proxy/video/api/aaa => http://localhost:7001/api/aaa\n2. 视频服务:   curl http://localhost:8001/example/api/proxy/video/api/c/somewhat?xxx=123 => http://localhost:7001/api/c/somewhat?xxx=123\n3. 音乐服务:   curl http://localhost:8001/example/api/proxy/music/api/bbb => http://192.168.1.1:7001/api/bbb\n```\n\n### 代理websocket服务\n\n```js\n// router.js\nconst app = require('./app');\nconst Proxy = require('hc-proxy');\nconst proxyInstance = new Proxy({\n  service: {\n    music: {\n      endpoint: 'http://192.168.1.1:7001/',\n      client: 'http',\n      api: [\n        '/api/bbb'\n      ]\n    },\n    chat: {\n      endpoint: 'http://localhost:7001/',\n      client: 'websocket',\n      api: [\n        '/ws/*'\n      ]\n    }\n  },\n  headers: [\n    'x-csrf-token',\n    'X-Operator'\n  ]\n});\n\nproxyInstance.setProxyPrefix('/api/proxy');\n\nmodule.exports = function (router) {\n  proxyInstance.mount(router, app);\n};\n```\n\n### websocket配置完成后访问地址\n\n访问地址为 ${honeycomb服务地址:honeycomb服务端口/honeycomb的prefix} + ${proxyPrefix} + ${被代理服务名} + ${具体api}\n\n```shell\n1. 音乐服务:   curl http://localhost:8001/example/api/proxy/music/api/bbb => http://192.168.1.1:7001/api/bbb\n2. 聊天服务:   curl http://localhost:8001/example/api/proxy/chat/ws/somewhat => http://localhost:7001/ws/somewhat      // 支持websocket\n```\n\n### 代理文件上传\n\n```js\n// router.js\nconst app = require('./app');\nconst Proxy = require('hc-proxy');\nconst proxyInstance = new Proxy({\n  service: {\n    music: {\n      endpoint: 'http://192.168.1.1:7001/',\n      client: 'http',\n      api: [\n        {\n          path: '/api/upload',\n          file: true\n        },\n        {\n          path: '/api/upload_limited',\n          file: {\n            maxFileSize: 100        // 100B\n          }\n        }\n      ]\n    }\n  },\n  headers: [\n    'x-csrf-token',\n    'X-Operator'\n  ]\n});\n\nproxyInstance.setProxyPrefix('/api/proxy');\n\nmodule.exports = function (router) {\n  proxyInstance.mount(router, app);\n};\n```\n\n### 文件上传代理效果\n\n```shell\n1. 上传文件1:   curl http://localhost:8001/example/api/proxy/music/api/upload => http://192.168.1.1:7001/api/upload\n2. 上传文件2:   curl http://localhost:8001/example/api/proxy/music/api/upload_limited => http://192.168.1.1:7001/api/upload_limited\n```\n\n## API document\n\n约定:\n\n- proxy挂在的http服务称为 \"代理服务\"\n- 被proxy代理的远端服务称为 \"远端服务\"\n\n### new Proxy(options)\n\n#### options Object\n\noptions.service 详情\n\n```\n{\n  ${serviceCode}: {\n    endpoint: ${endpoint},\n    accessKeyId: ${accessKeyId},\n    accessKeySecret: ${accessKeySecret},\n    headerExtension: ${headerExtension}，\n    headers: ${headers},\n    client: ${client},\n    timeout: ${timeout},\n    useQuerystringInDelete: ${useQuerystringInDelete},    // 只有 appClient / urllib 模式有效\n    urllibOption: ${urllibOption},                        // 只有 appClient / urllib 模式有效\n    api: [\n      ${apiString},\n      {\n        path: ${path},\n        route: ${route},\n        method: ${method},\n        timeout: ${apiTimeout},\n        defaultQuery: ${defaultQuery},\n        beforeRequest: ${beforeRequest}, // TODO\n        useQuerystringInDelete: ${useQuerystringInDelete},\n        urllibOption: ${urllibOption}\n      }\n    ]\n  }\n}\n```\n\n通用配置:\n\n- endpoint: 每个远端服务的服务地址，如: 'http://localhost:7001' 或 'http://localhost:7001/service'\n- client: 目前只支持'appClient' / 'http' / 'websocket'，默认为'appClient'，其中 appClient 带了honeycomb体系中的签名逻辑\n- timeout: 某个服务或接口的超时时间，毫秒计算，默认60000\n- apiString: 使用默认配置对某个api进行代理，设置的是Api的path，如: '/api/user' 会对 '/api/user' 进行 'GET', 'POST', 'PUT', 'DELETE' 代理\n- path: api的路径，如: '/api/user'，支持 '/api/user' / '/api/user/:user' / '/api/user/*'\n- route: api在路由中出现的路径(会忽略proxyPrefix)，如： '/remote_service/aaa' , 则调用 ${localService} + '/remote_service/aaa'，会被走path对应的远端服务\n- method: 指定这个api支持的方法 'GET' / ['GET', 'POST']，不填时，默认为 ['GET', 'POST', 'PUT', 'DELETE']\n- apiTimeout: 覆盖整个服务的timeout\n- defaultQuery: String / Object，用于配置默认的query参数(代理请求时自动加上)\n- beforeRequest: 暂不支持\n- file: 配置上传文件，出现上传文件配置时，该接口支持上传文件，子配置使用默认值可以配置为 {... file: true}\n  - maxFileSize: 上传文件的大小限制, 单位byte, default\n- useQuerystringInDelete: delete方法使用querystring代理, 默认为true\n- urllibOption: 用户覆盖的urllibOption，覆盖系统默认值，优先级: service.api.urllibOption > service.urllibOption > hc-proxy默认设置\n\nclient=[appClient/serviceClient]的专属配置\n\n- headers: 选填，同 hc-service-client 配置，见文档: https://www.npmjs.com/package/hc-service-client\n- accessKeyId: 选填，同 hc-service-client 配置，默认 'hc-proxy'，详见 https://www.npmjs.com/package/hc-service-client\n- accessKeySecret: 同 hc-service-client 配置，必填，不填时取 app.config.systemToken，详见 https://www.npmjs.com/package/hc-service-client\n- headerExtension:  同 hc-service-client 配置，见文档: https://www.npmjs.com/package/hc-service-client\n\n#### options.headers Array<string>\n\noptions.headers 用于声明proxy需要转发的header。\n默认情况下，proxy不转发客户端过来的header，只有在proxyHeaders中配置的header才会被转发。\n\n### proxy.setProxyPrefix(proxyPrefix)\n\n- proxyPrefix <String>\n\nsetProxyPrefix方法用于指定 hc-proxy 挂载在代理服务上的总前缀\n\n如: 默认 proxyPrefix = /api/proxy \n则: 所有请求远端服务的请求，格式为   ${localHttpServer}/api/proxy/${serviceCode}/${remoteApi}\n\n### proxy.mount(router, app)\n\n将proxy的配置挂在到代理服务。\n\n- router: Express Router instance\n- app: app.server 是一个 http.Server 的实例，honeycomb中，直接 require('./app') 能获得\n\n## 更多例子\n\n```js\n'use strict';\n\nconst app = require('./app');\nconst Proxy = require('hc-proxy');\nconst proxyInstance = new Proxy({\n  service: {\n    otm: {\n      endpoint: 'http://dev.dtboost.biz.aliyun.test/otm_v2',                           // 自动截取最后的'/'\n      client: 'appClient',                                                                // 默认appClient\n      timeout: 10000,                                                                     // 默认60000\n      api: [\n        '/api/*',                                                                         // 支持 * 代理某个path下的所有api\n        '/otm_v2/api/entities/list',                                                      // 代理这个 url 的 GET POST PUT DELETE 方法\n        {path: '/otm_v2/api/entities/list', method: 'GET'},                                // 只代理 GET 方法\n        {path: '/otm_v2/api/entities/list', client: 'appClient'},                          // 显式指定 method\n        {path: '/otm_v2/api/schemas', method: ['GET', 'POST']},                            // 只支持 GET POST 方法\n        {host: 'http://taobao.com/api', path: '/tag_factory_v2/api/:id', method: 'GET'},   // 不同域时，指定host\n        {path: 'http://taobao.com/api', route: '/api/proxy/taobao_api'},                   // 指定route的代理，不指定route时，所有代理接口请求 /<-app_name->/api/proxy 获得代理\n        '/otm_v2/api/tags/query_tags_entity_pagenum',                                     // \n        {path: '/otm_v2/api/schemas/:id', route: '/api/proxy/schemas/:id'}                 // 带参数的url，保证route和url中的param一致，也可以不填route\n      ]\n    },\n    websocket: {\n      endpoint: 'http://dev.dtboost.biz.aliyun.test/websocket',               // 远程的websocket地址\n      client: 'websocket',                                                       // 选择websocket作为连接的client\n      api: [\n        '/ws'                                                                    // 配置连接路径，不在的路径返回404\n      ]\n    }\n  },\n  headers: [\n    'x-csrf-token',\n    'X-Operator'\n  ]\n});\n\nproxyInstance.setProxyPrefix('/api/proxy');\n\nmodule.exports = function (router) {\n  proxyInstance.mount(router, app);\n};\n```\n\n## DEBUG [代理没生效？]\n\n在命令行启动命令前加入`DEBUG=hc-proxy`\n\n```sh\n// 以启动命令为 honeycomb start 为例\nDEBUG=hc-proxy honeycomb start\n\n// ...\n// hc-proxy [GET] /api/proxy/urllib_proxy/urllib -> http://localhost:58062/urllib +0ms\n// hc-proxy [POST] /api/proxy/urllib_proxy/urllib -> http://localhost:58062/urllib +3ms\n// hc-proxy [DELETE] /api/proxy/urllib_proxy/urllib -> http://localhost:58062/urllib +1ms\n// hc-proxy [PUT] /api/proxy/urllib_proxy/urllib -> http://localhost:58062/urllib +0ms\n// ...\n```\n\n## 作用\n\n- 本地开发时，可以使用这个代理访问远程其它服务(如otm)的问题；\n- 非本地开发环境时，可以不使用代理，而直接访问类似'/otm_v2/api/xxx'，以减小内部调用开销，由前端自行控制；\n","gitHead":"eb8aa1a1bab8bafea47b8b65eb1c17381f38721c","scripts":{"test":"make test"},"_npmUser":{"name":"noonnightstorm","email":"noonnightstorm@gmail.com"},"_npmVersion":"5.6.0","description":"honeycomb api proxy express middleware.","directories":{},"_nodeVersion":"8.5.0","dependencies":{"qs":"^6.5.2","debug":"3.1.0","lodash":"4.15.0","multer":"1.3.0","urllib":"^2.27.0","formstream":"1.1.0","path-to-regexp":"1.6.0","hc-service-client":"^1.0.0"},"_hasShrinkwrap":false,"readmeFilename":"readme.md","devDependencies":{"mocha":"^4.0.1","express":"4.16.2","supertest":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/hc-proxy_1.0.10_1540285977364_0.33265708320359244","host":"s3://npm-registry-packages"}},"1.0.11":{"name":"hc-proxy","version":"1.0.11","keywords":["api","proxy","middleware"],"author":{"name":"albin"},"license":"ISC","_id":"hc-proxy@1.0.11","maintainers":[{"name":"albin3","email":"binwei.zeng3@gmail.com"},{"name":"fishbar","email":"zhengxinlin@gmail.com"},{"name":"hqidea","email":"hqidea@yahoo.com"},{"name":"noonnightstorm","email":"noonnightstorm@gmail.com"}],"dist":{"shasum":"ea2f95beae9f6f861ed853bbf825ee2dcf58e772","tarball":"https://registry.npmjs.org/hc-proxy/-/hc-proxy-1.0.11.tgz","fileCount":13,"integrity":"sha512-lTTFKF1tS9UMe+HfWlR0JI8PAp0dA17W6dhWMwXu4yGEMb2p7zzHMC1acbwe/VZ4cSURclMGlcBAp0na365OpQ==","signatures":[{"sig":"MEUCIQDDs+Ki8VG0lzFv36/oic3pkReBiG8tRuZRgtMxxD1t9gIgSChURC5AtAO4CVRDrrImWIv1nJs7pZgn1S0nhrssGtQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":46216,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcLfOMCRA9TVsSAnZWagAAVEEP/1EuVqciWktBu1NuF20W\nJaI2zS8ikZ9GzqDfiSG+0ruRtfA/mkwiwXJzmQrGdNAivTFgQrdrDEthXXSp\nSP8igsQUCY/flWx/QPQKtUqj/dVjp341fNnxl2rDX8w0GjCkaqJAd8cwBRlW\nSz4LFUf0eJnPhhnfjiQpdwzBITcADcd9ngZNUKGunegRVb5BIhRMZq1ziT2w\npWum7cjPjE3Rr4nERk/GPsZFLnOmaQQDGP633MleChrz9jmb3sEvBBDRhh7+\nleeW0AKDaqq1YNbXfRy3VJOo5W/gmbZhgCY8D8YmXFC8ck/u/s7WIJeshyL1\nMj0AZqkiRcsj/g32Oj4Zi/4Pz0HsngBLtO5JvRpsQcPU6YkbUEfyUKvabt+1\nwDwCGmgQ0glvokV49z+dWtGcVC53mGnZ5C90vfTX6ejNUqxHOIOGt5FBlR6j\n9K6E1XYcxIShFIRovNyBV71JmF1FEjRLKUOinXx6OjgieleTOMzUqPW/2iNQ\nh8epMUs5uvzUmHIKhBchCQlSis+4qsNR0JRCIjT8pbnnfdZbh1BajpWtnWmk\n+VpEIpM7JK7F7SbDxYS0vgItoag6mFKtZod78AfUX/mpN+fZqYJnPDNqeCN5\n4c2oS7fVZ7Sqv407MKy22RxeconCmkHjg2dKifbJ0lG6jHlXEPeDOat2dW3i\nRLTT\r\n=wUHa\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","gitHead":"f37ac251017e675ec31dbc5170792f7f62eb0942","scripts":{"test":"make test"},"_npmUser":{"name":"noonnightstorm","email":"noonnightstorm@gmail.com"},"_npmVersion":"5.6.0","description":"honeycomb api proxy express middleware.","directories":{},"_nodeVersion":"8.5.0","dependencies":{"qs":"^6.5.2","debug":"3.1.0","lodash":"4.15.0","multer":"1.3.0","urllib":"^2.27.0","formstream":"1.1.0","path-to-regexp":"1.6.0","hc-service-client":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"^4.0.1","express":"4.16.2","supertest":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/hc-proxy_1.0.11_1546515340305_0.5541265400016202","host":"s3://npm-registry-packages"}},"1.0.12":{"name":"hc-proxy","version":"1.0.12","keywords":["api","proxy","middleware"],"author":{"name":"albin"},"license":"ISC","_id":"hc-proxy@1.0.12","maintainers":[{"name":"albin3","email":"binwei.zeng3@gmail.com"},{"name":"fishbar","email":"zhengxinlin@gmail.com"},{"name":"hqidea","email":"hqidea@yahoo.com"},{"name":"noonnightstorm","email":"noonnightstorm@gmail.com"}],"dist":{"shasum":"5f4246b5b037e1bd732169a31efcd5a420f57a55","tarball":"https://registry.npmjs.org/hc-proxy/-/hc-proxy-1.0.12.tgz","fileCount":13,"integrity":"sha512-EzEulPsqVmjoxLiS88YLO54h4dQUzcyx3+FaAVrszroZ6VBeOh2/WSKSXzyn3T+O6qXACw5Ue8MbThAk7yfYrg==","signatures":[{"sig":"MEUCIAwB1anMiDJbpOejnRBMzknGJdcGebJkmC0q149BoDU0AiEAyZLo2TNbWjjTBytoc+nx1Je/yp3GvhAshVQn6MB5RxM=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":47416,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcLfTSCRA9TVsSAnZWagAA3v4P/2y9x+QymjcYx3QWP2k9\n7QIHqVU7AK8VG5YrgcDFn0In7rdp4uo5wURogsIsCWFj+DqCvhoQMQ95EAH7\n3HzgllGGzJEt+jVFkuKa+QzfUhkstRCfGS4dov4VlfyRhxsmwU2wgQbCkxgG\nd7ImaRZC9xnUFi+d5uoG2NLteNXur3CtlFE1m7ANbeB0ZHn1ris/05VwrR2u\ndGjpJYBDNQldGadQQp+/10h+GPrkbWA/6gfxCmEwgPVhqgz8KVkUs2jqp1mS\nDm9E2HvtlpoT09u8aELsVqE4N0yxQWQQTR/X5J+tHMHhByZWqMjspZmUBODs\nPR6hqQqA37WgQTRJeiqurlkUBrpQK56WspmPbA/1UnCj9wbkqx9NDGS38l/s\nTx8rYga89O10RpPX/jU0nBcjIA9zuJqv4h/N9xhhjquuIEEPT7HFFBu5Myer\nyhPowiwrP/Gpra1/q/R7GhXqr3P+mpZdaa+IvODUsbsrZm1DMBjLxHh10Lpa\nwX39puVFbZmb7Ljz8HEeW/mh2FsDy2uphH/qlsqr9CzrFRXgLK6c6k37Bjus\nzfnmpgC6h/9sLa2Zoc+TXbSgHnhw+ZCzSUmHB0mW5lR9gU37SWP7ai5NKFsY\nBWkbaNrA81gKmwh0pnpL0MCsYIevxCKUeG8UFEgfPmqXuQq87wVXtJjHLn1w\nucxI\r\n=oYn4\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","gitHead":"3930133683300463f974c3c27ca31762e76f7f9a","scripts":{"test":"make test"},"_npmUser":{"name":"noonnightstorm","email":"noonnightstorm@gmail.com"},"_npmVersion":"5.6.0","description":"honeycomb api proxy express middleware.","directories":{},"_nodeVersion":"8.5.0","dependencies":{"qs":"^6.5.2","debug":"3.1.0","lodash":"4.15.0","multer":"1.3.0","urllib":"^2.27.0","formstream":"1.1.0","path-to-regexp":"1.6.0","hc-service-client":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"^4.0.1","express":"4.16.2","supertest":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/hc-proxy_1.0.12_1546515666290_0.037325988294331314","host":"s3://npm-registry-packages"}},"2.0.0":{"name":"hc-proxy","version":"2.0.0","keywords":["api","proxy","middleware"],"author":{"name":"albin"},"license":"ISC","_id":"hc-proxy@2.0.0","maintainers":[{"name":"albin3","email":"binwei.zeng3@gmail.com"},{"name":"fishbar","email":"zhengxinlin@gmail.com"},{"name":"hqidea","email":"hqidea@yahoo.com"},{"name":"noonnightstorm","email":"noonnightstorm@gmail.com"}],"dist":{"shasum":"22ed87150ab776aacb0e212018670656b9e3f517","tarball":"https://registry.npmjs.org/hc-proxy/-/hc-proxy-2.0.0.tgz","fileCount":13,"integrity":"sha512-i1TMo6oUJ/o+VpSo+fDjM7Yo1WU/wr32yBi75/ZlUrg4Y3d7lq/FBJjpoFp8i+AwRdA75IcDA8o1G71+yIVXOg==","signatures":[{"sig":"MEYCIQDH4X+1AIDIwYD1RnStNlk0qbYsHhVpXYJw4sY8lQB9CQIhAN7/J0RKLn6QLabKHmiwzoGxzCDKTHewJwQyimkratop","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":47863,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcUEAMCRA9TVsSAnZWagAAS0AP/iWk9j2mNAFt5u82CTox\nhuo0Gd3CwrynWL54hN/bM3hAkybh4SaM8gh61GtGd7lZYaXF9g7VupC80jqs\nql6s7xTCoA9qz0Fr0fBms8cWzzqAlPSW1cQ3Y/Es2M0VTYBHTdg+WupVSMcU\nyUfsndUlwLWjhG0DKgLH/VvJUUuprbNwWSGGIMOG5aOegsV9W0ZB87uVgx5D\nh25QggFM7HeCS6AW4Xh6Ol9V8MwMsPLELtENB4h/43GMMMzg/4AJo8PNaWY/\n6pDecERHarJrCTz4Mj4xGtRTYhE5dE+dgqj9fc42YxqSCoD6KHDLPAq2JiMh\nHh9eGYGiT9u/sFrU0wKc1lwUzNTDrE+aRXhZXnqf4bZ07A73opJyDxsUUsXA\nwb1pqeaIhFJSc14SH5Qwd7YWbvfYMpuhXZInfnq+fqlG7aCgcIdINfbbCe9o\nbMxA4bigwDaLyvcMi2DfIp+jEGpBQImp54bFuwfb5JzQcrMd/MWAFot5HmBz\nFfEdN3NxkNnFAm2UjBQP27Lw63aR2dlpZpEaXBxwLXBO5a0Q2TeoO5I1CqvN\ndLtHXJmYIPPHFbDEIJlnEBZc+jHjcIJFeThZKwlInngGTxGi/5e43B+iRqah\nGN3qLYMhOis8QrnN9u2O7rJ7Q3aAZOIQN+1XEp9RvGkntRnvbpYtLZJPaplk\nf+2v\r\n=3yC5\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","readme":"# service proxy\n\n> api代理模块，解决跨域、权限问题\n\n## 场景案例\n\n远程需要被代理转发的服务:\n\n```\nhttp://localhost:7001/api/aaa         // 视频服务接口\nhttp://localhost:7001/api/c/d        // 视频服务接口\nhttp://192.168.1.1:7001/api/bbb       // 音乐服务接口\nhttp://localhost:7001/ws/a            // 聊天服务接口 (使用websocket)\n```\n\n### 以honeycomb项目为例进行配置\n\n1. 确定honeycomb项目的启动端口和prefix，比如： 项目的启动端口为8001，prefix为 'example'\n2. 整理远程调用的服务，给每个服务起个英文名称，比如： 上面的两个服务  视频服务(video)  音乐服务(music)  聊天服务(chat)\n3. 配置在router.js中，进行如下配置\n4. 请注意，为了确保安全，所有api只支持白名单\n\n```js\n// router.js\nconst app = require('./app');\nconst Proxy = require('hc-proxy');\nconst proxyInstance = new Proxy({\n  service: {\n    video: {\n      endpoint: 'http://localhost:7001/',\n      client: 'http',\n      api: [\n        '/api/aaa',\n        '/api/c/d'\n      ]\n    },\n    music: {\n      endpoint: 'http://192.168.1.1:7001/',\n      client: 'http',\n      api: [\n        '/api/bbb'\n      ]\n    }\n  },\n  headers: [\n    'x-csrf-token',\n    'X-Operator'\n  ]\n});\n\nproxyInstance.setProxyPrefix('/api/proxy');\n\nmodule.exports = function (router) {\n  proxyInstance.mount(router, app);\n};\n```\n\n### 配置完成后访问地址\n\n访问地址为 ${honeycomb服务地址:honeycomb服务端口/honeycomb的prefix} + ${proxyPrefix} + ${被代理服务名} + ${具体api}\n\n```shell\n1. 视频服务:   curl http://localhost:8001/example/api/proxy/video/api/aaa => http://localhost:7001/api/aaa\n2. 视频服务:   curl http://localhost:8001/example/api/proxy/video/api/c/somewhat?xxx=123 => http://localhost:7001/api/c/somewhat?xxx=123\n3. 音乐服务:   curl http://localhost:8001/example/api/proxy/music/api/bbb => http://192.168.1.1:7001/api/bbb\n```\n\n### 代理websocket服务\n\n```js\n// router.js\nconst app = require('./app');\nconst Proxy = require('hc-proxy');\nconst proxyInstance = new Proxy({\n  service: {\n    music: {\n      endpoint: 'http://192.168.1.1:7001/',\n      client: 'http',\n      api: [\n        '/api/bbb'\n      ]\n    },\n    chat: {\n      endpoint: 'http://localhost:7001/',\n      client: 'websocket',\n      api: [\n        '/ws/a'\n      ]\n    }\n  },\n  headers: [\n    'x-csrf-token',\n    'X-Operator'\n  ]\n});\n\nproxyInstance.setProxyPrefix('/api/proxy');\n\nmodule.exports = function (router) {\n  proxyInstance.mount(router, app);\n};\n```\n\n### websocket配置完成后访问地址\n\n访问地址为 ${honeycomb服务地址:honeycomb服务端口/honeycomb的prefix} + ${proxyPrefix} + ${被代理服务名} + ${具体api}\n\n```shell\n1. 音乐服务:   curl http://localhost:8001/example/api/proxy/music/api/bbb => http://192.168.1.1:7001/api/bbb\n2. 聊天服务:   curl http://localhost:8001/example/api/proxy/chat/ws/somewhat => http://localhost:7001/ws/somewhat      // 支持websocket\n```\n\n### 代理文件上传\n\n```js\n// router.js\nconst app = require('./app');\nconst Proxy = require('hc-proxy');\nconst proxyInstance = new Proxy({\n  service: {\n    music: {\n      endpoint: 'http://192.168.1.1:7001/',\n      client: 'http',\n      api: [\n        {\n          path: '/api/upload',\n          file: true\n        },\n        {\n          path: '/api/upload_limited',\n          file: {\n            maxFileSize: 100        // 100B\n          }\n        }\n      ]\n    }\n  },\n  headers: [\n    'x-csrf-token',\n    'X-Operator'\n  ]\n});\n\nproxyInstance.setProxyPrefix('/api/proxy');\n\nmodule.exports = function (router) {\n  proxyInstance.mount(router, app);\n};\n```\n\n### 文件上传代理效果\n\n```shell\n1. 上传文件1:   curl http://localhost:8001/example/api/proxy/music/api/upload => http://192.168.1.1:7001/api/upload\n2. 上传文件2:   curl http://localhost:8001/example/api/proxy/music/api/upload_limited => http://192.168.1.1:7001/api/upload_limited\n```\n\n## API document\n\n约定:\n\n- proxy挂在的http服务称为 \"代理服务\"\n- 被proxy代理的远端服务称为 \"远端服务\"\n\n### new Proxy(options)\n\n#### options Object\n\noptions.service 详情\n\n```\n{\n  ${serviceCode}: {\n    endpoint: ${endpoint},\n    accessKeyId: ${accessKeyId},\n    accessKeySecret: ${accessKeySecret},\n    headerExtension: ${headerExtension}，\n    headers: ${headers},\n    client: ${client},\n    timeout: ${timeout},\n    useQuerystringInDelete: ${useQuerystringInDelete},    // 只有 appClient / urllib 模式有效\n    urllibOption: ${urllibOption},                        // 只有 appClient / urllib 模式有效\n    defaultErrorCode: ${errorCode}                        // 覆盖5XX的errorCode\n    api: [\n      ${apiString},\n      {\n        path: ${path},\n        route: ${route},\n        method: ${method},\n        timeout: ${apiTimeout},\n        defaultQuery: ${defaultQuery},\n        beforeRequest: ${beforeRequest}, // TODO\n        useQuerystringInDelete: ${useQuerystringInDelete},\n        urllibOption: ${urllibOption}\n      }\n    ]\n  }\n}\n```\n\n通用配置:\n\n- endpoint: 每个远端服务的服务地址，如: 'http://localhost:7001' 或 'http://localhost:7001/service'\n- client: 目前只支持'appClient' / 'http' / 'websocket'，默认为'appClient'，其中 appClient 带了honeycomb体系中的签名逻辑\n- timeout: 某个服务或接口的超时时间，毫秒计算，默认60000\n- apiString: 使用默认配置对某个api进行代理，设置的是Api的path，如: '/api/user' 会对 '/api/user' 进行 'GET', 'POST', 'PUT', 'DELETE' 代理\n- path: api的路径，如: '/api/user'，支持 '/api/user' / '/api/user/:user' / '/api/user/'\n- route: api在路由中出现的路径(会忽略proxyPrefix)，如： '/remote_service/aaa' , 则调用 ${localService} + '/remote_service/aaa'，会被走path对应的远端服务\n- method: 指定这个api支持的方法 'GET' / ['GET', 'POST']，不填时，默认为 ['GET', 'POST', 'PUT', 'DELETE']\n- apiTimeout: 覆盖整个服务的timeout\n- defaultQuery: String / Object，用于配置默认的query参数(代理请求时自动加上)\n- beforeRequest: 暂不支持\n- file: 配置上传文件，出现上传文件配置时，该接口支持上传文件，子配置使用默认值可以配置为 {... file: true}\n  - maxFileSize: 上传文件的大小限制, 单位byte, default\n- useQuerystringInDelete: delete方法使用querystring代理, 默认为true\n- urllibOption: 用户覆盖的urllibOption，覆盖系统默认值，优先级: service.api.urllibOption > service.urllibOption > hc-proxy默认设置\n- defaultErrorCode: 覆盖转发时的5XX的errorCode\n\nclient=[appClient/serviceClient]的专属配置\n\n- headers: 选填，同 hc-service-client 配置，见文档: https://www.npmjs.com/package/hc-service-client\n- accessKeyId: 选填，同 hc-service-client 配置，默认 'hc-proxy'，详见 https://www.npmjs.com/package/hc-service-client\n- accessKeySecret: 同 hc-service-client 配置，必填，不填时取 app.config.systemToken，详见 https://www.npmjs.com/package/hc-service-client\n- headerExtension:  同 hc-service-client 配置，见文档: https://www.npmjs.com/package/hc-service-client\n\n#### options.headers Array<string>\n\noptions.headers 用于声明proxy需要转发的header。\n默认情况下，proxy不转发客户端过来的header，只有在proxyHeaders中配置的header才会被转发。\n\n### proxy.setProxyPrefix(proxyPrefix)\n\n- proxyPrefix <String>\n\nsetProxyPrefix方法用于指定 hc-proxy 挂载在代理服务上的总前缀\n\n如: 默认 proxyPrefix = /api/proxy \n则: 所有请求远端服务的请求，格式为   ${localHttpServer}/api/proxy/${serviceCode}/${remoteApi}\n\n### proxy.mount(router, app)\n\n将proxy的配置挂在到代理服务。\n\n- router: Express Router instance\n- app: app.server 是一个 http.Server 的实例，honeycomb中，直接 require('./app') 能获得\n\n## 更多例子\n\n```js\n'use strict';\n\nconst app = require('./app');\nconst Proxy = require('hc-proxy');\nconst proxyInstance = new Proxy({\n  service: {\n    otm: {\n      endpoint: 'http://dev.dtboost.biz.aliyun.test/otm_v2',                           // 自动截取最后的'/'\n      client: 'appClient',                                                                // 默认appClient\n      timeout: 10000,                                                                     // 默认60000\n      api: [\n        '/api/a',                                                                         // 支持 * 代理某个path下的所有api\n        '/otm_v2/api/entities/list',                                                      // 代理这个 url 的 GET POST PUT DELETE 方法\n        {path: '/otm_v2/api/entities/list', method: 'GET'},                                // 只代理 GET 方法\n        {path: '/otm_v2/api/entities/list', client: 'appClient'},                          // 显式指定 method\n        {path: '/otm_v2/api/schemas', method: ['GET', 'POST']},                            // 只支持 GET POST 方法\n        {host: 'http://taobao.com/api', path: '/tag_factory_v2/api/:id', method: 'GET'},   // 不同域时，指定host\n        {path: 'http://taobao.com/api', route: '/api/proxy/taobao_api'},                   // 指定route的代理，不指定route时，所有代理接口请求 /<-app_name->/api/proxy 获得代理\n        '/otm_v2/api/tags/query_tags_entity_pagenum',                                     // \n        {path: '/otm_v2/api/schemas/:id', route: '/api/proxy/schemas/:id'}                 // 带参数的url，保证route和url中的param一致，也可以不填route\n      ]\n    },\n    websocket: {\n      endpoint: 'http://dev.dtboost.biz.aliyun.test/websocket',               // 远程的websocket地址\n      client: 'websocket',                                                       // 选择websocket作为连接的client\n      api: [\n        '/ws'                                                                    // 配置连接路径，不在的路径返回404\n      ]\n    }\n  },\n  headers: [\n    'x-csrf-token',\n    'X-Operator'\n  ]\n});\n\nproxyInstance.setProxyPrefix('/api/proxy');\n\nmodule.exports = function (router) {\n  proxyInstance.mount(router, app);\n};\n```\n\n## DEBUG [代理没生效？]\n\n在命令行启动命令前加入`DEBUG=hc-proxy`\n\n```sh\n// 以启动命令为 honeycomb start 为例\nDEBUG=hc-proxy honeycomb start\n\n// ...\n// hc-proxy [GET] /api/proxy/urllib_proxy/urllib -> http://localhost:58062/urllib +0ms\n// hc-proxy [POST] /api/proxy/urllib_proxy/urllib -> http://localhost:58062/urllib +3ms\n// hc-proxy [DELETE] /api/proxy/urllib_proxy/urllib -> http://localhost:58062/urllib +1ms\n// hc-proxy [PUT] /api/proxy/urllib_proxy/urllib -> http://localhost:58062/urllib +0ms\n// ...\n```\n\n## 作用\n\n- 本地开发时，可以使用这个代理访问远程其它服务(如otm)的问题；\n- 非本地开发环境时，可以不使用代理，而直接访问类似'/otm_v2/api/xxx'，以减小内部调用开销，由前端自行控制；\n","gitHead":"a6f115349e002e7421da0e7242717e7d96a7e08b","scripts":{"test":"make test"},"_npmUser":{"name":"noonnightstorm","email":"noonnightstorm@qq.com"},"_npmVersion":"5.6.0","description":"honeycomb api proxy express middleware.","directories":{},"_nodeVersion":"8.5.0","dependencies":{"qs":"^6.5.2","debug":"3.1.0","lodash":"4.15.0","multer":"1.3.0","urllib":"^2.27.0","formstream":"1.1.0","path-to-regexp":"1.6.0","hc-service-client":"^1.0.0"},"_hasShrinkwrap":false,"readmeFilename":"readme.md","devDependencies":{"mocha":"^4.0.1","express":"4.16.2","supertest":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/hc-proxy_2.0.0_1548763147996_0.603074090544951","host":"s3://npm-registry-packages"}},"2.0.1":{"name":"hc-proxy","version":"2.0.1","keywords":["api","proxy","middleware"],"author":{"name":"albin"},"license":"ISC","_id":"hc-proxy@2.0.1","maintainers":[{"name":"albin3","email":"binwei.zeng3@gmail.com"},{"name":"fishbar","email":"zhengxinlin@gmail.com"},{"name":"hqidea","email":"hqidea@yahoo.com"},{"name":"noonnightstorm","email":"noonnightstorm@gmail.com"}],"dist":{"shasum":"af192f770334887f055ab1e7e8bfd8dac2973947","tarball":"https://registry.npmjs.org/hc-proxy/-/hc-proxy-2.0.1.tgz","fileCount":13,"integrity":"sha512-/Iftznu76OmGymTnWDNOTwBJqvVF0dRgQcd3VEqUlWZlwzAfw0SXBP/4mypkOU7OUL4NKphcbf9+LqUxsEUt9g==","signatures":[{"sig":"MEUCIQCVIMLF1oAIRieMLkz4F2rStlERFWPptSMtggLt4AhsSwIgJqvL7valTPGql7Ax+dvk2p5ivPmpKeo+UmWiGRNmEdE=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":48302,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcUVQXCRA9TVsSAnZWagAAcXcQAJRoZDGaNkWeGxYhGJl+\nS4ke/GKXAs0zfmMb926oXm86XPmVtOoBvuFV710XY5DCbiKLocczw9aC8/Ps\ncg5vfY6/8LGAVr8/nTCquwxW8KzjydbyKcNARRdPoHH6D+pdLUaH52qflkCJ\nM1ZO+3/3s1Or8QM8N9Oo36bFsZemETU6GU7WWZcdAJIgeY1RyXSbzCmFgJ1d\nqUCO8euULADs4rrfNP5vr/vOqncnWJ7rPwcRNWkLFTydOlM+nJqxVvzWNGz5\nD1M40m4zZJnxR5EJSB2o+JWT88umorddGPN/WK9Ts5nQ9DhGMGGxCJD29BQc\nOolsIzgJ4cKFDD08KPfwWNVNx+fp9nenU9GIoMgvasTwZZ58NEa4L7Y6XEbq\nfBSjZJDryV0bRc76B60aTpXShJOkn7dvwflQSavNyyaA3bitK1540cR0UmCw\n4VOPfcAfjGHEeNGrJugRFu6W0X2fa6ViJvGQEeLeO6aSP3QUFkjQOdFYcFhv\nqm1SBR1DN13fzFbO2y2N+hu132/SEFJFYG1lmNmCkRHD1w4UgH7hXYmgu04n\nUWWkgr5cOfKzYa5CyIQcbEXouALu8iVdWqKpg4ApPoYqx/kgJ3pYcmPKDGNh\nZ4/leXtDySECoH17RbJ0VAshXk8IE/MCbcRwn2PEktPzl45bn0OK2jvuPIc6\nRhqG\r\n=Ee3a\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","gitHead":"83e2015b54edca44296d234faa878723c0a9fe88","scripts":{"test":"make test"},"_npmUser":{"name":"noonnightstorm","email":"noonnightstorm@qq.com"},"_npmVersion":"5.6.0","description":"honeycomb api proxy express middleware.","directories":{},"_nodeVersion":"8.5.0","dependencies":{"qs":"^6.5.2","debug":"3.1.0","lodash":"4.15.0","multer":"1.3.0","urllib":"^2.27.0","formstream":"1.1.0","path-to-regexp":"1.6.0","hc-service-client":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"^4.0.1","express":"4.16.2","supertest":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/hc-proxy_2.0.1_1548833814618_0.40962999817717494","host":"s3://npm-registry-packages"}},"2.0.2":{"name":"hc-proxy","version":"2.0.2","keywords":["api","proxy","middleware"],"author":{"name":"albin"},"license":"ISC","_id":"hc-proxy@2.0.2","maintainers":[{"name":"albin3","email":"binwei.zeng3@gmail.com"},{"name":"fishbar","email":"zhengxinlin@gmail.com"},{"name":"hqidea","email":"hqidea@yahoo.com"},{"name":"noonnightstorm","email":"noonnightstorm@gmail.com"}],"dist":{"shasum":"2fdcb6e9e915259f9d8d4969643b917bf727081a","tarball":"https://registry.npmjs.org/hc-proxy/-/hc-proxy-2.0.2.tgz","fileCount":13,"integrity":"sha512-fTUvK8B23LyFuhwl0K7JYqYa4RaxoGHfmfosVwC6Y3AVo6B6EV8pgxYAMLWlg9I3Dwk1tu4un6gegtCoBVLGRA==","signatures":[{"sig":"MEUCIQDJyjZNrjA8MtTPRp7Yiy40Tfr8BjG44AhggI5ByjT3PgIgeemr+c8tXt/BDMvHFkh62SFxv4qrXiCmW+KjRAFkeNQ=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":48626,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcUl0SCRA9TVsSAnZWagAAcqwP/j/jdOJCcVSysKN6X465\nFNh8PvJ7Pa81RJA5DAbvGAy8AcWMFK/MXIg8zAhKHlssGGxWdo3a6cj2BqFS\nr6D4CExbbQuOGh5GKX/Bd/lp4EJeV9CZe/uJqCKLkGLbECiF/QgYUHEmkufW\n7etUEToJ78bmDmez3VVvzoQm7IA6pqX5dPU0yE9vpoN3ME/TI2N0yVSBxAw6\n/MoW0gulqfUFUf5WglFIlciXxHfh5gqrmRRgU+8xvD6vcZrbA2uLipxH2+YI\ngKNaa4yvHEIHXxEPZFAKp0stwI1xyld6YX8UWE8AHgM9jZybJtks4d9XV2zX\n+7bPZsN2THgxqaIIuDPg7YZ2C5k5jkY8Sz+YjbN0PwM9c7Yt/8UrK1/vnk56\nUgzsRxWCduvClja70LhROudxZyzHMIh9k/MGt2ylEu4CJjpmT4pyNiHP2ZcG\n3I0pbb2mdRlHeZQ0Pchv56usZisJOGOEp+AFIDc2K9l2woXb6K+gKtg7mUlA\np3n1mPBQTgIkji7HbJg2MsgtgeX03oIaP9lI6umajNvlMsCpTtG9q/lvNgB+\n2iDyD3V+WafHETEawm2tFoXtFFW1JHB+JczDg53QK0KTCtxOpSaYIm7JQc51\n3Sic1JE8m/2ey2oh4XZ8d8EhMU15jirEk88IdDzem27aBGFMgn0kf486vo8+\nkoHR\r\n=VCP2\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","readme":"# service proxy\n\n> api代理模块，解决跨域、权限问题\n\n## 场景案例\n\n远程需要被代理转发的服务:\n\n```\nhttp://localhost:7001/api/aaa         // 视频服务接口\nhttp://localhost:7001/api/c/d        // 视频服务接口\nhttp://192.168.1.1:7001/api/bbb       // 音乐服务接口\nhttp://localhost:7001/ws/a            // 聊天服务接口 (使用websocket)\n```\n\n### 以honeycomb项目为例进行配置\n\n1. 确定honeycomb项目的启动端口和prefix，比如： 项目的启动端口为8001，prefix为 'example'\n2. 整理远程调用的服务，给每个服务起个英文名称，比如： 上面的两个服务  视频服务(video)  音乐服务(music)  聊天服务(chat)\n3. 配置在router.js中，进行如下配置\n4. 请注意，为了确保安全，所有api只支持白名单\n\n```js\n// router.js\nconst app = require('./app');\nconst Proxy = require('hc-proxy');\nconst proxyInstance = new Proxy({\n  service: {\n    video: {\n      endpoint: 'http://localhost:7001/',\n      client: 'http',\n      api: [\n        '/api/aaa',\n        '/api/c/d'\n      ]\n    },\n    music: {\n      endpoint: 'http://192.168.1.1:7001/',\n      client: 'http',\n      api: [\n        '/api/bbb'\n      ]\n    }\n  },\n  headers: [\n    'x-csrf-token',\n    'X-Operator'\n  ]\n});\n\nproxyInstance.setProxyPrefix('/api/proxy');\n\nmodule.exports = function (router) {\n  proxyInstance.mount(router, app);\n};\n```\n\n### 配置完成后访问地址\n\n访问地址为 ${honeycomb服务地址:honeycomb服务端口/honeycomb的prefix} + ${proxyPrefix} + ${被代理服务名} + ${具体api}\n\n```shell\n1. 视频服务:   curl http://localhost:8001/example/api/proxy/video/api/aaa => http://localhost:7001/api/aaa\n2. 视频服务:   curl http://localhost:8001/example/api/proxy/video/api/c/somewhat?xxx=123 => http://localhost:7001/api/c/somewhat?xxx=123\n3. 音乐服务:   curl http://localhost:8001/example/api/proxy/music/api/bbb => http://192.168.1.1:7001/api/bbb\n```\n\n### 代理websocket服务\n\n```js\n// router.js\nconst app = require('./app');\nconst Proxy = require('hc-proxy');\nconst proxyInstance = new Proxy({\n  service: {\n    music: {\n      endpoint: 'http://192.168.1.1:7001/',\n      client: 'http',\n      api: [\n        '/api/bbb'\n      ]\n    },\n    chat: {\n      endpoint: 'http://localhost:7001/',\n      client: 'websocket',\n      api: [\n        '/ws/a'\n      ]\n    }\n  },\n  headers: [\n    'x-csrf-token',\n    'X-Operator'\n  ]\n});\n\nproxyInstance.setProxyPrefix('/api/proxy');\n\nmodule.exports = function (router) {\n  proxyInstance.mount(router, app);\n};\n```\n\n### websocket配置完成后访问地址\n\n访问地址为 ${honeycomb服务地址:honeycomb服务端口/honeycomb的prefix} + ${proxyPrefix} + ${被代理服务名} + ${具体api}\n\n```shell\n1. 音乐服务:   curl http://localhost:8001/example/api/proxy/music/api/bbb => http://192.168.1.1:7001/api/bbb\n2. 聊天服务:   curl http://localhost:8001/example/api/proxy/chat/ws/somewhat => http://localhost:7001/ws/somewhat      // 支持websocket\n```\n\n### 代理文件上传\n\n```js\n// router.js\nconst app = require('./app');\nconst Proxy = require('hc-proxy');\nconst proxyInstance = new Proxy({\n  service: {\n    music: {\n      endpoint: 'http://192.168.1.1:7001/',\n      client: 'http',\n      api: [\n        {\n          path: '/api/upload',\n          file: true\n        },\n        {\n          path: '/api/upload_limited',\n          file: {\n            maxFileSize: 100        // 100B\n          }\n        }\n      ]\n    }\n  },\n  headers: [\n    'x-csrf-token',\n    'X-Operator'\n  ]\n});\n\nproxyInstance.setProxyPrefix('/api/proxy');\n\nmodule.exports = function (router) {\n  proxyInstance.mount(router, app);\n};\n```\n\n### 文件上传代理效果\n\n```shell\n1. 上传文件1:   curl http://localhost:8001/example/api/proxy/music/api/upload => http://192.168.1.1:7001/api/upload\n2. 上传文件2:   curl http://localhost:8001/example/api/proxy/music/api/upload_limited => http://192.168.1.1:7001/api/upload_limited\n```\n\n## API document\n\n约定:\n\n- proxy挂在的http服务称为 \"代理服务\"\n- 被proxy代理的远端服务称为 \"远端服务\"\n\n### new Proxy(options)\n\n#### options Object\n\noptions.service 详情\n\n```\n{\n  ${serviceCode}: {\n    endpoint: ${endpoint},\n    accessKeyId: ${accessKeyId},\n    accessKeySecret: ${accessKeySecret},\n    headerExtension: ${headerExtension}，\n    headers: ${headers},\n    client: ${client},\n    timeout: ${timeout},\n    useQuerystringInDelete: ${useQuerystringInDelete},    // 只有 appClient / urllib 模式有效\n    urllibOption: ${urllibOption},                        // 只有 appClient / urllib 模式有效\n    defaultErrorCode: ${errorCode}                        // 覆盖5XX的errorCode\n    api: [\n      ${apiString},\n      {\n        path: ${path},\n        route: ${route},\n        method: ${method},\n        timeout: ${apiTimeout},\n        defaultQuery: ${defaultQuery},\n        beforeRequest: ${beforeRequest}, // TODO\n        useQuerystringInDelete: ${useQuerystringInDelete},\n        urllibOption: ${urllibOption}\n      }\n    ]\n  }\n}\n```\n\n通用配置:\n\n- endpoint: 每个远端服务的服务地址，如: 'http://localhost:7001' 或 'http://localhost:7001/service'\n- client: 目前只支持'appClient' / 'http' / 'websocket'，默认为'appClient'，其中 appClient 带了honeycomb体系中的签名逻辑\n- timeout: 某个服务或接口的超时时间，毫秒计算，默认60000\n- apiString: 使用默认配置对某个api进行代理，设置的是Api的path，如: '/api/user' 会对 '/api/user' 进行 'GET', 'POST', 'PUT', 'PATCH', 'DELETE' 代理\n- path: api的路径，如: '/api/user'，支持 '/api/user' / '/api/user/:user' / '/api/user/'\n- route: api在路由中出现的路径(会忽略proxyPrefix)，如： '/remote_service/aaa' , 则调用 ${localService} + '/remote_service/aaa'，会被走path对应的远端服务\n- method: 指定这个api支持的方法 'GET' / ['GET', 'POST']，不填时，默认为 ['GET', 'POST', 'PUT', 'PATCH', 'DELETE']\n- apiTimeout: 覆盖整个服务的timeout\n- defaultQuery: String / Object，用于配置默认的query参数(代理请求时自动加上)\n- beforeRequest: 暂不支持\n- file: 配置上传文件，出现上传文件配置时，该接口支持上传文件，子配置使用默认值可以配置为 {... file: true}\n  - maxFileSize: 上传文件的大小限制, 单位byte, default\n- useQuerystringInDelete: delete方法使用querystring代理, 默认为true\n- urllibOption: 用户覆盖的urllibOption，覆盖系统默认值，优先级: service.api.urllibOption > service.urllibOption > hc-proxy默认设置\n- defaultErrorCode: 覆盖转发时的5XX的errorCode\n\nclient=[appClient/serviceClient]的专属配置\n\n- headers: 选填，同 hc-service-client 配置，见文档: https://www.npmjs.com/package/hc-service-client\n- accessKeyId: 选填，同 hc-service-client 配置，默认 'hc-proxy'，详见 https://www.npmjs.com/package/hc-service-client\n- accessKeySecret: 同 hc-service-client 配置，必填，不填时取 app.config.systemToken，详见 https://www.npmjs.com/package/hc-service-client\n- headerExtension:  同 hc-service-client 配置，见文档: https://www.npmjs.com/package/hc-service-client\n\n#### options.headers Array<string>\n\noptions.headers 用于声明proxy需要转发的header。\n默认情况下，proxy不转发客户端过来的header，只有在proxyHeaders中配置的header才会被转发。\n\n### proxy.setProxyPrefix(proxyPrefix)\n\n- proxyPrefix <String>\n\nsetProxyPrefix方法用于指定 hc-proxy 挂载在代理服务上的总前缀\n\n如: 默认 proxyPrefix = /api/proxy \n则: 所有请求远端服务的请求，格式为   ${localHttpServer}/api/proxy/${serviceCode}/${remoteApi}\n\n### proxy.mount(router, app)\n\n将proxy的配置挂在到代理服务。\n\n- router: Express Router instance\n- app: app.server 是一个 http.Server 的实例，honeycomb中，直接 require('./app') 能获得\n\n## 更多例子\n\n```js\n'use strict';\n\nconst app = require('./app');\nconst Proxy = require('hc-proxy');\nconst proxyInstance = new Proxy({\n  service: {\n    otm: {\n      endpoint: 'http://dev.dtboost.biz.aliyun.test/otm_v2',                           // 自动截取最后的'/'\n      client: 'appClient',                                                                // 默认appClient\n      timeout: 10000,                                                                     // 默认60000\n      api: [\n        '/api/a',                                                                         // 支持 * 代理某个path下的所有api\n        '/otm_v2/api/entities/list',                                                      // 代理这个 url 的 GET POST PUT DELETE 方法\n        {path: '/otm_v2/api/entities/list', method: 'GET'},                                // 只代理 GET 方法\n        {path: '/otm_v2/api/entities/list', client: 'appClient'},                          // 显式指定 method\n        {path: '/otm_v2/api/schemas', method: ['GET', 'POST']},                            // 只支持 GET POST 方法\n        {host: 'http://taobao.com/api', path: '/tag_factory_v2/api/:id', method: 'GET'},   // 不同域时，指定host\n        {path: 'http://taobao.com/api', route: '/api/proxy/taobao_api'},                   // 指定route的代理，不指定route时，所有代理接口请求 /<-app_name->/api/proxy 获得代理\n        '/otm_v2/api/tags/query_tags_entity_pagenum',                                     // \n        {path: '/otm_v2/api/schemas/:id', route: '/api/proxy/schemas/:id'}                 // 带参数的url，保证route和url中的param一致，也可以不填route\n      ]\n    },\n    websocket: {\n      endpoint: 'http://dev.dtboost.biz.aliyun.test/websocket',               // 远程的websocket地址\n      client: 'websocket',                                                       // 选择websocket作为连接的client\n      api: [\n        '/ws'                                                                    // 配置连接路径，不在的路径返回404\n      ]\n    }\n  },\n  headers: [\n    'x-csrf-token',\n    'X-Operator'\n  ]\n});\n\nproxyInstance.setProxyPrefix('/api/proxy');\n\nmodule.exports = function (router) {\n  proxyInstance.mount(router, app);\n};\n```\n\n## DEBUG [代理没生效？]\n\n在命令行启动命令前加入`DEBUG=hc-proxy`\n\n```sh\n// 以启动命令为 honeycomb start 为例\nDEBUG=hc-proxy honeycomb start\n\n// ...\n// hc-proxy [GET] /api/proxy/urllib_proxy/urllib -> http://localhost:58062/urllib +0ms\n// hc-proxy [POST] /api/proxy/urllib_proxy/urllib -> http://localhost:58062/urllib +3ms\n// hc-proxy [DELETE] /api/proxy/urllib_proxy/urllib -> http://localhost:58062/urllib +1ms\n// hc-proxy [PUT] /api/proxy/urllib_proxy/urllib -> http://localhost:58062/urllib +0ms\n// ...\n```\n\n## 作用\n\n- 本地开发时，可以使用这个代理访问远程其它服务(如otm)的问题；\n- 非本地开发环境时，可以不使用代理，而直接访问类似'/otm_v2/api/xxx'，以减小内部调用开销，由前端自行控制；\n","gitHead":"b75462218ba8343498c49e7cdad8222dbd30105b","scripts":{"test":"make test"},"_npmUser":{"name":"noonnightstorm","email":"noonnightstorm@qq.com"},"_npmVersion":"5.6.0","description":"honeycomb api proxy express middleware.","directories":{},"_nodeVersion":"8.5.0","dependencies":{"qs":"^6.5.2","debug":"3.1.0","lodash":"4.15.0","multer":"1.3.0","urllib":"^2.27.0","formstream":"1.1.0","path-to-regexp":"1.6.0","hc-service-client":"^1.0.0"},"_hasShrinkwrap":false,"readmeFilename":"readme.md","devDependencies":{"mocha":"^4.0.1","express":"4.16.2","supertest":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/hc-proxy_2.0.2_1548901650289_0.8253785484123668","host":"s3://npm-registry-packages"}},"2.0.3":{"name":"hc-proxy","version":"2.0.3","keywords":["api","proxy","middleware"],"author":{"name":"albin"},"license":"ISC","_id":"hc-proxy@2.0.3","maintainers":[{"name":"albin3","email":"binwei.zeng3@gmail.com"},{"name":"fishbar","email":"zhengxinlin@gmail.com"},{"name":"hqidea","email":"hqidea@yahoo.com"},{"name":"noonnightstorm","email":"noonnightstorm@gmail.com"}],"dist":{"shasum":"1827e9fe76505dd0f4792ddf0e89e6e15c80c0c2","tarball":"https://registry.npmjs.org/hc-proxy/-/hc-proxy-2.0.3.tgz","fileCount":13,"integrity":"sha512-JkMoPz2cfNh8rNJFQh2aNhh3wU4u8u5+yQAl/sm2PzhZSaHRcJ+cFJy6Ow1fqgVtcCd7NI4n5FS/SKkgVgV/aA==","signatures":[{"sig":"MEYCIQDUYiQwE1xKhN2MVI7xlIic9UpN4jdNz8MjCHBqLIddswIhAKAqaSsAn2bZ4LPmotswAbDnuI1qmJd2BVviRChHdI0k","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":48980,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdA0S1CRA9TVsSAnZWagAAO2YP/3aniOgUKWqck2Uglpug\niYlQOURNP1N2IzYYLtN1lsKz4Y/OQclyiAMVWrN71BYBIL+3EhXrFHRutMiL\nEdtFanR5oa1HRB2ITI2eplK63dys3zo0v5mqDC7lQ81FL2i7/82OTcQUdGnQ\n40j0j5VgVpr8fZNjlHlADEeXTxaWig9y/u/rjVYYTAXX0zqQxhNLWzoPZsLr\nq9rPWKWlFxx4I5rJWgqEBpA8nHZnzHApsXc94OrMg6kwKXIbGJplCAMCBj2Q\nfVKK73xdtbkSMzEYjCnPfCfIKsfpyOiZ3MCJh1LyfWnfKUQaeY+d1ud2BoIa\n3/ihVw58CA9Ktw0DaEgldfmrRGmswdBSrRE2aqnqvxzfjPzJq6GNjJx0NwrL\nR6F6Sonj5J2ShCpJ8F6MjGsz6pNcgZNj2j8SFFwevMBiYSgPPD6qI/lzSOKH\nFzYZHtBBKUfTPMWsc30syUfpJLOSrDW7AGawS3sD6tbaBi0QVlj7mzPltzgX\nqywB66UxRH79RjfPVkLWEUtp8wYCi0cPj1QhibhITd4/qIIWfUjYEpKWUV52\n1ND6H4udJpfkNZ44BPCOEgrAJRNhhRfVLnojhMyuGuBB7q6LRIRp3HFKm1iF\nDKv1myMHZ8i3pNgkQhwcJqfhbzc4Yc4sMRkmD+LlmJPtjbHUaOjuIlQCw36+\nnN3u\r\n=4Z4i\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","gitHead":"9ac5af5acf0d7ee3362f498e827b4c7215def0c0","scripts":{"test":"make test"},"_npmUser":{"name":"noonnightstorm","email":"noonnightstorm@qq.com"},"_npmVersion":"5.6.0","description":"honeycomb api proxy express middleware.","directories":{},"_nodeVersion":"8.5.0","dependencies":{"qs":"^6.5.2","debug":"3.1.0","lodash":"4.15.0","multer":"1.3.0","urllib":"^2.27.0","formstream":"1.1.0","path-to-regexp":"1.6.0","hc-service-client":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"^4.0.1","express":"4.16.2","supertest":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/hc-proxy_2.0.3_1560495284704_0.9577728445367848","host":"s3://npm-registry-packages"}},"2.0.4":{"name":"hc-proxy","version":"2.0.4","keywords":["api","proxy","middleware"],"author":{"name":"albin"},"license":"ISC","_id":"hc-proxy@2.0.4","maintainers":[{"name":"albin3","email":"binwei.zeng3@gmail.com"},{"name":"fishbar","email":"zhengxinlin@gmail.com"},{"name":"hqidea","email":"hqidea@yahoo.com"},{"name":"noonnightstorm","email":"noonnightstorm@gmail.com"}],"dist":{"shasum":"80c83f2bbe362689e99f067a70adf4616b177aae","tarball":"https://registry.npmjs.org/hc-proxy/-/hc-proxy-2.0.4.tgz","fileCount":13,"integrity":"sha512-aGxjDlStV6mhKkb8NdBXN4uZXeb7t1TDQvJlpB+i3IbZTouxjcYSE7qI7ijmIqyLTd4ofc1YLtMiWcStRdwcFw==","signatures":[{"sig":"MEYCIQDvvPauDCMmJwRxq+yYl3+7WS8pka1rVoDCZlWLQZOxUwIhAJ67fbInQ9Nzgaiu56mBwdhy2W2hjJZUkwxRJzfVyQP0","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":48967,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeFb9jCRA9TVsSAnZWagAAsM4QAIsUvtJgpgEAk7uytr+H\n2w+cUYor3fT024x2cp7e2GQXYL45YNXEezu98HErUVmVf0+MztosB+4boAGA\nYJNz3uSSoMydOoVQ52fFwoXujhEFlDt+pSW8ULQjRS6G0iaK8ot10aHD2JJ2\niBL7lj1gw2aRi/U2p573E+xL+OI6ucqTSbci1iaEb9lGiWjA5K0UmMPxzwlR\nAT4iloF8tOealdZiEGXnQxQLfsFZ1+Fc38+yR1Zwm1iEj1Gbb/3ctuuhopqT\n/t0l0Fgy1Byfjw8747IgEBMKk4HWCcDbJNHcNyD3S11j36V7JxjsJ5c1+QZC\nAJbYtdbvk3jixhR04aSjST0yGnZXSHKTWvCA0P0JKMWfsZOyYMiCDjfulTMQ\nvZIOlaQroyMynN+sQ4Uw4+/oitweGN4fr/iitB3aghMMKuuzKv5O4lDeGRFB\nOB2O6Vy0MHYHy9by+z8Sf+f7K8u1jf55mMp8YDL9p1PznqE5A2j2Xj6RNS34\n3qA0XSemakzcZ+618B64+j55nCJ6lAHFr4MdSYXSO+WP/2DOYMBe63XXz99Y\ngDodrUVkvSWMzuqugzVZfZ1S6vGZTFYUObvLm57ASJLUDIZvuNaToTwAIwzo\ngHVVe+YCJ+1imlPzaKhkMnP2X+in9KjbzdQln+R+1y+aSv17MKRdIssQNgFI\noD5i\r\n=nzer\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","gitHead":"e8c4f3be8cdf4d72118ef5a2886c01bc70ef90e5","scripts":{"test":"make test"},"_npmUser":{"name":"noonnightstorm","email":"noonnightstorm@qq.com"},"_npmVersion":"6.9.0","description":"honeycomb api proxy express middleware.","directories":{},"_nodeVersion":"10.16.0","dependencies":{"qs":"^6.5.2","debug":"3.1.0","lodash":"4.15.0","multer":"1.3.0","urllib":"^2.27.0","formstream":"1.1.0","path-to-regexp":"1.6.0","hc-service-client":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"^4.0.1","express":"4.16.2","supertest":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/hc-proxy_2.0.4_1578483555181_0.9587637183000968","host":"s3://npm-registry-packages"}},"2.0.5":{"name":"hc-proxy","version":"2.0.5","keywords":["api","proxy","middleware"],"author":{"name":"albin"},"license":"ISC","_id":"hc-proxy@2.0.5","maintainers":[{"name":"albin3","email":"binwei.zeng3@gmail.com"},{"name":"fish","email":"zhengxinlin@gmail.com"},{"name":"fishbar","email":"zhengxinlin@gmail.com"},{"name":"hqidea","email":"hqidea@yahoo.com"},{"name":"noonnightstorm","email":"noonnightstorm@qq.com"}],"dist":{"shasum":"34a08a848e0d2edb72ec78726715051da96b3913","tarball":"https://registry.npmjs.org/hc-proxy/-/hc-proxy-2.0.5.tgz","fileCount":13,"integrity":"sha512-kBvh15Xb9vWufM1/NV8L+9k1gxR+0UQ0OmWK48Epx49ez+5Os6IpRuX6sC9usfiAYhPYG+A9dm0P+KVjAj8gMA==","signatures":[{"sig":"MEYCIQD53JGMYiKeSDfLQbw07PXaiDSdRIQvLGIVc7DVAuKQuQIhANEQKONwBN3IufS+8sO93rIzrjU+A0aJtrDBWsOVKOgj","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":50775,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeWBQ2CRA9TVsSAnZWagAAVcAP/35cRrJGaYdwPzc74477\n6nRcy40nCGmzh1Db3drbh/W6AheoD2gtG/fnBRs59dIffGTx+RXVpxFrEWIV\n74RtwD2zx+pw8T3vsTI2ttpabEMlQRWj2S8JNJCpZDmRusOzqXRWOoStRUq3\nK/FcQk+bMLph6RmMuWrI2upTsBczMuo6lePIie7Zt+gTE8YigQovIZDvJy6K\nrvepyFpjtUcqZwDWgF+zTlDanSKUjXOg5ghmAtiCgsAmmAcuxgo/hjwreTWX\nmAkck+k0FfPSEDfQiATMoDVCn8NX4CgC14HdUF2psh5RQt6pmr+jHJbUEzun\nHtnO6W9moIz00ClnQ4pdGogU+yP6ctVvFzUrLFkitUVqli3oBw0TaF0LbSfP\nkOi5HOQ9+1gHq47Ci4rYiPCDdo6nc46N5limjzWARORnZJtwcQ8oR6bWwjOq\nk9bA20F4LGk79g8sZRudg+LbrJjypYHv4gR7q4lSZS34YgQS3aIf4w+ZT87o\nhwCL7hITSAODtgFUXdjnct3uuiyIQ15x0JsjJVvsb6xb5TgK/s/K07TTw9s/\nJgCrzYeOBZlXyRCfBy4QlT74I+1iiWR81+HQehM5MMvspnau1xJFKrIEBhX7\nszMhJYwNFXmYnQpifCNpKSM4AAp3hkD35vDqoVGT2ZtnGqTHzf9hma3hFCYa\nlP1V\r\n=d6Uk\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","gitHead":"a2a04e1c7b535f7253324ac88d5828bc6134a4f7","scripts":{"test":"make test"},"_npmUser":{"name":"fish","email":"zhengxinlin@gmail.com"},"_npmVersion":"5.6.0","description":"honeycomb api proxy express middleware.","directories":{},"_nodeVersion":"8.11.3","dependencies":{"qs":"^6.5.2","debug":"3.1.0","lodash":"4.15.0","multer":"1.3.0","urllib":"^2.27.0","formstream":"1.1.0","path-to-regexp":"1.6.0","hc-service-client":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"^4.0.1","express":"4.16.2","supertest":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/hc-proxy_2.0.5_1582830646205_0.06682539084119155","host":"s3://npm-registry-packages"}},"2.0.6":{"name":"hc-proxy","version":"2.0.6","keywords":["api","proxy","middleware"],"author":{"name":"albin"},"license":"ISC","_id":"hc-proxy@2.0.6","maintainers":[{"name":"fishbar","email":"zhengxinlin@gmail.com"},{"name":"fish","email":"zhengxinlin@gmail.com"},{"name":"albin3","email":"binwei.zeng3@gmail.com"},{"name":"noonnightstorm","email":"noonnightstorm@qq.com"},{"name":"hqidea","email":"hqidea@yahoo.com"},{"name":"cctv1005s","email":"384113872@qq.com"}],"dist":{"shasum":"4217f88e85525b73f4c8d1bbfcc1de4b2cf9b05c","tarball":"https://registry.npmjs.org/hc-proxy/-/hc-proxy-2.0.6.tgz","fileCount":15,"integrity":"sha512-rG7VHVT9paa8aITEmb08D6NS9VJzKiPOYa21fFOBtSFFyQmO+0zikkSLZJh7C0uSAhZwEc8AzoyhomUlYpPMrQ==","signatures":[{"sig":"MEQCIGSRtOFJoNiuuIZt6CK5LIQCay/lgwEOWxIaDqz68BBkAiAN7inxalUJsaRLBmvtukrwm9wcJnJJhFIPsttSdE+mag==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":52397,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgfPHkCRA9TVsSAnZWagAA8qMP/21dkm3brIRzkKmFoWIw\nsBADC/zM0I6LRKmexoM2sqHUGM7uyt/HOJzkK6XLXkcAr9XvnPc60p7qG+dn\nePCYQei57o6giz057u5v8CmiDB0eZyfbegXouvd/z4BPWsnmkKeaIQlYlq/Q\nXeTyA24Icl83aBAmi1QP0HRGTggHhga28+4mLq/7haZPD8rxO7mCZO35tuTm\nYPV+EAoVCc0h/quz2YpV2+NX4t88OPsSkvHBOZ65Z/JU/zNVgcxlgNOBC7s+\n7Ic45lKQiPszgBs58p1TOoPdrgjqrniaT0jqpeQeeGE65L5VAO3mCdKUuJKa\nyOVwHkqK1E/y9NGdGUFGWYx+4zu8j5xVofqafTGlL2GeaumfzYj5mR0eSCtz\nYQvjjvNdjdjjhBt7dCiBjg+dgkiGxAmR8tADt9sWOSJ9e2oPSOx/C3qnqeij\nd2iCDZImxcCOp/dAHjJSXSGC7mCNTYzsojYO552qAubjItUY0V+mL0kz3I5S\n9lzuOVcluU5GLDr3Ciha8s94iqqcTO83Lgzw8gYa7osX7pMT1UMb7a/p2niZ\n45RJOvRQyktU7aZvPJ+m4bZ8PFX1yKTAlX6nAupGvoLyQfgONY4tkVKK/CNv\n5i0wtmtYXdhwP46F47JYLoWjSE8aCjI/u2JNFHklKw0KXSH6VhfmGbTulZH2\n8oj7\r\n=wuID\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","gitHead":"09c37833dbd8ca0cb070121ffaddd512609e49a9","scripts":{"test":"make test","cover":"make cover"},"_npmUser":{"name":"cctv1005s","email":"384113872@qq.com"},"_npmVersion":"7.7.6","description":"honeycomb api proxy express middleware.","directories":{},"_nodeVersion":"15.14.0","dependencies":{"qs":"^6.5.2","debug":"3.1.0","lodash":"4.17.19","multer":"1.3.0","urllib":"^2.27.0","formstream":"1.1.0","path-to-regexp":"1.6.0","hc-service-client":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","mocha":"^4.0.1","express":"4.16.2","supertest":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/hc-proxy_2.0.6_1618801123558_0.6107375590873876","host":"s3://npm-registry-packages"}},"2.0.6-beta":{"name":"hc-proxy","version":"2.0.6-beta","keywords":["api","proxy","middleware"],"author":{"name":"albin"},"license":"ISC","_id":"hc-proxy@2.0.6-beta","maintainers":[{"name":"fishbar","email":"zhengxinlin@gmail.com"},{"name":"fish","email":"zhengxinlin@gmail.com"},{"name":"albin3","email":"binwei.zeng3@gmail.com"},{"name":"noonnightstorm","email":"noonnightstorm@qq.com"},{"name":"hqidea","email":"hqidea@yahoo.com"},{"name":"cctv1005s","email":"384113872@qq.com"}],"dist":{"shasum":"89bc1cf0c0270ebb876adef189431275cb1bc9db","tarball":"https://registry.npmjs.org/hc-proxy/-/hc-proxy-2.0.6-beta.tgz","fileCount":15,"integrity":"sha512-Dy+acUMXF/I0E4+6zoebCQJMeBYhnxnPJfi4EN4KH2PyG+T867zGs3GcQXPk8EN86kyNyEX+rWS4YoA5TtBKpA==","signatures":[{"sig":"MEUCIDme5yJLXETvnvr2RyxoGDN/AyYWHldXT5BxDhqBh7QPAiEA/UfTXE9bjmWTA0gAuMtrZMTgB9cmTktbLHfSqmMV74s=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":52560,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJghhnyCRA9TVsSAnZWagAAFfMP/1p6BPLa1dx9JoKp20lk\nfRpvo1aNVrwsetfIptPL6ilLuOAdD2DZQEAPJBlcnhmpVtzUFVYeY65DoNBt\nw+d6JaoxwEtAXCjlvfhCaHUW5lrDpzmwjLMyZ01RC1UhqDlzDYZRO0hDE/Eh\n6hGH7Xq07spYttHfUhayYi/yOzjC9N0GTZQEgMBDlRl4UQMBsFbcrL/zM1Af\nDNh2amz9Vaimq3a2JdkzztNbmhGoJBmR5Z3+uSeTvY447Mk5eUqc5LnC4pzS\nqFJvW3QCekMK6O3rYDtcc36VRaEi09HN8tDXjpep9BZ2Zfw1sgQ2/V35ufFT\nyYEN/0J34B7It2bp8IOXKF8p+dS5yT0smm5l1KIcVnIpJhgLxWabiU88wSL2\niqqfXru47Ip1ghz1mmqC+zg8LaofQnr6HorVBqPcpWuvrKCQzm0/g1T3caJ1\nWaqEPUh9/96omWACRaAbwRF8zPgTZX2JahTqY4x/O8BxENml07sU7bWIDeuo\n1DK2h58soFYkvMtOphZlM5Eq/I/0T53pVS3C8BZ3u1myoXxcFW8WfzQZ9Gzo\nbDN4jAjaGS4ELP1bm4p4gryyiomBj05Ys/wHkPj1itI6XDW+awagfn7P/F/x\nEewV3admYF2aImD8atYNs06tuS105BuFNcI68oe3rCcidFWL+y2zXbNGn4x7\n+9Aw\r\n=qDjx\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","gitHead":"09c37833dbd8ca0cb070121ffaddd512609e49a9","scripts":{"test":"make test","cover":"make cover"},"_npmUser":{"name":"cctv1005s","email":"384113872@qq.com"},"_npmVersion":"7.7.6","description":"honeycomb api proxy express middleware.","directories":{},"_nodeVersion":"15.14.0","dependencies":{"qs":"^6.5.2","debug":"3.1.0","lodash":"4.17.19","multer":"1.3.0","urllib":"^2.27.0","formstream":"1.1.0","path-to-regexp":"1.6.0","hc-service-client":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","mocha":"^4.0.1","express":"4.16.2","supertest":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/hc-proxy_2.0.6-beta_1619401201876_0.7174689703786383","host":"s3://npm-registry-packages"}},"2.0.7":{"name":"hc-proxy","version":"2.0.7","keywords":["api","proxy","middleware"],"author":{"name":"albin"},"license":"ISC","_id":"hc-proxy@2.0.7","maintainers":[{"name":"fishbar","email":"zhengxinlin@gmail.com"},{"name":"fish","email":"zhengxinlin@gmail.com"},{"name":"albin3","email":"binwei.zeng3@gmail.com"},{"name":"noonnightstorm","email":"noonnightstorm@qq.com"},{"name":"hqidea","email":"hqidea@yahoo.com"},{"name":"cctv1005s","email":"384113872@qq.com"}],"dist":{"shasum":"5cd3026082c8b3b838aec29e9dcfb60025503a8b","tarball":"https://registry.npmjs.org/hc-proxy/-/hc-proxy-2.0.7.tgz","fileCount":15,"integrity":"sha512-2H7GiO9hLqmRgppR12CG6pDAivtuxHAEH0woThhB7oJRDci1KPblwo9VPGxk6hop2i5fKfe2iQ97ahoioj1K/g==","signatures":[{"sig":"MEUCIEXNfiaRGwS7bshYhfxxt562ClDOWLEgf5HJsxsvyJ3FAiEAgntbxkuJg498mNvIIwKGScHG43PQd9nfxsIJsCX4Gms=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":52574,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJghnE5CRA9TVsSAnZWagAAhzMP/3kAfr3Wj/8uIElE4yD9\nzBVPehUKnGAcwQiYQqRAWmXqc1GMTwCX8UX7zuSVFtQH9OfhGingoBYbbpCV\nLdO1/FFbzhm31j1l6e6k2tmGRc0hwMMfrBQ2cWTPB1cVrLUn4CLr0CG2lSCQ\nKRfbdTa0f6CNP2fsLbdXO7plqEQCHNPUvNjirhEqFLGMhXcTf1ZuQAMbt4sn\nN6M4JIIcdJFnmrbc0jGQKZ1kv0u6xR5c0j1+hnbyFXodZcXncuLf//HiaH3u\nkBpfDT9uzevVHpJQ5fMkbSNeOmK6b9yF/Ze7UsLZ3BpivvHIs/jJz1NA+Nz0\nNfDlgXw47gcJp12ngIyzgPeokAEcslB4k0FiIsHfgPGIQb9sUl4iG17IiY+g\n7olpOsQ/NiKLpMM4DwkxzRY4T9sbJSp0PBSJKi77dKOLPNYKGUsaHit2UtV9\nZ8tMMhnVc17nadYj/5HKiF93+jynhIvlxeAeJzvk/G02rUKDhqZa+QLLr9ET\naLZKrVOz+LSbgu+MYpTh7y3itHfZBpvjzWxN/qBViPPtY9egCjIiftdb3hPs\nr9dLv0GffkZ0CG8K4uRz4bIhX0GLn+AJiNb0SwVb7ZyHXRLJhBmr7V0EXFVa\nG/TgA/ZsUzhSZ+R8gyYjNVNMIQBfcXkZlrIkSLfe13FvfCYFt2nuxg3a4Zq6\n3Bbu\r\n=zAVf\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","gitHead":"9dbbb2de282780278f1ab1e97fb8a1daff3c35a5","scripts":{"test":"make test","cover":"make cover"},"_npmUser":{"name":"cctv1005s","email":"384113872@qq.com"},"_npmVersion":"7.7.6","description":"honeycomb api proxy express middleware.","directories":{},"_nodeVersion":"15.14.0","dependencies":{"qs":"^6.5.2","debug":"3.1.0","lodash":"4.17.19","multer":"1.3.0","urllib":"^2.27.0","formstream":"1.1.0","path-to-regexp":"1.6.0","hc-service-client":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","mocha":"^4.0.1","express":"4.16.2","supertest":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/hc-proxy_2.0.7_1619423545192_0.928951236544451","host":"s3://npm-registry-packages"}},"2.0.8":{"name":"hc-proxy","version":"2.0.8","keywords":["api","proxy","middleware"],"author":{"name":"albin"},"license":"ISC","_id":"hc-proxy@2.0.8","maintainers":[{"name":"fishbar","email":"zhengxinlin@gmail.com"},{"name":"fish","email":"zhengxinlin@gmail.com"},{"name":"albin3","email":"binwei.zeng3@gmail.com"},{"name":"noonnightstorm","email":"noonnightstorm@qq.com"},{"name":"hqidea","email":"hqidea@yahoo.com"},{"name":"cctv1005s","email":"384113872@qq.com"}],"dist":{"shasum":"acdd14306d08be1040da310ecbc375399fba85b8","tarball":"https://registry.npmjs.org/hc-proxy/-/hc-proxy-2.0.8.tgz","fileCount":15,"integrity":"sha512-hk7FuWLQVmHerdiCiEKSK+9WjVR0BOay5xzMyNcTugd6Kfwx9cQd0AoNomTdMd/0DCUn37CAnd+/jatqI9QM2Q==","signatures":[{"sig":"MEYCIQDjqI3lVamEngudBTupNDQwRF4mVqgNyGmAw9DsWcBX2QIhAKKOsd/bkVAzx3ON/8lQVCsKkGUlHNvtn2nHGrPotz2F","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":52603,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgpiYJCRA9TVsSAnZWagAAaHMP/iGTSUzqSdpAs6WpwCCi\nYeDZI0ujtCdbgnJfxJ1ywVu5QKXO15ORUbYz3JGlxMel5etF6oLC93sLWwtL\nmV++RtKxv0cjzCkPa22rfyn80i0WIbwmCACQzJo+p/0tzTIU9V4ZnNj99rpS\nnFtVjmxoEOL7xI3oZARW99AVNy2GZtQtBIYqBXndKceWA2hCoOvVVyMyoNic\nNexwA+R5xepgzrWDkOKZSkCAn8Pr8W7shDoRpooKdfdW2Oy8x+rJ4rypP0Kz\nwj9qAm8TWewBy0V8ccLuTXFamKY8mIaYrlq10fC9ASHQ1wUhHEJjQDeFHLnE\nWe3/Bsa4YJOAyxQMKQuEWwTIOhl4f3Y+Bw4MdIZBULICPIi/hS2G5s+RR6up\n8oK0bsaYsZr9SzQh7UttLQMYsm9bwm3hqPYTKp9TbUwugLsPUCxmsBbMRXfL\naidU062xBk4SLOfUdpw6UYKgEIpycJzma0a+YXAs6aiv0eA4GQ5Rt2QMKHDf\n1fHsh3IUSjNSULHg5GG2YLKL8ZotNzmch96drY4bxf1PzNAQU25sPqi+nheS\n/xrXR5mzE58ckE63ueVslypvaWiAhAEA4ClnizZH5NxITBaWgzug+e6xy8+i\njjBn6OF7xxz0mngMjxNCcYOlthTvY+13xfOJMTUyT2X/9x4YszbupVOXtbNO\nLFIL\r\n=18CB\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","gitHead":"1fe13d6f25457234c7aa10f80d9f8490e44d8005","scripts":{"test":"make test","cover":"make cover"},"_npmUser":{"name":"cctv1005s","email":"384113872@qq.com"},"_npmVersion":"7.7.6","description":"honeycomb api proxy express middleware.","directories":{},"_nodeVersion":"15.14.0","dependencies":{"qs":"^6.5.2","debug":"3.1.0","lodash":"4.17.19","multer":"1.3.0","urllib":"^2.27.0","formstream":"1.1.0","path-to-regexp":"1.6.0","hc-service-client":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","mocha":"^4.0.1","express":"4.16.2","supertest":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/hc-proxy_2.0.8_1621501448581_0.8002563664970566","host":"s3://npm-registry-packages"}},"2.0.9":{"name":"hc-proxy","version":"2.0.9","keywords":["api","proxy","middleware"],"author":{"name":"albin"},"license":"ISC","_id":"hc-proxy@2.0.9","maintainers":[{"name":"fishbar","email":"zhengxinlin@gmail.com"},{"name":"fish","email":"zhengxinlin@gmail.com"},{"name":"albin3","email":"binwei.zeng3@gmail.com"},{"name":"noonnightstorm","email":"noonnightstorm@qq.com"},{"name":"hqidea","email":"hqidea@yahoo.com"},{"name":"cctv1005s","email":"384113872@qq.com"}],"dist":{"shasum":"80185acfc91b86b40d6533653b8ac945138efc22","tarball":"https://registry.npmjs.org/hc-proxy/-/hc-proxy-2.0.9.tgz","fileCount":15,"integrity":"sha512-9swKkk7j6HmTrdme3OkEjmCpjZ016uRruB/zfWYdweiweHRB8n7vg4KgamT0/pRuN8ghZukXqrtYU4O+eMo4YQ==","signatures":[{"sig":"MEUCIQD6Fa3oG9FvXor0nD+iNdGLB9pdtw0MgZIdN7RuWlLLFgIger+AUv0vex09ulKeA1Dvf6/4MaVyDoM8xTv8mHMBht0=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":53646,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg7BtBCRA9TVsSAnZWagAAEj4P/AsBR64jo7XetTjuF8A1\njAVAoYfFZOwa5fwf/2viviZAIjCt6OrJ3uazliW8zKJTMH4UZa68Mpwrhrtz\noUf5A8wSuD/hqkd7YVZv55zW6VTMYi7OqtGrXSmZBcTkz6hzjKSi/KKhLNar\nUAqvUyMEzcSIfU5qwZRJOn82/srquxnMjlTKuxiwir82RrWvaFRgOS4sEXZK\nTfpi+hr2y6uH77lFNAyQCtHAimNS6U4axJZSuV9tHI89YhmTC5mn609EGnrM\nEuQPlMl1p16W/WU1lpFiINs42De0epQu/G4x8K0sVy8jKDx7IXPHq4umlc/6\n9lmKEg1ZGz6Z9vBJe/uQn31xH2jeR37+r2CRj/0a7ykdmp3vbD7UbsShX3tF\nYWBYqHPg4WJeieWYmBtINlm9Tk6BuLumrX9qH/DnW5dIhlMJACy/X9oHkRjW\naL/UHmbVfEl4b/j/XjqfTWIgSiFVUYy2fj2hgLmBhKG5l87i1OFMumA8G6zz\njQIuvk5ds22B0FYH93yR2TjKn8F0+dw2/MFsy2sSjthVXYBnP+x6LCaB7AVX\nWrEU5EcH3nEG9KGGxRf8tTUQHT+MpRsNQl25clVhM5RbRs4RUjnN9R2FjdU6\ng1YQHzCi8WbvfXc6DeGxw5T0JzApEG1smNtv7Lu3fKodNjWcdxDwP3dzg7pq\nS8Z4\r\n=ycUo\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","gitHead":"1efb52da6e34cca90966d28a9e3572249cc1295c","scripts":{"test":"make test","cover":"make cover"},"_npmUser":{"name":"fish","email":"zhengxinlin@gmail.com"},"_npmVersion":"6.13.4","description":"honeycomb api proxy express middleware.","directories":{},"_nodeVersion":"12.16.1","dependencies":{"qs":"^6.5.2","debug":"3.1.0","lodash":"4.17.19","multer":"1.3.0","urllib":"^2.27.0","formstream":"1.1.0","path-to-regexp":"1.6.0","hc-service-client":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","mocha":"^4.0.1","express":"4.16.2","supertest":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/hc-proxy_2.0.9_1626086208709_0.07581988894420832","host":"s3://npm-registry-packages"}},"2.0.10":{"name":"hc-proxy","version":"2.0.10","keywords":["api","proxy","middleware"],"author":{"name":"albin"},"license":"ISC","_id":"hc-proxy@2.0.10","maintainers":[{"name":"fishbar","email":"zhengxinlin@gmail.com"},{"name":"fish","email":"zhengxinlin@gmail.com"},{"name":"albin3","email":"binwei.zeng3@gmail.com"},{"name":"noonnightstorm","email":"noonnightstorm@qq.com"},{"name":"hqidea","email":"hqidea@yahoo.com"},{"name":"cctv1005s","email":"384113872@qq.com"}],"dist":{"shasum":"93e2b355fa8ff5c38de1832791dbe8b836566f6c","tarball":"https://registry.npmjs.org/hc-proxy/-/hc-proxy-2.0.10.tgz","fileCount":15,"integrity":"sha512-P8mQXqlj231lxE/SCBemWw0tTOofgG8kmLexfYUOPwBphWfbZDdIdQMDx2NGFmGum8IhgNQKwM4g7TJUo6qLwg==","signatures":[{"sig":"MEUCIQDH/FaZnFrIFFTCl0VS+hyMosc/oI9jxEOASRn52zL5JAIgCO34GWEUJF18vtOSHhajt15AJTxG3LIfytjKAmWQ1p8=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":54361,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg7HLdCRA9TVsSAnZWagAAv4MQAIn0z+edieBnF4VsypO8\nKLCZxEjrhk1mBx3itBIyhPjdHemaOSa6KI9bpHi2OsA8gBBmR4BLhSLRnwEy\nXT55nC5yQjtTIF0DcbkjZL9XEsRXqyvUOZtAulnsx+1jP1XKon3VBq1QXZT5\npTbiXOkwNHnDhlwk2fkEfuuZQ1/GhwbMpvp9vR/4Ir891b9reSp7XIab4NKe\nTbcU3BrrKS7eaG/k7sGeklHykZ7rNRelRhUyCESZwkzuA9+1JVuADwA1L0+a\na/t+gbu0TinrYh7wiJlgK3ETRX3i6hM+XI6WlbEloYd6Nw3UzmjYsmLBLVDP\nHaCzeIOyyhW+fKBc3ilEbSa4w4/i+QY4thcaKdnKooB9hK9ImVeimDz7sQYs\n0qKKrsDmkNcuyPC/dh0hVj7xrilEBPd0yb1mrgPKgf2Gj/5YUL7RjEbg4pTK\n689RQ3n0FtB4LuhOBhLI80K3kwCVGh9y1cwD0838dCzdugva7BY/J/eF7+uI\nRk6CeKjU9zwNbmGs9WtNx9eNNjZSRDnJonjaty41hexMdH5HWEyk3VtMmN6a\nFD6rueF4fDZN3Ut8WmZI1wA9UcdN/vznK4LmrxhvORfWal1gz4msV8zL/C4L\nG8lxmOlyErmiczq6XQ3nlAK0DsXS9k/Xw4q3lejhSBjQc8IrjumGst+ijtx3\nBpoB\r\n=4lvl\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","gitHead":"e3e5231d8f0945e7e15c99018d0ee46516098ad9","scripts":{"test":"make test","cover":"make cover"},"_npmUser":{"name":"fish","email":"zhengxinlin@gmail.com"},"_npmVersion":"6.13.4","description":"honeycomb api proxy express middleware.","directories":{},"_nodeVersion":"12.16.1","dependencies":{"qs":"^6.5.2","debug":"3.1.0","lodash":"4.17.19","multer":"1.3.0","urllib":"^2.27.0","formstream":"1.1.0","path-to-regexp":"1.6.0","hc-service-client":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","mocha":"^4.0.1","express":"4.16.2","supertest":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/hc-proxy_2.0.10_1626108636689_0.8784148094369673","host":"s3://npm-registry-packages"}},"2.0.11":{"name":"hc-proxy","version":"2.0.11","keywords":["api","proxy","middleware"],"author":{"name":"albin"},"license":"ISC","_id":"hc-proxy@2.0.11","maintainers":[{"name":"fishbar","email":"zhengxinlin@gmail.com"},{"name":"fish","email":"zhengxinlin@gmail.com"},{"name":"albin3","email":"binwei.zeng3@gmail.com"},{"name":"noonnightstorm","email":"noonnightstorm@qq.com"},{"name":"hqidea","email":"hqidea@yahoo.com"},{"name":"cctv1005s","email":"384113872@qq.com"}],"dist":{"shasum":"ad10891f1c58c0fc5c7261476b41f491b2884f26","tarball":"https://registry.npmjs.org/hc-proxy/-/hc-proxy-2.0.11.tgz","fileCount":15,"integrity":"sha512-Pk2qqzjuwzaCA8295aLRg5RMPTyChJXLoXyfXpZ4TT+P5ZdAPo/KLCmzf66/DOkwjCIsjVtWaNdAQLLbibN0ww==","signatures":[{"sig":"MEUCIBMNWAWQq5aQd//F39eVw7hN+/fpCQLLl89dNpXS68PKAiEAiIUa2o1cTvy8WLHFmofGaLYQqG9wgFgxLsREf3hQYuI=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":54361,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg7HNACRA9TVsSAnZWagAATAAQAIuhf4w+NJNIdXA8gmwW\nZ+NNp79mXY1d0C6OdjTXGzMsImVz4LAD4nOqJ3JMDM5Gi/D6iaYxWIGammAo\nFCK+nqfzD74LxrWjfzoHQ473l20dONKWwmx/8z8Qnw43e9kqA4sqb09XTEta\nQVfTPvSEZP1yH9SGaT4h9nFJ2Ak5MgeftKetrakQHgUz5ja8+oEPzSJznBer\nPQNxGooOe+y96Rteg4Un4VVqrLCQF89EZj5S5Ry5WPYxQX0+lsui+72st/s4\nLVKd6IGq1pO2GDKFyIOM359JMCQktYZ4RrM6BJ2DxRMbiqcJ3MX61b0rnhBP\nSuGkc/DfGxIaDdnWm7EOHO1k76d5kQFL/TbwY4G8uaq7OXmxQFyZ8ZJPnSog\nDK/KqAl4Lb7BpidApG6wT1bOk4O1CxDL0WBLMr3hmefC+BiS5z3quOvKcmeP\nzrepjdwQCJmcmv/oCD1jKaCjOODs9LvvxB6jULxkyNmnpdv+/l/rrWDjIbmL\nMFW9gXUXqAW652mqhE1FZbE5CuynVr1fjwUoSruAe8YRYKDNP0G7rcJtaEqY\nRTQ9kf3KIdE2GDceOAiZWrhGDcBNxibPPKNeoVawZi77995PnyD1GvnfzDAs\ndiZi4xnRdV/KvAnLiskbHmF7n/tMN8KK406wqWoSURSx2p/NZeZJUXU1I8wl\nh5+j\r\n=EnG8\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","gitHead":"cd1b6438e9f28286677969cf6fbc47cb4274862e","scripts":{"test":"make test","cover":"make cover"},"_npmUser":{"name":"fish","email":"zhengxinlin@gmail.com"},"_npmVersion":"6.13.4","description":"honeycomb api proxy express middleware.","directories":{},"_nodeVersion":"12.16.1","dependencies":{"qs":"^6.5.2","debug":"3.1.0","lodash":"4.17.21","multer":"1.3.0","urllib":"^2.27.0","formstream":"1.1.0","path-to-regexp":"1.6.0","hc-service-client":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","mocha":"^4.0.1","express":"4.16.2","supertest":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/hc-proxy_2.0.11_1626108735710_0.7545783266350161","host":"s3://npm-registry-packages"}},"2.0.12":{"name":"hc-proxy","version":"2.0.12","keywords":["api","proxy","middleware"],"author":{"name":"albin"},"license":"ISC","_id":"hc-proxy@2.0.12","maintainers":[{"name":"fishbar","email":"zhengxinlin@gmail.com"},{"name":"fish","email":"zhengxinlin@gmail.com"},{"name":"albin3","email":"binwei.zeng3@gmail.com"},{"name":"noonnightstorm","email":"noonnightstorm@qq.com"},{"name":"hqidea","email":"hqidea@yahoo.com"},{"name":"cctv1005s","email":"384113872@qq.com"}],"dist":{"shasum":"6b00a6eb04412026ca0bb0550d6021e9c240e5a0","tarball":"https://registry.npmjs.org/hc-proxy/-/hc-proxy-2.0.12.tgz","fileCount":15,"integrity":"sha512-fUtA2wnpP1ThZn3ZoepqkQnHp0ohI8Gja/nwZom5sciB/G7pgK0veVIWRfSiPx6mU+Gx/DVZTMfLLXlTG/5BQA==","signatures":[{"sig":"MEYCIQC5BeoZTG74C6Icx/STyohz0ui/3RTGIxxV9uoXs8wNdQIhAJigACwXiXgOMEpDCVcwx7VHJwlwEUJjsW9lp+QRs1cV","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":54360,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg7Vm8CRA9TVsSAnZWagAALH4P/0ierPOEfH4M5GHWNowE\nWqCVJJXGZBW1HaZEEi74gXYvAGTqY531gK4CBamKDuhjVkohwMM5BN+bCjFo\nlqRHjFa1sMli2YD2jX6oSYIfi/E2pbwJk2t8FVcHwHwjKa2TLtPESgH9ap4u\nedWZa5yNy4W1qhaLs9YmXLzSGI+F+Xea43tgnHC0UxFpY7bDIBLjO/VVhCDf\nIGG+hYfa2jrz2GBr2GnKrJJrX3AbG6NJyIUgAMV2dxlvz+a3yqj8RoRf1rM1\nuT508lb3GUjj9EXrhXCW42tGr18AQHdEbY4g95Rlo7w2W0GCbHOhQA2FT4Ih\n1qfrf3WXaza49qqHwbMx/FtMCZq6i1M90wTXl13JSRnV8h4PV6OOoQJ5euSc\nS/KUQyUdveIyDm6LB6T0Ny5eAkJxYAnBc0XETUJgPsDoczlgqUw7RjUAxqnb\nw17ZeU7vxglvvVEa+7WtHWNHfNf0jumzCZm1T+UFf1YJ+PJRGUwFAH1YzKyh\n4JaPBtAj9zBy3ywwN904u6G86tzyN7QxgUfCr2MSYah/AOO9SmCV/lL50A1u\nyfg0GRQ0DAE2445jmyWvECxdcOdBOFQ48yriUHo06/SGRJVmmAlqr9oOgYaK\ndnebHNs2v9a8n/Jjw5f+ne3GE2rkEvWIHUbpLfAr8FKbavcOV1WTHM89Q4Y+\nY3Xb\r\n=uh0b\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","gitHead":"26b41484147ef0a20ef5ede1bb964a7583a5c85d","scripts":{"test":"make test","cover":"make cover"},"_npmUser":{"name":"fish","email":"zhengxinlin@gmail.com"},"_npmVersion":"6.13.4","description":"honeycomb api proxy express middleware.","directories":{},"_nodeVersion":"12.16.1","dependencies":{"qs":"^6.5.2","debug":"3.1.0","lodash":"4.17.21","multer":"1.3.0","urllib":"^2.27.0","formstream":"1.1.0","path-to-regexp":"1.6.0","hc-service-client":"1.1.7"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","mocha":"^4.0.1","express":"4.16.2","supertest":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/hc-proxy_2.0.12_1626167739624_0.9951660064546397","host":"s3://npm-registry-packages"}},"2.0.12-beta":{"name":"hc-proxy","version":"2.0.12-beta","keywords":["api","proxy","middleware"],"author":{"name":"albin"},"license":"ISC","_id":"hc-proxy@2.0.12-beta","maintainers":[{"name":"fishbar","email":"zhengxinlin@gmail.com"},{"name":"fish","email":"zhengxinlin@gmail.com"},{"name":"albin3","email":"binwei.zeng3@gmail.com"},{"name":"noonnightstorm","email":"noonnightstorm@qq.com"},{"name":"hqidea","email":"hqidea@yahoo.com"},{"name":"cctv1005s","email":"384113872@qq.com"}],"dist":{"shasum":"f30c6a4c1b19158fa6ff556498fd64504a9bd09b","tarball":"https://registry.npmjs.org/hc-proxy/-/hc-proxy-2.0.12-beta.tgz","fileCount":15,"integrity":"sha512-1bVjuzjrUxIr0IVzjvr3dtajPkeHwC+WtKo660I/BUrnx9CUGgIeRI8TGiTMD2LOmgDyH72yQ91oiS3PQHdotg==","signatures":[{"sig":"MEYCIQCM4JeeE8v5l1XJmlmRuuKvaqfIaawecKmpSxp2XlhrwgIhAIMVhUE1nm/pbC1O6Mfw+idvaGQXVCJLDZzSb6Mj0BaX","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":54436,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg8VYRCRA9TVsSAnZWagAAlcMP/3qgkZCE3zj2IgPl60QJ\nABdqKl/Saba3lx/UBBkPkLmZ8/PMuFLi5BSid+l6+w9AYh4xvzXfW+NTubDi\nd2Lx34RYq0BsdJnKruDWzRG42foxJSzq/jJzUwMczL5l4tVDEVac5iEwfasp\nzNUOs2UqflmhpK8lmWG5XRR/0aAyL+q5J2eYRoNCOUgmG3I4VUBFrUvjYEVQ\nkKh4MLvRYUR5HsO4kAkFdElRIDX6ukp3ZIbclGFiVtp76pQ+U4MWzEDTH+1k\nb0oee4Kn/OsCpYOSVBgbYbACZYBPlQ7iWq0nB+2s1BLEIiPuaDXb3MZoLrE2\nV7K4PrPK5q9WSLBZj6ikHTWZZyEmv6iM3YlIid7HKa3kVpOZ4hYQkBuMtKcL\nmnFqMTUzFT6qLuzbsgQuJW414sbj9NbkaMccjUiilruPk90mcBIh5sjc+I28\nTTkmDOq9LHXlBk7IFjlZZ12Gsic2Xo9S/Ybkmi8Dk2qZv/6tHCVQkSscSxQ0\njY/xTmSV0lYIiEfA5ws5zmOiJ9Jvgz/Pv66mRg6B7C/FywaqqfaHsBX/hhJR\n++tAgrt3X8ke4ZTCYk8Fib+WrPU12skFCddZpmYnMPH2Kokd1pe8VQSIy8vq\nlFAjs97J8KR2pE2HJU2Z29itr193lXNAJpqJkCUD38bg68/Fs2PqrzLQ/FpL\nEqqX\r\n=fs1U\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","gitHead":"552186b09e4bc023062180be5b19c46434132bd7","scripts":{"test":"make test","cover":"make cover"},"_npmUser":{"name":"cctv1005s","email":"384113872@qq.com"},"_npmVersion":"7.7.6","description":"honeycomb api proxy express middleware.","directories":{},"_nodeVersion":"15.14.0","dependencies":{"qs":"^6.5.2","debug":"3.1.0","lodash":"4.17.21","multer":"1.3.0","urllib":"^2.27.0","formstream":"1.1.0","path-to-regexp":"1.6.0","hc-service-client":"1.1.7"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","mocha":"^4.0.1","express":"4.16.2","supertest":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/hc-proxy_2.0.12-beta_1626428945223_0.1898267091673851","host":"s3://npm-registry-packages"}},"2.0.13":{"name":"hc-proxy","version":"2.0.13","keywords":["api","proxy","middleware"],"author":{"name":"albin"},"license":"ISC","_id":"hc-proxy@2.0.13","maintainers":[{"name":"fishbar","email":"zhengxinlin@gmail.com"},{"name":"fish","email":"zhengxinlin@gmail.com"},{"name":"albin3","email":"binwei.zeng3@gmail.com"},{"name":"noonnightstorm","email":"noonnightstorm@qq.com"},{"name":"hqidea","email":"hqidea@yahoo.com"},{"name":"cctv1005s","email":"384113872@qq.com"}],"dist":{"shasum":"745423c6c4777b57b824543585be17a924851313","tarball":"https://registry.npmjs.org/hc-proxy/-/hc-proxy-2.0.13.tgz","fileCount":15,"integrity":"sha512-x63WI37gBTe5C6lD1FcBMDPR2BGZzeLOu57Khqw/MVJAV2GPr+WcRrVs0IE6M4UDlXuF1IKE7Hag+AS/QICwlQ==","signatures":[{"sig":"MEQCIGwR1f4S7KkJRPzci7Br8yYy8ojjzzuhz/vZkW8wgLTeAiAGF3t/Ci6J1E18mVvD+rO2qdk3CAJsdYWGk4kD05TC0Q==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":54431,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhB8SeCRA9TVsSAnZWagAAp7EQAI0cKK5hfBhJ1mzgSCSp\nVwwQETsy2GGezADISHS/s2Xh04YJYNbzrkeBRGExZt4jJfDJ8fVZYpOPRSA3\nkhKdpRA0eHgu5O4W0MpMTWJbR2wNnILArtIajvV3xg60vP/2esMplYFJgj7A\nQmWjFAqFafwmxMPipYb3vaIxWjYHlbZT0PDt2y3EuK8g6AhmqAuwLS3j513I\nM1yyPaKXyyzZsYu6+C85+oKZUj7m6H/7ehVv7OAOlh/XpyXpICtSbnHFtfdx\nDa2BS0xAaV8ZLnRzGpYtxqWlcGWZdlcIPTJ4sqWVrQz8nUNvYEwKxW4BT1CJ\n7d31LaFRLNjhbJ4BDMP6O0G4pD99mQfK7bxeXZYL3kZRQ/djyvit6BD/Hw8o\nl6TgsUzujosXZvHWmhv8tsB7vP7Piw2Tpf7915bMkQR72qt7IsEAltrDwi7G\nNI8FolaiEHBfaLjkJFl9U14ud5a0xQ17fongDcKXErepK60ho5Mu569+jVsZ\n1K5QkdiF9xQnfaFkM03T+XiTXK8Tdu0KSNoYvW52bY1YX+ZVLWv1oJEE5Rwe\nHrjWDi+0vZXJUx4nGBYOkSn1mCqE0w4hEJ8xhMzl2Dyows36FHHwxujerx7d\n/Kzj21otgPmvip9eB20XJG4Ux/7wfUVqhtaObVepwv5MTIgnvpnBRvO+9pIB\nXr9p\r\n=0eL6\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","gitHead":"9f9b5eafded0f334b2c708c81e4b86bbdb3b600d","scripts":{"test":"make test","cover":"make cover"},"_npmUser":{"name":"cctv1005s","email":"384113872@qq.com"},"_npmVersion":"7.7.6","description":"honeycomb api proxy express middleware.","directories":{},"_nodeVersion":"15.14.0","dependencies":{"qs":"^6.5.2","debug":"3.1.0","lodash":"4.17.21","multer":"1.3.0","urllib":"^2.27.0","formstream":"1.1.0","path-to-regexp":"1.6.0","hc-service-client":"1.1.7"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","mocha":"^4.0.1","express":"4.16.2","supertest":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/hc-proxy_2.0.13_1627899038414_0.8046074904623126","host":"s3://npm-registry-packages"}},"2.0.14":{"name":"hc-proxy","version":"2.0.14","keywords":["api","proxy","middleware"],"author":{"name":"albin"},"license":"ISC","_id":"hc-proxy@2.0.14","maintainers":[{"name":"fishbar","email":"zhengxinlin@gmail.com"},{"name":"fish","email":"zhengxinlin@gmail.com"},{"name":"albin3","email":"binwei.zeng3@gmail.com"},{"name":"noonnightstorm","email":"noonnightstorm@qq.com"},{"name":"hqidea","email":"hqidea@yahoo.com"},{"name":"cctv1005s","email":"384113872@qq.com"}],"dist":{"shasum":"98f410b287151930d3c47a9191b6005c4c46e2cc","tarball":"https://registry.npmjs.org/hc-proxy/-/hc-proxy-2.0.14.tgz","fileCount":35,"integrity":"sha512-ApICpmZr3tA0+YnxREH4jnz9gJD13ej0hk2ROdkPIGsW2Ha7cqrdl8nzRgQzQQ6PyoaQFt04upB+L7fsDkfHWA==","signatures":[{"sig":"MEUCIEgkW37eL+as5qAPVvo0woRrCkA07K+nK7uw9T9CK1DfAiEAhnFvLdKbjMFHhykPqzcLdqiRd5u3yWQ66Tn3OD40MdA=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":186131,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhOr4WCRA9TVsSAnZWagAACDAP/j2K64bZxGOtrXs00FX7\nVoqZ0kklmZvIIfOdO2hzdBfd8hfsh8DnewQzrG+uAE0dxWs+7rwu6KnMx7lr\nvQgd5uGA4gcLC4MRWYptCCNdmbKATauqzyxIOEK7a7eacwN9qzxn+QT/s7Vb\nVOleWoVxlpKLB9yxwnMIxN8XnlNVYY0eue4ilK/2sX4eb0Sylnldz/guvJPM\nLFbJfomdDogbf+AJTYy5VwFxanboXZgz3+6sGvO3vkM8scpEQA4fNqIq/SuU\nY4Oigj3axN9uDkfuEuvirINkfL85a67P4ASMw6LezIzC1fJc2oevDKViy6HF\nwcZ0dK0CSHP8zJ8dGr2PMCf9QPhIR9TGYIUQM2g5It47Q2/4QpFjjHVKIG3B\neev6Qb3RtAtvhFgHlaedZ9xJNAGN/PuuwSoOeHB2zr2zDy/EVCtZ9U4/5FsQ\nPe8bRroC42RDTHE9vgJz8NUD1oDQ1EuQ9SV1aCmiVVG8t4jnRvKLTxf483PW\nrN9V1wcL7fsbmewGnRyyYtc6OrtjTiZAq+OEVgLQCTL4ocHTsDPYyrbhczwh\nEu3nZvEglcF4NKbQwYPXYxkEHX6TwhMEDqyirA8XQpzwY9CX9zgjiGr1cJbD\nfFAGUuR8vxdi8du+UqVyPgjLWo75/dp9kakW3Iv9boKm/xReMSrs7XVQyO+O\nQk/T\r\n=WMe1\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","gitHead":"7c42769e071798ff2fe72fa40fb5a4b25b473526","scripts":{"test":"make test","cover":"make cover"},"_npmUser":{"name":"cctv1005s","email":"384113872@qq.com"},"_npmVersion":"7.7.6","description":"honeycomb api proxy express middleware.","directories":{},"_nodeVersion":"15.14.0","dependencies":{"qs":"^6.5.2","debug":"3.1.0","lodash":"4.17.21","multer":"1.3.0","urllib":"^2.27.0","formstream":"1.1.0","path-to-regexp":"1.6.0","hc-service-client":"1.1.7"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","mocha":"^4.0.1","express":"4.16.2","supertest":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/hc-proxy_2.0.14_1631239702644_0.38258878829769416","host":"s3://npm-registry-packages"}},"2.0.15":{"name":"hc-proxy","version":"2.0.15","keywords":["api","proxy","middleware"],"author":{"name":"albin"},"license":"ISC","_id":"hc-proxy@2.0.15","maintainers":[{"name":"fishbar","email":"zhengxinlin@gmail.com"},{"name":"fish","email":"zhengxinlin@gmail.com"},{"name":"albin3","email":"binwei.zeng3@gmail.com"},{"name":"noonnightstorm","email":"noonnightstorm@qq.com"},{"name":"hqidea","email":"hqidea@yahoo.com"},{"name":"cctv1005s","email":"384113872@qq.com"}],"dist":{"shasum":"84a67cefe61e5a67048c81e56d0eb763611c317f","tarball":"https://registry.npmjs.org/hc-proxy/-/hc-proxy-2.0.15.tgz","fileCount":35,"integrity":"sha512-VCZnQ7g41XZxNY1LTqlxJUTywzHvtKL3hQ7fPp/PiPvXM8b++B8X67PigOW+HeGo5TuKkVJ3kJhcyAzFBTIXxg==","signatures":[{"sig":"MEUCIQD5tTpDyX9UR8oqBGrXVS2H8MZ8Yspfj16o/5qMRRV+ZQIgZJ5LbElzbQnI44+mb8xZyxQe+CE+ZUv/qONue+MdpMg=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":186581},"main":"index.js","gitHead":"1d2a4626d019c1979cc91fae34889ea4b67eb02f","scripts":{"test":"make test","cover":"make cover"},"_npmUser":{"name":"cctv1005s","email":"384113872@qq.com"},"_npmVersion":"7.7.6","description":"honeycomb api proxy express middleware.","directories":{},"_nodeVersion":"15.14.0","dependencies":{"qs":"^6.5.2","debug":"3.1.0","lodash":"4.17.21","multer":"1.3.0","urllib":"^2.27.0","formstream":"1.1.0","path-to-regexp":"1.6.0","hc-service-client":"1.1.7"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","mocha":"^4.0.1","express":"4.16.2","supertest":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/hc-proxy_2.0.15_1634264373332_0.2705650176730694","host":"s3://npm-registry-packages"}},"2.0.16":{"name":"hc-proxy","version":"2.0.16","keywords":["api","proxy","middleware"],"author":{"name":"albin"},"license":"ISC","_id":"hc-proxy@2.0.16","maintainers":[{"name":"fishbar","email":"zhengxinlin@gmail.com"},{"name":"fish","email":"zhengxinlin@gmail.com"},{"name":"albin3","email":"binwei.zeng3@gmail.com"},{"name":"noonnightstorm","email":"noonnightstorm@qq.com"},{"name":"hqidea","email":"hqidea@yahoo.com"},{"name":"cctv1005s","email":"384113872@qq.com"}],"dist":{"shasum":"0df0a464550696794809b9dbee03cdb525647c57","tarball":"https://registry.npmjs.org/hc-proxy/-/hc-proxy-2.0.16.tgz","fileCount":35,"integrity":"sha512-E4N6Z9TG3R2vWPOAllrj+dKuln75W6CP1swjCJdxpyKifYRRRLVmaqYdQw78JL7KZL+lP5nSBoZQNpBFyM1MZA==","signatures":[{"sig":"MEUCIGZpHPzLPnB9gAPqHYrGg46PknH+puROFQgT6fNbJDgHAiEAns2UlzlrdvPnQezgDv5NPO7XsEupEiRKJlM7hW1Sz1Y=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":186582},"main":"index.js","gitHead":"a40c8117a8defcea444afc75c512a89c9bb7540d","scripts":{"test":"make test","cover":"make cover"},"_npmUser":{"name":"cctv1005s","email":"384113872@qq.com"},"_npmVersion":"7.7.6","description":"honeycomb api proxy express middleware.","directories":{},"_nodeVersion":"15.14.0","dependencies":{"qs":"^6.5.2","debug":"3.1.0","lodash":"4.17.21","multer":"1.3.0","urllib":"^2.27.0","formstream":"1.1.0","path-to-regexp":"1.6.0","hc-service-client":"^1.1.8"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","mocha":"^4.0.1","express":"4.16.2","supertest":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/hc-proxy_2.0.16_1635239402268_0.5945793955254528","host":"s3://npm-registry-packages"}},"2.0.17-beta":{"name":"hc-proxy","version":"2.0.17-beta","keywords":["api","proxy","middleware"],"author":{"name":"albin"},"license":"ISC","_id":"hc-proxy@2.0.17-beta","maintainers":[{"name":"fishbar","email":"zhengxinlin@gmail.com"},{"name":"fish","email":"zhengxinlin@gmail.com"},{"name":"albin3","email":"binwei.zeng3@gmail.com"},{"name":"noonnightstorm","email":"noonnightstorm@qq.com"},{"name":"hqidea","email":"hqidea@yahoo.com"},{"name":"cctv1005s","email":"384113872@qq.com"}],"dist":{"shasum":"3925ba274ef3d4495c5f454cb857566fd1a3f72c","tarball":"https://registry.npmjs.org/hc-proxy/-/hc-proxy-2.0.17-beta.tgz","fileCount":35,"integrity":"sha512-AgwpvUj5qzPgW8+JEVVro3sRMjqKkDoibI6rvXwzt2WJL6F0ea1QjZCdpMv76iPiLW6A0MSG3AydGA9jm3xl4A==","signatures":[{"sig":"MEUCIC/KgxWxN8YJphGLj2cjyXK+YHgVI4VQSUzBMm1wUB5AAiEAzrvAEXCh9fr73/BfDETR8wZjZ21RR7rkdxFdD9Efq8c=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":187643,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh0/5PCRA9TVsSAnZWagAAFSMQAIEsqTi67Uxt5TwuGUTG\nEQPDcMfVxjarG2pl+32AbmP8wQDOTncTBDOj79M8HqgXFTR8xBwL2ziNtfoa\nnV+NN0Mhh+gdYm2cNcSyAwJDZrMKb32BRau3yQY4XMSeKUvHgdsq7DxLwLjv\nButgv3ku67wWYDbS5or8WLUb3LC4PFbFkuOg2pxNACwRz0U7lnc3P6pcSwQZ\nT+GH6Y2IvaCwmSL6bSgZqGO2yFlih8F6Rc6/EXM03K6/w0bsv3jAiuOlMQtR\nbbX0i/+hE+cm56xfCC61r1ohN+Iwz79SD7mtcgI36JPF+Ilxmo8A9Upq/eHz\nexfadhom/HC5Wpw6h11Jf5+hjF0KES4Jdp3FAfQikfYQHAj18SGSosip1131\nIRiwP6RpYf1mA9qO1pkIOG+xMyAloyGXcfp7ybVrbowqYDBIJg+aAOacQjHa\n7xFuPalmRXd8GwD31PjxHUvZZIHrPPQ/tCQ1qoAeIaxzfHyJPFN0laU05I2M\nfzvY2Ia0NnLhPS0gHcdBDnX6ip/WG2Ez1ZXbTWXtRL/mOGWEwNirxgMbSOvr\n/CAVJve3xP4i3Gv+rTmk3d69rCsaCsXIOrSgNSwCSABxNepa9fKKnesZYSkV\nD1GphI47sfesWmaAZh5BwVuyGPUXPFXnAds/20qb0oPdA/9w8c5/kmuKm/JK\n4T4y\r\n=u/im\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","readme":"# hc-proxy\n\napi代理模块，node server端代理请求后端service用。\n\n## 以honeycomb项目为例进行配置\n\n1. 确定honeycomb项目的启动端口和prefix，比如： 项目的启动端口为8001，prefix为 'example'\n2. 整理远程调用的服务，给每个服务起个英文名称，比如： 上面的两个服务  视频服务(video)  音乐服务(music)  聊天服务(chat)\n3. 配置在router.js中，进行如下配置\n4. 请注意，为了确保安全，所有api只支持白名单\n\n```js\n// router.js\nconst app = require('./app');\nconst Proxy = require('hc-proxy');\nconst proxyInstance = new Proxy({\n  service: {\n    video: {\n      endpoint: 'http://localhost:7001/',\n      client: 'http',\n      api: [\n        '/api/aaa',\n        '/api/c/d'\n      ]\n    },\n    music: {\n      endpoint: 'http://192.168.1.1:7001/',\n      client: 'http',\n      api: [\n        '/api/bbb'\n      ]\n    },\n    dtboostTest: {\n      endponit: 'http://localhost:8007/',\n      client: 'serviceClient',\n      api: [\n        '/test',\n      ],\n      serviceOpt: { // client 代理时会合并以下配置\n        pipe: false,\n      },\n    }\n  },\n  headers: [\n    'x-csrf-token',\n    'X-Operator'\n  ]\n});\n\n// 代理的接口前缀  /api/proxy, 可以自定义\nproxyInstance.setProxyPrefix('/api/proxy');\n\nmodule.exports = function (router) {\n  proxyInstance.mount(router, app);\n};\n```\n\n### 配置完成后访问地址\n\n访问地址为:\n```\n${服务地址:服务端口/prefix} + ${proxyPrefix} + ${被代理服务名} + ${具体api}\n```\n\n上面的配置案例里：\n```shell\n1. 视频服务:   curl http://localhost:8001/example/api/proxy/video/api/aaa => http://localhost:7001/api/aaa\n2. 视频服务:   curl http://localhost:8001/example/api/proxy/video/api/c/somewhat?xxx=123 => http://localhost:7001/api/c/somewhat?xxx=123\n3. 音乐服务:   curl http://localhost:8001/example/api/proxy/music/api/bbb => http://192.168.1.1:7001/api/bbb\n```\n\n### 代理websocket服务\n\n```js\n// router.js\nconst app = require('./app');\nconst Proxy = require('hc-proxy');\nconst proxyInstance = new Proxy({\n  service: {\n    music: {\n      endpoint: 'http://192.168.1.1:7001/',\n      client: 'http',\n      api: [\n        '/api/bbb'\n      ]\n    },\n    chat: {\n      endpoint: 'http://localhost:7001/',\n      client: 'websocket',\n      api: [\n        '/ws/a'\n      ]\n    }\n  },\n  headers: [\n    'x-csrf-token',\n    'X-Operator'\n  ]\n});\n\nproxyInstance.setProxyPrefix('/api/proxy');\n\nmodule.exports = function (router) {\n  proxyInstance.mount(router, app);\n};\n```\n\n### websocket配置完成后访问地址\n\n访问地址为 ${honeycomb服务地址:honeycomb服务端口/honeycomb的prefix} + ${proxyPrefix} + ${被代理服务名} + ${具体api}\n\n```shell\n1. 音乐服务:   curl http://localhost:8001/example/api/proxy/music/api/bbb => http://192.168.1.1:7001/api/bbb\n2. 聊天服务:   curl http://localhost:8001/example/api/proxy/chat/ws/somewhat => http://localhost:7001/ws/somewhat      // 支持websocket\n```\n\n### 代理文件上传\n\n```js\n// router.js\nconst app = require('./app');\nconst Proxy = require('hc-proxy');\nconst proxyInstance = new Proxy({\n  service: {\n    music: {\n      endpoint: 'http://192.168.1.1:7001/',\n      client: 'http',\n      api: [\n        {\n          path: '/api/404',\n          return: 404\n        },\n        {\n          path: '/api/upload',\n          file: true\n        },\n        {\n          path: '/api/upload_limited',\n          file: {\n            maxFileSize: 100        // 100B\n          },\n          beforeRequest: (req, options, config) => {},\n          beforeResponse: (req, res, data) => {}\n        }\n      ]\n    }\n  },\n  headers: [\n    'x-csrf-token',\n    'X-Operator'\n  ]\n});\n\nproxyInstance.setProxyPrefix('/api/proxy');\n\nmodule.exports = function (router) {\n  proxyInstance.mount(router, app);\n};\n```\n\n### 文件上传代理效果\n\n```shell\n1. 上传文件1:   curl http://localhost:8001/example/api/proxy/music/api/upload => http://192.168.1.1:7001/api/upload\n2. 上传文件2:   curl http://localhost:8001/example/api/proxy/music/api/upload_limited => http://192.168.1.1:7001/api/upload_limited\n```\n\n## API document\n\n约定:\n\n- proxy挂在的http服务称为 \"代理服务\"\n- 被proxy代理的远端服务称为 \"远端服务\"\n\n### new Proxy(options)\n\n#### options Object\n\noptions.service 详情\n\n```\n{\n  ${serviceCode}: {\n    /* 每个远端服务的服务地址，如: 'http://localhost:7001' */\n    endpoint: ${endpoint},\n    accessKeyId: ${accessKeyId},\n    accessKeySecret: ${accessKeySecret},\n    /* 同 hc-service-client 配置，见文档: https://www.npmjs.com/package/hc-service-client */\n    headerExtension: ${headerExtension},\n    /* 选填，透传的header列表，同 hc-service-client 配置，见文档: https://www.npmjs.com/package/hc-service-client */\n    headers: {Array},\n    /* 可选，发起请求的agent，目前只支持'appClient' / 'http' / 'websocket' / 'serviceWebsocket'，默认为'appClient'，其中 appClient 和 serviceWebsocket 带了honeycomb体系中的签名逻辑 */\n    client: ${client},\n    /* 接口超时时间，单位毫秒 */\n    timeout: ${timeout},\n    /* 可选，delete方法使用querystring代理, 默认为true */\n    useQuerystringInDelete: ${useQuerystringInDelete}, // 只有 appClient / urllib 模式有效\n    /* 可选，用户覆盖的urllibOption，覆盖系统默认值，优先级: service.api.urllibOption > service.urllibOption > hc-proxy默认设置 */\n    urllibOption: {Object},                     // 只有 appClient / urllib 模式有效\n    /* 覆盖转发时的5XX的errorCode */\n    defaultErrorCode: {Number}\n    /* 排除列表, 不代理的接口 */\n    exclude: {Array}\n    /* 路由前缀 */\n    routePrefix: {String} \n    /* 是否开启路径支持正则匹配, 默认关闭，开启请确保安全 */\n    enablePathWithMatch: {Boolean} false\n    api: [\n      /* 接口配置可以是简单的一个string */\n      '${ApiPathString}',\n      {\n        /* api访问的path */\n        path: {String}\n        /* 如若定义，会覆盖proxyPrefix, 给特殊场景定义接口路径用 */\n        route: {String}\n        /* 接口方法 */\n        method: 'GET|POST|PUT|DELETE|PATCH'\n        /* 接口超时时间, 单位毫秒，覆盖上面配置的服务的通用超时，通常用来设置特殊接口的超时时长 */\n        timeout: {Number},\n        /* 是否透传, 开启透传之后，body不落地，直接pipe到远端； 开启pipe之后，body内容不参与签名(签名里的body='') */\n        pipe: true,\n        /* 请求的默认querystring信息， 用于配置默认的query参数(代理请求时自动加上) */\n        defaultQuery: {Object|String},\n        /**\n         * 发起请求前的hook, beforeRequest(req, apiReq, config) \n         *    @param req {Request} 客户端请求对象request,\n         *    @param options {Object} urlib的配置信息,\n         *    @param config {Object} api的配置信息\n         */\n        beforeRequest: {Function(req, options, config)},\n        /**\n         * 请求从服务接口返回之后的hook，afterResponse(req, res, apiRes) \n         *  @param req {Request} 客户端请求的request对象,\n         *  @param res {Response} proxy端请求的response对象,\n         *  @param data {Response} 返回数据\n         *  @return data\n         */\n        beforeResponse: {Function(req, res, data)}, \n        /* delete方法使用querystring代理, 默认为true */\n        useQuerystringInDelete: {Boolean},\n        /** 用户覆盖的urllibOption，覆盖系统默认值，优先级: service.api.urllibOption > service.urllibOption > hc-proxy默认设置 */\n        urllibOption: {Object}\n      }\n    ]\n  }\n}\n```\n\n通用配置:\n\n- headers: 选填，同 hc-service-client 配置，见文档: https://www.npmjs.com/package/hc-service-client\n- accessKeyId: 选填，同 hc-service-client 配置，默认 'hc-proxy'，详见 https://www.npmjs.com/package/hc-service-client\n- accessKeySecret: 同 hc-service-client 配置，必填，不填时取 app.config.systemToken，详见 https://www.npmjs.com/package/hc-service-client\n- headerExtension:  同 hc-service-client 配置，见文档: https://www.npmjs.com/package/hc-service-client\n\n#### options.headers Array<string>\n\noptions.headers 用于声明proxy需要转发的header。\n默认情况下，proxy不转发客户端过来的header，只有在proxyHeaders中配置的header才会被转发。\n\n### proxy.setProxyPrefix(proxyPrefix)\n\n- proxyPrefix <String>\n\nsetProxyPrefix方法用于指定 hc-proxy 挂载在代理服务上的总前缀\n\n如: 默认 proxyPrefix = /api/proxy \n则: 所有请求远端服务的请求，格式为   ${localHttpServer}/api/proxy/${serviceCode}/${remoteApi}\n\n### proxy.mount(router, app)\n\n将proxy的配置挂在到代理服务。\n\n- router: Express Router instance\n- app: app.server 是一个 http.Server 的实例，honeycomb中，直接 require('./app') 能获得\n\n## 更多例子\n\n```js\n'use strict';\n\nconst app = require('./app');\nconst Proxy = require('hc-proxy');\nconst proxyInstance = new Proxy({\n  service: {\n    otm: {\n      endpoint: 'http://dev.dtboost.biz.aliyun.test/otm_v2',                           // 自动截取最后的'/'\n      client: 'appClient',                                                                // 默认appClient\n      timeout: 10000,                                                                     // 默认60000\n      api: [\n        '/api/a',                                                                         // 支持 * 代理某个path下的所有api\n        '/otm_v2/api/entities/list',                                                      // 代理这个 url 的 GET POST PUT DELETE 方法\n        {path: '/otm_v2/api/entities/list', method: 'GET'},                                // 只代理 GET 方法\n        {path: '/otm_v2/api/entities/list', client: 'appClient'},                          // 显式指定 method\n        {path: '/otm_v2/api/schemas', method: ['GET', 'POST']},                            // 只支持 GET POST 方法\n        {host: 'http://taobao.com/api', path: '/tag_factory_v2/api/:id', method: 'GET'},   // 不同域时，指定host\n        {path: 'http://taobao.com/api', route: '/api/proxy/taobao_api'},                   // 指定route的代理，不指定route时，所有代理接口请求 /<-app_name->/api/proxy 获得代理\n        '/otm_v2/api/tags/query_tags_entity_pagenum',                                     // \n        {path: '/otm_v2/api/schemas/:id', route: '/api/proxy/schemas/:id'}                 // 带参数的url，保证route和url中的param一致，也可以不填route\n      ]\n    },\n    websocket: {\n      endpoint: 'http://dev.dtboost.biz.aliyun.test/websocket',               // 远程的websocket地址\n      client: 'websocket',                                                       // 选择websocket作为连接的client\n      api: [\n        '/ws'                                                                    // 配置连接路径，不在的路径返回404\n      ]\n    }\n  },\n  headers: [\n    'x-csrf-token',\n    'X-Operator'\n  ]\n});\n\nproxyInstance.setProxyPrefix('/api/proxy');\n\nmodule.exports = function (router) {\n  proxyInstance.mount(router, app);\n};\n```\n\n## DEBUG [代理没生效？]\n\n在命令行启动命令前加入`DEBUG=hc-proxy`\n\n```sh\n// 以启动命令为 honeycomb start 为例\nDEBUG=hc-proxy honeycomb start\n\n// ...\n// hc-proxy [GET] /api/proxy/urllib_proxy/urllib -> http://localhost:58062/urllib +0ms\n// hc-proxy [POST] /api/proxy/urllib_proxy/urllib -> http://localhost:58062/urllib +3ms\n// hc-proxy [DELETE] /api/proxy/urllib_proxy/urllib -> http://localhost:58062/urllib +1ms\n// hc-proxy [PUT] /api/proxy/urllib_proxy/urllib -> http://localhost:58062/urllib +0ms\n// ...\n```\n\n## 作用\n\n- 本地开发时，可以使用这个代理访问远程其它服务(如otm)的问题；\n- 非本地开发环境时，可以不使用代理，而直接访问类似'/otm_v2/api/xxx'，以减小内部调用开销，由前端自行控制；\n","gitHead":"f960cf6733156a193b73ab293a4889ff430d2029","scripts":{"test":"make test","cover":"make cover"},"_npmUser":{"name":"cctv1005s","email":"384113872@qq.com"},"_npmVersion":"7.7.6","description":"honeycomb api proxy express middleware.","directories":{},"_nodeVersion":"15.14.0","dependencies":{"qs":"^6.5.2","debug":"3.1.0","lodash":"4.17.21","multer":"1.3.0","urllib":"^2.27.0","formstream":"1.1.0","path-to-regexp":"1.6.0","hc-service-client":"^1.1.8"},"_hasShrinkwrap":false,"readmeFilename":"readme.md","devDependencies":{"nyc":"^15.1.0","mocha":"^4.0.1","express":"4.16.2","supertest":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/hc-proxy_2.0.17-beta_1641283151749_0.34272847891890823","host":"s3://npm-registry-packages"}},"2.0.17":{"name":"hc-proxy","version":"2.0.17","keywords":["api","proxy","middleware"],"author":{"name":"albin"},"license":"ISC","_id":"hc-proxy@2.0.17","maintainers":[{"name":"fishbar","email":"zhengxinlin@gmail.com"},{"name":"fish","email":"zhengxinlin@gmail.com"},{"name":"albin3","email":"binwei.zeng3@gmail.com"},{"name":"noonnightstorm","email":"noonnightstorm@qq.com"},{"name":"hqidea","email":"hqidea@yahoo.com"},{"name":"cctv1005s","email":"384113872@qq.com"}],"dist":{"shasum":"bc134a15e60d7bca91a9b28f9ebfd5c00afd2e25","tarball":"https://registry.npmjs.org/hc-proxy/-/hc-proxy-2.0.17.tgz","fileCount":16,"integrity":"sha512-d9E0pMOpt4tbeghBoCyjuGUsv8MaTN+117a5aacQBrKL2BmCz2zCkQhOTh4Z3cCesZdTe10ox41uKcOcVPA3iw==","signatures":[{"sig":"MEQCIGQuf8lHGy5k3sT2jXrbtCHrQxVC7SFbtWAMNGnnHtgPAiB8zwjNk9gL0BAmeG8zZ6L5jf0oMWUih7pJy3i5LEXXBw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":61006,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiVUkzACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoOaxAAhls8Ke9xiegraAigX4slSQ1zPoXqpu7XbwlszXkE3zz6uRnx\r\ntjDhRHNRq+eEQaNl4nue6IJYVAwdBSaqY4t4nJwgwv/XflM8hzHCV37MkCq1\r\nj0mJv2vA/chktja/HXi1r8Km+TLXs9WR7IQ2phXjXEuPmLALPS8ezrlO9mtH\r\n/li+FM9XpyLy2DEWo7TARf/Y/I7bgVmooLVvOug07JvziuWT2fyBIAxlt+jG\r\naj8FeEMSIK9GMi/9JyFIhqgRK97kCs6IJTWvT2nMn5lHB4pe4S0iw8t8ywS4\r\ntkunxkpdCTVY9yMd/Ez+5EDR5pF2aaVn3ROCD591cVEnfjhgMXN8s0eJ7ImS\r\n1+l8uRM+CiosfkFARGEQ1Fe0Bn8wUpN4gfaVdG85nWRftv8veSZi7qDWDfP2\r\nEKmaDpj++dIyc0soI7f4HVgcJ21Lrwg5T9+7+kdKN8jEuqr4A+6Y2tCEJzFm\r\ntPSYTpgLQPFltEBXPxYwQiqACZNX9IztiL8zGMZazC2BT1iYhGA4jW3Fj7G1\r\n7Blanf3jJlOru2xyTY1cZOvkPKIUNr1OePaANSbuvr8qJpVstohtwNizHFhu\r\ntS//avNjY5xsQV6JQPMNM3ZFc/mWSMjvenC1ETxElfphL+UCNOD2ycnTEq1K\r\n0DYWcOxqu8yjBQXxOmPONoF41Jen9y6ejoY=\r\n=Mbgk\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","gitHead":"f348e50cf574169640c9b2771b2245a1fda1dce1","scripts":{"test":"make test","cover":"make cover"},"_npmUser":{"name":"noonnightstorm","email":"noonnightstorm@qq.com"},"_npmVersion":"6.14.2","description":"honeycomb api proxy express middleware.","directories":{},"_nodeVersion":"10.16.0","dependencies":{"qs":"^6.5.2","debug":"3.1.0","lodash":"4.17.21","multer":"1.3.0","urllib":"^2.27.0","formstream":"1.1.0","path-to-regexp":"1.6.0","hc-service-client":"^1.1.8"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","mocha":"^4.0.1","express":"4.16.2","supertest":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/hc-proxy_2.0.17_1649756467721_0.5160387927573413","host":"s3://npm-registry-packages"}},"2.0.18-alpha.0":{"name":"hc-proxy","version":"2.0.18-alpha.0","keywords":["api","proxy","middleware"],"author":{"name":"albin"},"license":"ISC","_id":"hc-proxy@2.0.18-alpha.0","maintainers":[{"name":"fishbar","email":"zhengxinlin@gmail.com"},{"name":"fish","email":"zhengxinlin@gmail.com"},{"name":"albin3","email":"binwei.zeng3@gmail.com"},{"name":"backspacebyte","email":"backspace@backblog.me"},{"name":"noonnightstorm","email":"noonnightstorm@qq.com"},{"name":"hqidea","email":"hqidea@yahoo.com"},{"name":"cctv1005s","email":"384113872@qq.com"}],"dist":{"shasum":"1f5ccbef7a56bd3fd74ac2aa74598c28be9e7ff4","tarball":"https://registry.npmjs.org/hc-proxy/-/hc-proxy-2.0.18-alpha.0.tgz","fileCount":16,"integrity":"sha512-Sw8ZUXlhldr6YytYZJNDnsgwd1iUp5nIfx84w34VUBYA5V44VNA3+gjxpj8XcpbStvfF9k+OiIUDiKUa6LQEpw==","signatures":[{"sig":"MEYCIQDUiWGogt0JqnSKEJoBbUoaQzRR3AoJODNKnp8xYbnSRAIhAK+B/Vu++g0sMgg0lHHq33cSdDc/L4ozVu57FUedAtQ4","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":61045,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiZP85ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqhlA//VEFSQcgAAbo/X6ZWM8bY9YShEG2nKj03xNGzTdPmn7trZcj3\r\n/DRPOYVAYiB/vMtpcOwL9WsmUgi119WoL0+qCosp4n83m+72owFtugWuS+BP\r\nnPD1AV912+n8/ZZ2r1ChcDKHnIj7YBirfx1901u9BXnhPX+ePLqMDc20AKRg\r\nQhGyJ6E1skmWPVR37gSxQsVxca6H1853SgsL+bfiwlpxF5ZNE6Avbd+MKiZ3\r\n04xNC5y7+Ftiy2d1scGpjyKHp+GNP+mka/puXJUQLlvQewt+H4f6guuWurAY\r\nArRHxYI8yR07Gm2x0cGUwBqUSmaqffXfkoXj8aK9XHzGsIQsgU0kTlb/5q2k\r\nrapx+zWjJrSY84FkyDgPrZ7CBz47MZC/38bU+VMbP1zsuyAaxmR6voVORpSJ\r\nntd60GY4RQpo0xhHDSrBL4MwR8hZFH8k6pU06/XLxmj4IN5Ub7Nq8SruO49b\r\n9bwAb1IT6NdUQLsJU/tk3Vz2Kwo0ZJxDRygd/tUkUeIq6Iizm87LPYfwPfHg\r\nV0DXDYM9+C+X0x3xg/I40paC+JQUCIEUmF2CJz3E0marmf/Dtto3C8OjLPSd\r\nq0MGhmduwnSrmYT9sepjlkmOheb5aqf/UhCcxK+rTD+UV/g8U0qIuQeqzRVv\r\nbjWBPdd0M9YF6qPTdTyj7ywNr1naZ1elfqs=\r\n=0LlN\r\n-----END PGP SIGNATURE-----\r\n"},"main":"index.js","readme":"# hc-proxy\n\napi代理模块，node server端代理请求后端service用。\n\n## 以honeycomb项目为例进行配置\n\n1. 确定honeycomb项目的启动端口和prefix，比如： 项目的启动端口为8001，prefix为 'example'\n2. 整理远程调用的服务，给每个服务起个英文名称，比如： 上面的两个服务  视频服务(video)  音乐服务(music)  聊天服务(chat)\n3. 配置在router.js中，进行如下配置\n4. 请注意，为了确保安全，所有api只支持白名单\n\n```js\n// router.js\nconst app = require('./app');\nconst Proxy = require('hc-proxy');\nconst proxyInstance = new Proxy({\n  service: {\n    video: {\n      endpoint: 'http://localhost:7001/',\n      client: 'http',\n      api: [\n        '/api/aaa',\n        '/api/c/d'\n      ]\n    },\n    music: {\n      endpoint: 'http://192.168.1.1:7001/',\n      client: 'http',\n      api: [\n        '/api/bbb'\n      ]\n    },\n    dtboostTest: {\n      endponit: 'http://localhost:8007/',\n      client: 'serviceClient',\n      api: [\n        '/test',\n      ],\n      serviceOpt: { // client 代理时会合并以下配置\n        pipe: false,\n      },\n    }\n  },\n  headers: [\n    'x-csrf-token',\n    'X-Operator'\n  ]\n});\n\n// 代理的接口前缀  /api/proxy, 可以自定义\nproxyInstance.setProxyPrefix('/api/proxy');\n\nmodule.exports = function (router) {\n  proxyInstance.mount(router, app);\n};\n```\n\n### 配置完成后访问地址\n\n访问地址为:\n```\n${服务地址:服务端口/prefix} + ${proxyPrefix} + ${被代理服务名} + ${具体api}\n```\n\n上面的配置案例里：\n```shell\n1. 视频服务:   curl http://localhost:8001/example/api/proxy/video/api/aaa => http://localhost:7001/api/aaa\n2. 视频服务:   curl http://localhost:8001/example/api/proxy/video/api/c/somewhat?xxx=123 => http://localhost:7001/api/c/somewhat?xxx=123\n3. 音乐服务:   curl http://localhost:8001/example/api/proxy/music/api/bbb => http://192.168.1.1:7001/api/bbb\n```\n\n### 代理websocket服务\n\n```js\n// router.js\nconst app = require('./app');\nconst Proxy = require('hc-proxy');\nconst proxyInstance = new Proxy({\n  service: {\n    music: {\n      endpoint: 'http://192.168.1.1:7001/',\n      client: 'http',\n      api: [\n        '/api/bbb'\n      ]\n    },\n    chat: {\n      endpoint: 'http://localhost:7001/',\n      client: 'websocket',\n      api: [\n        '/ws/a'\n      ]\n    }\n  },\n  headers: [\n    'x-csrf-token',\n    'X-Operator'\n  ]\n});\n\nproxyInstance.setProxyPrefix('/api/proxy');\n\nmodule.exports = function (router) {\n  proxyInstance.mount(router, app);\n};\n```\n\n### websocket配置完成后访问地址\n\n访问地址为 ${honeycomb服务地址:honeycomb服务端口/honeycomb的prefix} + ${proxyPrefix} + ${被代理服务名} + ${具体api}\n\n```shell\n1. 音乐服务:   curl http://localhost:8001/example/api/proxy/music/api/bbb => http://192.168.1.1:7001/api/bbb\n2. 聊天服务:   curl http://localhost:8001/example/api/proxy/chat/ws/somewhat => http://localhost:7001/ws/somewhat      // 支持websocket\n```\n\n### 代理文件上传\n\n```js\n// router.js\nconst app = require('./app');\nconst Proxy = require('hc-proxy');\nconst proxyInstance = new Proxy({\n  service: {\n    music: {\n      endpoint: 'http://192.168.1.1:7001/',\n      client: 'http',\n      api: [\n        {\n          path: '/api/404',\n          return: 404\n        },\n        {\n          path: '/api/upload',\n          file: true\n        },\n        {\n          path: '/api/upload_limited',\n          file: {\n            maxFileSize: 100        // 100B\n          },\n          beforeRequest: (req, options, config) => {},\n          beforeResponse: (req, res, data) => {}\n        }\n      ]\n    }\n  },\n  headers: [\n    'x-csrf-token',\n    'X-Operator'\n  ]\n});\n\nproxyInstance.setProxyPrefix('/api/proxy');\n\nmodule.exports = function (router) {\n  proxyInstance.mount(router, app);\n};\n```\n\n### 文件上传代理效果\n\n```shell\n1. 上传文件1:   curl http://localhost:8001/example/api/proxy/music/api/upload => http://192.168.1.1:7001/api/upload\n2. 上传文件2:   curl http://localhost:8001/example/api/proxy/music/api/upload_limited => http://192.168.1.1:7001/api/upload_limited\n```\n\n## API document\n\n约定:\n\n- proxy挂在的http服务称为 \"代理服务\"\n- 被proxy代理的远端服务称为 \"远端服务\"\n\n### new Proxy(options)\n\n#### options Object\n\noptions.service 详情\n\n```\n{\n  ${serviceCode}: {\n    /* 每个远端服务的服务地址，如: 'http://localhost:7001' */\n    endpoint: ${endpoint},\n    accessKeyId: ${accessKeyId},\n    accessKeySecret: ${accessKeySecret},\n    /* 同 hc-service-client 配置，见文档: https://www.npmjs.com/package/hc-service-client */\n    headerExtension: ${headerExtension},\n    /* 选填，透传的header列表，同 hc-service-client 配置，见文档: https://www.npmjs.com/package/hc-service-client */\n    headers: {Array},\n    /* 可选，发起请求的agent，目前只支持'appClient' / 'http' / 'websocket' / 'serviceWebsocket'，默认为'appClient'，其中 appClient 和 serviceWebsocket 带了honeycomb体系中的签名逻辑 */\n    client: ${client},\n    /* 接口超时时间，单位毫秒 */\n    timeout: ${timeout},\n    /* 可选，delete方法使用querystring代理, 默认为true */\n    useQuerystringInDelete: ${useQuerystringInDelete}, // 只有 appClient / urllib 模式有效\n    /* 可选，用户覆盖的urllibOption，覆盖系统默认值，优先级: service.api.urllibOption > service.urllibOption > hc-proxy默认设置 */\n    urllibOption: {Object},                     // 只有 appClient / urllib 模式有效\n    /* 覆盖转发时的5XX的errorCode */\n    defaultErrorCode: {Number}\n    /* 排除列表, 不代理的接口 */\n    exclude: {Array}\n    /* 路由前缀 */\n    routePrefix: {String} \n    /* 是否开启路径支持正则匹配, 默认关闭，开启请确保安全 */\n    enablePathWithMatch: {Boolean} false\n    api: [\n      /* 接口配置可以是简单的一个string */\n      '${ApiPathString}',\n      {\n        /* api访问的path */\n        path: {String}\n        /* 如若定义，会覆盖proxyPrefix, 给特殊场景定义接口路径用 */\n        route: {String}\n        /* 接口方法 */\n        method: 'GET|POST|PUT|DELETE|PATCH'\n        /* 接口超时时间, 单位毫秒，覆盖上面配置的服务的通用超时，通常用来设置特殊接口的超时时长 */\n        timeout: {Number},\n        /* 是否透传, 开启透传之后，body不落地，直接pipe到远端； 开启pipe之后，body内容不参与签名(签名里的body='') */\n        pipe: true,\n        /* 请求的默认querystring信息， 用于配置默认的query参数(代理请求时自动加上) */\n        defaultQuery: {Object|String},\n        /**\n         * 发起请求前的hook, beforeRequest(req, apiReq, config) \n         *    @param req {Request} 客户端请求对象request,\n         *    @param options {Object} urlib的配置信息,\n         *    @param config {Object} api的配置信息\n         */\n        beforeRequest: {Function(req, options, config)},\n        /**\n         * 请求从服务接口返回之后的hook，afterResponse(req, res, apiRes) \n         *  @param req {Request} 客户端请求的request对象,\n         *  @param res {Response} proxy端请求的response对象,\n         *  @param data {Response} 返回数据\n         *  @return data\n         */\n        beforeResponse: {Function(req, res, data)}, \n        /* delete方法使用querystring代理, 默认为true */\n        useQuerystringInDelete: {Boolean},\n        /** 用户覆盖的urllibOption，覆盖系统默认值，优先级: service.api.urllibOption > service.urllibOption > hc-proxy默认设置 */\n        urllibOption: {Object}\n      }\n    ]\n  }\n}\n```\n\n通用配置:\n\n- headers: 选填，同 hc-service-client 配置，见文档: https://www.npmjs.com/package/hc-service-client\n- accessKeyId: 选填，同 hc-service-client 配置，默认 'hc-proxy'，详见 https://www.npmjs.com/package/hc-service-client\n- accessKeySecret: 同 hc-service-client 配置，必填，不填时取 app.config.systemToken，详见 https://www.npmjs.com/package/hc-service-client\n- headerExtension:  同 hc-service-client 配置，见文档: https://www.npmjs.com/package/hc-service-client\n\n#### options.headers Array<string>\n\noptions.headers 用于声明proxy需要转发的header。\n默认情况下，proxy不转发客户端过来的header，只有在proxyHeaders中配置的header才会被转发。\n\n### proxy.setProxyPrefix(proxyPrefix)\n\n- proxyPrefix <String>\n\nsetProxyPrefix方法用于指定 hc-proxy 挂载在代理服务上的总前缀\n\n如: 默认 proxyPrefix = /api/proxy \n则: 所有请求远端服务的请求，格式为   ${localHttpServer}/api/proxy/${serviceCode}/${remoteApi}\n\n### proxy.mount(router, app)\n\n将proxy的配置挂在到代理服务。\n\n- router: Express Router instance\n- app: app.server 是一个 http.Server 的实例，honeycomb中，直接 require('./app') 能获得\n\n## 更多例子\n\n```js\n'use strict';\n\nconst app = require('./app');\nconst Proxy = require('hc-proxy');\nconst proxyInstance = new Proxy({\n  service: {\n    otm: {\n      endpoint: 'http://dev.dtboost.biz.aliyun.test/otm_v2',                           // 自动截取最后的'/'\n      client: 'appClient',                                                                // 默认appClient\n      timeout: 10000,                                                                     // 默认60000\n      api: [\n        '/api/a',                                                                         // 支持 * 代理某个path下的所有api\n        '/otm_v2/api/entities/list',                                                      // 代理这个 url 的 GET POST PUT DELETE 方法\n        {path: '/otm_v2/api/entities/list', method: 'GET'},                                // 只代理 GET 方法\n        {path: '/otm_v2/api/entities/list', client: 'appClient'},                          // 显式指定 method\n        {path: '/otm_v2/api/schemas', method: ['GET', 'POST']},                            // 只支持 GET POST 方法\n        {host: 'http://taobao.com/api', path: '/tag_factory_v2/api/:id', method: 'GET'},   // 不同域时，指定host\n        {path: 'http://taobao.com/api', route: '/api/proxy/taobao_api'},                   // 指定route的代理，不指定route时，所有代理接口请求 /<-app_name->/api/proxy 获得代理\n        '/otm_v2/api/tags/query_tags_entity_pagenum',                                     // \n        {path: '/otm_v2/api/schemas/:id', route: '/api/proxy/schemas/:id'}                 // 带参数的url，保证route和url中的param一致，也可以不填route\n      ]\n    },\n    websocket: {\n      endpoint: 'http://dev.dtboost.biz.aliyun.test/websocket',               // 远程的websocket地址\n      client: 'websocket',                                                       // 选择websocket作为连接的client\n      api: [\n        '/ws'                                                                    // 配置连接路径，不在的路径返回404\n      ]\n    }\n  },\n  headers: [\n    'x-csrf-token',\n    'X-Operator'\n  ]\n});\n\nproxyInstance.setProxyPrefix('/api/proxy');\n\nmodule.exports = function (router) {\n  proxyInstance.mount(router, app);\n};\n```\n\n## DEBUG [代理没生效？]\n\n在命令行启动命令前加入`DEBUG=hc-proxy`\n\n```sh\n// 以启动命令为 honeycomb start 为例\nDEBUG=hc-proxy honeycomb start\n\n// ...\n// hc-proxy [GET] /api/proxy/urllib_proxy/urllib -> http://localhost:58062/urllib +0ms\n// hc-proxy [POST] /api/proxy/urllib_proxy/urllib -> http://localhost:58062/urllib +3ms\n// hc-proxy [DELETE] /api/proxy/urllib_proxy/urllib -> http://localhost:58062/urllib +1ms\n// hc-proxy [PUT] /api/proxy/urllib_proxy/urllib -> http://localhost:58062/urllib +0ms\n// ...\n```\n\n## 作用\n\n- 本地开发时，可以使用这个代理访问远程其它服务(如otm)的问题；\n- 非本地开发环境时，可以不使用代理，而直接访问类似'/otm_v2/api/xxx'，以减小内部调用开销，由前端自行控制；\n","gitHead":"89543ec5bf2357984fd7cb7271ccd564fdb82f5e","scripts":{"test":"make test","cover":"make cover"},"_npmUser":{"name":"backspacebyte","email":"backspace@backblog.me"},"_npmVersion":"7.9.0","description":"honeycomb api proxy express middleware.","directories":{},"_nodeVersion":"12.17.0","dependencies":{"qs":"^6.5.2","debug":"3.1.0","lodash":"4.17.21","multer":"1.3.0","urllib":"^2.27.0","formstream":"1.1.0","path-to-regexp":"1.6.0","hc-service-client":"^1.3.0-alpha.0"},"_hasShrinkwrap":false,"readmeFilename":"readme.md","devDependencies":{"nyc":"^15.1.0","mocha":"^4.0.1","express":"4.16.2","supertest":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/hc-proxy_2.0.18-alpha.0_1650786105638_0.3968792307921438","host":"s3://npm-registry-packages"}},"2.0.18":{"name":"hc-proxy","version":"2.0.18","keywords":["api","proxy","middleware"],"author":{"name":"albin"},"license":"ISC","_id":"hc-proxy@2.0.18","maintainers":[{"name":"fishbar","email":"zhengxinlin@gmail.com"},{"name":"fish","email":"zhengxinlin@gmail.com"},{"name":"albin3","email":"binwei.zeng3@gmail.com"},{"name":"backspacebyte","email":"backspace@backblog.me"},{"name":"noonnightstorm","email":"noonnightstorm@qq.com"},{"name":"hqidea","email":"hqidea@yahoo.com"},{"name":"cctv1005s","email":"384113872@qq.com"}],"dist":{"shasum":"36e26d7298f85d25d8d26e777cd1dbde4f664946","tarball":"https://registry.npmjs.org/hc-proxy/-/hc-proxy-2.0.18.tgz","fileCount":17,"integrity":"sha512-jgOzUiAcfygA08NJjcTl8idKTkZ3auBUJrELXBKNZo/KIMPK6maOlHjB1iIIGoXalsuTpSOlyFXej0/KX+35Ow==","signatures":[{"sig":"MEUCICkvIokHlmPhQKFYTEOEkDKQwOmKLbaDjf7fgD1sIylTAiEA31GCN87qd327nDmdk9bwc0iOHgHiHa6reofTxX8eEOM=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":61749},"main":"index.js","gitHead":"b8c75d852d7fe8958dd5df4a00c1b9b2739249a1","scripts":{"test":"make test","cover":"make cover"},"_npmUser":{"name":"fish","email":"zhengxinlin@gmail.com"},"_npmVersion":"8.15.0","description":"honeycomb api proxy express middleware.","directories":{},"_nodeVersion":"16.17.0","dependencies":{"qs":"^6.5.2","debug":"3.1.0","lodash":"4.17.21","multer":"1.3.0","urllib":"^2.27.0","formstream":"1.1.0","path-to-regexp":"1.6.0","hc-service-client":"^1.1.8"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","mocha":"^4.0.1","express":"4.16.2","supertest":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/hc-proxy_2.0.18_1700124538660_0.7962997149865454","host":"s3://npm-registry-packages"}},"2.0.19":{"name":"hc-proxy","version":"2.0.19","keywords":["api","proxy","middleware"],"author":{"name":"albin"},"license":"ISC","_id":"hc-proxy@2.0.19","maintainers":[{"name":"fishbar","email":"zhengxinlin@gmail.com"},{"name":"fish","email":"zhengxinlin@gmail.com"},{"name":"albin3","email":"binwei.zeng3@gmail.com"},{"name":"backspacebyte","email":"backspace@backblog.me"},{"name":"noonnightstorm","email":"noonnightstorm@qq.com"},{"name":"hqidea","email":"hqidea@yahoo.com"},{"name":"cctv1005s","email":"384113872@qq.com"}],"dist":{"shasum":"8520c2c3407a60239dd93ff505e7081b1c5f1d26","tarball":"https://registry.npmjs.org/hc-proxy/-/hc-proxy-2.0.19.tgz","fileCount":17,"integrity":"sha512-NcnqbMozz/Bp7DBs5sNzLvuv2dMXrFaTOFlizqFtmBIHDPe9X3Jg3Ipual/5AojNo4Lysj8ZwoGWq9unCUg1qQ==","signatures":[{"sig":"MEYCIQDl6u9YgpXZMXzzWRQBQ+BnE7+nBiDulOSW1+kmVF29jAIhANjvbJt3xQEkF4feE6mmm+SJPWfbTwzlLH7CbSqTGOUM","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":61760},"main":"index.js","gitHead":"fa09abf1a44f644fbe3fdde795a593c7f93c758a","scripts":{"test":"make test","cover":"make cover"},"_npmUser":{"name":"fish","email":"zhengxinlin@gmail.com"},"_npmVersion":"8.15.0","description":"honeycomb api proxy express middleware.","directories":{},"_nodeVersion":"16.17.0","dependencies":{"qs":"^6.5.2","debug":"3.1.0","lodash":"4.17.21","multer":"1.3.0","urllib":"^2.27.0","formstream":"1.1.0","path-to-regexp":"1.6.0","hc-service-client":"^1.1.8"},"_hasShrinkwrap":false,"devDependencies":{"nyc":"^15.1.0","mocha":"^4.0.1","express":"4.16.2","supertest":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/hc-proxy_2.0.19_1700194297230_0.720501140534584","host":"s3://npm-registry-packages"}}},"time":{"created":"2018-04-17T10:46:47.870Z","modified":"2026-09-06T03:25:32.693Z","1.0.0":"2018-04-17T10:46:48.003Z","1.0.1":"2018-04-18T07:09:58.764Z","1.0.2":"2018-05-30T04:13:50.104Z","1.0.3":"2018-05-30T08:08:58.411Z","1.0.4":"2018-06-01T07:27:21.068Z","1.0.5":"2018-06-13T06:48:40.713Z","1.0.6":"2018-06-15T06:54:54.812Z","1.0.7":"2018-06-25T06:35:42.086Z","1.0.8":"2018-09-25T08:15:37.227Z","1.0.9":"2018-09-26T11:28:23.076Z","1.0.10":"2018-10-23T09:12:57.479Z","1.0.11":"2019-01-03T11:35:40.483Z","1.0.12":"2019-01-03T11:41:06.466Z","2.0.0":"2019-01-29T11:59:08.143Z","2.0.1":"2019-01-30T07:36:54.698Z","2.0.2":"2019-01-31T02:27:30.374Z","2.0.3":"2019-06-14T06:54:44.897Z","2.0.4":"2020-01-08T11:39:15.308Z","2.0.5":"2020-02-27T19:10:46.299Z","2.0.6":"2021-04-19T02:58:43.732Z","2.0.6-beta":"2021-04-26T01:40:02.085Z","2.0.7":"2021-04-26T07:52:25.337Z","2.0.8":"2021-05-20T09:04:08.712Z","2.0.9":"2021-07-12T10:36:48.846Z","2.0.10":"2021-07-12T16:50:36.822Z","2.0.11":"2021-07-12T16:52:15.841Z","2.0.12":"2021-07-13T09:15:39.721Z","2.0.12-beta":"2021-07-16T09:49:05.382Z","2.0.13":"2021-08-02T10:10:38.519Z","2.0.14":"2021-09-10T02:08:22.856Z","2.0.15":"2021-10-15T02:19:33.540Z","2.0.16":"2021-10-26T09:10:02.640Z","2.0.17-beta":"2022-01-04T07:59:11.942Z","2.0.17":"2022-04-12T09:41:07.928Z","2.0.18-alpha.0":"2022-04-24T07:41:45.785Z","2.0.18":"2023-11-16T08:48:58.952Z","2.0.19":"2023-11-17T04:11:37.421Z"},"author":{"name":"albin"},"license":"ISC","keywords":["api","proxy","middleware"],"description":"honeycomb api proxy express middleware.","maintainers":[{"email":"zhengxinlin@gmail.com","name":"fish"},{"email":"binwei.zeng3@gmail.com","name":"albin3"},{"email":"backspace@backblog.me","name":"backspacebyte"},{"email":"noonnightstorm@qq.com","name":"noonnightstorm"},{"email":"hqidea@yahoo.com","name":"hqidea"},{"email":"384113872@qq.com","name":"cctv1005s"}],"readme":"# hc-proxy\n\napi代理模块，node server端代理请求后端service用。\n\n## 以honeycomb项目为例进行配置\n\n1. 确定honeycomb项目的启动端口和prefix，比如： 项目的启动端口为8001，prefix为 'example'\n2. 整理远程调用的服务，给每个服务起个英文名称，比如： 上面的两个服务  视频服务(video)  音乐服务(music)  聊天服务(chat)\n3. 配置在router.js中，进行如下配置\n4. 请注意，为了确保安全，所有api只支持白名单\n\n```js\n// router.js\nconst app = require('./app');\nconst Proxy = require('hc-proxy');\nconst proxyInstance = new Proxy({\n  service: {\n    video: {\n      endpoint: 'http://localhost:7001/',\n      client: 'http',\n      api: [\n        '/api/aaa',\n        '/api/c/d'\n      ]\n    },\n    music: {\n      endpoint: 'http://192.168.1.1:7001/',\n      client: 'http',\n      api: [\n        '/api/bbb'\n      ]\n    },\n    dtboostTest: {\n      endponit: 'http://localhost:8007/',\n      client: 'serviceClient',\n      api: [\n        '/test',\n      ],\n      serviceOpt: { // client 代理时会合并以下配置\n        pipe: false,\n      },\n    }\n  },\n  headers: [\n    'x-csrf-token',\n    'X-Operator'\n  ]\n});\n\n// 代理的接口前缀  /api/proxy, 可以自定义\nproxyInstance.setProxyPrefix('/api/proxy');\n\nmodule.exports = function (router) {\n  proxyInstance.mount(router, app);\n};\n```\n\n### 配置完成后访问地址\n\n访问地址为:\n```\n${服务地址:服务端口/prefix} + ${proxyPrefix} + ${被代理服务名} + ${具体api}\n```\n\n上面的配置案例里：\n```shell\n1. 视频服务:   curl http://localhost:8001/example/api/proxy/video/api/aaa => http://localhost:7001/api/aaa\n2. 视频服务:   curl http://localhost:8001/example/api/proxy/video/api/c/somewhat?xxx=123 => http://localhost:7001/api/c/somewhat?xxx=123\n3. 音乐服务:   curl http://localhost:8001/example/api/proxy/music/api/bbb => http://192.168.1.1:7001/api/bbb\n```\n\n### 代理websocket服务\n\n```js\n// router.js\nconst app = require('./app');\nconst Proxy = require('hc-proxy');\nconst proxyInstance = new Proxy({\n  service: {\n    music: {\n      endpoint: 'http://192.168.1.1:7001/',\n      client: 'http',\n      api: [\n        '/api/bbb'\n      ]\n    },\n    chat: {\n      endpoint: 'http://localhost:7001/',\n      client: 'websocket',\n      api: [\n        '/ws/a'\n      ]\n    }\n  },\n  headers: [\n    'x-csrf-token',\n    'X-Operator'\n  ]\n});\n\nproxyInstance.setProxyPrefix('/api/proxy');\n\nmodule.exports = function (router) {\n  proxyInstance.mount(router, app);\n};\n```\n\n### websocket配置完成后访问地址\n\n访问地址为 ${honeycomb服务地址:honeycomb服务端口/honeycomb的prefix} + ${proxyPrefix} + ${被代理服务名} + ${具体api}\n\n```shell\n1. 音乐服务:   curl http://localhost:8001/example/api/proxy/music/api/bbb => http://192.168.1.1:7001/api/bbb\n2. 聊天服务:   curl http://localhost:8001/example/api/proxy/chat/ws/somewhat => http://localhost:7001/ws/somewhat      // 支持websocket\n```\n\n### 代理文件上传\n\n```js\n// router.js\nconst app = require('./app');\nconst Proxy = require('hc-proxy');\nconst proxyInstance = new Proxy({\n  service: {\n    music: {\n      endpoint: 'http://192.168.1.1:7001/',\n      client: 'http',\n      api: [\n        {\n          path: '/api/404',\n          return: 404\n        },\n        {\n          path: '/api/upload',\n          file: true\n        },\n        {\n          path: '/api/upload_limited',\n          file: {\n            maxFileSize: 100        // 100B\n          },\n          beforeRequest: (req, options, config) => {},\n          beforeResponse: (req, res, data) => {}\n        }\n      ]\n    }\n  },\n  headers: [\n    'x-csrf-token',\n    'X-Operator'\n  ]\n});\n\nproxyInstance.setProxyPrefix('/api/proxy');\n\nmodule.exports = function (router) {\n  proxyInstance.mount(router, app);\n};\n```\n\n### 文件上传代理效果\n\n```shell\n1. 上传文件1:   curl http://localhost:8001/example/api/proxy/music/api/upload => http://192.168.1.1:7001/api/upload\n2. 上传文件2:   curl http://localhost:8001/example/api/proxy/music/api/upload_limited => http://192.168.1.1:7001/api/upload_limited\n```\n\n## API document\n\n约定:\n\n- proxy挂在的http服务称为 \"代理服务\"\n- 被proxy代理的远端服务称为 \"远端服务\"\n\n### new Proxy(options)\n\n#### options Object\n\noptions.service 详情\n\n```\n{\n  ${serviceCode}: {\n    /* 每个远端服务的服务地址，如: 'http://localhost:7001' */\n    endpoint: ${endpoint},\n    accessKeyId: ${accessKeyId},\n    accessKeySecret: ${accessKeySecret},\n    /* 同 hc-service-client 配置，见文档: https://www.npmjs.com/package/hc-service-client */\n    headerExtension: ${headerExtension},\n    /* 选填，透传的header列表，同 hc-service-client 配置，见文档: https://www.npmjs.com/package/hc-service-client */\n    headers: {Array},\n    /* 可选，发起请求的agent，目前只支持'appClient' / 'http' / 'websocket' / 'serviceWebsocket'，默认为'appClient'，其中 appClient 和 serviceWebsocket 带了honeycomb体系中的签名逻辑 */\n    client: ${client},\n    /* 接口超时时间，单位毫秒 */\n    timeout: ${timeout},\n    /* 可选，delete方法使用querystring代理, 默认为true */\n    useQuerystringInDelete: ${useQuerystringInDelete}, // 只有 appClient / urllib 模式有效\n    /* 可选，用户覆盖的urllibOption，覆盖系统默认值，优先级: service.api.urllibOption > service.urllibOption > hc-proxy默认设置 */\n    urllibOption: {Object},                     // 只有 appClient / urllib 模式有效\n    /* 覆盖转发时的5XX的errorCode */\n    defaultErrorCode: {Number}\n    /* 排除列表, 不代理的接口 */\n    exclude: {Array}\n    /* 路由前缀 */\n    routePrefix: {String} \n    /* 是否开启路径支持正则匹配, 默认关闭，开启请确保安全 */\n    enablePathWithMatch: {Boolean} false\n    api: [\n      /* 接口配置可以是简单的一个string */\n      '${ApiPathString}',\n      {\n        /* api访问的path */\n        path: {String}\n        /* 如若定义，会覆盖proxyPrefix, 给特殊场景定义接口路径用 */\n        route: {String}\n        /* 接口方法 */\n        method: 'GET|POST|PUT|DELETE|PATCH'\n        /* 接口超时时间, 单位毫秒，覆盖上面配置的服务的通用超时，通常用来设置特殊接口的超时时长 */\n        timeout: {Number},\n        /* 是否透传, 开启透传之后，body不落地，直接pipe到远端； 开启pipe之后，body内容不参与签名(签名里的body='') */\n        pipe: true,\n        /* 请求的默认querystring信息， 用于配置默认的query参数(代理请求时自动加上) */\n        defaultQuery: {Object|String},\n        /**\n         * 发起请求前的hook, beforeRequest(req, apiReq, config) \n         *    @param req {Request} 客户端请求对象request,\n         *    @param options {Object} urlib的配置信息,\n         *    @param config {Object} api的配置信息\n         */\n        beforeRequest: {Function(req, options, config)},\n        /**\n         * 请求从服务接口返回之后的hook，afterResponse(req, res, apiRes) \n         *  @param req {Request} 客户端请求的request对象,\n         *  @param res {Response} proxy端请求的response对象,\n         *  @param data {Response} 返回数据\n         *  @return data\n         */\n        beforeResponse: {Function(req, res, data)}, \n        /* delete方法使用querystring代理, 默认为true */\n        useQuerystringInDelete: {Boolean},\n        /** 用户覆盖的urllibOption，覆盖系统默认值，优先级: service.api.urllibOption > service.urllibOption > hc-proxy默认设置 */\n        urllibOption: {Object}\n      }\n    ]\n  }\n}\n```\n\n通用配置:\n\n- headers: 选填，同 hc-service-client 配置，见文档: https://www.npmjs.com/package/hc-service-client\n- accessKeyId: 选填，同 hc-service-client 配置，默认 'hc-proxy'，详见 https://www.npmjs.com/package/hc-service-client\n- accessKeySecret: 同 hc-service-client 配置，必填，不填时取 app.config.systemToken，详见 https://www.npmjs.com/package/hc-service-client\n- headerExtension:  同 hc-service-client 配置，见文档: https://www.npmjs.com/package/hc-service-client\n\n#### options.headers Array<string>\n\noptions.headers 用于声明proxy需要转发的header。\n默认情况下，proxy不转发客户端过来的header，只有在proxyHeaders中配置的header才会被转发。\n\n### proxy.setProxyPrefix(proxyPrefix)\n\n- proxyPrefix <String>\n\nsetProxyPrefix方法用于指定 hc-proxy 挂载在代理服务上的总前缀\n\n如: 默认 proxyPrefix = /api/proxy \n则: 所有请求远端服务的请求，格式为   ${localHttpServer}/api/proxy/${serviceCode}/${remoteApi}\n\n### proxy.mount(router, app)\n\n将proxy的配置挂在到代理服务。\n\n- router: Express Router instance\n- app: app.server 是一个 http.Server 的实例，honeycomb中，直接 require('./app') 能获得\n\n## 更多例子\n\n```js\n'use strict';\n\nconst app = require('./app');\nconst Proxy = require('hc-proxy');\nconst proxyInstance = new Proxy({\n  service: {\n    otm: {\n      endpoint: 'http://dev.dtboost.biz.aliyun.test/otm_v2',                           // 自动截取最后的'/'\n      client: 'appClient',                                                                // 默认appClient\n      timeout: 10000,                                                                     // 默认60000\n      api: [\n        '/api/a',                                                                         // 支持 * 代理某个path下的所有api\n        '/otm_v2/api/entities/list',                                                      // 代理这个 url 的 GET POST PUT DELETE 方法\n        {path: '/otm_v2/api/entities/list', method: 'GET'},                                // 只代理 GET 方法\n        {path: '/otm_v2/api/entities/list', client: 'appClient'},                          // 显式指定 method\n        {path: '/otm_v2/api/schemas', method: ['GET', 'POST']},                            // 只支持 GET POST 方法\n        {host: 'http://taobao.com/api', path: '/tag_factory_v2/api/:id', method: 'GET'},   // 不同域时，指定host\n        {path: 'http://taobao.com/api', route: '/api/proxy/taobao_api'},                   // 指定route的代理，不指定route时，所有代理接口请求 /<-app_name->/api/proxy 获得代理\n        '/otm_v2/api/tags/query_tags_entity_pagenum',                                     // \n        {path: '/otm_v2/api/schemas/:id', route: '/api/proxy/schemas/:id'}                 // 带参数的url，保证route和url中的param一致，也可以不填route\n      ]\n    },\n    websocket: {\n      endpoint: 'http://dev.dtboost.biz.aliyun.test/websocket',               // 远程的websocket地址\n      client: 'websocket',                                                       // 选择websocket作为连接的client\n      api: [\n        '/ws'                                                                    // 配置连接路径，不在的路径返回404\n      ]\n    }\n  },\n  headers: [\n    'x-csrf-token',\n    'X-Operator'\n  ]\n});\n\nproxyInstance.setProxyPrefix('/api/proxy');\n\nmodule.exports = function (router) {\n  proxyInstance.mount(router, app);\n};\n```\n\n## DEBUG [代理没生效？]\n\n在命令行启动命令前加入`DEBUG=hc-proxy`\n\n```sh\n// 以启动命令为 honeycomb start 为例\nDEBUG=hc-proxy honeycomb start\n\n// ...\n// hc-proxy [GET] /api/proxy/urllib_proxy/urllib -> http://localhost:58062/urllib +0ms\n// hc-proxy [POST] /api/proxy/urllib_proxy/urllib -> http://localhost:58062/urllib +3ms\n// hc-proxy [DELETE] /api/proxy/urllib_proxy/urllib -> http://localhost:58062/urllib +1ms\n// hc-proxy [PUT] /api/proxy/urllib_proxy/urllib -> http://localhost:58062/urllib +0ms\n// ...\n```\n\n## 作用\n\n- 本地开发时，可以使用这个代理访问远程其它服务(如otm)的问题；\n- 非本地开发环境时，可以不使用代理，而直接访问类似'/otm_v2/api/xxx'，以减小内部调用开销，由前端自行控制；\n","readmeFilename":"readme.md"}