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/special/notricochet/rpc" | ||||||
| 	"github.com/yawning/bulb" | 	"github.com/yawning/bulb" | ||||||
| 	bulbutils "github.com/yawning/bulb/utils" | 	bulbutils "github.com/yawning/bulb/utils" | ||||||
|  | 	"golang.org/x/net/context" | ||||||
| 	"golang.org/x/net/proxy" | 	"golang.org/x/net/proxy" | ||||||
| 	"log" | 	"log" | ||||||
| 	"net" | 	"net" | ||||||
|  | @ -221,7 +222,7 @@ func chooseSocksAddress(addresses []string, controlAddress string) (socksAddress | ||||||
| 	return selected, nil | 	return selected, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (n *Network) GetProxyDialer() (proxy.Dialer, error) { | func (n *Network) GetProxyDialer(forward proxy.Dialer) (proxy.Dialer, error) { | ||||||
| 	n.controlMutex.Lock() | 	n.controlMutex.Lock() | ||||||
| 	socks := n.socksAddress | 	socks := n.socksAddress | ||||||
| 	n.controlMutex.Unlock() | 	n.controlMutex.Unlock() | ||||||
|  | @ -230,7 +231,42 @@ func (n *Network) GetProxyDialer() (proxy.Dialer, error) { | ||||||
| 		return nil, errors.New("No valid SOCKS configuration") | 		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
 | // Return the control connection, blocking until connected if necessary
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue