···12891289 return nil, fmt.Errorf("url.Parse(%v): %v", conf.root, err)
12901290 }
1291129112921292+ rootURL = addDefaultPort(rootURL)
12931293+12921294 // Tune GOMAXPROCS to match Linux container CPU quota.
12931295 _, _ = maxprocs.Set()
12941296···14421444 ctx = metadata.AppendToOutgoingContext(ctx, "X-Sourcegraph-Actor-UID", "internal")
14431445 return streamer(ctx, desc, cc, method, opts...)
14441446 }
14471447+}
14481448+14491449+// addDefaultPort adds a default port to a URL if one is not specified.
14501450+//
14511451+// If the URL scheme is "http" and no port is specified, "80" is used.
14521452+// If the scheme is "https", "443" is used.
14531453+//
14541454+// The original URL is not mutated. A copy is modified and returned.
14551455+func addDefaultPort(original *url.URL) *url.URL {
14561456+ if original == nil {
14571457+ return nil // don't panic
14581458+ }
14591459+14601460+ if !original.IsAbs() {
14611461+ return original // don't do anything if the URL doesn't look like a remote URL
14621462+ }
14631463+14641464+ if original.Scheme == "http" && original.Port() == "" {
14651465+ u := cloneURL(original)
14661466+ u.Host = net.JoinHostPort(u.Host, "80")
14671467+ return u
14681468+ }
14691469+14701470+ if original.Scheme == "https" && original.Port() == "" {
14711471+ u := cloneURL(original)
14721472+ u.Host = net.JoinHostPort(u.Host, "443")
14731473+ return u
14741474+ }
14751475+14761476+ return original
14771477+}
14781478+14791479+// cloneURL returns a copy of the URL. It is safe to mutate the returned URL.
14801480+// This is copied from net/http/clone.go
14811481+func cloneURL(u *url.URL) *url.URL {
14821482+ if u == nil {
14831483+ return nil
14841484+ }
14851485+ u2 := new(url.URL)
14861486+ *u2 = *u
14871487+ if u.User != nil {
14881488+ u2.User = new(url.Userinfo)
14891489+ *u2.User = *u.User
14901490+ }
14911491+ return u2
14451492}
1446149314471494func main() {