diff --git a/cmd/frpc/sub/root.go b/cmd/frpc/sub/root.go index 44904768..eb55716d 100644 --- a/cmd/frpc/sub/root.go +++ b/cmd/frpc/sub/root.go @@ -86,7 +86,7 @@ func init() { func RegisterCommonFlags(cmd *cobra.Command) { cmd.PersistentFlags().StringVarP(&serverAddr, "server_addr", "s", "127.0.0.1:7000", "frp server's address") cmd.PersistentFlags().StringVarP(&user, "user", "u", "", "user") - cmd.PersistentFlags().StringVarP(&protocol, "protocol", "p", "tcp", "tcp or kcp or websocket") + cmd.PersistentFlags().StringVarP(&protocol, "protocol", "p", "tcp", "tcp or kcp or websocket or wss") cmd.PersistentFlags().StringVarP(&token, "token", "t", "", "auth token") cmd.PersistentFlags().StringVarP(&logLevel, "log_level", "", "info", "log level") cmd.PersistentFlags().StringVarP(&logFile, "log_file", "", "console", "console or file path") diff --git a/conf/frpc_full.ini b/conf/frpc_full.ini index 7aacfebf..96dcdc53 100644 --- a/conf/frpc_full.ini +++ b/conf/frpc_full.ini @@ -46,7 +46,7 @@ user = your_name login_fail_exit = true # communication protocol used to connect to server -# now it supports tcp and kcp and websocket, default is tcp +# now it supports tcp, kcp, websocket and wss, default is tcp protocol = tcp # if tls_enable is true, frpc will connect frps by tls diff --git a/models/config/client_common.go b/models/config/client_common.go index aa47b531..e374a9c7 100644 --- a/models/config/client_common.go +++ b/models/config/client_common.go @@ -267,7 +267,7 @@ func UnmarshalClientConfFromIni(content string) (cfg ClientCommonConf, err error if tmpStr, ok = conf.Get("common", "protocol"); ok { // Now it only support tcp and kcp and websocket. - if tmpStr != "tcp" && tmpStr != "kcp" && tmpStr != "websocket" { + if tmpStr != "tcp" && tmpStr != "kcp" && tmpStr != "websocket" && tmpStr != "wss" { err = fmt.Errorf("Parse conf error: invalid protocol") return } diff --git a/utils/net/conn.go b/utils/net/conn.go index 4a122b03..eccf5d78 100644 --- a/utils/net/conn.go +++ b/utils/net/conn.go @@ -221,7 +221,9 @@ func ConnectServerByProxy(proxyURL string, protocol string, addr string) (c net. // http proxy is not supported for kcp return ConnectServer(protocol, addr) case "websocket": - return ConnectWebsocketServer(addr) + return ConnectWebsocketServer(addr, false) + case "wss": + return ConnectWebsocketServer(addr, true) default: return nil, fmt.Errorf("unsupport protocol: %s", protocol) } diff --git a/utils/net/websocket.go b/utils/net/websocket.go index 36b6440c..fb882be2 100644 --- a/utils/net/websocket.go +++ b/utils/net/websocket.go @@ -79,14 +79,26 @@ func (p *WebsocketListener) Addr() net.Addr { } // addr: domain:port -func ConnectWebsocketServer(addr string) (net.Conn, error) { - addr = "ws://" + addr + FrpWebsocketPath +func ConnectWebsocketServer(addr string, isSecure bool) (net.Conn, error) { + + if isSecure { + addr = "wss://" + addr + FrpWebsocketPath + } else { + addr = "ws://" + addr + FrpWebsocketPath + } + uri, err := url.Parse(addr) if err != nil { return nil, err } - origin := "http://" + uri.Host + var origin string + if isSecure { + origin = "https://" + uri.Host + } else { + origin = "http://" + uri.Host + } + cfg, err := websocket.NewConfig(addr, origin) if err != nil { return nil, err