44 lines
714 B
Go
44 lines
714 B
Go
package wrapper
|
|
|
|
import (
|
|
"errors"
|
|
"net"
|
|
"syscall"
|
|
|
|
limiter "github.com/go-gost/core/limiter/conn"
|
|
)
|
|
|
|
var (
|
|
errUnsupport = errors.New("unsupported operation")
|
|
)
|
|
|
|
// serverConn is a server side Conn with metrics supported.
|
|
type serverConn struct {
|
|
net.Conn
|
|
limiter limiter.Limiter
|
|
}
|
|
|
|
func WrapConn(limiter limiter.Limiter, c net.Conn) net.Conn {
|
|
if limiter == nil {
|
|
return c
|
|
}
|
|
return &serverConn{
|
|
Conn: c,
|
|
limiter: limiter,
|
|
}
|
|
}
|
|
|
|
func (c *serverConn) SyscallConn() (rc syscall.RawConn, err error) {
|
|
if sc, ok := c.Conn.(syscall.Conn); ok {
|
|
rc, err = sc.SyscallConn()
|
|
return
|
|
}
|
|
err = errUnsupport
|
|
return
|
|
}
|
|
|
|
func (c *serverConn) Close() error {
|
|
c.limiter.Allow(-1)
|
|
return c.Conn.Close()
|
|
}
|