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 }