79 lines
2.0 KiB
Go
79 lines
2.0 KiB
Go
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 supports all the parserbuilders out of the box
|
|
headerParser := NewFallbackHeaderParserBuilder(
|
|
TextHeaderParserBuilder,
|
|
BinaryHeaderParserBuilder,
|
|
StubHeaderParserBuilder,
|
|
).Build(logger)
|
|
|
|
return NewConn(rawConn, headerParser), nil
|
|
}
|