Compare commits

...
23 Commits
Author SHA1 Message Date
fatedier 3bf1eb8565 Merge pull request #2216 from fatedier/dev
bump version
2021-01-25 16:15:52 +08:00
fatedier a821db3f45 add release note 2021-01-25 16:06:38 +08:00
fatedier ecb6ed9258 revert web code (#2215) 2021-01-25 16:04:33 +08:00
fatedier b2ae433e18 Merge pull request #2206 from fatedier/dev
bump version
2021-01-19 20:56:06 +08:00
fatedier b26080589b bump version 2021-01-19 20:51:06 +08:00
yuyulei aff979c2b6 Merge pull request #2199 from fatedier/fix
vhost: set DisableKeepAlives = false and fix websocket not work
2021-01-19 15:40:41 +08:00
fatedier 46f809d711 vhost: set DisableKeepAlives = false and fix websocket not work 2021-01-18 21:49:44 +08:00
yuyulei 72595b2da8 Add user remote address info log (#2184) 2021-01-11 16:52:17 +08:00
XNG c842558ace Reduced log level of "get hostname error" (#2165)
Reduced log level of "get hostname from http/https request error" to debug so that it won't overwhelms the log file when user is using apache/ngix as their own SSL backend
2020-12-25 13:39:26 +08:00
yuyulei ed61049041 Bugfix: add ipv6 parsing with address of frps (#2163) 2020-12-24 21:48:26 +08:00
fatedier abe6f580c0 update README 2020-12-03 20:41:37 +08:00
fatedier e940066012 auto generate web assets 2020-12-03 20:23:43 +08:00
hubery 1e846df870 some dashboard refactor (#2101) 2020-12-03 20:20:48 +08:00
Mike Cardwell 0ab055e946 Allow server plugin to talk to https services. Option for skipping tls verification (#2103)
* Allow server plugin to talk to https services. Option for skipping tls verification

* Rename TlsVerify to TLSVerify

* Server plugin should use default http transport when scheme is not https
2020-12-03 14:36:14 +08:00
fatedier fca59c71e2 clear Release.md 2020-11-23 17:34:09 +08:00
wxiaoguang fae2f8768d tweak logs: (#2100)
* show what config frps uses (config file / command line)
* optimize the "start successfully" log message
2020-11-23 17:01:31 +08:00
fatedier 3d9499f554 autogen web assets 2020-11-23 15:21:07 +08:00
hubery 7adeeedd55 fix dashboard horizontal scrollbar (#2096) 2020-11-23 14:52:55 +08:00
yuyulei 127a31ea6a Fix typo (#2089) 2020-11-23 11:38:21 +08:00
fatedier a85bd9a4d9 update 2020-11-20 20:10:08 +08:00
fatedier 01d551ec8d update 2020-11-20 18:10:33 +08:00
fatedier 16cabf4127 add .circleci 2020-11-20 18:04:44 +08:00
fatedier 968be4a2c2 use self token 2020-11-20 17:35:06 +08:00
42 changed files with 8223 additions and 20611 deletions

No files matched your search

+25
View File
@@ -0,0 +1,25 @@
version: 2
jobs:
test1:
docker:
- image: circleci/golang:1.15-node
working_directory: /go/src/github.com/fatedier/frp
steps:
- checkout
- run: make
- run: make alltest
test2:
docker:
- image: circleci/golang:1.14-node
working_directory: /go/src/github.com/fatedier/frp
steps:
- checkout
- run: make
- run: make alltest
workflows:
version: 2
build_and_test:
jobs:
- test1
- test2
+1 -1
View File
@@ -27,4 +27,4 @@ jobs:
version: latest
args: release --rm-dist --release-notes=./Release.md
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_TOKEN: ${{ secrets.GPR_TOKEN }}
-12
View File
@@ -1,12 +0,0 @@
sudo: false
language: go
go:
- 1.14.x
- 1.15.x
install:
- make
script:
- make alltest
+1 -1
View File
@@ -1,6 +1,6 @@
# frp
[![Build Status](https://travis-ci.org/fatedier/frp.svg?branch=master)](https://travis-ci.org/fatedier/frp)
[![Build Status](https://circleci.com/gh/fatedier/frp.svg?style=shield)](https://circleci.com/gh/fatedier/frp)
[![GitHub release](https://img.shields.io/github/tag/fatedier/frp.svg?label=release)](https://github.com/fatedier/frp/releases)
[README](README.md) | [中文文档](README_zh.md)
+2 -2
View File
@@ -1,3 +1,3 @@
### New
### Fix
* Command line parameters support `enable_prometheus`.
* Reduce binary file size.
+1 -1
View File
@@ -1 +1 @@
<!doctype html> <html lang=en> <head> <meta charset=utf-8> <title>frp client admin UI</title> <link rel="shortcut icon" href="favicon.ico"></head> <body> <div id=app></div> <script type="text/javascript" src="manifest.js?d2cd6337d30c7b22e836"></script><script type="text/javascript" src="vendor.js?edb271e1d9c81f857840"></script></body> </html>
<!doctype html> <html lang=en> <head> <meta charset=utf-8> <title>frp client admin UI</title> <link rel="shortcut icon" href="favicon.ico"></head> <body> <div id=app></div> <script type="text/javascript" src="manifest.js?f30e0e5ff7dbde4611e0"></script><script type="text/javascript" src="vendor.js?a82aed5fb0b844cbdb29"></script></body> </html>
+1 -1
View File
@@ -1 +1 @@
!function(e){function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}var r=window.webpackJsonp;window.webpackJsonp=function(t,c,u){for(var i,a,f,l=0,s=[];l<t.length;l++)a=t[l],o[a]&&s.push(o[a][0]),o[a]=0;for(i in c)Object.prototype.hasOwnProperty.call(c,i)&&(e[i]=c[i]);for(r&&r(t,c,u);s.length;)s.shift()();if(u)for(l=0;l<u.length;l++)f=n(n.s=u[l]);return f};var t={},o={1:0};n.e=function(e){function r(){i.onerror=i.onload=null,clearTimeout(a);var n=o[e];0!==n&&(n&&n[1](new Error("Loading chunk "+e+" failed.")),o[e]=void 0)}var t=o[e];if(0===t)return new Promise(function(e){e()});if(t)return t[2];var c=new Promise(function(n,r){t=o[e]=[n,r]});t[2]=c;var u=document.getElementsByTagName("head")[0],i=document.createElement("script");i.type="text/javascript",i.charset="utf-8",i.async=!0,i.timeout=12e4,n.nc&&i.setAttribute("nonce",n.nc),i.src=n.p+""+e+".js?"+{0:"edb271e1d9c81f857840"}[e];var a=setTimeout(r,12e4);return i.onerror=i.onload=r,u.appendChild(i),c},n.m=e,n.c=t,n.i=function(e){return e},n.d=function(e,r,t){n.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:t})},n.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(r,"a",r),r},n.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},n.p="",n.oe=function(e){throw console.error(e),e}}([]);
!function(e){function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}var r=window.webpackJsonp;window.webpackJsonp=function(t,c,u){for(var i,a,f,l=0,s=[];l<t.length;l++)a=t[l],o[a]&&s.push(o[a][0]),o[a]=0;for(i in c)Object.prototype.hasOwnProperty.call(c,i)&&(e[i]=c[i]);for(r&&r(t,c,u);s.length;)s.shift()();if(u)for(l=0;l<u.length;l++)f=n(n.s=u[l]);return f};var t={},o={1:0};n.e=function(e){function r(){i.onerror=i.onload=null,clearTimeout(a);var n=o[e];0!==n&&(n&&n[1](new Error("Loading chunk "+e+" failed.")),o[e]=void 0)}var t=o[e];if(0===t)return new Promise(function(e){e()});if(t)return t[2];var c=new Promise(function(n,r){t=o[e]=[n,r]});t[2]=c;var u=document.getElementsByTagName("head")[0],i=document.createElement("script");i.type="text/javascript",i.charset="utf-8",i.async=!0,i.timeout=12e4,n.nc&&i.setAttribute("nonce",n.nc),i.src=n.p+""+e+".js?"+{0:"a82aed5fb0b844cbdb29"}[e];var a=setTimeout(r,12e4);return i.onerror=i.onload=r,u.appendChild(i),c},n.m=e,n.c=t,n.i=function(e){return e},n.d=function(e,r,t){n.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:t})},n.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(r,"a",r),r},n.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},n.p="",n.oe=function(e){throw console.error(e),e}}([]);
+1 -1
View File
@@ -1 +1 @@
webpackJsonp([0],[function(e,t,o){var r=o(160);"string"==typeof r&&(r=[[e.i,r,""]]);var i={hmr:!0};i.transform=void 0,i.insertInto=void 0,o(3)(r,i),r.locals&&(e.exports=r.locals)},function(e,t,o){"use strict";function r(){for(var e=arguments.length,t=Array(e),o=0;o<e;o++)t[o]=arguments[o];var r=1,i=t[0],n=t.length;if("function"==typeof i)return i.apply(null,t.slice(1));if("string"==typeof i){for(var l=String(i).replace(m,function(e){if("%%"===e)return"%";if(r>=n)return e;switch(e){case"%s":return String(t[r++]);case"%d":return Number(t[r++]);case"%j":try{return JSON.stringify(t[r++])}catch(e){return"[Circular]"}break;default:return e}}),a=t[r];r<n;a=t[++r])l+=" "+a;return l}return i}function i(e){return"string"===e||"url"===e||"hex"===e||"email"===e||"pattern"===e}function n(e,t){return void 0===e||null===e||!("array"!==t||!Array.isArray(e)||e.length)||!(!i(t)||"string"!=typeof e||e)}function l(e,t,o){function r(e){i.push.apply(i,e),++n===l&&o(i)}var i=[],n=0,l=e.length;e.forEach(function(e){t(e,r)})}function a(e,t,o){function r(l){if(l&&l.length)return void o(l);var a=i;i+=1,a<n?t(e[a],r):o([])}var i=0,n=e.length;r([])}function s(e){var t=[];return Object.keys(e).forEach(function(o){t.push.apply(t,e[o])}),t}function c(e,t,o,r){if(t.first)return a(s(e),o,r);var i=t.firstFields||[];!0===i&&(i=Object.keys(e));var n=Object.keys(e),c=n.length,d=0,u=[],p=function(e){u.push.apply(u,e),++d===c&&r(u)};n.forEach(function(t){var r=e[t];-1!==i.indexOf(t)?a(r,o,p):l(r,o,p)})}function d(e){return function(t){return t&&t.message?(t.field=t.field||e.fullField,t):{message:t,field:t.field||e.fullField}}}function u(e,t){if(t)for(var o in t)if(t.hasOwnProperty(o)){var r=t[o];"object"===(void 0===r?"undefined":b()(r))&&"object"===b()(e[o])?e[o]=f()({},e[o],r):e[o]=r}return e}o.d(t,"c",function(){return g}),t.e=r,t.f=n,t.b=c,t.d=d,t.a=u;var p=o(52),f=o.n(p),h=o(20),b=o.n(h),m=/%[sdj%]/g,g=function(){}},function(e,t,o){"use strict";function r(e,t){var o=e[1]||"",r=e[3];if(!r)return o;if(t&&"function"==typeof btoa){var n=i(r);return[o].concat(r.sources.map(function(e){return"/*# sourceURL="+r.sourceRoot+e+" */"})).concat([n]).join("\n")}return[o].join("\n")}function i(e){return"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(e))))+" */"}e.exports=function(e){var t=[];return t.toString=function(){return this.map(function(t){var o=r(t,e);return t[2]?"@media "+t[2]+"{"+o+"}":o}).join("")},t.i=function(e,o){"string"==typeof e&&(e=[[null,e,""]]);for(var r={},i=0;i<this.length;i++){var n=this[i][0];null!=n&&(r[n]=!0)}for(i=0;i<e.length;i++){var l=e[i];null!=l[0]&&r[l[0]]||(o&&!l[2]?l[2]=o:o&&(l[2]="("+l[2]+") and ("+o+")"),t.push(l))}},t}},function(e,t,o){function r(e,t){for(var o=0;o<e.length;o++){var r=e[o],i=b[r.id];if(i){i.refs++;for(var n=0;n<i.parts.length;n++)i.parts[n](r.parts[n]);for(;n<r.parts.length;n++)i.parts.push(u(r.parts[n],t))}else{for(var l=[],n=0;n<r.parts.length;n++)l.push(u(r.parts[n],t));b[r.id]={id:r.id,refs:1,parts:l}}}}function i(e,t){for(var o=[],r={},i=0;i<e.length;i++){var n=e[i],l=t.base?n[0]+t.base:n[0],a=n[1],s=n[2],c=n[3],d={css:a,media:s,sourceMap:c};r[l]?r[l].parts.push(d):o.push(r[l]={id:l,parts:[d]})}return o}function n(e,t){var o=_(e.insertInto);if(!o)throw new Error("Couldn't find a style target. This probably means that the value for the 'insertInto' parameter is invalid.");var r=y[y.length-1];if("top"===e.insertAt)r?r.nextSibling?o.insertBefore(t,r.nextSibling):o.appendChild(t):o.insertBefore(t,o.firstChild),y.push(t);else if("bottom"===e.insertAt)o.appendChild(t);else{if("object"!=typeof e.insertAt||!e.insertAt.before)throw new Error("[Style Loader]\n\n Invalid value for parameter 'insertAt' ('options.insertAt') found.\n Must be 'top', 'bottom', or Object.\n (https://github.com/webpack-contrib/style-loader#insertat)\n");var i=_(e.insertAt.before,o);o.insertBefore(t,i)}}function l(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e);var t=y.indexOf(e);t>=0&&y.splice(t,1)}function a(e){var t=document.createElement("style");if(void 0===e.attrs.type&&(e.attrs.type="text/css"),void 0===e.attrs.nonce){var o=d();o&&(e.attrs.nonce=o)}return c(t,e.attrs),n(e,t),t}function s(e){var t=document.createElement("link");return void 0===e.attrs.type&&(e.attrs.type="text/css"),e.attrs.rel="stylesheet",c(t,e.attrs),n(e,t),t}function c(e,t){Object.keys(t).forEach(function(o){e.setAttribute(o,t[o])})}function d(){return o.nc}function u(e,t){var o,r,i,n;if(t.transform&&e.css){if(!(n="function"==typeof t.transform?t.transform(e.css):t.transform.default(e.css)))return function(){};e.css=n}if(t.singleton){var c=v++;o=x||(x=a(t)),r=p.bind(null,o,c,!1),i=p.bind(null,o,c,!0)}else e.sourceMap&&"function"==typeof URL&&"function"==typeof URL.createObjectURL&&"function"==typeof URL.revokeObjectURL&&"function"==typeof Blob&&"function"==typeof btoa?(o=s(t),r=h.bind(null,o,t),i=function(){l(o),o.href&&URL.revokeObjectURL(o.href)}):(o=a(t),r=f.bind(null,oLine truncated
webpackJsonp([0],[function(e,t,o){var r=o(159);"string"==typeof r&&(r=[[e.i,r,""]]);var n={hmr:!0};n.transform=void 0,n.insertInto=void 0,o(3)(r,n),r.locals&&(e.exports=r.locals)},function(e,t,o){"use strict";function r(){for(var e=arguments.length,t=Array(e),o=0;o<e;o++)t[o]=arguments[o];var r=1,n=t[0],i=t.length;if("function"==typeof n)return n.apply(null,t.slice(1));if("string"==typeof n){for(var l=String(n).replace(g,function(e){if("%%"===e)return"%";if(r>=i)return e;switch(e){case"%s":return String(t[r++]);case"%d":return Number(t[r++]);case"%j":try{return JSON.stringify(t[r++])}catch(e){return"[Circular]"}break;default:return e}}),a=t[r];r<i;a=t[++r])l+=" "+a;return l}return n}function n(e){return"string"===e||"url"===e||"hex"===e||"email"===e||"pattern"===e}function i(e,t){return void 0===e||null===e||!("array"!==t||!Array.isArray(e)||e.length)||!(!n(t)||"string"!=typeof e||e)}function l(e,t,o){function r(e){n.push.apply(n,e),++i===l&&o(n)}var n=[],i=0,l=e.length;e.forEach(function(e){t(e,r)})}function a(e,t,o){function r(l){if(l&&l.length)return void o(l);var a=n;n+=1,a<i?t(e[a],r):o([])}var n=0,i=e.length;r([])}function s(e){var t=[];return Object.keys(e).forEach(function(o){t.push.apply(t,e[o])}),t}function c(e,t,o,r){if(t.first)return a(s(e),o,r);var n=t.firstFields||[];!0===n&&(n=Object.keys(e));var i=Object.keys(e),c=i.length,d=0,u=[],p=function(e){u.push.apply(u,e),++d===c&&r(u)};i.forEach(function(t){var r=e[t];-1!==n.indexOf(t)?a(r,o,p):l(r,o,p)})}function d(e){return function(t){return t&&t.message?(t.field=t.field||e.fullField,t):{message:t,field:t.field||e.fullField}}}function u(e,t){if(t)for(var o in t)if(t.hasOwnProperty(o)){var r=t[o];"object"===(void 0===r?"undefined":b()(r))&&"object"===b()(e[o])?e[o]=f()({},e[o],r):e[o]=r}return e}o.d(t,"c",function(){return m}),t.e=r,t.f=i,t.b=c,t.d=d,t.a=u;var p=o(54),f=o.n(p),h=o(20),b=o.n(h),g=/%[sdj%]/g,m=function(){}},function(e,t,o){"use strict";function r(e,t){var o=e[1]||"",r=e[3];if(!r)return o;if(t&&"function"==typeof btoa){var i=n(r);return[o].concat(r.sources.map(function(e){return"/*# sourceURL="+r.sourceRoot+e+" */"})).concat([i]).join("\n")}return[o].join("\n")}function n(e){return"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(e))))+" */"}e.exports=function(e){var t=[];return t.toString=function(){return this.map(function(t){var o=r(t,e);return t[2]?"@media "+t[2]+"{"+o+"}":o}).join("")},t.i=function(e,o){"string"==typeof e&&(e=[[null,e,""]]);for(var r={},n=0;n<this.length;n++){var i=this[n][0];null!=i&&(r[i]=!0)}for(n=0;n<e.length;n++){var l=e[n];null!=l[0]&&r[l[0]]||(o&&!l[2]?l[2]=o:o&&(l[2]="("+l[2]+") and ("+o+")"),t.push(l))}},t}},function(e,t,o){function r(e,t){for(var o=0;o<e.length;o++){var r=e[o],n=b[r.id];if(n){n.refs++;for(var i=0;i<n.parts.length;i++)n.parts[i](r.parts[i]);for(;i<r.parts.length;i++)n.parts.push(u(r.parts[i],t))}else{for(var l=[],i=0;i<r.parts.length;i++)l.push(u(r.parts[i],t));b[r.id]={id:r.id,refs:1,parts:l}}}}function n(e,t){for(var o=[],r={},n=0;n<e.length;n++){var i=e[n],l=t.base?i[0]+t.base:i[0],a=i[1],s=i[2],c=i[3],d={css:a,media:s,sourceMap:c};r[l]?r[l].parts.push(d):o.push(r[l]={id:l,parts:[d]})}return o}function i(e,t){var o=_(e.insertInto);if(!o)throw new Error("Couldn't find a style target. This probably means that the value for the 'insertInto' parameter is invalid.");var r=y[y.length-1];if("top"===e.insertAt)r?r.nextSibling?o.insertBefore(t,r.nextSibling):o.appendChild(t):o.insertBefore(t,o.firstChild),y.push(t);else if("bottom"===e.insertAt)o.appendChild(t);else{if("object"!=typeof e.insertAt||!e.insertAt.before)throw new Error("[Style Loader]\n\n Invalid value for parameter 'insertAt' ('options.insertAt') found.\n Must be 'top', 'bottom', or Object.\n (https://github.com/webpack-contrib/style-loader#insertat)\n");var n=_(e.insertAt.before,o);o.insertBefore(t,n)}}function l(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e);var t=y.indexOf(e);t>=0&&y.splice(t,1)}function a(e){var t=document.createElement("style");if(void 0===e.attrs.type&&(e.attrs.type="text/css"),void 0===e.attrs.nonce){var o=d();o&&(e.attrs.nonce=o)}return c(t,e.attrs),i(e,t),t}function s(e){var t=document.createElement("link");return void 0===e.attrs.type&&(e.attrs.type="text/css"),e.attrs.rel="stylesheet",c(t,e.attrs),i(e,t),t}function c(e,t){Object.keys(t).forEach(function(o){e.setAttribute(o,t[o])})}function d(){return o.nc}function u(e,t){var o,r,n,i;if(t.transform&&e.css){if(!(i="function"==typeof t.transform?t.transform(e.css):t.transform.default(e.css)))return function(){};e.css=i}if(t.singleton){var c=x++;o=v||(v=a(t)),r=p.bind(null,o,c,!1),n=p.bind(null,o,c,!0)}else e.sourceMap&&"function"==typeof URL&&"function"==typeof URL.createObjectURL&&"function"==typeof URL.revokeObjectURL&&"function"==typeof Blob&&"function"==typeof btoa?(o=s(t),r=h.bind(null,o,t),n=function(){l(o),o.href&&URL.revokeObjectURL(o.href)}):(o=a(t),r=f.bind(null,oLine truncated
+1 -1
View File
@@ -5,6 +5,6 @@ import (
)
func init() {
data := "PK\x03\x04\x14\x00\x08\x00\x00\x00\xcf!KN\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00$\x00 \x006f0a76321d30f3c8120915e57f7bd77e.ttfUT\x05\x00\x01\xa6\xf6`\\\x00\x01\x00\x00\x00\x0b\x00\x80\x00\x03\x000GSUB\xb0\xfe\xb3\xed\x00\x00\x018\x00\x00\x00BOS/2V\xeeH8\x00\x00\x01|\x00\x00\x00Vcmap\xd4\xa4\xc1\x90\x00\x00\x02\xf4\x00\x00\x05Tglyf\x00\xd0\xc5\xf7\x00\x00\x08\xdc\x00\x00\x1c\\head\x0f\x87\x89\xc1\x00\x00\x00\xe0\x00\x00\x006hhea\x07\xe0\x03\xc8\x00\x00\x00\xbc\x00\x00\x00$hmtx\x1f\xe9\x00\x00\x00\x00\x01\xd4\x00\x00\x01 loca\xf22\xean\x00\x00\x08H\x00\x00\x00\x92maxp\x01Z\x00q\x00\x00\x01\x18\x00\x00\x00 name\xac\x00y\x8a\x00\x00%8\x00\x00\x02\xa9post\x19\xb8\xdb\xb7\x00\x00'\xe4\x00\x00\x03<\x00\x01\x00\x00\x03\x80\xff\x80\x00\\\x04\x00\x00\x00\xff\xff\x04\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00H\x00\x01\x00\x00\x00\x01\x00\x00\xc2P\x80\xb2_\x0f<\xf5\x00\x0b\x04\x00\x00\x00\x00\x00\xd63\xa2\xe2\x00\x00\x00\x00\xd63\xa2\xe2\x00\x00\xff\x80\x04\x01\x03\x80\x00\x00\x00\x08\x00\x02\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00H\x00e\x00\x08\x00\x00\x00\x00\x00\x02\x00\x00\x00\n\x00\n\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\n\x00\x1e\x00,\x00\x01DFLT\x00\x08\x00\x04\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01liga\x00\x08\x00\x00\x00\x01\x00\x00\x00\x01\x00\x04\x00\x04\x00\x00\x00\x01\x00\x08\x00\x01\x00\x06\x00\x00\x00\x01\x00\x00\x00\x00\x00\x01\x04\x00\x01\x90\x00\x05\x00\x08\x02\x89\x02\xcc\x00\x00\x00\x8f\x02\x89\x02\xcc\x00\x00\x01\xeb\x002\x01\x08\x00\x00\x02\x00\x05\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00PfEd\x00@\x00x\xe6F\x03\x80\xff\x80\x00\\\x03\x80\x00\x80\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x03\xe9\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x03\x00\x00\x00,\x00\x00\x00\x04\x00\x00\x01\xf0\x00\x01\x00\x00\x00\x00\x00\xea\x00\x03\x00\x01\x00\x00\x00,\x00\x03\x00\n\x00\x00\x01\xf0\x00\x04\x00\xbe\x00\x00\x00\x08\x00\x08\x00\x02\x00\x00\x00x\xe6\"\xe6F\xff\xff\x00\x00\x00x\xe6\x00\xe6$\xff\xff\x00\x00\x00\x00\x00\x00\x00\x01\x00\x08\x00\x08\x00L\x00\x00\x00\x01\x00\x08\x00 \x00\n\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x02\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00 \x00!\x00\"\x00#\x00$\x00%\x00&\x00'\x00(\x00)\x00*\x00+\x00,\x00-\x00.\x00/\x000\x001\x00\x03\x00\x04\x00\x05\x002\x00\x06\x00\x07\x003\x004\x005\x006\x007\x008\x009\x00:\x00;\x00<\x00=\x00>\x00?\x00@\x00A\x00B\x00C\x00D\x00E\x00F\x00G\x00\x00\x01\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00\x03d\x00\x00\x00\x00\x00\x00\x00G\x00\x00\x00x\x00\x00\x00x\x00\x00\x00\x01\x00\x00\xe6\x00\x00\x00\xe6\x00\x00\x00\x00\x08\x00\x00\xe6\x01\x00\x00\xe6\x01\x00\x00\x00 \x00\x00\xe6\x02\x00\x00\xe6\x02\x00\x00\x00\n\x00\x00\xe6\x03\x0Line truncated
data := "PK\x03\x04\x14\x00\x08\x00\x00\x00\xa5=9R\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00%\x00 \x00535877f50039c0cb49a6196a5b7517cd.woffUT\x05\x00\x01\x07w\x0e`wOFF\x00\x01\x00\x00\x00\x00n(\x00\x0b\x00\x00\x00\x00\xda\x94\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00GSUB\x00\x00\x01\x08\x00\x00\x003\x00\x00\x00B\xb0\xfe\xb3\xedOS/2\x00\x00\x01<\x00\x00\x00D\x00\x00\x00V=\x16I\xbccmap\x00\x00\x01\x80\x00\x00\x07T\x00\x00\x11*8\n\xd2\xa9glyf\x00\x00\x08\xd4\x00\x00Y\x9a\x00\x00\xb1\x8c+\xdbB\xe0head\x00\x00bp\x00\x00\x00/\x00\x00\x006\x14\xee\xbf\"hhea\x00\x00b\xa0\x00\x00\x00\x1d\x00\x00\x00$\x07\xde\x04\x9ahmtx\x00\x00b\xc0\x00\x00\x00\x15\x00\x00\x04dd\x00\x00\x00loca\x00\x00b\xd8\x00\x00\x024\x00\x00\x024}\x86\xaa`maxp\x00\x00e\x0c\x00\x00\x00\x1f\x00\x00\x00 \x021\x00\x98name\x00\x00e,\x00\x00\x01J\x00\x00\x02a\xc3\x8c\xa5\x01post\x00\x00fx\x00\x00\x07\xb0\x00\x00\x0d\x0b\xe4s\x05\x1bx\x9cc`d``\xe0b\x90c\xd0a`tq\xf3 a\xe0``a\x80\x00\x90\x0ccNfz\"P\x0c\xca\x03\xca\xb1\x80i\x0e f\x83\x88\x02\x00\x8a#\x03O\x00x\x9cc`da`\x9c\xc0\xc0\xca\xc0\xc1\xd4\xc9t\x86\x81\x81\xa1\x1fB3\xbef0b\xe4```b`ef\xc0\n\x02\xd2\\S\x18\x1c\x9e-x~\x8a\xb9\xe1\x7f\x03C\x0cs\x03C\x03P\x98\x11$\x07\x00\xf9W\x0dNx\x9c\xdd\xd7\xf5\xb7\x97u\x16\xc5\xf1\xf7\xe7\xd2]R\x83\xc1`\xcb\xa0\x88\xd8\xc9\x0c\x0cvw3\x18\xd8\xdd\xdd\xdd\xdd(%\xddH#\x1dvw\xeb9&\x83\xe2 &\xee\x87\xfd\x07\xf8\xfb\xb0\xd6\x8bu\xef]w\xad\xfb\xbd\xf1\xec\xbd\x0fP\x07\xa8%\xff\x90\xdaz\xf3\x17\x8a\xde\xa2\xe6G}\xb4\xac\xfex-\x1a\xae\xfex\xed\x9aEz\xbf\x13\x1d\xf5y5\xd1?\x86\xc4\xa4\x98\x15Kcy\xac\xcaV\xd9>;f\xe7\xec\x91\xbd\xb2O.\xcc%\xabV\x81>g@\x0c\x8d\xc91;\x96\xc5\x8a\xac\xc9\xd6\xd9!;e\x97\xec\x99\xbd\xb3o.\xae>\xe7/\xfe\x15}\xbdNlBO\xf6g\x04\xe3\x98G\xb0\x94\x95\xa5a\xe9V\xba\x97~5]W\x7fN\x8d^cm}'u\xa9G}\x1a\xe8\xf56\xa21MhJ3\x9a\xd3\x82\x96\xb4b\x0dZ\xd3\x86\xb6\xb4\xa3=\x7f\xa3\x03k\xb2\x16k\xb3\x8e\xbe\x9b\xbf\xeb+\xac\xcbz\xac\xcf\x06l\xc8Fl\xac\xaf\xd7Y\xdfw\x176e3\xba\xb29\xdd\xd8\x82\xeel\xc9Vl\xcd6l\xcbvl\xcf\x0e\xec\xc8N\xec\xcc.\xf4\xe0\x9f\xfcK\xaf\xb0\x17\xff\xa67\xbb\xb2\x1b\xbb\xb3\x07{\xb2\x17{\xb3\x0f\xfb\xb2\x9f^\xfb\x01\x1c\xc8A\x1c\xcc!\x1c\xcaa\x1c\xce\x11\x1c\xc9Q\x1c\xcd1\x1cK\x1f\xfeC_\x8e\xe3xN\xe0D\xfaq\x12's\n\xa7r\x1a\xa7s\x06gr\x16gs\x0e\xe7r\x1e\xe7s\x01\x17r\x11\x17s \x97r\x19\x97s\x05Wr\x15Ws\x0d\xd7r\x1d\xd7s\x037r\x137s\x0b\xb7r\x1b\xb7s\x07wr\x17ws\x0f\xf7r\x1f\xf7\xf3\x00\x0f\xf2\x10\x0f\xf3\x08\x8f\xf2\x18\x8f\xf3\x04\xfdy\x92\xa7\x18\xc0@\x061\x98!<\xcdP\x861\\?\xed\x91\x8cb4c\x18\xab\x9f\xfbx&0\x91I<\xc3d\xa60\x95iLg\x063\x99\xc5\xb3\xccf\x0es\xf5\x9b\x99\xcf\x02\x16\xb2\x88\xc5,\xe19\x9e\xe7\x05\xde\xe0M\xde\xe2E\xde\xe6\x1d^\xe2e^\xe1U^\xe3]^\xe7=\xde\xe7\x03>\xe4#>\xe6\x13>\xe53>\xe7\x0b\xfdn\x93/\xf9\x8a\xaf\xf9\x86o\xf9N\xbf\xe9\xff\xb2\x8c\xef\xf9\x81\xe5\xfc\xc8\xffX\xc1O\xac\xe4g~\xe1W~\xe3w\xfe`U\xa1\x94RSj\x95\xda\xa5N\xa9[\xea\x95\xfa\xa5\x81\xfe:\x1a\x95\xc6\xa5IiZ\x9a\x95\xe6\xa5EiYZ\x955J\xeb\xd2\xa6\xb4-\xed\xf4\x07S\xf7/\xff\xee\xfe\xff\xff5\xae\xfek\xd2\xd5\xefT?\x95\xe8o\xd5S\x1f\x03LO\x161\xd0\xaa\x94\x88AV%E\x0c\xb6*Ab\x88\xe9 $\x86\x9a\x9eEb\x98\xe9\xa9$\x86\x9b\x9eOb\x84U\xc9\x12#M\xcf,1\xca\xaaW\x17\xa3M\xcf11\xc6\xf4D\x13cM\xcf61\xce\xf4\x94\x13\xe3M\xcf;1\xc1\xf4\xe4\x13\x13M\x19@L2\xa5\x011\xd9\x94\x0b\xc4\x14SB\x10SMYAL3\xaa\x9f\xcftS~\x103LIB\xcc4e\n1\xcb\x94.\xc4lS\xce\x10sL\x89C\xcc5e\x0f1\xcf\x94B\xc4|S\x1e\x11\x0bL\xc9D,4e\x14\xb1\xc8\x94V\xc4bSn\x11KL F<g\xca2\xe2yS\xaa\x11/\x98\xf2\x8dx\xd1\x94t\xc4K\xa6\xcc#^\xb6\xaa\x0d\xe2\x15S\x0e\x12\xaf\x9a\x12\x91x\xcd\x94\x8d\xc4\xeb\xa6\x94$\xde0\xe5%\xf1\xa6)9\x89\xb7L\x19J\xbcmJS\xe2\x1dS\xae\x12\xef\x9a\x12\x96x\xcf\x94\xb5\xc4\xfb\xa6\xd4%>0\xe5/\xf1\xa1)\x89\x89\x8fL\x99L|lJg\xe2\x13SN\x13\x9f\x9a\x12\x9b\xf8\xcc\x94\xdd\xc4\xe7\xa6\x14'\xbe0\xe59\x11\xa6d'\xd2\x94\xf1\xc4\x97\xa6\xb4'\xbe2\xe5>\xf1\xb5\xa9\x01\x88oL]@|kj\x05\xe2;S?\x10KMMA,3u\x06\xf1\xbd\xa9=\x88\x1fL=B,75\n\xb1\xc2\xd4-\xc4O\xa6\x96!V\x9a\xfa\x86\xf8\xd9\xd4<\xc4/\xa6\x0e\"~5\xb5\x11\xf1\x9b\xa9\x97\x88\xdfM\x0dE\xfca\xea*b\x95\xa9\xb5\xc8\x1aS\x7f\x91\xb5LMF\xd66u\x1aY\xc7\xd4nd]S\xcf\x91\xf5L\x8dG\xd67u\x1f\xd9\xc0\xd4\x82dCS\x1f\x92\x8dL\xcdH66u$\xd9\xc4\xd4\x96dSSo\x92\xcdL\x0dJ67u)\xd9\xc2\xd4\xaadKS\xbf\x92\xadLMK\xb66u.\xd9\xc6\xd4\xbed[S\x0f\x93\xedL\x8dL\xb67u3\xd9\xc1\xd4\xd2\xe4\x9a\xa6\xbe&\xd7257\xb9\xb6\xa9\xc3\xc9uLmNv4\xf5:\xd9\xc9\xd4\xf0\xe4\xba\xa6\xae'\xd73\xb5>\xb9\xbe\xa9\xff\xc9\x0dLK\x80\xdc\xd0\xb4 \xc8\x8dL\xeb\x80\xdc\xd8\xb4\x13\xc8ML\x8b\x81\xecl\xda\x0ed\x17\xd3\x8a 75\xed r3\xd3\xb2 \xbb\x9a6\x06\xb9\xb9im\x90\xddL\xbb\x83\xdc\xc2\xb4@\xc8\xee\xa6-BniZ%\xe4V\xa6}BnmZ*\xe46\xa6\xcdBnkZ/\xe4v\xa6\x1dCnoZ4\xe4\x0e\xa6mC\xeehZ9\xe4N\xa6\xbdC\xeelZ>\xe4.\xa6\x0dD\xf60\xad!\xb2\xa7i\x17\x91\xbdL\x0b\x89\xecm\xdaJ\xe4\xae\xa6\xd5D\xeef\xdaO\xe4\xee\xa6%E\xeea\xdaT\xe4\x9e\xa6uE\xeee\xdaY\xe4\xde\xa6\xc5E\xeec\xda^\xe4\xbe\xa6\x15F\xeeg\xdac\xe4\xfe\xa6eF\x1e`\xdah\xe4\x81\xa6\xb5F\x1ed\xdam\xe4\xLine truncated
fs.Register(data)
}
+1 -1
View File
@@ -1 +1 @@
<!DOCTYPE html> <html lang=en> <head> <meta charset=utf-8> <title>frps dashboard</title> <link rel="shortcut icon" href="favicon.ico"></head> <body> <div id=app></div> <script type="text/javascript" src="manifest.js?14bea8276eef86cc7c61"></script><script type="text/javascript" src="vendor.js?51925ec1a77936b64d61"></script></body> </html>
<!doctype html> <html lang=en> <head> <meta charset=utf-8> <title>frps dashboard</title> <link rel="shortcut icon" href="favicon.ico"></head> <body> <div id=app></div> <script type="text/javascript" src="manifest.js?b8b55d8156200869417b"></script><script type="text/javascript" src="vendor.js?3e078a9d741093b909de"></script></body> </html>
+1 -1
View File
@@ -1 +1 @@
!function(e){function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}var r=window.webpackJsonp;window.webpackJsonp=function(t,c,u){for(var i,a,f,l=0,s=[];l<t.length;l++)a=t[l],o[a]&&s.push(o[a][0]),o[a]=0;for(i in c)Object.prototype.hasOwnProperty.call(c,i)&&(e[i]=c[i]);for(r&&r(t,c,u);s.length;)s.shift()();if(u)for(l=0;l<u.length;l++)f=n(n.s=u[l]);return f};var t={},o={1:0};n.e=function(e){function r(){i.onerror=i.onload=null,clearTimeout(a);var n=o[e];0!==n&&(n&&n[1](new Error("Loading chunk "+e+" failed.")),o[e]=void 0)}var t=o[e];if(0===t)return new Promise(function(e){e()});if(t)return t[2];var c=new Promise(function(n,r){t=o[e]=[n,r]});t[2]=c;var u=document.getElementsByTagName("head")[0],i=document.createElement("script");i.type="text/javascript",i.charset="utf-8",i.async=!0,i.timeout=12e4,n.nc&&i.setAttribute("nonce",n.nc),i.src=n.p+""+e+".js?"+{0:"51925ec1a77936b64d61"}[e];var a=setTimeout(r,12e4);return i.onerror=i.onload=r,u.appendChild(i),c},n.m=e,n.c=t,n.i=function(e){return e},n.d=function(e,r,t){n.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:t})},n.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(r,"a",r),r},n.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},n.p="",n.oe=function(e){throw console.error(e),e}}([]);
!function(e){function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}var r=window.webpackJsonp;window.webpackJsonp=function(t,u,c){for(var i,a,f,l=0,s=[];l<t.length;l++)a=t[l],o[a]&&s.push(o[a][0]),o[a]=0;for(i in u)Object.prototype.hasOwnProperty.call(u,i)&&(e[i]=u[i]);for(r&&r(t,u,c);s.length;)s.shift()();if(c)for(l=0;l<c.length;l++)f=n(n.s=c[l]);return f};var t={},o={1:0};n.e=function(e){function r(){i.onerror=i.onload=null,clearTimeout(a);var n=o[e];0!==n&&(n&&n[1](new Error("Loading chunk "+e+" failed.")),o[e]=void 0)}var t=o[e];if(0===t)return new Promise(function(e){e()});if(t)return t[2];var u=new Promise(function(n,r){t=o[e]=[n,r]});t[2]=u;var c=document.getElementsByTagName("head")[0],i=document.createElement("script");i.type="text/javascript",i.charset="utf-8",i.async=!0,i.timeout=12e4,n.nc&&i.setAttribute("nonce",n.nc),i.src=n.p+""+e+".js?"+{0:"3e078a9d741093b909de"}[e];var a=setTimeout(r,12e4);return i.onerror=i.onload=r,c.appendChild(i),u},n.m=e,n.c=t,n.i=function(e){return e},n.d=function(e,r,t){n.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:t})},n.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(r,"a",r),r},n.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},n.p="",n.oe=function(e){throw console.error(e),e}}([]);
+1 -1
View File
@@ -1 +1 @@
webpackJsonp([0],[function(e,t){function i(e,t){q[e]=t}function n(e){if(null==e||"object"!=typeof e)return e;var t=e,i=F.call(e);if("[object Array]"===i){t=[];for(var o=0,r=e.length;o<r;o++)t[o]=n(e[o])}else if(V[i]){var a=e.constructor;if(e.constructor.from)t=a.from(e);else{t=new a(e.length);for(var o=0,r=e.length;o<r;o++)t[o]=n(e[o])}}else if(!B[i]&&!O(e)&&!M(e)){t={};for(var l in e)e.hasOwnProperty(l)&&(t[l]=n(e[l]))}return t}function o(e,t,i){if(!S(t)||!S(e))return i?n(t):e;for(var r in t)if(t.hasOwnProperty(r)){var a=e[r],l=t[r];!S(l)||!S(a)||y(l)||y(a)||M(l)||M(a)||k(l)||k(a)||O(l)||O(a)?!i&&r in e||(e[r]=n(t[r],!0)):o(a,l,i)}return e}function r(e,t){for(var i=e[0],n=1,r=e.length;n<r;n++)i=o(i,e[n],t);return i}function a(e,t){for(var i in t)t.hasOwnProperty(i)&&(e[i]=t[i]);return e}function l(e,t,i){for(var n in t)t.hasOwnProperty(n)&&(i?null!=t[n]:null==e[n])&&(e[n]=t[n]);return e}function s(){return Z||(Z=Y().getContext("2d")),Z}function c(e,t){if(e){if(e.indexOf)return e.indexOf(t);for(var i=0,n=e.length;i<n;i++)if(e[i]===t)return i}return-1}function u(e,t){function i(){}var n=e.prototype;i.prototype=t.prototype,e.prototype=new i;for(var o in n)e.prototype[o]=n[o];e.prototype.constructor=e,e.superClass=t}function d(e,t,i){e="prototype"in e?e.prototype:e,t="prototype"in t?t.prototype:t,l(e,t,i)}function p(e){if(e)return"string"!=typeof e&&"number"==typeof e.length}function h(e,t,i){if(e&&t)if(e.forEach&&e.forEach===W)e.forEach(t,i);else if(e.length===+e.length)for(var n=0,o=e.length;n<o;n++)t.call(i,e[n],n,e);else for(var r in e)e.hasOwnProperty(r)&&t.call(i,e[r],r,e)}function f(e,t,i){if(e&&t){if(e.map&&e.map===$)return e.map(t,i);for(var n=[],o=0,r=e.length;o<r;o++)n.push(t.call(i,e[o],o,e));return n}}function g(e,t,i,n){if(e&&t){if(e.reduce&&e.reduce===U)return e.reduce(t,i,n);for(var o=0,r=e.length;o<r;o++)i=t.call(n,i,e[o],o,e);return i}}function m(e,t,i){if(e&&t){if(e.filter&&e.filter===j)return e.filter(t,i);for(var n=[],o=0,r=e.length;o<r;o++)t.call(i,e[o],o,e)&&n.push(e[o]);return n}}function v(e,t,i){if(e&&t)for(var n=0,o=e.length;n<o;n++)if(t.call(i,e[n],n,e))return e[n]}function b(e,t){var i=G.call(arguments,2);return function(){return e.apply(t,i.concat(G.call(arguments)))}}function x(e){var t=G.call(arguments,1);return function(){return e.apply(this,t.concat(G.call(arguments)))}}function y(e){return"[object Array]"===F.call(e)}function _(e){return"function"==typeof e}function w(e){return"[object String]"===F.call(e)}function S(e){var t=typeof e;return"function"===t||!!e&&"object"==t}function k(e){return!!B[F.call(e)]}function M(e){return"object"==typeof e&&"number"==typeof e.nodeType&&"object"==typeof e.ownerDocument}function A(e){return e!==e}function C(e){for(var t=0,i=arguments.length;t<i;t++)if(null!=arguments[t])return arguments[t]}function T(e,t){return null!=e?e:t}function I(e,t,i){return null!=e?e:null!=t?t:i}function L(){return Function.call.apply(G,arguments)}function E(e){if("number"==typeof e)return[e,e,e,e];var t=e.length;return 2===t?[e[0],e[1],e[0],e[1]]:3===t?[e[0],e[1],e[2],e[1]]:e}function P(e,t){if(!e)throw new Error(t)}function D(e){e[X]=!0}function O(e){return e[X]}function z(e){e&&h(e,function(e,t){this.set(t,e)},this)}function R(e){return new z(e)}function N(){}var B={"[object Function]":1,"[object RegExp]":1,"[object Date]":1,"[object Error]":1,"[object CanvasGradient]":1,"[object CanvasPattern]":1,"[object Image]":1,"[object Canvas]":1},V={"[object Int8Array]":1,"[object Uint8Array]":1,"[object Uint8ClampedArray]":1,"[object Int16Array]":1,"[object Uint16Array]":1,"[object Int32Array]":1,"[object Uint32Array]":1,"[object Float32Array]":1,"[object Float64Array]":1},F=Object.prototype.toString,H=Array.prototype,W=H.forEach,j=H.filter,G=H.slice,$=H.map,U=H.reduce,q={},Y=function(){return q.createCanvas()};q.createCanvas=function(){return document.createElement("canvas")};var Z,X="__ec_primitive__";z.prototype={constructor:z,get:function(e){return this["_ec_"+e]},set:function(e,t){return this["_ec_"+e]=t,t},each:function(e,t){void 0!==t&&(e=b(e,t));for(var i in this)this.hasOwnProperty(i)&&e(this[i],i.slice(4))},removeKey:function(e){delete this["_ec_"+e]}},t.$override=i,t.clone=n,t.merge=o,t.mergeAll=r,t.extend=a,t.defaults=l,t.createCanvas=Y,t.getContext=s,t.indexOf=c,t.inherits=u,t.mixin=d,t.isArrayLike=p,t.each=h,t.map=f,t.reduce=g,t.filter=m,t.find=v,t.bind=b,t.curry=x,t.isArray=y,t.isFunction=_,t.isString=w,t.isObject=S,t.isBuiltInObject=k,t.isDom=M,t.eqNaN=A,t.retrieve=C,t.retrieve2=T,t.retrieve3=I,t.slice=L,t.normalizeCssArray=E,t.assert=P,t.setAsPrimitive=D,t.isPrimitive=O,t.createHashMap=R,t.noop=N},function(e,t,i){function n(e){return function(t,i,n){t=t&&t.toLowerCase(),J.prototype[e].call(this,t,i,n)}}function o(){J.call(this)}function r(e,t,i){function n(e,t){return e.prio-t.prio}i=i||{},"string"==typeof t&&(t=De[t]),this.id,this.group,this._dom=e;var r=this._zr=q.init(e,{renderer:i.renderer||"canvas",devicePixelRatio:i.devicePixelRatio,width:i.widthLine truncated
webpackJsonp([0],[function(e,t){function n(e,t){q[e]=t}function o(e){if(null==e||"object"!=typeof e)return e;var t=e,n=V.call(e);if("[object Array]"===n){t=[];for(var i=0,r=e.length;i<r;i++)t[i]=o(e[i])}else if(F[n]){var a=e.constructor;if(e.constructor.from)t=a.from(e);else{t=new a(e.length);for(var i=0,r=e.length;i<r;i++)t[i]=o(e[i])}}else if(!B[n]&&!D(e)&&!M(e)){t={};for(var l in e)e.hasOwnProperty(l)&&(t[l]=o(e[l]))}return t}function i(e,t,n){if(!k(t)||!k(e))return n?o(t):e;for(var r in t)if(t.hasOwnProperty(r)){var a=e[r],l=t[r];!k(l)||!k(a)||y(l)||y(a)||M(l)||M(a)||S(l)||S(a)||D(l)||D(a)?!n&&r in e||(e[r]=o(t[r],!0)):i(a,l,n)}return e}function r(e,t){for(var n=e[0],o=1,r=e.length;o<r;o++)n=i(n,e[o],t);return n}function a(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function l(e,t,n){for(var o in t)t.hasOwnProperty(o)&&(n?null!=t[o]:null==e[o])&&(e[o]=t[o]);return e}function s(){return Z||(Z=Y().getContext("2d")),Z}function c(e,t){if(e){if(e.indexOf)return e.indexOf(t);for(var n=0,o=e.length;n<o;n++)if(e[n]===t)return n}return-1}function u(e,t){function n(){}var o=e.prototype;n.prototype=t.prototype,e.prototype=new n;for(var i in o)e.prototype[i]=o[i];e.prototype.constructor=e,e.superClass=t}function d(e,t,n){e="prototype"in e?e.prototype:e,t="prototype"in t?t.prototype:t,l(e,t,n)}function f(e){if(e)return"string"!=typeof e&&"number"==typeof e.length}function p(e,t,n){if(e&&t)if(e.forEach&&e.forEach===$)e.forEach(t,n);else if(e.length===+e.length)for(var o=0,i=e.length;o<i;o++)t.call(n,e[o],o,e);else for(var r in e)e.hasOwnProperty(r)&&t.call(n,e[r],r,e)}function h(e,t,n){if(e&&t){if(e.map&&e.map===G)return e.map(t,n);for(var o=[],i=0,r=e.length;i<r;i++)o.push(t.call(n,e[i],i,e));return o}}function g(e,t,n,o){if(e&&t){if(e.reduce&&e.reduce===U)return e.reduce(t,n,o);for(var i=0,r=e.length;i<r;i++)n=t.call(o,n,e[i],i,e);return n}}function m(e,t,n){if(e&&t){if(e.filter&&e.filter===H)return e.filter(t,n);for(var o=[],i=0,r=e.length;i<r;i++)t.call(n,e[i],i,e)&&o.push(e[i]);return o}}function v(e,t,n){if(e&&t)for(var o=0,i=e.length;o<i;o++)if(t.call(n,e[o],o,e))return e[o]}function b(e,t){var n=W.call(arguments,2);return function(){return e.apply(t,n.concat(W.call(arguments)))}}function x(e){var t=W.call(arguments,1);return function(){return e.apply(this,t.concat(W.call(arguments)))}}function y(e){return"[object Array]"===V.call(e)}function _(e){return"function"==typeof e}function w(e){return"[object String]"===V.call(e)}function k(e){var t=typeof e;return"function"===t||!!e&&"object"==t}function S(e){return!!B[V.call(e)]}function M(e){return"object"==typeof e&&"number"==typeof e.nodeType&&"object"==typeof e.ownerDocument}function C(e){return e!==e}function A(e){for(var t=0,n=arguments.length;t<n;t++)if(null!=arguments[t])return arguments[t]}function T(e,t){return null!=e?e:t}function E(e,t,n){return null!=e?e:null!=t?t:n}function I(){return Function.call.apply(W,arguments)}function O(e){if("number"==typeof e)return[e,e,e,e];var t=e.length;return 2===t?[e[0],e[1],e[0],e[1]]:3===t?[e[0],e[1],e[2],e[1]]:e}function L(e,t){if(!e)throw new Error(t)}function P(e){e[X]=!0}function D(e){return e[X]}function z(e){e&&p(e,function(e,t){this.set(t,e)},this)}function R(e){return new z(e)}function N(){}var B={"[object Function]":1,"[object RegExp]":1,"[object Date]":1,"[object Error]":1,"[object CanvasGradient]":1,"[object CanvasPattern]":1,"[object Image]":1,"[object Canvas]":1},F={"[object Int8Array]":1,"[object Uint8Array]":1,"[object Uint8ClampedArray]":1,"[object Int16Array]":1,"[object Uint16Array]":1,"[object Int32Array]":1,"[object Uint32Array]":1,"[object Float32Array]":1,"[object Float64Array]":1},V=Object.prototype.toString,j=Array.prototype,$=j.forEach,H=j.filter,W=j.slice,G=j.map,U=j.reduce,q={},Y=function(){return q.createCanvas()};q.createCanvas=function(){return document.createElement("canvas")};var Z,X="__ec_primitive__";z.prototype={constructor:z,get:function(e){return this["_ec_"+e]},set:function(e,t){return this["_ec_"+e]=t,t},each:function(e,t){void 0!==t&&(e=b(e,t));for(var n in this)this.hasOwnProperty(n)&&e(this[n],n.slice(4))},removeKey:function(e){delete this["_ec_"+e]}},t.$override=n,t.clone=o,t.merge=i,t.mergeAll=r,t.extend=a,t.defaults=l,t.createCanvas=Y,t.getContext=s,t.indexOf=c,t.inherits=u,t.mixin=d,t.isArrayLike=f,t.each=p,t.map=h,t.reduce=g,t.filter=m,t.find=v,t.bind=b,t.curry=x,t.isArray=y,t.isFunction=_,t.isString=w,t.isObject=k,t.isBuiltInObject=S,t.isDom=M,t.eqNaN=C,t.retrieve=A,t.retrieve2=T,t.retrieve3=E,t.slice=I,t.normalizeCssArray=O,t.assert=L,t.setAsPrimitive=P,t.isPrimitive=D,t.createHashMap=R,t.noop=N},function(e,t,n){function o(e){return function(t,n,o){t=t&&t.toLowerCase(),J.prototype[e].call(this,t,n,o)}}function i(){J.call(this)}function r(e,t,n){function o(e,t){return e.prio-t.prio}n=n||{},"string"==typeof t&&(t=Pe[t]),this.id,this.group,this._dom=e;var r=this._zr=q.init(e,{renderer:n.renderer||"canvas",devicePixelRatio:n.devicePixelRatio,width:n.widthLine truncated
+1 -1
View File
@@ -5,6 +5,6 @@ import (
)
func init() {
data := "PK\x03\x04\x14\x00\x08\x00\x00\x00\xcf!KN\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00$\x00 \x006f0a76321d30f3c8120915e57f7bd77e.ttfUT\x05\x00\x01\xa6\xf6`\\\x00\x01\x00\x00\x00\x0b\x00\x80\x00\x03\x000GSUB\xb0\xfe\xb3\xed\x00\x00\x018\x00\x00\x00BOS/2V\xeeH8\x00\x00\x01|\x00\x00\x00Vcmap\xd4\xa4\xc1\x90\x00\x00\x02\xf4\x00\x00\x05Tglyf\x00\xd0\xc5\xf7\x00\x00\x08\xdc\x00\x00\x1c\\head\x0f\x87\x89\xc1\x00\x00\x00\xe0\x00\x00\x006hhea\x07\xe0\x03\xc8\x00\x00\x00\xbc\x00\x00\x00$hmtx\x1f\xe9\x00\x00\x00\x00\x01\xd4\x00\x00\x01 loca\xf22\xean\x00\x00\x08H\x00\x00\x00\x92maxp\x01Z\x00q\x00\x00\x01\x18\x00\x00\x00 name\xac\x00y\x8a\x00\x00%8\x00\x00\x02\xa9post\x19\xb8\xdb\xb7\x00\x00'\xe4\x00\x00\x03<\x00\x01\x00\x00\x03\x80\xff\x80\x00\\\x04\x00\x00\x00\xff\xff\x04\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00H\x00\x01\x00\x00\x00\x01\x00\x00\xc2P\x80\xb2_\x0f<\xf5\x00\x0b\x04\x00\x00\x00\x00\x00\xd63\xa2\xe2\x00\x00\x00\x00\xd63\xa2\xe2\x00\x00\xff\x80\x04\x01\x03\x80\x00\x00\x00\x08\x00\x02\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00H\x00e\x00\x08\x00\x00\x00\x00\x00\x02\x00\x00\x00\n\x00\n\x00\x00\x00\xff\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\n\x00\x1e\x00,\x00\x01DFLT\x00\x08\x00\x04\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01liga\x00\x08\x00\x00\x00\x01\x00\x00\x00\x01\x00\x04\x00\x04\x00\x00\x00\x01\x00\x08\x00\x01\x00\x06\x00\x00\x00\x01\x00\x00\x00\x00\x00\x01\x04\x00\x01\x90\x00\x05\x00\x08\x02\x89\x02\xcc\x00\x00\x00\x8f\x02\x89\x02\xcc\x00\x00\x01\xeb\x002\x01\x08\x00\x00\x02\x00\x05\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00PfEd\x00@\x00x\xe6F\x03\x80\xff\x80\x00\\\x03\x80\x00\x80\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x03\xe9\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x03\x00\x00\x00,\x00\x00\x00\x04\x00\x00\x01\xf0\x00\x01\x00\x00\x00\x00\x00\xea\x00\x03\x00\x01\x00\x00\x00,\x00\x03\x00\n\x00\x00\x01\xf0\x00\x04\x00\xbe\x00\x00\x00\x08\x00\x08\x00\x02\x00\x00\x00x\xe6\"\xe6F\xff\xff\x00\x00\x00x\xe6\x00\xe6$\xff\xff\x00\x00\x00\x00\x00\x00\x00\x01\x00\x08\x00\x08\x00L\x00\x00\x00\x01\x00\x08\x00 \x00\n\x00\x0b\x00\x0c\x00\x0d\x00\x0e\x00\x0f\x00\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x02\x00\x15\x00\x16\x00\x17\x00\x18\x00\x19\x00\x1a\x00\x1b\x00\x1c\x00\x1d\x00\x1e\x00\x1f\x00 \x00!\x00\"\x00#\x00$\x00%\x00&\x00'\x00(\x00)\x00*\x00+\x00,\x00-\x00.\x00/\x000\x001\x00\x03\x00\x04\x00\x05\x002\x00\x06\x00\x07\x003\x004\x005\x006\x007\x008\x009\x00:\x00;\x00<\x00=\x00>\x00?\x00@\x00A\x00B\x00C\x00D\x00E\x00F\x00G\x00\x00\x01\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x00\x03d\x00\x00\x00\x00\x00\x00\x00G\x00\x00\x00x\x00\x00\x00x\x00\x00\x00\x01\x00\x00\xe6\x00\x00\x00\xe6\x00\x00\x00\x00\x08\x00\x00\xe6\x01\x00\x00\xe6\x01\x00\x00\x00 \x00\x00\xe6\x02\x00\x00\xe6\x02\x00\x00\x00\n\x00\x00\xe6\x03\x0Line truncated
data := "PK\x03\x04\x14\x00\x08\x00\x00\x00\xa5=9R\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00%\x00 \x00535877f50039c0cb49a6196a5b7517cd.woffUT\x05\x00\x01\x07w\x0e`wOFF\x00\x01\x00\x00\x00\x00n(\x00\x0b\x00\x00\x00\x00\xda\x94\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00GSUB\x00\x00\x01\x08\x00\x00\x003\x00\x00\x00B\xb0\xfe\xb3\xedOS/2\x00\x00\x01<\x00\x00\x00D\x00\x00\x00V=\x16I\xbccmap\x00\x00\x01\x80\x00\x00\x07T\x00\x00\x11*8\n\xd2\xa9glyf\x00\x00\x08\xd4\x00\x00Y\x9a\x00\x00\xb1\x8c+\xdbB\xe0head\x00\x00bp\x00\x00\x00/\x00\x00\x006\x14\xee\xbf\"hhea\x00\x00b\xa0\x00\x00\x00\x1d\x00\x00\x00$\x07\xde\x04\x9ahmtx\x00\x00b\xc0\x00\x00\x00\x15\x00\x00\x04dd\x00\x00\x00loca\x00\x00b\xd8\x00\x00\x024\x00\x00\x024}\x86\xaa`maxp\x00\x00e\x0c\x00\x00\x00\x1f\x00\x00\x00 \x021\x00\x98name\x00\x00e,\x00\x00\x01J\x00\x00\x02a\xc3\x8c\xa5\x01post\x00\x00fx\x00\x00\x07\xb0\x00\x00\x0d\x0b\xe4s\x05\x1bx\x9cc`d``\xe0b\x90c\xd0a`tq\xf3 a\xe0``a\x80\x00\x90\x0ccNfz\"P\x0c\xca\x03\xca\xb1\x80i\x0e f\x83\x88\x02\x00\x8a#\x03O\x00x\x9cc`da`\x9c\xc0\xc0\xca\xc0\xc1\xd4\xc9t\x86\x81\x81\xa1\x1fB3\xbef0b\xe4```b`ef\xc0\n\x02\xd2\\S\x18\x1c\x9e-x~\x8a\xb9\xe1\x7f\x03C\x0cs\x03C\x03P\x98\x11$\x07\x00\xf9W\x0dNx\x9c\xdd\xd7\xf5\xb7\x97u\x16\xc5\xf1\xf7\xe7\xd2]R\x83\xc1`\xcb\xa0\x88\xd8\xc9\x0c\x0cvw3\x18\xd8\xdd\xdd\xdd\xdd(%\xddH#\x1dvw\xeb9&\x83\xe2 &\xee\x87\xfd\x07\xf8\xfb\xb0\xd6\x8bu\xef]w\xad\xfb\xbd\xf1\xec\xbd\x0fP\x07\xa8%\xff\x90\xdaz\xf3\x17\x8a\xde\xa2\xe6G}\xb4\xac\xfex-\x1a\xae\xfex\xed\x9aEz\xbf\x13\x1d\xf5y5\xd1?\x86\xc4\xa4\x98\x15Kcy\xac\xcaV\xd9>;f\xe7\xec\x91\xbd\xb2O.\xcc%\xabV\x81>g@\x0c\x8d\xc91;\x96\xc5\x8a\xac\xc9\xd6\xd9!;e\x97\xec\x99\xbd\xb3o.\xae>\xe7/\xfe\x15}\xbdNlBO\xf6g\x04\xe3\x98G\xb0\x94\x95\xa5a\xe9V\xba\x97~5]W\x7fN\x8d^cm}'u\xa9G}\x1a\xe8\xf56\xa21MhJ3\x9a\xd3\x82\x96\xb4b\x0dZ\xd3\x86\xb6\xb4\xa3=\x7f\xa3\x03k\xb2\x16k\xb3\x8e\xbe\x9b\xbf\xeb+\xac\xcbz\xac\xcf\x06l\xc8Fl\xac\xaf\xd7Y\xdfw\x176e3\xba\xb29\xdd\xd8\x82\xeel\xc9Vl\xcd6l\xcbvl\xcf\x0e\xec\xc8N\xec\xcc.\xf4\xe0\x9f\xfcK\xaf\xb0\x17\xff\xa67\xbb\xb2\x1b\xbb\xb3\x07{\xb2\x17{\xb3\x0f\xfb\xb2\x9f^\xfb\x01\x1c\xc8A\x1c\xcc!\x1c\xcaa\x1c\xce\x11\x1c\xc9Q\x1c\xcd1\x1cK\x1f\xfeC_\x8e\xe3xN\xe0D\xfaq\x12's\n\xa7r\x1a\xa7s\x06gr\x16gs\x0e\xe7r\x1e\xe7s\x01\x17r\x11\x17s \x97r\x19\x97s\x05Wr\x15Ws\x0d\xd7r\x1d\xd7s\x037r\x137s\x0b\xb7r\x1b\xb7s\x07wr\x17ws\x0f\xf7r\x1f\xf7\xf3\x00\x0f\xf2\x10\x0f\xf3\x08\x8f\xf2\x18\x8f\xf3\x04\xfdy\x92\xa7\x18\xc0@\x061\x98!<\xcdP\x861\\?\xed\x91\x8cb4c\x18\xab\x9f\xfbx&0\x91I<\xc3d\xa60\x95iLg\x063\x99\xc5\xb3\xccf\x0es\xf5\x9b\x99\xcf\x02\x16\xb2\x88\xc5,\xe19\x9e\xe7\x05\xde\xe0M\xde\xe2E\xde\xe6\x1d^\xe2e^\xe1U^\xe3]^\xe7=\xde\xe7\x03>\xe4#>\xe6\x13>\xe53>\xe7\x0b\xfdn\x93/\xf9\x8a\xaf\xf9\x86o\xf9N\xbf\xe9\xff\xb2\x8c\xef\xf9\x81\xe5\xfc\xc8\xffX\xc1O\xac\xe4g~\xe1W~\xe3w\xfe`U\xa1\x94RSj\x95\xda\xa5N\xa9[\xea\x95\xfa\xa5\x81\xfe:\x1a\x95\xc6\xa5IiZ\x9a\x95\xe6\xa5EiYZ\x955J\xeb\xd2\xa6\xb4-\xed\xf4\x07S\xf7/\xff\xee\xfe\xff\xff5\xae\xfek\xd2\xd5\xefT?\x95\xe8o\xd5S\x1f\x03LO\x161\xd0\xaa\x94\x88AV%E\x0c\xb6*Ab\x88\xe9 $\x86\x9a\x9eEb\x98\xe9\xa9$\x86\x9b\x9eOb\x84U\xc9\x12#M\xcf,1\xca\xaaW\x17\xa3M\xcf11\xc6\xf4D\x13cM\xcf61\xce\xf4\x94\x13\xe3M\xcf;1\xc1\xf4\xe4\x13\x13M\x19@L2\xa5\x011\xd9\x94\x0b\xc4\x14SB\x10SMYAL3\xaa\x9f\xcftS~\x103LIB\xcc4e\n1\xcb\x94.\xc4lS\xce\x10sL\x89C\xcc5e\x0f1\xcf\x94B\xc4|S\x1e\x11\x0bL\xc9D,4e\x14\xb1\xc8\x94V\xc4bSn\x11KL F<g\xca2\xe2yS\xaa\x11/\x98\xf2\x8dx\xd1\x94t\xc4K\xa6\xcc#^\xb6\xaa\x0d\xe2\x15S\x0e\x12\xaf\x9a\x12\x91x\xcd\x94\x8d\xc4\xeb\xa6\x94$\xde0\xe5%\xf1\xa6)9\x89\xb7L\x19J\xbcmJS\xe2\x1dS\xae\x12\xef\x9a\x12\x96x\xcf\x94\xb5\xc4\xfb\xa6\xd4%>0\xe5/\xf1\xa1)\x89\x89\x8fL\x99L|lJg\xe2\x13SN\x13\x9f\x9a\x12\x9b\xf8\xcc\x94\xdd\xc4\xe7\xa6\x14'\xbe0\xe59\x11\xa6d'\xd2\x94\xf1\xc4\x97\xa6\xb4'\xbe2\xe5>\xf1\xb5\xa9\x01\x88oL]@|kj\x05\xe2;S?\x10KMMA,3u\x06\xf1\xbd\xa9=\x88\x1fL=B,75\n\xb1\xc2\xd4-\xc4O\xa6\x96!V\x9a\xfa\x86\xf8\xd9\xd4<\xc4/\xa6\x0e\"~5\xb5\x11\xf1\x9b\xa9\x97\x88\xdfM\x0dE\xfca\xea*b\x95\xa9\xb5\xc8\x1aS\x7f\x91\xb5LMF\xd66u\x1aY\xc7\xd4nd]S\xcf\x91\xf5L\x8dG\xd67u\x1f\xd9\xc0\xd4\x82dCS\x1f\x92\x8dL\xcdH66u$\xd9\xc4\xd4\x96dSSo\x92\xcdL\x0dJ67u)\xd9\xc2\xd4\xaadKS\xbf\x92\xadLMK\xb66u.\xd9\xc6\xd4\xbed[S\x0f\x93\xedL\x8dL\xb67u3\xd9\xc1\xd4\xd2\xe4\x9a\xa6\xbe&\xd7257\xb9\xb6\xa9\xc3\xc9uLmNv4\xf5:\xd9\xc9\xd4\xf0\xe4\xba\xa6\xae'\xd73\xb5>\xb9\xbe\xa9\xff\xc9\x0dLK\x80\xdc\xd0\xb4 \xc8\x8dL\xeb\x80\xdc\xd8\xb4\x13\xc8ML\x8b\x81\xecl\xda\x0ed\x17\xd3\x8a 75\xed r3\xd3\xb2 \xbb\x9a6\x06\xb9\xb9im\x90\xddL\xbb\x83\xdc\xc2\xb4@\xc8\xee\xa6-BniZ%\xe4V\xa6}BnmZ*\xe46\xa6\xcdBnkZ/\xe4v\xa6\x1dCnoZ4\xe4\x0e\xa6mC\xeehZ9\xe4N\xa6\xbdC\xeelZ>\xe4.\xa6\x0dD\xf60\xad!\xb2\xa7i\x17\x91\xbdL\x0b\x89\xecm\xdaJ\xe4\xae\xa6\xd5D\xeef\xdaO\xe4\xee\xa6%E\xeea\xdaT\xe4\x9e\xa6uE\xeee\xdaY\xe4\xde\xa6\xc5E\xeec\xda^\xe4\xbe\xa6\x15F\xeeg\xdac\xe4\xfe\xa6eF\x1e`\xdah\xe4\x81\xa6\xb5F\x1ed\xdam\xe4\xLine truncated
fs.Register(data)
}
+7 -5
View File
@@ -17,10 +17,10 @@ package client
import (
"context"
"crypto/tls"
"fmt"
"io"
"net"
"runtime/debug"
"strconv"
"sync"
"time"
@@ -222,8 +222,10 @@ func (ctl *Control) connectServer() (conn net.Conn, err error) {
return
}
}
conn, err = frpNet.ConnectServerByProxyWithTLS(ctl.clientCfg.HTTPProxy, ctl.clientCfg.Protocol,
fmt.Sprintf("%s:%d", ctl.clientCfg.ServerAddr, ctl.clientCfg.ServerPort), tlsConfig)
address := net.JoinHostPort(ctl.clientCfg.ServerAddr, strconv.Itoa(ctl.clientCfg.ServerPort))
conn, err = frpNet.ConnectServerByProxyWithTLS(ctl.clientCfg.HTTPProxy, ctl.clientCfg.Protocol, address, tlsConfig)
if err != nil {
xl.Warn("start new connection to server error: %v", err)
return
@@ -295,7 +297,7 @@ func (ctl *Control) msgHandler() {
}()
defer ctl.msgHandlerShutdown.Done()
hbSend := time.NewTicker(time.Duration(ctl.clientCfg.HeartBeatInterval) * time.Second)
hbSend := time.NewTicker(time.Duration(ctl.clientCfg.HeartbeatInterval) * time.Second)
defer hbSend.Stop()
hbCheck := time.NewTicker(time.Second)
defer hbCheck.Stop()
@@ -314,7 +316,7 @@ func (ctl *Control) msgHandler() {
}
ctl.sendCh <- pingMsg
case <-hbCheck.C:
if time.Since(ctl.lastPong) > time.Duration(ctl.clientCfg.HeartBeatTimeout)*time.Second {
if time.Since(ctl.lastPong) > time.Duration(ctl.clientCfg.HeartbeatTimeout)*time.Second {
xl.Warn("heartbeat timeout")
// let reader() stop
ctl.conn.Close()
+4 -2
View File
@@ -21,6 +21,7 @@ import (
"io/ioutil"
"net"
"runtime"
"strconv"
"sync"
"sync/atomic"
"time"
@@ -215,8 +216,9 @@ func (svr *Service) login() (conn net.Conn, session *fmux.Session, err error) {
return
}
}
conn, err = frpNet.ConnectServerByProxyWithTLS(svr.cfg.HTTPProxy, svr.cfg.Protocol,
fmt.Sprintf("%s:%d", svr.cfg.ServerAddr, svr.cfg.ServerPort), tlsConfig)
address := net.JoinHostPort(svr.cfg.ServerAddr, strconv.Itoa(svr.cfg.ServerPort))
conn, err = frpNet.ConnectServerByProxyWithTLS(svr.cfg.HTTPProxy, svr.cfg.Protocol, address, tlsConfig)
if err != nil {
return
}
+7 -8
View File
@@ -157,17 +157,16 @@ func parseClientCommonCfgFromIni(content string) (config.ClientCommonConf, error
func parseClientCommonCfgFromCmd() (cfg config.ClientCommonConf, err error) {
cfg = config.GetDefaultClientConf()
strs := strings.Split(serverAddr, ":")
if len(strs) < 2 {
err = fmt.Errorf("invalid server_addr")
ipStr, portStr, err := net.SplitHostPort(serverAddr)
if err != nil {
err = fmt.Errorf("invalid server_addr: %v", err)
return
}
if strs[0] != "" {
cfg.ServerAddr = strs[0]
}
cfg.ServerPort, err = strconv.Atoi(strs[1])
cfg.ServerAddr = ipStr
cfg.ServerPort, err = strconv.Atoi(portStr)
if err != nil {
err = fmt.Errorf("invalid server_addr")
err = fmt.Errorf("invalid server_addr: %v", err)
return
}
+3 -1
View File
@@ -105,6 +105,7 @@ var rootCmd = &cobra.Command{
var cfg config.ServerCommonConf
var err error
if cfgFile != "" {
log.Info("frps uses config file: %s", cfgFile)
var content string
content, err = config.GetRenderedConfFromFile(cfgFile)
if err != nil {
@@ -112,6 +113,7 @@ var rootCmd = &cobra.Command{
}
cfg, err = parseServerCommonCfg(CfgFileTypeIni, content)
} else {
log.Info("frps uses command line arguments for config")
cfg, err = parseServerCommonCfg(CfgFileTypeCmd, "")
}
if err != nil {
@@ -212,7 +214,7 @@ func runServer(cfg config.ServerCommonConf) (err error) {
if err != nil {
return err
}
log.Info("start frps success")
log.Info("frps started successfully")
svr.Run()
return
}
+17 -2
View File
@@ -23,15 +23,30 @@ log_max_days = 3
disable_log_color = false
# for authentication, should be same as your frps.ini
# AuthenticateHeartBeats specifies whether to include authentication token in heartbeats sent to frps. By default, this value is false.
# authenticate_heartbeats specifies whether to include authentication token in heartbeats sent to frps. By default, this value is false.
authenticate_heartbeats = false
# AuthenticateNewWorkConns specifies whether to include authentication token in new work connections sent to frps. By default, this value is false.
# authenticate_new_work_conns specifies whether to include authentication token in new work connections sent to frps. By default, this value is false.
authenticate_new_work_conns = false
# auth token
token = 12345678
# oidc_client_id specifies the client ID to use to get a token in OIDC authentication if AuthenticationMethod == "oidc".
# By default, this value is "".
oidc_client_id =
# oidc_client_secret specifies the client secret to use to get a token in OIDC authentication if AuthenticationMethod == "oidc".
# By default, this value is "".
oidc_client_secret =
# oidc_audience specifies the audience of the token in OIDC authentication if AuthenticationMethod == "oidc". By default, this value is "".
oidc_audience =
# oidc_token_endpoint_url specifies the URL which implements OIDC Token Endpoint.
# It will be used to get an OIDC token if AuthenticationMethod == "oidc". By default, this value is "".
oidc_token_endpoint_url =
# set admin address for control frpc's action by http api such as reload
admin_addr = 127.0.0.1
admin_port = 7400
+20 -13
View File
@@ -23,7 +23,7 @@ vhost_https_port = 443
# response header timeout(seconds) for vhost http server, default is 60s
# vhost_http_timeout = 60
# TcpMuxHttpConnectPort specifies the port that the server listens for TCP
# tcpmux_httpconnect_port specifies the port that the server listens for TCP
# HTTP CONNECT requests. If the value is 0, the server will not multiplex TCP
# requests on one single port. If it's not - it will listen on this value for
# HTTP CONNECT requests. By default, this value is 0.
@@ -44,6 +44,7 @@ enable_prometheus = true
# dashboard assets directory(only for debug mode)
# assets_dir = ./static
# console or real logFile path like ./frps.log
log_file = ./frps.log
@@ -58,12 +59,12 @@ disable_log_color = false
# DetailedErrorsToClient defines whether to send the specific error (with debug info) to frpc. By default, this value is true.
detailed_errors_to_client = true
# AuthenticationMethod specifies what authentication method to use authenticate frpc with frps.
# authentication_method specifies what authentication method to use authenticate frpc with frps.
# If "token" is specified - token will be read into login message.
# If "oidc" is specified - OIDC (Open ID Connect) token will be issued using OIDC settings. By default, this value is "token".
authentication_method = token
# AuthenticateHeartBeats specifies whether to include authentication token in heartbeats sent to frps. By default, this value is false.
# authenticate_heartbeats specifies whether to include authentication token in heartbeats sent to frps. By default, this value is false.
authenticate_heartbeats = false
# AuthenticateNewWorkConns specifies whether to include authentication token in new work connections sent to frps. By default, this value is false.
@@ -72,25 +73,31 @@ authenticate_new_work_conns = false
# auth token
token = 12345678
# OidcClientId specifies the client ID to use to get a token in OIDC authentication if AuthenticationMethod == "oidc".
# oidc_issuer specifies the issuer to verify OIDC tokens with.
# By default, this value is "".
oidc_client_id =
oidc_issuer =
# OidcClientSecret specifies the client secret to use to get a token in OIDC authentication if AuthenticationMethod == "oidc".
# oidc_audience specifies the audience OIDC tokens should contain when validated.
# By default, this value is "".
oidc_client_secret =
oidc_audience =
# OidcAudience specifies the audience of the token in OIDC authentication if AuthenticationMethod == "oidc". By default, this value is "".
oidc_audience =
# oidc_skip_expiry_check specifies whether to skip checking if the OIDC token is expired.
# By default, this value is false.
oidc_skip_expiry_check = false
# OidcTokenEndpointUrl specifies the URL which implements OIDC Token Endpoint.
# It will be used to get an OIDC token if AuthenticationMethod == "oidc". By default, this value is "".
oidc_token_endpoint_url =
# oidc_skip_issuer_check specifies whether to skip checking if the OIDC token's issuer claim matches the issuer specified in OidcIssuer.
# By default, this value is false.
oidc_skip_issuer_check = false
# heartbeat configure, it's not recommended to modify the default value
# the default value of heartbeat_timeout is 90
# heartbeat_timeout = 90
# user_conn_timeout configure, it's not recommended to modify the default value
# the default value of user_conn_timeout is 10
# user_conn_timeout = 10
# only allow frpc to bind ports you list, if you set nothing, there won't be any limit
allow_ports = 2000-3000,3001,3003,4000-50000
@@ -100,7 +107,7 @@ max_pool_count = 5
# max ports can be used for each client, default value is 0 means no limit
max_ports_per_client = 0
# TlsOnly specifies whether to only accept TLS-encrypted connections. By default, the value is false.
# tls_only specifies whether to only accept TLS-encrypted connections. By default, the value is false.
tls_only = false
# tls_cert_file = server.crt
+4 -3
View File
@@ -209,9 +209,10 @@ path = /handler
ops = NewProxy
```
addr: the address where the external RPC service listens on.
path: http request url path for the POST request.
ops: operations plugin needs to handle (e.g. "Login", "NewProxy", ...).
- addr: the address where the external RPC service listens. Defaults to http. For https, specify the schema: `addr = https://127.0.0.1:9001`.
- path: http request url path for the POST request.
- ops: operations plugin needs to handle (e.g. "Login", "NewProxy", ...).
- tls_verify: When the schema is https, we verify by default. Set this value to false if you want to skip verification.
### Metadata
+8 -8
View File
@@ -121,11 +121,11 @@ type ClientCommonConf struct {
// HeartBeatInterval specifies at what interval heartbeats are sent to the
// server, in seconds. It is not recommended to change this value. By
// default, this value is 30.
HeartBeatInterval int64 `json:"heartbeat_interval"`
HeartbeatInterval int64 `json:"heartbeat_interval"`
// HeartBeatTimeout specifies the maximum allowed heartbeat response delay
// before the connection is terminated, in seconds. It is not recommended
// to change this value. By default, this value is 90.
HeartBeatTimeout int64 `json:"heartbeat_timeout"`
HeartbeatTimeout int64 `json:"heartbeat_timeout"`
// Client meta info
Metas map[string]string `json:"metas"`
// UDPPacketSize specifies the udp packet size
@@ -160,8 +160,8 @@ func GetDefaultClientConf() ClientCommonConf {
TLSCertFile: "",
TLSKeyFile: "",
TLSTrustedCaFile: "",
HeartBeatInterval: 30,
HeartBeatTimeout: 90,
HeartbeatInterval: 30,
HeartbeatTimeout: 90,
Metas: make(map[string]string),
UDPPacketSize: 1500,
}
@@ -312,7 +312,7 @@ func UnmarshalClientConfFromIni(content string) (cfg ClientCommonConf, err error
err = fmt.Errorf("Parse conf error: invalid heartbeat_timeout")
return
}
cfg.HeartBeatTimeout = v
cfg.HeartbeatTimeout = v
}
if tmpStr, ok = conf.Get("common", "heartbeat_interval"); ok {
@@ -320,7 +320,7 @@ func UnmarshalClientConfFromIni(content string) (cfg ClientCommonConf, err error
err = fmt.Errorf("Parse conf error: invalid heartbeat_interval")
return
}
cfg.HeartBeatInterval = v
cfg.HeartbeatInterval = v
}
for k, v := range conf.Section("common") {
if strings.HasPrefix(k, "meta_") {
@@ -338,12 +338,12 @@ func UnmarshalClientConfFromIni(content string) (cfg ClientCommonConf, err error
}
func (cfg *ClientCommonConf) Check() (err error) {
if cfg.HeartBeatInterval <= 0 {
if cfg.HeartbeatInterval <= 0 {
err = fmt.Errorf("Parse conf error: invalid heartbeat_interval")
return
}
if cfg.HeartBeatTimeout < cfg.HeartBeatInterval {
if cfg.HeartbeatTimeout < cfg.HeartbeatInterval {
err = fmt.Errorf("Parse conf error: invalid heartbeat_timeout, heartbeat_timeout is less than heartbeat_interval")
return
}
+13 -8
View File
@@ -83,7 +83,7 @@ type ServerCommonConf struct {
// AssetsDir specifies the local directory that the dashboard will load
// resources from. If this value is "", assets will be loaded from the
// bundled executable using statik. By default, this value is "".
AssetsDir string `json:"asserts_dir"`
AssetsDir string `json:"assets_dir"`
// LogFile specifies a file where logs will be written to. This value will
// only be used if LogWay is set appropriately. By default, this value is
// "console".
@@ -154,7 +154,7 @@ type ServerCommonConf struct {
// HeartBeatTimeout specifies the maximum time to wait for a heartbeat
// before terminating the connection. It is not recommended to change this
// value. By default, this value is 90.
HeartBeatTimeout int64 `json:"heart_beat_timeout"`
HeartbeatTimeout int64 `json:"heartbeat_timeout"`
// UserConnTimeout specifies the maximum time to wait for a work
// connection. By default, this value is 10.
UserConnTimeout int64 `json:"user_conn_timeout"`
@@ -199,7 +199,7 @@ func GetDefaultServerConf() ServerCommonConf {
TLSCertFile: "",
TLSKeyFile: "",
TLSTrustedCaFile: "",
HeartBeatTimeout: 90,
HeartbeatTimeout: 90,
UserConnTimeout: 10,
Custom404Page: "",
HTTPPlugins: make(map[string]plugin.HTTPPluginOptions),
@@ -421,7 +421,7 @@ func UnmarshalServerConfFromIni(content string) (cfg ServerCommonConf, err error
err = fmt.Errorf("Parse conf error: heartbeat_timeout is incorrect")
return
}
cfg.HeartBeatTimeout = v
cfg.HeartbeatTimeout = v
}
if tmpStr, ok = conf.Get("common", "tls_only"); ok && tmpStr == "true" {
@@ -458,11 +458,16 @@ func UnmarshalPluginsFromIni(sections ini.File, cfg *ServerCommonConf) {
for name, section := range sections {
if strings.HasPrefix(name, "plugin.") {
name = strings.TrimSpace(strings.TrimPrefix(name, "plugin."))
var tls_verify, err = strconv.ParseBool(section["tls_verify"])
if err != nil {
tls_verify = true
}
options := plugin.HTTPPluginOptions{
Name: name,
Addr: section["addr"],
Path: section["path"],
Ops: strings.Split(section["ops"], ","),
Name: name,
Addr: section["addr"],
Path: section["path"],
Ops: strings.Split(section["ops"], ","),
TLSVerify: tls_verify,
}
for i := range options.Ops {
options.Ops[i] = strings.TrimSpace(options.Ops[i])
+24 -6
View File
@@ -17,19 +17,22 @@ package plugin
import (
"bytes"
"context"
"crypto/tls"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"net/url"
"reflect"
"strings"
)
type HTTPPluginOptions struct {
Name string
Addr string
Path string
Ops []string
Name string
Addr string
Path string
Ops []string
TLSVerify bool
}
type httpPlugin struct {
@@ -40,10 +43,25 @@ type httpPlugin struct {
}
func NewHTTPPluginOptions(options HTTPPluginOptions) Plugin {
var url = fmt.Sprintf("%s%s", options.Addr, options.Path)
var client *http.Client
if strings.HasPrefix(url, "https://") {
tr := &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: options.TLSVerify == false},
}
client = &http.Client{Transport: tr}
} else {
client = &http.Client{}
}
if !strings.HasPrefix(url, "https://") && !strings.HasPrefix(url, "http://") {
url = "http://" + url
}
return &httpPlugin{
options: options,
url: fmt.Sprintf("http://%s%s", options.Addr, options.Path),
client: &http.Client{},
url: url,
client: client,
}
}
+33
View File
@@ -15,6 +15,7 @@
package util
import (
"net"
"net/http"
"strings"
)
@@ -33,6 +34,7 @@ func OkResponse() *http.Response {
return res
}
// TODO: use "CanonicalHost" func to replace all "GetHostFromAddr" func.
func GetHostFromAddr(addr string) (host string) {
strs := strings.Split(addr, ":")
if len(strs) > 1 {
@@ -42,3 +44,34 @@ func GetHostFromAddr(addr string) (host string) {
}
return
}
// canonicalHost strips port from host if present and returns the canonicalized
// host name.
func CanonicalHost(host string) (string, error) {
var err error
host = strings.ToLower(host)
if hasPort(host) {
host, _, err = net.SplitHostPort(host)
if err != nil {
return "", err
}
}
if strings.HasSuffix(host, ".") {
// Strip trailing dot from fully qualified domain names.
host = host[:len(host)-1]
}
return host, nil
}
// hasPort reports whether host contains a port number. host may be a host
// name, an IPv4 or an IPv6 address.
func hasPort(host string) bool {
colons := strings.Count(host, ":")
if colons == 0 {
return false
}
if colons == 1 {
return true
}
return host[0] == '[' && strings.Contains(host, "]:")
}
+1 -1
View File
@@ -19,7 +19,7 @@ import (
"strings"
)
var version string = "0.34.3"
var version string = "0.35.1"
func Full() string {
return version
+23 -9
View File
@@ -17,6 +17,7 @@ package vhost
import (
"bytes"
"context"
"encoding/base64"
"errors"
"fmt"
"log"
@@ -59,20 +60,25 @@ func NewHTTPReverseProxy(option HTTPReverseProxyOptions, vhostRouter *Routers) *
req.URL.Scheme = "http"
url := req.Context().Value(RouteInfoURL).(string)
oldHost := util.GetHostFromAddr(req.Context().Value(RouteInfoHost).(string))
host := rp.GetRealHost(oldHost, url)
if host != "" {
req.Host = host
}
req.URL.Host = req.Host
rc := rp.GetRouteConfig(oldHost, url)
if rc != nil {
if rc.RewriteHost != "" {
req.Host = rc.RewriteHost
}
// Set {domain}.{location} as URL host here to let http transport reuse connections.
req.URL.Host = rc.Domain + "." + base64.StdEncoding.EncodeToString([]byte(rc.Location))
headers := rp.GetHeaders(oldHost, url)
for k, v := range headers {
req.Header.Set(k, v)
for k, v := range rc.Headers {
req.Header.Set(k, v)
}
} else {
req.URL.Host = req.Host
}
},
Transport: &http.Transport{
ResponseHeaderTimeout: rp.responseHeaderTimeout,
DisableKeepAlives: true,
IdleConnTimeout: 60 * time.Second,
DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) {
url := ctx.Value(RouteInfoURL).(string)
host := util.GetHostFromAddr(ctx.Value(RouteInfoHost).(string))
@@ -107,6 +113,14 @@ func (rp *HTTPReverseProxy) UnRegister(domain string, location string) {
rp.vhostRouter.Del(domain, location)
}
func (rp *HTTPReverseProxy) GetRouteConfig(domain string, location string) *RouteConfig {
vr, ok := rp.getVhost(domain, location)
if ok {
return vr.payload.(*RouteConfig)
}
return nil
}
func (rp *HTTPReverseProxy) GetRealHost(domain string, location string) (host string) {
vr, ok := rp.getVhost(domain, location)
if ok {
+1 -1
View File
@@ -144,7 +144,7 @@ func (v *Muxer) handle(c net.Conn) {
sConn, reqInfoMap, err := v.vhostFunc(c)
if err != nil {
log.Warn("get hostname from http/https request error: %v", err)
log.Debug("get hostname from http/https request error: %v", err)
c.Close()
return
}
+1 -1
View File
@@ -408,7 +408,7 @@ func (ctl *Control) manager() {
for {
select {
case <-heartbeat.C:
if time.Since(ctl.lastPing) > time.Duration(ctl.serverCfg.HeartBeatTimeout)*time.Second {
if time.Since(ctl.lastPing) > time.Duration(ctl.serverCfg.HeartbeatTimeout)*time.Second {
xl.Warn("heartbeat timeout")
return
}
+1 -1
View File
@@ -74,7 +74,7 @@ func (svr *Service) APIServerInfo(w http.ResponseWriter, r *http.Request) {
SubdomainHost: svr.cfg.SubDomainHost,
MaxPoolCount: svr.cfg.MaxPoolCount,
MaxPortsPerClient: svr.cfg.MaxPortsPerClient,
HeartBeatTimeout: svr.cfg.HeartBeatTimeout,
HeartBeatTimeout: svr.cfg.HeartbeatTimeout,
TotalTrafficIn: serverStats.TotalTrafficIn,
TotalTrafficOut: serverStats.TotalTrafficOut,
+2 -2
View File
@@ -100,7 +100,7 @@ func (pxy *BaseProxy) GetWorkConnFromPool(src, dst net.Addr) (workConn net.Conn,
xl.Warn("failed to get work connection: %v", err)
return
}
xl.Info("get a new work connection: [%s]", workConn.RemoteAddr().String())
xl.Debug("get a new work connection: [%s]", workConn.RemoteAddr().String())
xl.Spawn().AppendPrefix(pxy.GetName())
workConn = frpNet.NewContextConn(pxy.ctx, workConn)
@@ -159,7 +159,7 @@ func (pxy *BaseProxy) startListenHandler(p Proxy, handler func(Proxy, net.Conn,
xl.Info("listener is closed")
return
}
xl.Debug("get a user connection [%s]", c.RemoteAddr().String())
xl.Info("get a user connection [%s]", c.RemoteAddr().String())
go handler(p, c, pxy.serverCfg)
}
}(listener)
+24 -8
View File
@@ -139,6 +139,7 @@ func TestHealthCheck(t *testing.T) {
}
httpSvc3 := mock.NewHTTPServer(15005, func(w http.ResponseWriter, r *http.Request) {
time.Sleep(time.Second)
w.Write([]byte("http3"))
})
err = httpSvc3.Start()
@@ -147,6 +148,7 @@ func TestHealthCheck(t *testing.T) {
}
httpSvc4 := mock.NewHTTPServer(15006, func(w http.ResponseWriter, r *http.Request) {
time.Sleep(time.Second)
w.Write([]byte("http4"))
})
err = httpSvc4.Start()
@@ -277,16 +279,30 @@ func TestHealthCheck(t *testing.T) {
// ****** load balancing type http ******
result = make([]string, 0)
var wait sync.WaitGroup
var mu sync.Mutex
wait.Add(2)
code, body, _, err = util.SendHTTPMsg("GET", "http://127.0.0.1:14000/xxx", "test.balancing.com", nil, "")
assert.NoError(err)
assert.Equal(200, code)
result = append(result, body)
go func() {
defer wait.Done()
code, body, _, err := util.SendHTTPMsg("GET", "http://127.0.0.1:14000/xxx", "test.balancing.com", nil, "")
assert.NoError(err)
assert.Equal(200, code)
mu.Lock()
result = append(result, body)
mu.Unlock()
}()
code, body, _, err = util.SendHTTPMsg("GET", "http://127.0.0.1:14000/xxx", "test.balancing.com", nil, "")
assert.NoError(err)
assert.Equal(200, code)
result = append(result, body)
go func() {
defer wait.Done()
code, body, _, err = util.SendHTTPMsg("GET", "http://127.0.0.1:14000/xxx", "test.balancing.com", nil, "")
assert.NoError(err)
assert.Equal(200, code)
mu.Lock()
result = append(result, body)
mu.Unlock()
}()
wait.Wait()
assert.Contains(result, "http3")
assert.Contains(result, "http4")
-9334
View File
File diff suppressed because it is too large. Load diff
+1615 -1839
View File
File diff suppressed because it is too large. Load diff
-9334
View File
File diff suppressed because it is too large. Load diff
+1 -1
View File
@@ -6,7 +6,7 @@
</el-row>
</header>
<section>
<el-row :gutter="20">
<el-row>
<el-col id="side-nav" :xs="24" :md="4">
<el-menu default-active="1" mode="vertical" theme="light" router="false" @select="handleSelect">
<el-menu-item index="/">Overview</el-menu-item>
+6377
View File
File diff suppressed because it is too large. Load diff