feat: support wss protocol

This commit is contained in:
Jack King 2020-07-28 19:51:47 +08:00
parent b1181fd17a
commit 4a5c9a8796
No known key found for this signature in database
GPG Key ID: 82B96A9FEB52D5C3
5 changed files with 21 additions and 7 deletions

View File

@ -86,7 +86,7 @@ func init() {
func RegisterCommonFlags(cmd *cobra.Command) { func RegisterCommonFlags(cmd *cobra.Command) {
cmd.PersistentFlags().StringVarP(&serverAddr, "server_addr", "s", "127.0.0.1:7000", "frp server's address") 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(&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(&token, "token", "t", "", "auth token")
cmd.PersistentFlags().StringVarP(&logLevel, "log_level", "", "info", "log level") cmd.PersistentFlags().StringVarP(&logLevel, "log_level", "", "info", "log level")
cmd.PersistentFlags().StringVarP(&logFile, "log_file", "", "console", "console or file path") cmd.PersistentFlags().StringVarP(&logFile, "log_file", "", "console", "console or file path")

View File

@ -46,7 +46,7 @@ user = your_name
login_fail_exit = true login_fail_exit = true
# communication protocol used to connect to server # 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 protocol = tcp
# if tls_enable is true, frpc will connect frps by tls # if tls_enable is true, frpc will connect frps by tls

View File

@ -267,7 +267,7 @@ func UnmarshalClientConfFromIni(content string) (cfg ClientCommonConf, err error
if tmpStr, ok = conf.Get("common", "protocol"); ok { if tmpStr, ok = conf.Get("common", "protocol"); ok {
// Now it only support tcp and kcp and websocket. // 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") err = fmt.Errorf("Parse conf error: invalid protocol")
return return
} }

View File

@ -221,7 +221,9 @@ func ConnectServerByProxy(proxyURL string, protocol string, addr string) (c net.
// http proxy is not supported for kcp // http proxy is not supported for kcp
return ConnectServer(protocol, addr) return ConnectServer(protocol, addr)
case "websocket": case "websocket":
return ConnectWebsocketServer(addr) return ConnectWebsocketServer(addr, false)
case "wss":
return ConnectWebsocketServer(addr, true)
default: default:
return nil, fmt.Errorf("unsupport protocol: %s", protocol) return nil, fmt.Errorf("unsupport protocol: %s", protocol)
} }

View File

@ -79,14 +79,26 @@ func (p *WebsocketListener) Addr() net.Addr {
} }
// addr: domain:port // addr: domain:port
func ConnectWebsocketServer(addr string) (net.Conn, error) { func ConnectWebsocketServer(addr string, isSecure bool) (net.Conn, error) {
addr = "ws://" + addr + FrpWebsocketPath
if isSecure {
addr = "wss://" + addr + FrpWebsocketPath
} else {
addr = "ws://" + addr + FrpWebsocketPath
}
uri, err := url.Parse(addr) uri, err := url.Parse(addr)
if err != nil { if err != nil {
return nil, err 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) cfg, err := websocket.NewConfig(addr, origin)
if err != nil { if err != nil {
return nil, err return nil, err