First commit

This commit is contained in:
2025-12-10 05:17:46 +02:00
commit 8a186cfeb2
14 changed files with 743 additions and 0 deletions

78
listener.go Normal file
View File

@@ -0,0 +1,78 @@
package proxyprotocol
import (
"net"
)
const bufferSize = 1400
// SourceChecker check trusted address
type SourceChecker func(net.Addr) (bool, error)
// NewListener construct Listener
func NewListener(listener net.Listener) Listener {
return Listener{
Listener: listener,
}
}
// Listener implement net.Listener
type Listener struct {
net.Listener
}
// HeaderParserBuilderFunc wrap builder func into HeaderParserBuilder
type HeaderParserBuilderFunc func(logger Logger) HeaderParser
// Build implement HeaderParserBuilder for build func
func (funcBuilder HeaderParserBuilderFunc) Build(logger Logger) HeaderParser {
return funcBuilder(logger)
}
// TextHeaderParserBuilder build TextHeaderParser
var TextHeaderParserBuilder = HeaderParserBuilderFunc(func(logger Logger) HeaderParser {
return NewTextHeaderParser(logger)
})
// BinaryHeaderParserBuilder build BinaryHeaderParser
var BinaryHeaderParserBuilder = HeaderParserBuilderFunc(func(logger Logger) HeaderParser {
return NewBinaryHeaderParser(logger)
})
// StubHeaderParserBuilder build StubHeaderParser
var StubHeaderParserBuilder = HeaderParserBuilderFunc(func(logger Logger) HeaderParser {
return NewStubHeaderParser()
})
// Otherwise connection wrapped into Conn with header parser.
func (listener Listener) Accept() (net.Conn, error) {
rawConn, err := listener.Listener.Accept()
if err != nil {
return nil, err
}
logger := FallbackLogger{Logger: nil}
// trusted := true
// if listener.SourceChecker != nil {
// trusted, err = listener.SourceChecker(rawConn.RemoteAddr())
// if err != nil {
// logger.Printf("Source check error: %s", err)
// return nil, err
// }
// }
// if trusted {
// logger.Printf("Trusted connection")
// } else {
// logger.Printf("Not trusted connection")
// }
// NOTE strictly a proxy protocol implementation without plain connections
headerParser := NewFallbackHeaderParserBuilder(
TextHeaderParserBuilder,
BinaryHeaderParserBuilder,
// StubHeaderParserBuilder,
).Build(logger)
return NewConn(rawConn, headerParser), nil
}