Skip to content

Commit 00531fe

Browse files
author
Nicolas Chatelain
committed
refactor websocket
1 parent 0b80926 commit 00531fe

File tree

2 files changed

+16
-45
lines changed

2 files changed

+16
-45
lines changed

cmd/proxy/main.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ var (
2222
func main() {
2323
var allowDomains []string
2424
var verboseFlag = flag.Bool("v", false, "enable verbose mode")
25-
var listenInterface = flag.String("laddr", "0.0.0.0:11601", "listening address ")
25+
var listenInterface = flag.String("laddr", "0.0.0.0:11601", "listening address (prefix with https:// for websocket)")
2626
var enableAutocert = flag.Bool("autocert", false, "automatically request letsencrypt certificates, requires port 80 to be accessible")
2727
var enableSelfcert = flag.Bool("selfcert", false, "dynamically generate self-signed certificates")
2828
var certFile = flag.String("certfile", "certs/cert.pem", "TLS server certificate")

pkg/controller/controller.go

+15-44
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import (
1212
"net/http"
1313
"nhooyr.io/websocket"
1414
"strings"
15-
"time"
1615
)
1716

1817
type Controller struct {
@@ -34,29 +33,10 @@ type ControllerConfig struct {
3433
DomainWhitelist []string
3534
}
3635

37-
var wsconn net.Conn
38-
3936
func New(config ControllerConfig) Controller {
4037
return Controller{Network: "tcp", Connection: make(chan net.Conn, 1024), ControllerConfig: config, startchan: make(chan error), SelfCertCache: "ligolo-selfcerts"}
4138
}
4239

43-
type ligoloHttpServer struct {
44-
// logf controls where logs are sent.
45-
logf func(f string, v ...interface{})
46-
}
47-
48-
func (s ligoloHttpServer) ServeHTTP(w http.ResponseWriter, r *http.Request) {
49-
50-
c, err := websocket.Accept(w, r, nil)
51-
if err != nil {
52-
logrus.Error(err)
53-
return
54-
}
55-
netctx, _ := context.WithTimeout(context.Background(), time.Hour*999999)
56-
wsconn = websocket.NetConn(netctx, c, websocket.MessageBinary)
57-
return
58-
}
59-
6040
func (c *Controller) WaitForReady() error {
6141
return <-c.startchan
6242
}
@@ -114,40 +94,31 @@ func (c *Controller) ListenAndServe() {
11494
return
11595
}
11696

117-
if strings.Contains(c.Address, "https://") {
97+
if strings.HasPrefix(c.Address, "https://") {
11898
//SSL websocket protocol
11999
listener, err := tls.Listen(c.Network, strings.Replace(c.Address, "https://", "", 1), &tlsConfig)
120100
if err != nil {
121-
logrus.Fatal(err)
101+
c.startchan <- err
102+
return
122103
}
123104
defer listener.Close()
124-
close(c.startchan) // Controller is listening.
105+
106+
c.startchan <- nil
125107
logrus.Infof("Listening websocket on %s", c.Address)
126108

127109
s := &http.Server{
128-
Handler: ligoloHttpServer{},
129-
}
130-
for {
131-
//start http handler in go routine
132-
go func() {
133-
err = s.Serve(listener)
134-
}()
135-
if err != nil {
136-
logrus.Error(err)
137-
}
138-
//manual waiting until handler got connection and global variable wsconn is set by http handler
139-
//this not so gracefully but effective ))
140-
for {
141-
if wsconn != nil {
142-
logrus.Debugf("Got websocket connection %s", wsconn.RemoteAddr())
143-
c.Connection <- wsconn
144-
wsconn = nil
145-
break
110+
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
111+
ws, err := websocket.Accept(w, r, nil)
112+
if err != nil {
113+
logrus.Error(err)
114+
return
146115
}
147-
//add some sleep to reduce CPU usage, because it is in loop
148-
time.Sleep(time.Millisecond * 500)
149-
}
116+
netctx := context.Background()
117+
118+
c.Connection <- websocket.NetConn(netctx, ws, websocket.MessageBinary)
119+
}),
150120
}
121+
err = s.Serve(listener)
151122
} else {
152123
//direct listen with legacy ligolo-ng protocol
153124
listener, err := tls.Listen(c.Network, c.Address, &tlsConfig)

0 commit comments

Comments
 (0)