From 3c68728e9fa87d540f54dcdf4710ac0e3cd18bd1 Mon Sep 17 00:00:00 2001 From: David Scott Date: Thu, 14 Apr 2016 16:02:02 +0100 Subject: [PATCH] proxy: remove assumption that frontend is a TCPListener We require the frontend to be a `net.Listener` and the `net.Conn` connection which are established must be type-switched to `Conn` to support the `CloseRead` and `CloseWrite` methods. Signed-off-by: David Scott --- alpine/packages/proxy/vendor/libproxy/proxy.go | 8 +++++++- alpine/packages/proxy/vendor/libproxy/tcp_proxy.go | 12 ++++-------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/alpine/packages/proxy/vendor/libproxy/proxy.go b/alpine/packages/proxy/vendor/libproxy/proxy.go index b825b972a..79bd6dbe7 100644 --- a/alpine/packages/proxy/vendor/libproxy/proxy.go +++ b/alpine/packages/proxy/vendor/libproxy/proxy.go @@ -24,13 +24,19 @@ type Proxy interface { BackendAddr() net.Addr } + + // NewProxy creates a Proxy according to the specified frontendAddr and backendAddr. func NewProxy(frontendAddr, backendAddr net.Addr) (Proxy, error) { switch frontendAddr.(type) { case *net.UDPAddr: return NewUDPProxy(frontendAddr.(*net.UDPAddr), backendAddr.(*net.UDPAddr)) case *net.TCPAddr: - return NewTCPProxy(frontendAddr.(*net.TCPAddr), backendAddr.(*net.TCPAddr)) + listener, err := net.Listen("tcp", frontendAddr.String()) + if err != nil { + return nil, err + } + return NewTCPProxy(listener, backendAddr.(*net.TCPAddr)) default: panic(fmt.Errorf("Unsupported protocol")) } diff --git a/alpine/packages/proxy/vendor/libproxy/tcp_proxy.go b/alpine/packages/proxy/vendor/libproxy/tcp_proxy.go index 6e36075de..659473fe3 100644 --- a/alpine/packages/proxy/vendor/libproxy/tcp_proxy.go +++ b/alpine/packages/proxy/vendor/libproxy/tcp_proxy.go @@ -19,22 +19,18 @@ type Conn interface { // TCPProxy is a proxy for TCP connections. It implements the Proxy interface to // handle TCP traffic forwarding between the frontend and backend addresses. type TCPProxy struct { - listener *net.TCPListener - frontendAddr *net.TCPAddr + listener net.Listener + frontendAddr net.Addr backendAddr *net.TCPAddr } // NewTCPProxy creates a new TCPProxy. -func NewTCPProxy(frontendAddr, backendAddr *net.TCPAddr) (*TCPProxy, error) { - listener, err := net.ListenTCP("tcp", frontendAddr) - if err != nil { - return nil, err - } +func NewTCPProxy(listener net.Listener, backendAddr *net.TCPAddr) (*TCPProxy, error) { // If the port in frontendAddr was 0 then ListenTCP will have a picked // a port to listen on, hence the call to Addr to get that actual port: return &TCPProxy{ listener: listener, - frontendAddr: listener.Addr().(*net.TCPAddr), + frontendAddr: listener.Addr(), backendAddr: backendAddr, }, nil }