Skip to content

Commit 647550d

Browse files
committed
use log functions instead of interface
1 parent b8c0d46 commit 647550d

File tree

1 file changed

+35
-49
lines changed

1 file changed

+35
-49
lines changed

vncproxy/handler.go

Lines changed: 35 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ import (
2828
)
2929

3030
type peer struct {
31-
logger Logger
31+
ProxyConfig
32+
3233
source *websocket.Websocket
3334
target *net.TCPConn
3435
closed int32
@@ -39,37 +40,20 @@ func (p *peer) Close(addr string, err error) {
3940
if atomic.CompareAndSwapInt32(&p.closed, 0, 1) {
4041
p.target.Close()
4142
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",
4344
p.source.RemoteAddr().String(), p.target.RemoteAddr().String(),
4445
time.Since(p.start).String(), addr, err)
4546
}
4647
}
4748

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}
5851
}
5952

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-
7053
// ProxyConfig is used to configure WsVncProxyHandler.
7154
type ProxyConfig struct {
72-
Logger Logger
55+
ErrorLog func(format string, args ...interface{})
56+
InfoLog func(format string, args ...interface{})
7357

7458
// MaxMsgSize is used to control the size of the websocket message.
7559
// The default is 64KB.
@@ -94,18 +78,27 @@ type ProxyConfig struct {
9478
GetBackend func(r *http.Request) (addr string, err error)
9579
}
9680

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+
9793
// WebsocketVncProxyHandler is a VNC proxy handler based on websocket.
9894
type WebsocketVncProxyHandler struct {
9995
connection int64
10096
peers map[*peer]struct{}
10197
exit chan struct{}
10298
lock sync.RWMutex
10399

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
109102
}
110103

111104
// NewWebsocketVncProxyHandler returns a new WebsocketVncProxyHandler.
@@ -121,17 +114,10 @@ func NewWebsocketVncProxyHandler(conf ProxyConfig) *WebsocketVncProxyHandler {
121114
if conf.Timeout <= 0 {
122115
conf.Timeout = time.Second * 10
123116
}
124-
if conf.Logger == nil {
125-
conf.Logger = NewNoopLogger()
126-
}
127117

128118
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),
135121
upgrader: websocket.Upgrader{
136122
MaxMsgSize: conf.MaxMsgSize,
137123
Timeout: conf.Timeout,
@@ -169,7 +155,7 @@ func (h *WebsocketVncProxyHandler) delPeer(p *peer) {
169155
}
170156

171157
func (h *WebsocketVncProxyHandler) tick() {
172-
ticker := time.NewTicker(h.timeout * 8 / 10)
158+
ticker := time.NewTicker(h.conf.Timeout * 8 / 10)
173159
defer ticker.Stop()
174160

175161
for {
@@ -205,43 +191,43 @@ func (h *WebsocketVncProxyHandler) ServeHTTP(w http.ResponseWriter, r *http.Requ
205191

206192
if strings.ToLower(r.Header.Get("Upgrade")) != "websocket" {
207193
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"))
209195
return
210196
}
211197

212-
backend, err := h.getBackend(r)
198+
backend, err := h.conf.GetBackend(r)
213199
if err != nil {
214200
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)
216202
return
217203
} else if backend == "" {
218204
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)
220206
return
221207
}
222208

223-
ws, err := h.upgrader.Upgrade(w, r, h.upheader)
209+
ws, err := h.upgrader.Upgrade(w, r, h.conf.UpgradeHeader)
224210
if err != nil {
225211
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)
227213
return
228214
}
229215

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)
231217

232-
c, err := net.DialTimeout("tcp", backend, h.timeout)
218+
c, err := net.DialTimeout("tcp", backend, h.conf.Timeout)
233219
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)
235221
ws.SendClose(websocket.CloseAbnormalClosure, "cannot connect to the backend")
236222
return
237223
}
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",
239225
backend, r.RemoteAddr, time.Since(starttime).String())
240226

241227
h.incConnection()
242228
defer h.decConnection()
243229

244-
peer := newPeer(ws, c.(*net.TCPConn), starttime, h.logger)
230+
peer := newPeer(ws, c.(*net.TCPConn), starttime, h.conf)
245231
h.addPeer(peer)
246232
defer h.delPeer(peer)
247233

0 commit comments

Comments
 (0)