From ff985f910b342d64daab219b20718d7ed9dd84a3 Mon Sep 17 00:00:00 2001 From: onionjake Date: Thu, 2 Nov 2017 14:26:45 -0600 Subject: [PATCH] add support for using socks proxy --- jiracli/cli.go | 4 ++++ jiracli/socksproxy.go | 31 +++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 jiracli/socksproxy.go diff --git a/jiracli/cli.go b/jiracli/cli.go index 0825bc13..6ea0ae41 100644 --- a/jiracli/cli.go +++ b/jiracli/cli.go @@ -35,6 +35,7 @@ type GlobalOptions struct { PasswordSource figtree.StringOption `yaml:"password-source,omitempty" json:"password-source,omitempty"` Quiet figtree.BoolOption `yaml:"quiet,omitempty" json:"quiet,omitempty"` UnixProxy figtree.StringOption `yaml:"unixproxy,omitempty" json:"unixproxy,omitempty"` + SocksProxy figtree.StringOption `yaml:"socksproxy,omitempty" json:"socksproxy,omitempty"` User figtree.StringOption `yaml:"user,omitempty" json:"user,omitempty"` } @@ -73,6 +74,7 @@ func Register(app *kingpin.Application, o *oreo.Client, fig *figtree.FigTree, re app.Flag("insecure", "Disable TLS certificate verification").Short('k').SetValue(&globals.Insecure) app.Flag("quiet", "Suppress output to console").Short('Q').SetValue(&globals.Quiet) app.Flag("unixproxy", "Path for a unix-socket proxy").SetValue(&globals.UnixProxy) + app.Flag("socksproxy", "Address for a socks proxy").SetValue(&globals.SocksProxy) app.Flag("user", "Login name used for authentication with Jira service").Short('u').SetValue(&globals.User) app.PreAction(func(_ *kingpin.ParseContext) error { @@ -87,6 +89,8 @@ func Register(app *kingpin.Application, o *oreo.Client, fig *figtree.FigTree, re } if globals.UnixProxy.Value != "" { o = o.WithTransport(unixProxy(globals.UnixProxy.Value)) + } else if globals.SocksProxy.Value != "" { + o = o.WithTransport(socksProxy(globals.SocksProxy.Value)) } return nil }) diff --git a/jiracli/socksproxy.go b/jiracli/socksproxy.go new file mode 100644 index 00000000..8c407897 --- /dev/null +++ b/jiracli/socksproxy.go @@ -0,0 +1,31 @@ +package jiracli + +import ( + "net" + "net/http" + "time" + + "golang.org/x/net/proxy" +) + +func socksProxy(address string) *http.Transport { + return newSocksProxyTransport(address) +} + +func newSocksProxyTransport(address string) *http.Transport { + dialer, err := proxy.SOCKS5("tcp", address, nil, proxy.Direct) + if err != nil { + // TODO: whoops, return error? + panic(err) + } + dial := func(network, addr string) (net.Conn, error) { + return dialer.Dial(network, addr) + } + + return &http.Transport{ + Dial: dial, + DisableKeepAlives: true, + ResponseHeaderTimeout: 30 * time.Second, + ExpectContinueTimeout: 10 * time.Second, + } +}