diff options
author | Filip Navara <filip.navara@gmail.com> | 2019-05-03 11:47:56 +0200 |
---|---|---|
committer | Filip Navara <filip.navara@gmail.com> | 2019-05-03 11:47:56 +0200 |
commit | 79262fc996a067e062796754748d12de349aa5aa (patch) | |
tree | c8c103ab6e0c3799bd3d5890a57d48ea99be0919 /plumbing/transport/ssh/common.go | |
parent | 5f53b23103a04f97220f325772646b603c4dc25f (diff) | |
parent | e17ee112ca6cc7db0a732c0676b61511e84ec899 (diff) | |
download | go-git-79262fc996a067e062796754748d12de349aa5aa.tar.gz |
Merge remote-tracking branch 'origin/master' into commitgraph-obj
Diffstat (limited to 'plumbing/transport/ssh/common.go')
-rw-r--r-- | plumbing/transport/ssh/common.go | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/plumbing/transport/ssh/common.go b/plumbing/transport/ssh/common.go index e4a3d18..d320d43 100644 --- a/plumbing/transport/ssh/common.go +++ b/plumbing/transport/ssh/common.go @@ -2,6 +2,7 @@ package ssh import ( + "context" "fmt" "reflect" "strconv" @@ -11,6 +12,7 @@ import ( "github.com/kevinburke/ssh_config" "golang.org/x/crypto/ssh" + "golang.org/x/net/proxy" ) // DefaultClient is the default SSH client. @@ -115,7 +117,7 @@ func (c *command) connect() error { overrideConfig(c.config, config) - c.client, err = ssh.Dial("tcp", c.getHostWithPort(), config) + c.client, err = dial("tcp", c.getHostWithPort(), config) if err != nil { return err } @@ -130,6 +132,29 @@ func (c *command) connect() error { return nil } +func dial(network, addr string, config *ssh.ClientConfig) (*ssh.Client, error) { + var ( + ctx = context.Background() + cancel context.CancelFunc + ) + if config.Timeout > 0 { + ctx, cancel = context.WithTimeout(ctx, config.Timeout) + } else { + ctx, cancel = context.WithCancel(ctx) + } + defer cancel() + + conn, err := proxy.Dial(ctx, network, addr) + if err != nil { + return nil, err + } + c, chans, reqs, err := ssh.NewClientConn(conn, addr, config) + if err != nil { + return nil, err + } + return ssh.NewClient(c, chans, reqs), nil +} + func (c *command) getHostWithPort() string { if addr, found := c.doGetHostWithPortFromSSHConfig(); found { return addr |