cleanhttp.go raw

   1  package cleanhttp
   2  
   3  import (
   4  	"net"
   5  	"net/http"
   6  	"runtime"
   7  	"time"
   8  )
   9  
  10  // DefaultTransport returns a new http.Transport with similar default values to
  11  // http.DefaultTransport, but with idle connections and keepalives disabled.
  12  func DefaultTransport() *http.Transport {
  13  	transport := DefaultPooledTransport()
  14  	transport.DisableKeepAlives = true
  15  	transport.MaxIdleConnsPerHost = -1
  16  	return transport
  17  }
  18  
  19  // DefaultPooledTransport returns a new http.Transport with similar default
  20  // values to http.DefaultTransport. Do not use this for transient transports as
  21  // it can leak file descriptors over time. Only use this for transports that
  22  // will be re-used for the same host(s).
  23  func DefaultPooledTransport() *http.Transport {
  24  	transport := &http.Transport{
  25  		Proxy: http.ProxyFromEnvironment,
  26  		DialContext: (&net.Dialer{
  27  			Timeout:   30 * time.Second,
  28  			KeepAlive: 30 * time.Second,
  29  			DualStack: true,
  30  		}).DialContext,
  31  		MaxIdleConns:          100,
  32  		IdleConnTimeout:       90 * time.Second,
  33  		TLSHandshakeTimeout:   10 * time.Second,
  34  		ExpectContinueTimeout: 1 * time.Second,
  35  		ForceAttemptHTTP2:     true,
  36  		MaxIdleConnsPerHost:   runtime.GOMAXPROCS(0) + 1,
  37  	}
  38  	return transport
  39  }
  40  
  41  // DefaultClient returns a new http.Client with similar default values to
  42  // http.Client, but with a non-shared Transport, idle connections disabled, and
  43  // keepalives disabled.
  44  func DefaultClient() *http.Client {
  45  	return &http.Client{
  46  		Transport: DefaultTransport(),
  47  	}
  48  }
  49  
  50  // DefaultPooledClient returns a new http.Client with similar default values to
  51  // http.Client, but with a shared Transport. Do not use this function for
  52  // transient clients as it can leak file descriptors over time. Only use this
  53  // for clients that will be re-used for the same host(s).
  54  func DefaultPooledClient() *http.Client {
  55  	return &http.Client{
  56  		Transport: DefaultPooledTransport(),
  57  	}
  58  }
  59