diff --git a/cmd/strelaysrv/main.go b/cmd/strelaysrv/main.go index 8afc73c1..3a666349 100644 --- a/cmd/strelaysrv/main.go +++ b/cmd/strelaysrv/main.go @@ -86,6 +86,12 @@ var ( pprofEnabled bool ) +// httpClient is the HTTP client we use for outbound requests. It has a +// timeout and may get further options set during initialization. +var httpClient = &http.Client{ + Timeout: 30 * time.Second, +} + func main() { log.SetFlags(log.Lshortfile | log.LstdFlags) @@ -129,14 +135,14 @@ func main() { if err != nil { log.Fatal(err) } + if laddr.IP != nil && !laddr.IP.IsUnspecified() { + // We bind to a specific address. Our outgoing HTTP requests should + // also come from that address. laddr.Port = 0 - transport, ok := http.DefaultTransport.(*http.Transport) - if ok { - transport.Dial = (&net.Dialer{ - Timeout: 30 * time.Second, - LocalAddr: laddr, - }).Dial + boundDialer := &net.Dialer{LocalAddr: laddr} + httpClient.Transport = &http.Transport{ + DialContext: boundDialer.DialContext, } } diff --git a/cmd/strelaysrv/pool.go b/cmd/strelaysrv/pool.go index 4a92ef34..56f85e26 100644 --- a/cmd/strelaysrv/pool.go +++ b/cmd/strelaysrv/pool.go @@ -7,7 +7,6 @@ import ( "encoding/json" "io/ioutil" "log" - "net/http" "net/url" "time" ) @@ -27,7 +26,7 @@ func poolHandler(pool string, uri *url.URL, mapping mapping) { uriCopy.String(), }) - resp, err := http.Post(pool, "application/json", &b) + resp, err := httpClient.Post(pool, "application/json", &b) if err != nil { log.Println("Error joining pool", pool, err) } else if resp.StatusCode == 500 {