gitextract_d931dhl1/ ├── .circleci/ │ └── config.yml ├── .github/ │ ├── FUNDING.yml │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.yaml │ │ ├── config.yml │ │ └── feature_request.yaml │ ├── pull_request_template.md │ └── workflows/ │ ├── build-and-push-image.yml │ ├── golangci-lint.yml │ ├── goreleaser.yml │ └── stale.yml ├── .gitignore ├── .golangci.yml ├── .goreleaser.yml ├── AGENTS.md ├── LICENSE ├── Makefile ├── Makefile.cross-compiles ├── README.md ├── README_zh.md ├── Release.md ├── assets/ │ └── assets.go ├── client/ │ ├── api_router.go │ ├── config_manager.go │ ├── config_manager_test.go │ ├── configmgmt/ │ │ └── types.go │ ├── connector.go │ ├── control.go │ ├── event/ │ │ └── event.go │ ├── health/ │ │ └── health.go │ ├── http/ │ │ ├── controller.go │ │ ├── controller_test.go │ │ └── model/ │ │ ├── proxy_definition.go │ │ ├── types.go │ │ └── visitor_definition.go │ ├── proxy/ │ │ ├── general_tcp.go │ │ ├── proxy.go │ │ ├── proxy_manager.go │ │ ├── proxy_wrapper.go │ │ ├── sudp.go │ │ ├── udp.go │ │ └── xtcp.go │ ├── service.go │ ├── service_test.go │ └── visitor/ │ ├── stcp.go │ ├── sudp.go │ ├── visitor.go │ ├── visitor_manager.go │ └── xtcp.go ├── cmd/ │ ├── frpc/ │ │ ├── main.go │ │ └── sub/ │ │ ├── admin.go │ │ ├── nathole.go │ │ ├── proxy.go │ │ ├── root.go │ │ └── verify.go │ └── frps/ │ ├── main.go │ ├── root.go │ └── verify.go ├── conf/ │ ├── frpc.toml │ ├── frpc_full_example.toml │ ├── frps.toml │ ├── frps_full_example.toml │ └── legacy/ │ ├── frpc_legacy_full.ini │ └── frps_legacy_full.ini ├── doc/ │ ├── server_plugin.md │ ├── ssh_tunnel_gateway.md │ └── virtual_net.md ├── dockerfiles/ │ ├── Dockerfile-for-frpc │ └── Dockerfile-for-frps ├── go.mod ├── go.sum ├── hack/ │ ├── download.sh │ └── run-e2e.sh ├── package.sh ├── pkg/ │ ├── auth/ │ │ ├── auth.go │ │ ├── legacy/ │ │ │ └── legacy.go │ │ ├── oidc.go │ │ ├── oidc_test.go │ │ ├── pass.go │ │ └── token.go │ ├── config/ │ │ ├── flags.go │ │ ├── legacy/ │ │ │ ├── README.md │ │ │ ├── client.go │ │ │ ├── conversion.go │ │ │ ├── parse.go │ │ │ ├── proxy.go │ │ │ ├── server.go │ │ │ ├── utils.go │ │ │ ├── value.go │ │ │ └── visitor.go │ │ ├── load.go │ │ ├── load_test.go │ │ ├── source/ │ │ │ ├── aggregator.go │ │ │ ├── aggregator_test.go │ │ │ ├── base_source.go │ │ │ ├── base_source_test.go │ │ │ ├── clone.go │ │ │ ├── config_source.go │ │ │ ├── config_source_test.go │ │ │ ├── source.go │ │ │ ├── store.go │ │ │ └── store_test.go │ │ ├── template.go │ │ ├── types/ │ │ │ ├── types.go │ │ │ └── types_test.go │ │ └── v1/ │ │ ├── api.go │ │ ├── client.go │ │ ├── client_test.go │ │ ├── clone_test.go │ │ ├── common.go │ │ ├── decode.go │ │ ├── decode_test.go │ │ ├── proxy.go │ │ ├── proxy_plugin.go │ │ ├── proxy_test.go │ │ ├── server.go │ │ ├── server_test.go │ │ ├── store.go │ │ ├── validation/ │ │ │ ├── client.go │ │ │ ├── common.go │ │ │ ├── oidc.go │ │ │ ├── oidc_test.go │ │ │ ├── plugin.go │ │ │ ├── proxy.go │ │ │ ├── server.go │ │ │ ├── validation.go │ │ │ ├── validator.go │ │ │ └── visitor.go │ │ ├── value_source.go │ │ ├── value_source_test.go │ │ ├── visitor.go │ │ └── visitor_plugin.go │ ├── errors/ │ │ └── errors.go │ ├── metrics/ │ │ ├── aggregate/ │ │ │ └── server.go │ │ ├── mem/ │ │ │ ├── server.go │ │ │ └── types.go │ │ ├── metrics.go │ │ └── prometheus/ │ │ └── server.go │ ├── msg/ │ │ ├── ctl.go │ │ ├── handler.go │ │ └── msg.go │ ├── naming/ │ │ ├── names.go │ │ └── names_test.go │ ├── nathole/ │ │ ├── analysis.go │ │ ├── classify.go │ │ ├── controller.go │ │ ├── discovery.go │ │ ├── nathole.go │ │ └── utils.go │ ├── plugin/ │ │ ├── client/ │ │ │ ├── http2http.go │ │ │ ├── http2https.go │ │ │ ├── http_proxy.go │ │ │ ├── https2http.go │ │ │ ├── https2https.go │ │ │ ├── plugin.go │ │ │ ├── socks5.go │ │ │ ├── static_file.go │ │ │ ├── tls2raw.go │ │ │ ├── unix_domain_socket.go │ │ │ └── virtual_net.go │ │ ├── server/ │ │ │ ├── http.go │ │ │ ├── manager.go │ │ │ ├── plugin.go │ │ │ ├── tracer.go │ │ │ └── types.go │ │ └── visitor/ │ │ ├── plugin.go │ │ └── virtual_net.go │ ├── policy/ │ │ ├── featuregate/ │ │ │ └── feature_gate.go │ │ └── security/ │ │ └── unsafe.go │ ├── proto/ │ │ └── udp/ │ │ ├── udp.go │ │ └── udp_test.go │ ├── sdk/ │ │ └── client/ │ │ └── client.go │ ├── ssh/ │ │ ├── gateway.go │ │ ├── server.go │ │ └── terminal.go │ ├── transport/ │ │ ├── message.go │ │ └── tls.go │ ├── util/ │ │ ├── http/ │ │ │ ├── context.go │ │ │ ├── error.go │ │ │ ├── handler.go │ │ │ ├── http.go │ │ │ ├── middleware.go │ │ │ └── server.go │ │ ├── jsonx/ │ │ │ ├── json_v1.go │ │ │ └── raw_message.go │ │ ├── limit/ │ │ │ ├── reader.go │ │ │ └── writer.go │ │ ├── log/ │ │ │ └── log.go │ │ ├── metric/ │ │ │ ├── counter.go │ │ │ ├── counter_test.go │ │ │ ├── date_counter.go │ │ │ ├── date_counter_test.go │ │ │ └── metrics.go │ │ ├── net/ │ │ │ ├── conn.go │ │ │ ├── dial.go │ │ │ ├── dns.go │ │ │ ├── http.go │ │ │ ├── kcp.go │ │ │ ├── listener.go │ │ │ ├── proxyprotocol.go │ │ │ ├── proxyprotocol_test.go │ │ │ ├── tls.go │ │ │ ├── udp.go │ │ │ └── websocket.go │ │ ├── system/ │ │ │ ├── system.go │ │ │ └── system_android.go │ │ ├── tcpmux/ │ │ │ └── httpconnect.go │ │ ├── util/ │ │ │ ├── types.go │ │ │ ├── util.go │ │ │ └── util_test.go │ │ ├── version/ │ │ │ └── version.go │ │ ├── vhost/ │ │ │ ├── http.go │ │ │ ├── https.go │ │ │ ├── https_test.go │ │ │ ├── resource.go │ │ │ ├── router.go │ │ │ └── vhost.go │ │ ├── wait/ │ │ │ └── backoff.go │ │ └── xlog/ │ │ ├── ctx.go │ │ ├── log_writer.go │ │ └── xlog.go │ ├── virtual/ │ │ └── client.go │ └── vnet/ │ ├── controller.go │ ├── message.go │ ├── tun.go │ ├── tun_darwin.go │ ├── tun_linux.go │ └── tun_unsupported.go ├── server/ │ ├── api_router.go │ ├── control.go │ ├── controller/ │ │ └── resource.go │ ├── group/ │ │ ├── base.go │ │ ├── base_test.go │ │ ├── group.go │ │ ├── http.go │ │ ├── https.go │ │ ├── listener.go │ │ ├── listener_test.go │ │ ├── registry.go │ │ ├── registry_test.go │ │ ├── tcp.go │ │ └── tcpmux.go │ ├── http/ │ │ ├── controller.go │ │ ├── controller_test.go │ │ └── model/ │ │ └── types.go │ ├── metrics/ │ │ └── metrics.go │ ├── ports/ │ │ └── ports.go │ ├── proxy/ │ │ ├── http.go │ │ ├── https.go │ │ ├── proxy.go │ │ ├── stcp.go │ │ ├── sudp.go │ │ ├── tcp.go │ │ ├── tcpmux.go │ │ ├── udp.go │ │ └── xtcp.go │ ├── registry/ │ │ └── registry.go │ ├── service.go │ └── visitor/ │ └── visitor.go ├── test/ │ └── e2e/ │ ├── e2e.go │ ├── e2e_test.go │ ├── examples.go │ ├── framework/ │ │ ├── cleanup.go │ │ ├── client.go │ │ ├── consts/ │ │ │ └── consts.go │ │ ├── expect.go │ │ ├── framework.go │ │ ├── log.go │ │ ├── mockservers.go │ │ ├── process.go │ │ ├── request.go │ │ ├── test_context.go │ │ └── util.go │ ├── legacy/ │ │ ├── basic/ │ │ │ ├── basic.go │ │ │ ├── client.go │ │ │ ├── client_server.go │ │ │ ├── cmd.go │ │ │ ├── config.go │ │ │ ├── http.go │ │ │ ├── server.go │ │ │ ├── tcpmux.go │ │ │ └── xtcp.go │ │ ├── features/ │ │ │ ├── bandwidth_limit.go │ │ │ ├── chaos.go │ │ │ ├── group.go │ │ │ ├── heartbeat.go │ │ │ ├── monitor.go │ │ │ └── real_ip.go │ │ └── plugin/ │ │ ├── client.go │ │ └── server.go │ ├── mock/ │ │ └── server/ │ │ ├── httpserver/ │ │ │ └── server.go │ │ ├── interface.go │ │ ├── oidcserver/ │ │ │ └── oidcserver.go │ │ └── streamserver/ │ │ └── server.go │ ├── pkg/ │ │ ├── cert/ │ │ │ ├── generator.go │ │ │ └── selfsigned.go │ │ ├── plugin/ │ │ │ └── plugin.go │ │ ├── port/ │ │ │ ├── port.go │ │ │ └── util.go │ │ ├── process/ │ │ │ └── process.go │ │ ├── request/ │ │ │ └── request.go │ │ ├── rpc/ │ │ │ └── rpc.go │ │ └── ssh/ │ │ └── client.go │ ├── suites.go │ └── v1/ │ ├── basic/ │ │ ├── annotations.go │ │ ├── basic.go │ │ ├── client.go │ │ ├── client_server.go │ │ ├── cmd.go │ │ ├── config.go │ │ ├── http.go │ │ ├── oidc.go │ │ ├── server.go │ │ ├── tcpmux.go │ │ ├── token_source.go │ │ └── xtcp.go │ ├── features/ │ │ ├── bandwidth_limit.go │ │ ├── chaos.go │ │ ├── group.go │ │ ├── heartbeat.go │ │ ├── monitor.go │ │ ├── real_ip.go │ │ ├── ssh_tunnel.go │ │ └── store.go │ └── plugin/ │ ├── client.go │ └── server.go └── web/ ├── frpc/ │ ├── .gitignore │ ├── .prettierrc.json │ ├── Makefile │ ├── README.md │ ├── auto-imports.d.ts │ ├── components.d.ts │ ├── embed.go │ ├── embed_stub.go │ ├── env.d.ts │ ├── eslint.config.js │ ├── index.html │ ├── package.json │ ├── src/ │ │ ├── App.vue │ │ ├── api/ │ │ │ ├── frpc.ts │ │ │ └── http.ts │ │ ├── assets/ │ │ │ └── css/ │ │ │ ├── _form-layout.scss │ │ │ ├── _index.scss │ │ │ ├── _mixins.scss │ │ │ ├── _variables.scss │ │ │ ├── dark.css │ │ │ └── var.css │ │ ├── components/ │ │ │ ├── ConfigField.vue │ │ │ ├── ConfigSection.vue │ │ │ ├── KeyValueEditor.vue │ │ │ ├── ProxyCard.vue │ │ │ ├── StatusPills.vue │ │ │ ├── StringListEditor.vue │ │ │ ├── proxy-form/ │ │ │ │ ├── ProxyAuthSection.vue │ │ │ │ ├── ProxyBackendSection.vue │ │ │ │ ├── ProxyBaseSection.vue │ │ │ │ ├── ProxyFormLayout.vue │ │ │ │ ├── ProxyHealthSection.vue │ │ │ │ ├── ProxyHttpSection.vue │ │ │ │ ├── ProxyLoadBalanceSection.vue │ │ │ │ ├── ProxyMetadataSection.vue │ │ │ │ ├── ProxyNatSection.vue │ │ │ │ ├── ProxyRemoteSection.vue │ │ │ │ └── ProxyTransportSection.vue │ │ │ └── visitor-form/ │ │ │ ├── VisitorBaseSection.vue │ │ │ ├── VisitorConnectionSection.vue │ │ │ ├── VisitorFormLayout.vue │ │ │ ├── VisitorTransportSection.vue │ │ │ └── VisitorXtcpSection.vue │ │ ├── composables/ │ │ │ └── useResponsive.ts │ │ ├── main.ts │ │ ├── router/ │ │ │ └── index.ts │ │ ├── stores/ │ │ │ ├── client.ts │ │ │ ├── proxy.ts │ │ │ └── visitor.ts │ │ ├── svg.d.ts │ │ ├── types/ │ │ │ ├── constants.ts │ │ │ ├── index.ts │ │ │ ├── proxy-converters.ts │ │ │ ├── proxy-form.ts │ │ │ ├── proxy-status.ts │ │ │ └── proxy-store.ts │ │ ├── utils/ │ │ │ └── format.ts │ │ └── views/ │ │ ├── ClientConfigure.vue │ │ ├── ProxyDetail.vue │ │ ├── ProxyEdit.vue │ │ ├── ProxyList.vue │ │ ├── VisitorDetail.vue │ │ ├── VisitorEdit.vue │ │ └── VisitorList.vue │ ├── tsconfig.json │ ├── tsconfig.node.json │ └── vite.config.mts ├── frps/ │ ├── .gitignore │ ├── .prettierrc.json │ ├── Makefile │ ├── README.md │ ├── auto-imports.d.ts │ ├── components.d.ts │ ├── embed.go │ ├── embed_stub.go │ ├── env.d.ts │ ├── eslint.config.js │ ├── index.html │ ├── package.json │ ├── src/ │ │ ├── App.vue │ │ ├── api/ │ │ │ ├── client.ts │ │ │ ├── http.ts │ │ │ ├── proxy.ts │ │ │ └── server.ts │ │ ├── assets/ │ │ │ └── css/ │ │ │ ├── custom.css │ │ │ ├── dark.css │ │ │ └── var.css │ │ ├── components/ │ │ │ ├── ClientCard.vue │ │ │ ├── ProxyCard.vue │ │ │ ├── StatCard.vue │ │ │ └── Traffic.vue │ │ ├── composables/ │ │ │ └── useResponsive.ts │ │ ├── main.ts │ │ ├── router/ │ │ │ └── index.ts │ │ ├── svg.d.ts │ │ ├── types/ │ │ │ ├── client.ts │ │ │ ├── proxy.ts │ │ │ └── server.ts │ │ ├── utils/ │ │ │ ├── client.ts │ │ │ ├── format.ts │ │ │ └── proxy.ts │ │ └── views/ │ │ ├── ClientDetail.vue │ │ ├── Clients.vue │ │ ├── Proxies.vue │ │ ├── ProxyDetail.vue │ │ └── ServerOverview.vue │ ├── tsconfig.json │ ├── tsconfig.node.json │ └── vite.config.mts ├── package.json └── shared/ ├── components/ │ ├── ActionButton.vue │ ├── BaseDialog.vue │ ├── ConfirmDialog.vue │ ├── FilterDropdown.vue │ ├── PopoverMenu.vue │ └── PopoverMenuItem.vue ├── css/ │ ├── _index.scss │ ├── _mixins.scss │ └── _variables.scss └── package.json