Refactored detection logic to include ports and a confidence score

This commit is contained in:
2025-10-09 11:54:43 +02:00
parent 2081d684ed
commit 2ab59437fa
17 changed files with 795 additions and 129 deletions

View File

@@ -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)
}