support wss
This commit is contained in:
parent
b6d333e7d5
commit
ba3b1e8ef5
14
conn.go
14
conn.go
@ -35,6 +35,12 @@ func listenAndServe(arg Args) error {
|
|||||||
glog.Infoln(err)
|
glog.Infoln(err)
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
|
case "wss": // websocket security connection
|
||||||
|
err = NewWs(arg).listenAndServeTLS()
|
||||||
|
if err != nil {
|
||||||
|
glog.Infoln(err)
|
||||||
|
}
|
||||||
|
return err
|
||||||
case "tls": // tls connection
|
case "tls": // tls connection
|
||||||
ln, err = tls.Listen("tcp", arg.Addr,
|
ln, err = tls.Listen("tcp", arg.Addr,
|
||||||
&tls.Config{Certificates: []tls.Certificate{arg.Cert}})
|
&tls.Config{Certificates: []tls.Certificate{arg.Cert}})
|
||||||
@ -253,8 +259,12 @@ func forward(conn net.Conn, arg Args) (net.Conn, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
//case "wss": // websocket security
|
case "wss": // websocket security
|
||||||
// tlsUsed = true
|
tlsUsed = true
|
||||||
|
conn, err = wssClient(conn, arg.Addr)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
case "tls": // tls connection
|
case "tls": // tls connection
|
||||||
tlsUsed = true
|
tlsUsed = true
|
||||||
conn = tls.Client(conn, &tls.Config{InsecureSkipVerify: true})
|
conn = tls.Client(conn, &tls.Config{InsecureSkipVerify: true})
|
||||||
|
2
util.go
2
util.go
@ -72,7 +72,7 @@ func parseArgs(ss []string) (args []Args) {
|
|||||||
arg.Protocol = "default"
|
arg.Protocol = "default"
|
||||||
}
|
}
|
||||||
switch arg.Transport {
|
switch arg.Transport {
|
||||||
case "ws", "tls", "tcp":
|
case "ws", "wss", "tls", "tcp":
|
||||||
default:
|
default:
|
||||||
arg.Transport = "tcp"
|
arg.Transport = "tcp"
|
||||||
}
|
}
|
||||||
|
28
ws.go
28
ws.go
@ -2,6 +2,7 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
//"github.com/ginuerzh/gosocks5"
|
//"github.com/ginuerzh/gosocks5"
|
||||||
|
"crypto/tls"
|
||||||
"github.com/golang/glog"
|
"github.com/golang/glog"
|
||||||
"github.com/gorilla/websocket"
|
"github.com/gorilla/websocket"
|
||||||
"net"
|
"net"
|
||||||
@ -17,7 +18,23 @@ type wsConn struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func wsClient(conn net.Conn, host string) (*wsConn, error) {
|
func wsClient(conn net.Conn, host string) (*wsConn, error) {
|
||||||
c, resp, err := websocket.NewClient(conn, &url.URL{Scheme: "ws", Host: host, Path: "/ws"}, nil, 1024, 1024)
|
c, resp, err := websocket.NewClient(conn, &url.URL{Scheme: "ws", Host: host, Path: "/ws"}, nil, 4096, 4096)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
resp.Body.Close()
|
||||||
|
|
||||||
|
return &wsConn{conn: c}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func wssClient(conn net.Conn, host string) (*wsConn, error) {
|
||||||
|
tlsConn := tls.Client(conn, &tls.Config{InsecureSkipVerify: true})
|
||||||
|
if err := tlsConn.Handshake(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
conn = tlsConn
|
||||||
|
|
||||||
|
c, resp, err := websocket.NewClient(conn, &url.URL{Scheme: "wss", Host: host, Path: "/ws"}, nil, 4096, 4096)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -115,3 +132,12 @@ func (s *ws) ListenAndServe() error {
|
|||||||
http.HandleFunc("/ws", s.handle)
|
http.HandleFunc("/ws", s.handle)
|
||||||
return http.ListenAndServe(s.arg.Addr, nil)
|
return http.ListenAndServe(s.arg.Addr, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *ws) listenAndServeTLS() error {
|
||||||
|
http.HandleFunc("/ws", s.handle)
|
||||||
|
server := &http.Server{
|
||||||
|
Addr: s.arg.Addr,
|
||||||
|
TLSConfig: &tls.Config{Certificates: []tls.Certificate{s.arg.Cert}},
|
||||||
|
}
|
||||||
|
return server.ListenAndServeTLS("", "")
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user