First commit
This commit is contained in:
78
listener.go
Normal file
78
listener.go
Normal 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
|
||||
}
|
||||
Reference in New Issue
Block a user