diff --git a/config.go b/config.go index 3b7a7d5..29ed421 100644 --- a/config.go +++ b/config.go @@ -53,6 +53,9 @@ type config struct { Username string `short:"u" long:"username" description:"Username for btcd authorization"` Password string `short:"P" long:"password" description:"Password for btcd authorization"` MainNet bool `long:"mainnet" description:"*DISABLED* Use the main Bitcoin network (default testnet3)"` + Proxy string `long:"proxy" description:"Connect via SOCKS5 proxy (eg. 127.0.0.1:9050)"` + ProxyUser string `long:"proxyuser" description:"Username for proxy server"` + ProxyPass string `long:"proxypass" default-mask:"-" description:"Password for proxy server"` } // updateConfigWithActiveParams update the passed config with parameters diff --git a/sockets.go b/sockets.go index a27a189..2f38117 100644 --- a/sockets.go +++ b/sockets.go @@ -28,6 +28,7 @@ import ( "github.com/conformal/btcwallet/wallet" "github.com/conformal/btcwire" "github.com/conformal/btcws" + "github.com/conformal/go-socks" "net" "net/http" "sync" @@ -600,9 +601,28 @@ func BtcdConnect(certificates []byte, reply chan error) { config.Header.Add("Authorization", auth) // Attempt to connect to running btcd instance. Bail if it fails. - btcdws, err := websocket.DialConfig(config) - if err != nil { - log.Errorf("%s", err) + var btcdws *websocket.Conn + var cerr error + if cfg.Proxy != "" { + proxy := &socks.Proxy{ + Addr: cfg.Proxy, + Username: cfg.ProxyUser, + Password: cfg.ProxyPass, + } + conn, err := proxy.Dial("tcp", cfg.Connect) + if err != nil { + log.Warnf("Error connecting to proxy: %v", err) + reply <- ErrConnRefused + return + } + + tlsConn := tls.Client(conn, config.TlsConfig) + btcdws, cerr = websocket.NewClient(config, tlsConn) + } else { + btcdws, cerr = websocket.DialConfig(config) + } + if cerr != nil { + log.Errorf("%s", cerr) reply <- ErrConnRefused return }