// Creates a new HTTP connection pool using the given address and pool parameters. // // 'addr' is a net.Dial()-style 'host:port' destination for making the TCP connection for // HTTP/HTTPS traffic. It will be used as the hostname by default for virtual hosting // and SSL certificate validation; if you'd like to use a different hostname, // set params.HostHeader. func NewSimplePool(addr string, params ConnectionParams) *SimplePool { pool := &SimplePool{ addr: addr, params: params, client: new(http.Client), } // setup HTTP transport transport := new(http.Transport) transport.ResponseHeaderTimeout = params.ResponseTimeout transport.MaxIdleConnsPerHost = params.MaxIdle transport.Proxy = http.ProxyFromEnvironment if params.Dial == nil { // dialTimeout could only be used in none proxy requests since it talks directly // to pool.addr if getenvEitherCase("HTTP_PROXY") == "" { transport.Dial = pool.dialTimeout } } else { transport.Dial = params.Dial } pool.transport = transport pool.client.Transport = transport if params.UseSSL && params.SkipVerifySSL { transport.TLSClientConfig = &tls.Config{ InsecureSkipVerify: true, } } return pool }
// Creates a new HTTP connection pool using the given address and pool parameters. // // 'addr' is a net.Dial()-style 'host:port' destination for making the TCP connection for // HTTP/HTTPS traffic. It will be used as the hostname by default for virtual hosting // and SSL certificate validation; if you'd like to use a different hostname, // set params.HostHeader. func NewSimplePool(addr string, params ConnectionParams) *SimplePool { pool := &SimplePool{ addr: addr, params: params, client: new(http.Client), } // It's desirable to enforce the timeout at the client-level since it // includes the connection time, redirects and the time to finish reading // the full response. Unlike ResponseHeaderTimeout supported by // `http.Transport` which merely accounts for the timeout to receive the // first response header byte. It ignores the time to send the request or // the time to read the full response. pool.client.Timeout = params.ResponseTimeout // setup HTTP transport transport := new(http.Transport) transport.ResponseHeaderTimeout = params.ResponseTimeout transport.MaxIdleConnsPerHost = params.MaxIdle if params.Proxy != nil { transport.Proxy = params.Proxy } else { transport.Proxy = http.ProxyFromEnvironment } if params.Dial == nil { // dialTimeout could only be used in none proxy requests since it talks directly // to pool.addr if getenvEitherCase("HTTP_PROXY") == "" && params.Proxy == nil { transport.Dial = pool.dialTimeout } } else { transport.Dial = params.Dial } pool.transport = transport pool.client.Transport = transport if params.UseSSL && params.SkipVerifySSL { transport.TLSClientConfig = &tls.Config{ InsecureSkipVerify: true, } } return pool }
func newHttpTransporter() (trans *httpTransporter) { tr := new(http.Transport) tr.DisableCompression = true tr.DisableKeepAlives = false tr.MaxIdleConnsPerHost = 4 jar := cookieJar if DisableGlobalCookie { jar, _ = cookiejar.New(nil) } client := new(http.Client) client.Jar = jar client.Transport = tr trans = new(httpTransporter) trans.Client = client trans.Header = new(http.Header) return }
func newHttpClient(config *Config) *http.Client { transport := new(http.Transport) if defaultTransport, ok := http.DefaultTransport.(*http.Transport); ok { transport.Proxy = defaultTransport.Proxy transport.Dial = defaultTransport.Dial transport.TLSHandshakeTimeout = defaultTransport.TLSHandshakeTimeout } if config.ProxyHost != "" { host := config.ProxyHost if config.ProxyPort > 0 { host += ":" + strconv.Itoa(config.ProxyPort) } proxyUrl, err := url.Parse(util.HostToURL(host, "http")) if err != nil { panic(err) } transport.Proxy = http.ProxyURL(proxyUrl) } /* if c.ConnectionTimeout > 0 { transport.TLSHandshakeTimeout = c.ConnectionTimeout } */ if config.MaxConnections > 0 { transport.MaxIdleConnsPerHost = config.MaxConnections } return &http.Client{ Transport: transport, Timeout: config.Timeout, } }
// Transport returns an http.RoundTripper with the correct timeouts func (ci *ConfigInfo) Transport() http.RoundTripper { noTransport.Do(func() { // Start with a sensible set of defaults then override. // This also means we get new stuff when it gets added to go t := new(http.Transport) setDefaults(t, http.DefaultTransport.(*http.Transport)) t.Proxy = http.ProxyFromEnvironment t.MaxIdleConnsPerHost = 4 * (ci.Checkers + ci.Transfers + 1) t.TLSHandshakeTimeout = ci.ConnectTimeout t.ResponseHeaderTimeout = ci.Timeout t.TLSClientConfig = &tls.Config{InsecureSkipVerify: ci.InsecureSkipVerify} t.DisableCompression = *noGzip // Set in http_old.go initTransport // t.Dial // Set in http_new.go initTransport // t.DialContext // t.IdelConnTimeout // t.ExpectContinueTimeout ci.initTransport(t) // Wrap that http.Transport in our own transport transport = NewTransport(t, ci.DumpHeaders, ci.DumpBodies) }) return transport }