@@ -28,7 +28,8 @@ import (
28
28
)
29
29
30
30
type peer struct {
31
- logger Logger
31
+ ProxyConfig
32
+
32
33
source * websocket.Websocket
33
34
target * net.TCPConn
34
35
closed int32
@@ -39,37 +40,20 @@ func (p *peer) Close(addr string, err error) {
39
40
if atomic .CompareAndSwapInt32 (& p .closed , 0 , 1 ) {
40
41
p .target .Close ()
41
42
p .source .SendClose (websocket .CloseNormalClosure , "close" )
42
- p .logger . Infof ("close VNC: source=%s, target=%s, duration=%s, from=%s, err=%v" ,
43
+ p .infof ("close VNC: source=%s, target=%s, duration=%s, from=%s, err=%v" ,
43
44
p .source .RemoteAddr ().String (), p .target .RemoteAddr ().String (),
44
45
time .Since (p .start ).String (), addr , err )
45
46
}
46
47
}
47
48
48
- func newPeer (source * websocket.Websocket , target * net.TCPConn , now time.Time , logger Logger ) * peer {
49
- return & peer {source : source , target : target , start : now , logger : logger }
50
- }
51
-
52
- // Logger represents a logger interface.
53
- type Logger interface {
54
- Debugf (format string , args ... interface {})
55
- Infof (format string , args ... interface {})
56
- Warnf (format string , args ... interface {})
57
- Errorf (format string , args ... interface {})
49
+ func newPeer (source * websocket.Websocket , target * net.TCPConn , now time.Time , c ProxyConfig ) * peer {
50
+ return & peer {source : source , target : target , start : now , ProxyConfig : c }
58
51
}
59
52
60
- // NewNoopLogger returns a Noop Logger, which does nothing.
61
- func NewNoopLogger () Logger { return noopLogger {} }
62
-
63
- type noopLogger struct {}
64
-
65
- func (n noopLogger ) Debugf (format string , args ... interface {}) {}
66
- func (n noopLogger ) Infof (format string , args ... interface {}) {}
67
- func (n noopLogger ) Warnf (format string , args ... interface {}) {}
68
- func (n noopLogger ) Errorf (format string , args ... interface {}) {}
69
-
70
53
// ProxyConfig is used to configure WsVncProxyHandler.
71
54
type ProxyConfig struct {
72
- Logger Logger
55
+ ErrorLog func (format string , args ... interface {})
56
+ InfoLog func (format string , args ... interface {})
73
57
74
58
// MaxMsgSize is used to control the size of the websocket message.
75
59
// The default is 64KB.
@@ -94,18 +78,27 @@ type ProxyConfig struct {
94
78
GetBackend func (r * http.Request ) (addr string , err error )
95
79
}
96
80
81
+ func (c ProxyConfig ) errorf (format string , args ... interface {}) {
82
+ if c .ErrorLog != nil {
83
+ c .ErrorLog (format , args ... )
84
+ }
85
+ }
86
+
87
+ func (c ProxyConfig ) infof (format string , args ... interface {}) {
88
+ if c .InfoLog != nil {
89
+ c .InfoLog (format , args ... )
90
+ }
91
+ }
92
+
97
93
// WebsocketVncProxyHandler is a VNC proxy handler based on websocket.
98
94
type WebsocketVncProxyHandler struct {
99
95
connection int64
100
96
peers map [* peer ]struct {}
101
97
exit chan struct {}
102
98
lock sync.RWMutex
103
99
104
- logger Logger
105
- timeout time.Duration
106
- upheader http.Header
107
- upgrader websocket.Upgrader
108
- getBackend func (* http.Request ) (string , error )
100
+ conf ProxyConfig
101
+ upgrader websocket.Upgrader
109
102
}
110
103
111
104
// NewWebsocketVncProxyHandler returns a new WebsocketVncProxyHandler.
@@ -121,17 +114,10 @@ func NewWebsocketVncProxyHandler(conf ProxyConfig) *WebsocketVncProxyHandler {
121
114
if conf .Timeout <= 0 {
122
115
conf .Timeout = time .Second * 10
123
116
}
124
- if conf .Logger == nil {
125
- conf .Logger = NewNoopLogger ()
126
- }
127
117
128
118
handler := & WebsocketVncProxyHandler {
129
- exit : make (chan struct {}),
130
- peers : make (map [* peer ]struct {}, 1024 ),
131
- logger : conf .Logger ,
132
- timeout : conf .Timeout ,
133
- getBackend : conf .GetBackend ,
134
- upheader : conf .UpgradeHeader ,
119
+ exit : make (chan struct {}),
120
+ peers : make (map [* peer ]struct {}, 1024 ),
135
121
upgrader : websocket.Upgrader {
136
122
MaxMsgSize : conf .MaxMsgSize ,
137
123
Timeout : conf .Timeout ,
@@ -169,7 +155,7 @@ func (h *WebsocketVncProxyHandler) delPeer(p *peer) {
169
155
}
170
156
171
157
func (h * WebsocketVncProxyHandler ) tick () {
172
- ticker := time .NewTicker (h .timeout * 8 / 10 )
158
+ ticker := time .NewTicker (h .conf . Timeout * 8 / 10 )
173
159
defer ticker .Stop ()
174
160
175
161
for {
@@ -205,43 +191,43 @@ func (h *WebsocketVncProxyHandler) ServeHTTP(w http.ResponseWriter, r *http.Requ
205
191
206
192
if strings .ToLower (r .Header .Get ("Upgrade" )) != "websocket" {
207
193
w .Header ().Set ("Connection" , "close" )
208
- h .logger . Errorf ("not websocket: client=%s, upgrade=%s" , r .RemoteAddr , r .Header .Get ("Upgrade" ))
194
+ h .conf . errorf ("not websocket: client=%s, upgrade=%s" , r .RemoteAddr , r .Header .Get ("Upgrade" ))
209
195
return
210
196
}
211
197
212
- backend , err := h .getBackend (r )
198
+ backend , err := h .conf . GetBackend (r )
213
199
if err != nil {
214
200
w .Header ().Set ("Connection" , "close" )
215
- h .logger . Errorf ("cannot get backend: client=%s, url=%s, err=%s" , r .RemoteAddr , r .RequestURI , err )
201
+ h .conf . errorf ("cannot get backend: client=%s, url=%s, err=%s" , r .RemoteAddr , r .RequestURI , err )
216
202
return
217
203
} else if backend == "" {
218
204
w .Header ().Set ("Connection" , "close" )
219
- h .logger . Errorf ("no backend: client=%s, url=%s" , r .RemoteAddr , r .RequestURI )
205
+ h .conf . errorf ("no backend: client=%s, url=%s" , r .RemoteAddr , r .RequestURI )
220
206
return
221
207
}
222
208
223
- ws , err := h .upgrader .Upgrade (w , r , h .upheader )
209
+ ws , err := h .upgrader .Upgrade (w , r , h .conf . UpgradeHeader )
224
210
if err != nil {
225
211
w .Header ().Set ("Connection" , "close" )
226
- h .logger . Errorf ("cannot upgrade to websocket: client=%s, err=%s" , r .RemoteAddr , err )
212
+ h .conf . errorf ("cannot upgrade to websocket: client=%s, err=%s" , r .RemoteAddr , err )
227
213
return
228
214
}
229
215
230
- h .logger . Infof ("connecting to the VNC backend '%s' for '%s', url=%s" , backend , r .RemoteAddr , r .RequestURI )
216
+ h .conf . infof ("connecting to the VNC backend '%s' for '%s', url=%s" , backend , r .RemoteAddr , r .RequestURI )
231
217
232
- c , err := net .DialTimeout ("tcp" , backend , h .timeout )
218
+ c , err := net .DialTimeout ("tcp" , backend , h .conf . Timeout )
233
219
if err != nil {
234
- h .logger . Errorf ("cannot connect to the VNC backend '%s': %s" , backend , err )
220
+ h .conf . errorf ("cannot connect to the VNC backend '%s': %s" , backend , err )
235
221
ws .SendClose (websocket .CloseAbnormalClosure , "cannot connect to the backend" )
236
222
return
237
223
}
238
- h .logger . Infof ("connected to the VNC backend '%s' for '%s', cost=%s" ,
224
+ h .conf . infof ("connected to the VNC backend '%s' for '%s', cost=%s" ,
239
225
backend , r .RemoteAddr , time .Since (starttime ).String ())
240
226
241
227
h .incConnection ()
242
228
defer h .decConnection ()
243
229
244
- peer := newPeer (ws , c .(* net.TCPConn ), starttime , h .logger )
230
+ peer := newPeer (ws , c .(* net.TCPConn ), starttime , h .conf )
245
231
h .addPeer (peer )
246
232
defer h .delPeer (peer )
247
233
0 commit comments