From 50b4985199960e434024d364559916ca531a01be Mon Sep 17 00:00:00 2001 From: Tom Wilkie Date: Wed, 15 Feb 2017 18:58:17 +0000 Subject: [PATCH] Add a method to expose the proxy protocol destination address. --- protocol.go | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/protocol.go b/protocol.go index dfa6eb0..3cd32d4 100644 --- a/protocol.go +++ b/protocol.go @@ -99,6 +99,11 @@ func (p *Conn) LocalAddr() net.Addr { return p.conn.LocalAddr() } +func (p *Conn) DstAddr() net.Addr { + p.checkPrefixOnce() + return p.dstAddr +} + // RemoteAddr returns the address of the client if the proxy // protocol is being used, otherwise just returns the address of // the socket peer. If there is an error parsing the header, the @@ -107,13 +112,7 @@ func (p *Conn) LocalAddr() net.Addr { // client is slow. Using a Deadline is recommended if this is called // before Read() func (p *Conn) RemoteAddr() net.Addr { - p.once.Do(func() { - if err := p.checkPrefix(); err != nil && err != io.EOF { - log.Printf("[ERR] Failed to read proxy prefix: %v", err) - p.Close() - p.bufReader = bufio.NewReader(p.conn) - } - }) + p.checkPrefixOnce() if p.srcAddr != nil { return p.srcAddr } @@ -132,6 +131,16 @@ func (p *Conn) SetWriteDeadline(t time.Time) error { return p.conn.SetWriteDeadline(t) } +func (p *Conn) checkPrefixOnce() { + p.once.Do(func() { + if err := p.checkPrefix(); err != nil && err != io.EOF { + log.Printf("[ERR] Failed to read proxy prefix: %v", err) + p.Close() + p.bufReader = bufio.NewReader(p.conn) + } + }) +} + func (p *Conn) checkPrefix() error { if p.proxyHeaderTimeout != 0 { readDeadLine := time.Now().Add(p.proxyHeaderTimeout)