summaryrefslogtreecommitdiff
path: root/transport.go
diff options
context:
space:
mode:
Diffstat (limited to 'transport.go')
-rw-r--r--transport.go74
1 files changed, 53 insertions, 21 deletions
diff --git a/transport.go b/transport.go
index 88700cf..34efa89 100644
--- a/transport.go
+++ b/transport.go
@@ -1,8 +1,8 @@
// +build go1.7 go1.8
/*
- * Minio Go Library for Amazon S3 Compatible Cloud Storage
- * Copyright 2017-2018 Minio, Inc.
+ * MinIO Go Library for Amazon S3 Compatible Cloud Storage
+ * Copyright 2017-2018 MinIO, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -20,31 +20,63 @@
package minio
import (
+ "crypto/tls"
+ "crypto/x509"
"net"
"net/http"
"time"
+
+ "golang.org/x/net/http2"
)
// DefaultTransport - this default transport is similar to
// http.DefaultTransport but with additional param DisableCompression
// is set to true to avoid decompressing content with 'gzip' encoding.
-var DefaultTransport http.RoundTripper = &http.Transport{
- Proxy: http.ProxyFromEnvironment,
- DialContext: (&net.Dialer{
- Timeout: 30 * time.Second,
- KeepAlive: 30 * time.Second,
- DualStack: true,
- }).DialContext,
- MaxIdleConns: 100,
- MaxIdleConnsPerHost: 100,
- IdleConnTimeout: 90 * time.Second,
- TLSHandshakeTimeout: 10 * time.Second,
- ExpectContinueTimeout: 1 * time.Second,
- // Set this value so that the underlying transport round-tripper
- // doesn't try to auto decode the body of objects with
- // content-encoding set to `gzip`.
- //
- // Refer:
- // https://golang.org/src/net/http/transport.go?h=roundTrip#L1843
- DisableCompression: true,
+var DefaultTransport = func(secure bool) (http.RoundTripper, error) {
+ tr := &http.Transport{
+ Proxy: http.ProxyFromEnvironment,
+ DialContext: (&net.Dialer{
+ Timeout: 30 * time.Second,
+ KeepAlive: 30 * time.Second,
+ }).DialContext,
+ MaxIdleConns: 1024,
+ MaxIdleConnsPerHost: 1024,
+ IdleConnTimeout: 90 * time.Second,
+ TLSHandshakeTimeout: 10 * time.Second,
+ ExpectContinueTimeout: 1 * time.Second,
+ // Set this value so that the underlying transport round-tripper
+ // doesn't try to auto decode the body of objects with
+ // content-encoding set to `gzip`.
+ //
+ // Refer:
+ // https://golang.org/src/net/http/transport.go?h=roundTrip#L1843
+ DisableCompression: true,
+ }
+
+ if secure {
+ rootCAs, _ := x509.SystemCertPool()
+ if rootCAs == nil {
+ // In some systems (like Windows) system cert pool is
+ // not supported or no certificates are present on the
+ // system - so we create a new cert pool.
+ rootCAs = x509.NewCertPool()
+ }
+
+ // Keep TLS config.
+ tlsConfig := &tls.Config{
+ RootCAs: rootCAs,
+ // Can't use SSLv3 because of POODLE and BEAST
+ // Can't use TLSv1.0 because of POODLE and BEAST using CBC cipher
+ // Can't use TLSv1.1 because of RC4 cipher usage
+ MinVersion: tls.VersionTLS12,
+ }
+ tr.TLSClientConfig = tlsConfig
+
+ // Because we create a custom TLSClientConfig, we have to opt-in to HTTP/2.
+ // See https://github.com/golang/go/issues/14275
+ if err := http2.ConfigureTransport(tr); err != nil {
+ return nil, err
+ }
+ }
+ return tr, nil
}