Refactored detection logic to include ports and a confidence score
This commit is contained in:
@@ -35,42 +35,43 @@ type connLimiter struct {
|
||||
acceptError atomic.Value
|
||||
}
|
||||
|
||||
func (l *connLimiter) init(readData, writeData []byte) {
|
||||
l.acceptOnce.Do(func() {
|
||||
func (limiter *connLimiter) init(readData, writeData []byte) {
|
||||
limiter.acceptOnce.Do(func() {
|
||||
var (
|
||||
dir Direction
|
||||
data []byte
|
||||
dir Direction
|
||||
data []byte
|
||||
srcPort, dstPort int
|
||||
)
|
||||
if readData != nil {
|
||||
// init called by initial read
|
||||
dir, data = Server, readData
|
||||
dir, data, srcPort, dstPort = Server, readData, getPortFromAddr(limiter.LocalAddr()), getPortFromAddr(limiter.RemoteAddr())
|
||||
} else {
|
||||
// init called by initial write
|
||||
dir, data = Client, writeData
|
||||
dir, data, srcPort, dstPort = Client, writeData, getPortFromAddr(limiter.RemoteAddr()), getPortFromAddr(limiter.LocalAddr())
|
||||
}
|
||||
protocol, _ := Detect(dir, data)
|
||||
if err := l.accept(dir, protocol); err != nil {
|
||||
l.acceptError.Store(err)
|
||||
protocol, _, _ := Detect(dir, data, srcPort, dstPort)
|
||||
if err := limiter.accept(dir, protocol); err != nil {
|
||||
limiter.acceptError.Store(err)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func (l *connLimiter) Read(p []byte) (n int, err error) {
|
||||
func (limiter *connLimiter) Read(p []byte) (n int, err error) {
|
||||
var ok bool
|
||||
if err, ok = l.acceptError.Load().(error); ok && err != nil {
|
||||
if err, ok = limiter.acceptError.Load().(error); ok && err != nil {
|
||||
return
|
||||
}
|
||||
if n, err = l.Conn.Read(p); n > 0 {
|
||||
l.init(p[:n], nil)
|
||||
if n, err = limiter.Conn.Read(p); n > 0 {
|
||||
limiter.init(p[:n], nil)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (l *connLimiter) Write(p []byte) (n int, err error) {
|
||||
l.init(nil, p)
|
||||
func (limiter *connLimiter) Write(p []byte) (n int, err error) {
|
||||
limiter.init(nil, p)
|
||||
var ok bool
|
||||
if err, ok = l.acceptError.Load().(error); ok && err != nil {
|
||||
if err, ok = limiter.acceptError.Load().(error); ok && err != nil {
|
||||
return
|
||||
}
|
||||
return l.Conn.Write(p)
|
||||
return limiter.Conn.Write(p)
|
||||
}
|
||||
|
Reference in New Issue
Block a user