@@ -12,7 +12,6 @@ import (
12
12
"net/http"
13
13
"nhooyr.io/websocket"
14
14
"strings"
15
- "time"
16
15
)
17
16
18
17
type Controller struct {
@@ -34,29 +33,10 @@ type ControllerConfig struct {
34
33
DomainWhitelist []string
35
34
}
36
35
37
- var wsconn net.Conn
38
-
39
36
func New (config ControllerConfig ) Controller {
40
37
return Controller {Network : "tcp" , Connection : make (chan net.Conn , 1024 ), ControllerConfig : config , startchan : make (chan error ), SelfCertCache : "ligolo-selfcerts" }
41
38
}
42
39
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
-
60
40
func (c * Controller ) WaitForReady () error {
61
41
return <- c .startchan
62
42
}
@@ -114,40 +94,31 @@ func (c *Controller) ListenAndServe() {
114
94
return
115
95
}
116
96
117
- if strings .Contains (c .Address , "https://" ) {
97
+ if strings .HasPrefix (c .Address , "https://" ) {
118
98
//SSL websocket protocol
119
99
listener , err := tls .Listen (c .Network , strings .Replace (c .Address , "https://" , "" , 1 ), & tlsConfig )
120
100
if err != nil {
121
- logrus .Fatal (err )
101
+ c .startchan <- err
102
+ return
122
103
}
123
104
defer listener .Close ()
124
- close (c .startchan ) // Controller is listening.
105
+
106
+ c .startchan <- nil
125
107
logrus .Infof ("Listening websocket on %s" , c .Address )
126
108
127
109
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
146
115
}
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
+ }),
150
120
}
121
+ err = s .Serve (listener )
151
122
} else {
152
123
//direct listen with legacy ligolo-ng protocol
153
124
listener , err := tls .Listen (c .Network , c .Address , & tlsConfig )
0 commit comments