support wss

This commit is contained in:
rui.zheng 2016-01-09 12:52:59 +08:00
parent b6d333e7d5
commit ba3b1e8ef5
3 changed files with 40 additions and 4 deletions

14
conn.go
View File

@ -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})

View File

@ -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
View File

@ -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("", "")
}