core: Add Network WaitForProxyDialer method
This commit is contained in:
parent
fe117d10c8
commit
ec8d6f5430
|
@ -7,6 +7,7 @@ import (
|
|||
"github.com/special/notricochet/rpc"
|
||||
"github.com/yawning/bulb"
|
||||
bulbutils "github.com/yawning/bulb/utils"
|
||||
"golang.org/x/net/context"
|
||||
"golang.org/x/net/proxy"
|
||||
"log"
|
||||
"net"
|
||||
|
@ -221,7 +222,7 @@ func chooseSocksAddress(addresses []string, controlAddress string) (socksAddress
|
|||
return selected, nil
|
||||
}
|
||||
|
||||
func (n *Network) GetProxyDialer() (proxy.Dialer, error) {
|
||||
func (n *Network) GetProxyDialer(forward proxy.Dialer) (proxy.Dialer, error) {
|
||||
n.controlMutex.Lock()
|
||||
socks := n.socksAddress
|
||||
n.controlMutex.Unlock()
|
||||
|
@ -230,7 +231,42 @@ func (n *Network) GetProxyDialer() (proxy.Dialer, error) {
|
|||
return nil, errors.New("No valid SOCKS configuration")
|
||||
}
|
||||
|
||||
return proxy.SOCKS5(socks.Network, socks.Address, nil, nil)
|
||||
return proxy.SOCKS5(socks.Network, socks.Address, nil, forward)
|
||||
}
|
||||
|
||||
func (n *Network) WaitForProxyDialer(forward proxy.Dialer, c context.Context) (proxy.Dialer, error) {
|
||||
var monitor <-chan interface{}
|
||||
for {
|
||||
// Check if there's a proxy address available
|
||||
n.controlMutex.Lock()
|
||||
socks := n.socksAddress
|
||||
n.controlMutex.Unlock()
|
||||
|
||||
if socks.IsValid() {
|
||||
return proxy.SOCKS5(socks.Network, socks.Address, nil, forward)
|
||||
}
|
||||
|
||||
if monitor == nil {
|
||||
// Subscribe to connectivity change events; this is done after the first
|
||||
// check to avoid overhead for the common case
|
||||
monitor = n.EventMonitor().Subscribe(20)
|
||||
defer n.EventMonitor().Unsubscribe(monitor)
|
||||
// Check again before blocking on the monitor now that we're subscribed,
|
||||
// in case the state changed since unlocking the mutex.
|
||||
continue
|
||||
}
|
||||
|
||||
select {
|
||||
case _, ok := <-monitor:
|
||||
if !ok {
|
||||
return nil, errors.New("Event monitor closed")
|
||||
}
|
||||
case <-c.Done():
|
||||
return nil, c.Err()
|
||||
}
|
||||
}
|
||||
|
||||
return nil, errors.New("No valid SOCKS configuration")
|
||||
}
|
||||
|
||||
// Return the control connection, blocking until connected if necessary
|
||||
|
|
Loading…
Reference in New Issue