Skip to content

Commit 4463b38

Browse files
authored
refactor: use a noop metric implementation if no metrics are provided (#210)
* refactor: make connection metrics optional * Create noop metrics if nil. * Revert some more changes. * Add noop implementation for `ShadowsocksConnMetrics`.
1 parent adf8a31 commit 4463b38

File tree

3 files changed

+28
-1
lines changed

3 files changed

+28
-1
lines changed

service/shadowsocks.go

+9
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,12 @@ import "time"
2020
type ShadowsocksConnMetrics interface {
2121
AddCipherSearch(accessKeyFound bool, timeToCipher time.Duration)
2222
}
23+
24+
// NoOpShadowsocksConnMetrics is a [ShadowsocksConnMetrics] that doesn't do anything. Useful in tests
25+
// or if you don't want to track metrics.
26+
type NoOpShadowsocksConnMetrics struct{}
27+
28+
var _ ShadowsocksConnMetrics = (*NoOpShadowsocksConnMetrics)(nil)
29+
30+
func (m *NoOpShadowsocksConnMetrics) AddCipherSearch(accessKeyFound bool, timeToCipher time.Duration) {
31+
}

service/tcp.go

+6
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,9 @@ type StreamAuthenticateFunc func(clientConn transport.StreamConn) (string, trans
117117
// NewShadowsocksStreamAuthenticator creates a stream authenticator that uses Shadowsocks.
118118
// TODO(fortuna): Offer alternative transports.
119119
func NewShadowsocksStreamAuthenticator(ciphers CipherList, replayCache *ReplayCache, metrics ShadowsocksConnMetrics) StreamAuthenticateFunc {
120+
if metrics == nil {
121+
metrics = &NoOpShadowsocksConnMetrics{}
122+
}
120123
return func(clientConn transport.StreamConn) (string, transport.StreamConn, *onet.ConnectionError) {
121124
// Find the cipher and acess key id.
122125
cipherEntry, clientReader, clientSalt, timeToCipher, keyErr := findAccessKey(clientConn, remoteIP(clientConn), ciphers)
@@ -241,6 +244,9 @@ func StreamServe(accept StreamAcceptFunc, handle StreamHandleFunc) {
241244
}
242245

243246
func (h *streamHandler) Handle(ctx context.Context, clientConn transport.StreamConn, connMetrics TCPConnMetrics) {
247+
if connMetrics == nil {
248+
connMetrics = &NoOpTCPConnMetrics{}
249+
}
244250
var proxyMetrics metrics.ProxyMetrics
245251
measuredClientConn := metrics.MeasureConn(clientConn, &proxyMetrics.ProxyClient, &proxyMetrics.ClientProxy)
246252
connStart := time.Now()

service/udp.go

+13-1
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,19 @@ type packetHandler struct {
8989

9090
// NewPacketHandler creates a UDPService
9191
func NewPacketHandler(natTimeout time.Duration, cipherList CipherList, m UDPMetrics, ssMetrics ShadowsocksConnMetrics) PacketHandler {
92-
return &packetHandler{natTimeout: natTimeout, ciphers: cipherList, m: m, ssm: ssMetrics, targetIPValidator: onet.RequirePublicIP}
92+
if m == nil {
93+
m = &NoOpUDPMetrics{}
94+
}
95+
if ssMetrics == nil {
96+
ssMetrics = &NoOpShadowsocksConnMetrics{}
97+
}
98+
return &packetHandler{
99+
natTimeout: natTimeout,
100+
ciphers: cipherList,
101+
m: m,
102+
ssm: ssMetrics,
103+
targetIPValidator: onet.RequirePublicIP,
104+
}
93105
}
94106

95107
// PacketHandler is a running UDP shadowsocks proxy that can be stopped.

0 commit comments

Comments
 (0)