diff --git a/http.go b/http.go index 0b2ef57..9de001b 100644 --- a/http.go +++ b/http.go @@ -28,6 +28,7 @@ import ( "io" "io/ioutil" "net/http" + "net/url" "reflect" "runtime" "unsafe" @@ -142,8 +143,32 @@ func (self *ManagedTransport) ensureClient() error { return nil } + runtime.LockOSThread() + defer runtime.UnlockOSThread() + + var cpopts C.git_proxy_options + if ret := C.git_transport_smart_proxy_options(&cpopts, self.owner); ret < 0 { + return MakeGitError(ret) + } + + var proxyFn func(*http.Request) (*url.URL, error) + proxyOpts := proxyOptionsFromC(&cpopts) + switch proxyOpts.Type { + case ProxyTypeNone: + proxyFn = nil + case ProxyTypeAuto: + proxyFn = http.ProxyFromEnvironment + case ProxyTypeSpecified: + parsedUrl, err := url.Parse(proxyOpts.Url) + if err != nil { + return err + } + + proxyFn = http.ProxyURL(parsedUrl) + } + transport := &http.Transport{ - Proxy: http.ProxyFromEnvironment, + Proxy: proxyFn, } self.client = &http.Client{Transport: transport} diff --git a/remote.go b/remote.go index b4b1dd7..07ff291 100644 --- a/remote.go +++ b/remote.go @@ -141,6 +141,13 @@ type ProxyOptions struct { Url string } +func proxyOptionsFromC(copts *C.git_proxy_options) ProxyOptions { + return ProxyOptions{ + Type: ProxyType(copts._type), + Url: C.GoString(copts.url), + } +} + type Remote struct { ptr *C.git_remote callbacks RemoteCallbacks