github.com/aavshr/aws-sdk-go@v1.41.3/aws/config.go (about)

     1  package aws
     2  
     3  import (
     4  	"net/http"
     5  	"time"
     6  
     7  	"github.com/aavshr/aws-sdk-go/aws/credentials"
     8  	"github.com/aavshr/aws-sdk-go/aws/endpoints"
     9  )
    10  
    11  // UseServiceDefaultRetries instructs the config to use the service's own
    12  // default number of retries. This will be the default action if
    13  // Config.MaxRetries is nil also.
    14  const UseServiceDefaultRetries = -1
    15  
    16  // RequestRetryer is an alias for a type that implements the request.Retryer
    17  // interface.
    18  type RequestRetryer interface{}
    19  
    20  // A Config provides service configuration for service clients. By default,
    21  // all clients will use the defaults.DefaultConfig structure.
    22  //
    23  //     // Create Session with MaxRetries configuration to be shared by multiple
    24  //     // service clients.
    25  //     sess := session.Must(session.NewSession(&aws.Config{
    26  //         MaxRetries: aws.Int(3),
    27  //     }))
    28  //
    29  //     // Create S3 service client with a specific Region.
    30  //     svc := s3.New(sess, &aws.Config{
    31  //         Region: aws.String("us-west-2"),
    32  //     })
    33  type Config struct {
    34  	// Enables verbose error printing of all credential chain errors.
    35  	// Should be used when wanting to see all errors while attempting to
    36  	// retrieve credentials.
    37  	CredentialsChainVerboseErrors *bool
    38  
    39  	// The credentials object to use when signing requests. Defaults to a
    40  	// chain of credential providers to search for credentials in environment
    41  	// variables, shared credential file, and EC2 Instance Roles.
    42  	Credentials *credentials.Credentials
    43  
    44  	// An optional endpoint URL (hostname only or fully qualified URI)
    45  	// that overrides the default generated endpoint for a client. Set this
    46  	// to `nil` or the value to `""` to use the default generated endpoint.
    47  	//
    48  	// Note: You must still provide a `Region` value when specifying an
    49  	// endpoint for a client.
    50  	Endpoint *string
    51  
    52  	// The resolver to use for looking up endpoints for AWS service clients
    53  	// to use based on region.
    54  	EndpointResolver endpoints.Resolver
    55  
    56  	// EnforceShouldRetryCheck is used in the AfterRetryHandler to always call
    57  	// ShouldRetry regardless of whether or not if request.Retryable is set.
    58  	// This will utilize ShouldRetry method of custom retryers. If EnforceShouldRetryCheck
    59  	// is not set, then ShouldRetry will only be called if request.Retryable is nil.
    60  	// Proper handling of the request.Retryable field is important when setting this field.
    61  	EnforceShouldRetryCheck *bool
    62  
    63  	// The region to send requests to. This parameter is required and must
    64  	// be configured globally or on a per-client basis unless otherwise
    65  	// noted. A full list of regions is found in the "Regions and Endpoints"
    66  	// document.
    67  	//
    68  	// See http://docs.aws.amazon.com/general/latest/gr/rande.html for AWS
    69  	// Regions and Endpoints.
    70  	Region *string
    71  
    72  	// Set this to `true` to disable SSL when sending requests. Defaults
    73  	// to `false`.
    74  	DisableSSL *bool
    75  
    76  	// The HTTP client to use when sending requests. Defaults to
    77  	// `http.DefaultClient`.
    78  	HTTPClient *http.Client
    79  
    80  	// An integer value representing the logging level. The default log level
    81  	// is zero (LogOff), which represents no logging. To enable logging set
    82  	// to a LogLevel Value.
    83  	LogLevel *LogLevelType
    84  
    85  	// The logger writer interface to write logging messages to. Defaults to
    86  	// standard out.
    87  	Logger Logger
    88  
    89  	// The maximum number of times that a request will be retried for failures.
    90  	// Defaults to -1, which defers the max retry setting to the service
    91  	// specific configuration.
    92  	MaxRetries *int
    93  
    94  	// Retryer guides how HTTP requests should be retried in case of
    95  	// recoverable failures.
    96  	//
    97  	// When nil or the value does not implement the request.Retryer interface,
    98  	// the client.DefaultRetryer will be used.
    99  	//
   100  	// When both Retryer and MaxRetries are non-nil, the former is used and
   101  	// the latter ignored.
   102  	//
   103  	// To set the Retryer field in a type-safe manner and with chaining, use
   104  	// the request.WithRetryer helper function:
   105  	//
   106  	//   cfg := request.WithRetryer(aws.NewConfig(), myRetryer)
   107  	//
   108  	Retryer RequestRetryer
   109  
   110  	// Disables semantic parameter validation, which validates input for
   111  	// missing required fields and/or other semantic request input errors.
   112  	DisableParamValidation *bool
   113  
   114  	// Disables the computation of request and response checksums, e.g.,
   115  	// CRC32 checksums in Amazon DynamoDB.
   116  	DisableComputeChecksums *bool
   117  
   118  	// Set this to `true` to force the request to use path-style addressing,
   119  	// i.e., `http://s3.amazonaws.com/BUCKET/KEY`. By default, the S3 client
   120  	// will use virtual hosted bucket addressing when possible
   121  	// (`http://BUCKET.s3.amazonaws.com/KEY`).
   122  	//
   123  	// Note: This configuration option is specific to the Amazon S3 service.
   124  	//
   125  	// See http://docs.aws.amazon.com/AmazonS3/latest/dev/VirtualHosting.html
   126  	// for Amazon S3: Virtual Hosting of Buckets
   127  	S3ForcePathStyle *bool
   128  
   129  	// Set this to `true` to disable the SDK adding the `Expect: 100-Continue`
   130  	// header to PUT requests over 2MB of content. 100-Continue instructs the
   131  	// HTTP client not to send the body until the service responds with a
   132  	// `continue` status. This is useful to prevent sending the request body
   133  	// until after the request is authenticated, and validated.
   134  	//
   135  	// http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html
   136  	//
   137  	// 100-Continue is only enabled for Go 1.6 and above. See `http.Transport`'s
   138  	// `ExpectContinueTimeout` for information on adjusting the continue wait
   139  	// timeout. https://golang.org/pkg/net/http/#Transport
   140  	//
   141  	// You should use this flag to disable 100-Continue if you experience issues
   142  	// with proxies or third party S3 compatible services.
   143  	S3Disable100Continue *bool
   144  
   145  	// Set this to `true` to enable S3 Accelerate feature. For all operations
   146  	// compatible with S3 Accelerate will use the accelerate endpoint for
   147  	// requests. Requests not compatible will fall back to normal S3 requests.
   148  	//
   149  	// The bucket must be enable for accelerate to be used with S3 client with
   150  	// accelerate enabled. If the bucket is not enabled for accelerate an error
   151  	// will be returned. The bucket name must be DNS compatible to also work
   152  	// with accelerate.
   153  	S3UseAccelerate *bool
   154  
   155  	// S3DisableContentMD5Validation config option is temporarily disabled,
   156  	// For S3 GetObject API calls, #1837.
   157  	//
   158  	// Set this to `true` to disable the S3 service client from automatically
   159  	// adding the ContentMD5 to S3 Object Put and Upload API calls. This option
   160  	// will also disable the SDK from performing object ContentMD5 validation
   161  	// on GetObject API calls.
   162  	S3DisableContentMD5Validation *bool
   163  
   164  	// Set this to `true` to have the S3 service client to use the region specified
   165  	// in the ARN, when an ARN is provided as an argument to a bucket parameter.
   166  	S3UseARNRegion *bool
   167  
   168  	// Set this to `true` to enable the SDK to unmarshal API response header maps to
   169  	// normalized lower case map keys.
   170  	//
   171  	// For example S3's X-Amz-Meta prefixed header will be unmarshaled to lower case
   172  	// Metadata member's map keys. The value of the header in the map is unaffected.
   173  	LowerCaseHeaderMaps *bool
   174  
   175  	// Set this to `true` to disable the EC2Metadata client from overriding the
   176  	// default http.Client's Timeout. This is helpful if you do not want the
   177  	// EC2Metadata client to create a new http.Client. This options is only
   178  	// meaningful if you're not already using a custom HTTP client with the
   179  	// SDK. Enabled by default.
   180  	//
   181  	// Must be set and provided to the session.NewSession() in order to disable
   182  	// the EC2Metadata overriding the timeout for default credentials chain.
   183  	//
   184  	// Example:
   185  	//    sess := session.Must(session.NewSession(aws.NewConfig()
   186  	//       .WithEC2MetadataDisableTimeoutOverride(true)))
   187  	//
   188  	//    svc := s3.New(sess)
   189  	//
   190  	EC2MetadataDisableTimeoutOverride *bool
   191  
   192  	// Instructs the endpoint to be generated for a service client to
   193  	// be the dual stack endpoint. The dual stack endpoint will support
   194  	// both IPv4 and IPv6 addressing.
   195  	//
   196  	// Setting this for a service which does not support dual stack will fail
   197  	// to make requests. It is not recommended to set this value on the session
   198  	// as it will apply to all service clients created with the session. Even
   199  	// services which don't support dual stack endpoints.
   200  	//
   201  	// If the Endpoint config value is also provided the UseDualStack flag
   202  	// will be ignored.
   203  	//
   204  	// Only supported with.
   205  	//
   206  	//     sess := session.Must(session.NewSession())
   207  	//
   208  	//     svc := s3.New(sess, &aws.Config{
   209  	//         UseDualStack: aws.Bool(true),
   210  	//     })
   211  	UseDualStack *bool
   212  
   213  	// SleepDelay is an override for the func the SDK will call when sleeping
   214  	// during the lifecycle of a request. Specifically this will be used for
   215  	// request delays. This value should only be used for testing. To adjust
   216  	// the delay of a request see the aws/client.DefaultRetryer and
   217  	// aws/request.Retryer.
   218  	//
   219  	// SleepDelay will prevent any Context from being used for canceling retry
   220  	// delay of an API operation. It is recommended to not use SleepDelay at all
   221  	// and specify a Retryer instead.
   222  	SleepDelay func(time.Duration)
   223  
   224  	// DisableRestProtocolURICleaning will not clean the URL path when making rest protocol requests.
   225  	// Will default to false. This would only be used for empty directory names in s3 requests.
   226  	//
   227  	// Example:
   228  	//    sess := session.Must(session.NewSession(&aws.Config{
   229  	//         DisableRestProtocolURICleaning: aws.Bool(true),
   230  	//    }))
   231  	//
   232  	//    svc := s3.New(sess)
   233  	//    out, err := svc.GetObject(&s3.GetObjectInput {
   234  	//    	Bucket: aws.String("bucketname"),
   235  	//    	Key: aws.String("//foo//bar//moo"),
   236  	//    })
   237  	DisableRestProtocolURICleaning *bool
   238  
   239  	// EnableEndpointDiscovery will allow for endpoint discovery on operations that
   240  	// have the definition in its model. By default, endpoint discovery is off.
   241  	// To use EndpointDiscovery, Endpoint should be unset or set to an empty string.
   242  	//
   243  	// Example:
   244  	//    sess := session.Must(session.NewSession(&aws.Config{
   245  	//         EnableEndpointDiscovery: aws.Bool(true),
   246  	//    }))
   247  	//
   248  	//    svc := s3.New(sess)
   249  	//    out, err := svc.GetObject(&s3.GetObjectInput {
   250  	//    	Bucket: aws.String("bucketname"),
   251  	//    	Key: aws.String("/foo/bar/moo"),
   252  	//    })
   253  	EnableEndpointDiscovery *bool
   254  
   255  	// DisableEndpointHostPrefix will disable the SDK's behavior of prefixing
   256  	// request endpoint hosts with modeled information.
   257  	//
   258  	// Disabling this feature is useful when you want to use local endpoints
   259  	// for testing that do not support the modeled host prefix pattern.
   260  	DisableEndpointHostPrefix *bool
   261  
   262  	// STSRegionalEndpoint will enable regional or legacy endpoint resolving
   263  	STSRegionalEndpoint endpoints.STSRegionalEndpoint
   264  
   265  	// S3UsEast1RegionalEndpoint will enable regional or legacy endpoint resolving
   266  	S3UsEast1RegionalEndpoint endpoints.S3UsEast1RegionalEndpoint
   267  }
   268  
   269  // NewConfig returns a new Config pointer that can be chained with builder
   270  // methods to set multiple configuration values inline without using pointers.
   271  //
   272  //     // Create Session with MaxRetries configuration to be shared by multiple
   273  //     // service clients.
   274  //     sess := session.Must(session.NewSession(aws.NewConfig().
   275  //         WithMaxRetries(3),
   276  //     ))
   277  //
   278  //     // Create S3 service client with a specific Region.
   279  //     svc := s3.New(sess, aws.NewConfig().
   280  //         WithRegion("us-west-2"),
   281  //     )
   282  func NewConfig() *Config {
   283  	return &Config{}
   284  }
   285  
   286  // WithCredentialsChainVerboseErrors sets a config verbose errors boolean and returning
   287  // a Config pointer.
   288  func (c *Config) WithCredentialsChainVerboseErrors(verboseErrs bool) *Config {
   289  	c.CredentialsChainVerboseErrors = &verboseErrs
   290  	return c
   291  }
   292  
   293  // WithCredentials sets a config Credentials value returning a Config pointer
   294  // for chaining.
   295  func (c *Config) WithCredentials(creds *credentials.Credentials) *Config {
   296  	c.Credentials = creds
   297  	return c
   298  }
   299  
   300  // WithEndpoint sets a config Endpoint value returning a Config pointer for
   301  // chaining.
   302  func (c *Config) WithEndpoint(endpoint string) *Config {
   303  	c.Endpoint = &endpoint
   304  	return c
   305  }
   306  
   307  // WithEndpointResolver sets a config EndpointResolver value returning a
   308  // Config pointer for chaining.
   309  func (c *Config) WithEndpointResolver(resolver endpoints.Resolver) *Config {
   310  	c.EndpointResolver = resolver
   311  	return c
   312  }
   313  
   314  // WithRegion sets a config Region value returning a Config pointer for
   315  // chaining.
   316  func (c *Config) WithRegion(region string) *Config {
   317  	c.Region = &region
   318  	return c
   319  }
   320  
   321  // WithDisableSSL sets a config DisableSSL value returning a Config pointer
   322  // for chaining.
   323  func (c *Config) WithDisableSSL(disable bool) *Config {
   324  	c.DisableSSL = &disable
   325  	return c
   326  }
   327  
   328  // WithHTTPClient sets a config HTTPClient value returning a Config pointer
   329  // for chaining.
   330  func (c *Config) WithHTTPClient(client *http.Client) *Config {
   331  	c.HTTPClient = client
   332  	return c
   333  }
   334  
   335  // WithMaxRetries sets a config MaxRetries value returning a Config pointer
   336  // for chaining.
   337  func (c *Config) WithMaxRetries(max int) *Config {
   338  	c.MaxRetries = &max
   339  	return c
   340  }
   341  
   342  // WithDisableParamValidation sets a config DisableParamValidation value
   343  // returning a Config pointer for chaining.
   344  func (c *Config) WithDisableParamValidation(disable bool) *Config {
   345  	c.DisableParamValidation = &disable
   346  	return c
   347  }
   348  
   349  // WithDisableComputeChecksums sets a config DisableComputeChecksums value
   350  // returning a Config pointer for chaining.
   351  func (c *Config) WithDisableComputeChecksums(disable bool) *Config {
   352  	c.DisableComputeChecksums = &disable
   353  	return c
   354  }
   355  
   356  // WithLogLevel sets a config LogLevel value returning a Config pointer for
   357  // chaining.
   358  func (c *Config) WithLogLevel(level LogLevelType) *Config {
   359  	c.LogLevel = &level
   360  	return c
   361  }
   362  
   363  // WithLogger sets a config Logger value returning a Config pointer for
   364  // chaining.
   365  func (c *Config) WithLogger(logger Logger) *Config {
   366  	c.Logger = logger
   367  	return c
   368  }
   369  
   370  // WithS3ForcePathStyle sets a config S3ForcePathStyle value returning a Config
   371  // pointer for chaining.
   372  func (c *Config) WithS3ForcePathStyle(force bool) *Config {
   373  	c.S3ForcePathStyle = &force
   374  	return c
   375  }
   376  
   377  // WithS3Disable100Continue sets a config S3Disable100Continue value returning
   378  // a Config pointer for chaining.
   379  func (c *Config) WithS3Disable100Continue(disable bool) *Config {
   380  	c.S3Disable100Continue = &disable
   381  	return c
   382  }
   383  
   384  // WithS3UseAccelerate sets a config S3UseAccelerate value returning a Config
   385  // pointer for chaining.
   386  func (c *Config) WithS3UseAccelerate(enable bool) *Config {
   387  	c.S3UseAccelerate = &enable
   388  	return c
   389  
   390  }
   391  
   392  // WithS3DisableContentMD5Validation sets a config
   393  // S3DisableContentMD5Validation value returning a Config pointer for chaining.
   394  func (c *Config) WithS3DisableContentMD5Validation(enable bool) *Config {
   395  	c.S3DisableContentMD5Validation = &enable
   396  	return c
   397  
   398  }
   399  
   400  // WithS3UseARNRegion sets a config S3UseARNRegion value and
   401  // returning a Config pointer for chaining
   402  func (c *Config) WithS3UseARNRegion(enable bool) *Config {
   403  	c.S3UseARNRegion = &enable
   404  	return c
   405  }
   406  
   407  // WithUseDualStack sets a config UseDualStack value returning a Config
   408  // pointer for chaining.
   409  func (c *Config) WithUseDualStack(enable bool) *Config {
   410  	c.UseDualStack = &enable
   411  	return c
   412  }
   413  
   414  // WithEC2MetadataDisableTimeoutOverride sets a config EC2MetadataDisableTimeoutOverride value
   415  // returning a Config pointer for chaining.
   416  func (c *Config) WithEC2MetadataDisableTimeoutOverride(enable bool) *Config {
   417  	c.EC2MetadataDisableTimeoutOverride = &enable
   418  	return c
   419  }
   420  
   421  // WithSleepDelay overrides the function used to sleep while waiting for the
   422  // next retry. Defaults to time.Sleep.
   423  func (c *Config) WithSleepDelay(fn func(time.Duration)) *Config {
   424  	c.SleepDelay = fn
   425  	return c
   426  }
   427  
   428  // WithEndpointDiscovery will set whether or not to use endpoint discovery.
   429  func (c *Config) WithEndpointDiscovery(t bool) *Config {
   430  	c.EnableEndpointDiscovery = &t
   431  	return c
   432  }
   433  
   434  // WithDisableEndpointHostPrefix will set whether or not to use modeled host prefix
   435  // when making requests.
   436  func (c *Config) WithDisableEndpointHostPrefix(t bool) *Config {
   437  	c.DisableEndpointHostPrefix = &t
   438  	return c
   439  }
   440  
   441  // WithSTSRegionalEndpoint will set whether or not to use regional endpoint flag
   442  // when resolving the endpoint for a service
   443  func (c *Config) WithSTSRegionalEndpoint(sre endpoints.STSRegionalEndpoint) *Config {
   444  	c.STSRegionalEndpoint = sre
   445  	return c
   446  }
   447  
   448  // WithS3UsEast1RegionalEndpoint will set whether or not to use regional endpoint flag
   449  // when resolving the endpoint for a service
   450  func (c *Config) WithS3UsEast1RegionalEndpoint(sre endpoints.S3UsEast1RegionalEndpoint) *Config {
   451  	c.S3UsEast1RegionalEndpoint = sre
   452  	return c
   453  }
   454  
   455  // WithLowerCaseHeaderMaps sets a config LowerCaseHeaderMaps value
   456  // returning a Config pointer for chaining.
   457  func (c *Config) WithLowerCaseHeaderMaps(t bool) *Config {
   458  	c.LowerCaseHeaderMaps = &t
   459  	return c
   460  }
   461  
   462  // WithDisableRestProtocolURICleaning sets a config DisableRestProtocolURICleaning value
   463  // returning a Config pointer for chaining.
   464  func (c *Config) WithDisableRestProtocolURICleaning(t bool) *Config {
   465  	c.DisableRestProtocolURICleaning = &t
   466  	return c
   467  }
   468  
   469  // MergeIn merges the passed in configs into the existing config object.
   470  func (c *Config) MergeIn(cfgs ...*Config) {
   471  	for _, other := range cfgs {
   472  		mergeInConfig(c, other)
   473  	}
   474  }
   475  
   476  func mergeInConfig(dst *Config, other *Config) {
   477  	if other == nil {
   478  		return
   479  	}
   480  
   481  	if other.CredentialsChainVerboseErrors != nil {
   482  		dst.CredentialsChainVerboseErrors = other.CredentialsChainVerboseErrors
   483  	}
   484  
   485  	if other.Credentials != nil {
   486  		dst.Credentials = other.Credentials
   487  	}
   488  
   489  	if other.Endpoint != nil {
   490  		dst.Endpoint = other.Endpoint
   491  	}
   492  
   493  	if other.EndpointResolver != nil {
   494  		dst.EndpointResolver = other.EndpointResolver
   495  	}
   496  
   497  	if other.Region != nil {
   498  		dst.Region = other.Region
   499  	}
   500  
   501  	if other.DisableSSL != nil {
   502  		dst.DisableSSL = other.DisableSSL
   503  	}
   504  
   505  	if other.HTTPClient != nil {
   506  		dst.HTTPClient = other.HTTPClient
   507  	}
   508  
   509  	if other.LogLevel != nil {
   510  		dst.LogLevel = other.LogLevel
   511  	}
   512  
   513  	if other.Logger != nil {
   514  		dst.Logger = other.Logger
   515  	}
   516  
   517  	if other.MaxRetries != nil {
   518  		dst.MaxRetries = other.MaxRetries
   519  	}
   520  
   521  	if other.Retryer != nil {
   522  		dst.Retryer = other.Retryer
   523  	}
   524  
   525  	if other.DisableParamValidation != nil {
   526  		dst.DisableParamValidation = other.DisableParamValidation
   527  	}
   528  
   529  	if other.DisableComputeChecksums != nil {
   530  		dst.DisableComputeChecksums = other.DisableComputeChecksums
   531  	}
   532  
   533  	if other.S3ForcePathStyle != nil {
   534  		dst.S3ForcePathStyle = other.S3ForcePathStyle
   535  	}
   536  
   537  	if other.S3Disable100Continue != nil {
   538  		dst.S3Disable100Continue = other.S3Disable100Continue
   539  	}
   540  
   541  	if other.S3UseAccelerate != nil {
   542  		dst.S3UseAccelerate = other.S3UseAccelerate
   543  	}
   544  
   545  	if other.S3DisableContentMD5Validation != nil {
   546  		dst.S3DisableContentMD5Validation = other.S3DisableContentMD5Validation
   547  	}
   548  
   549  	if other.S3UseARNRegion != nil {
   550  		dst.S3UseARNRegion = other.S3UseARNRegion
   551  	}
   552  
   553  	if other.UseDualStack != nil {
   554  		dst.UseDualStack = other.UseDualStack
   555  	}
   556  
   557  	if other.EC2MetadataDisableTimeoutOverride != nil {
   558  		dst.EC2MetadataDisableTimeoutOverride = other.EC2MetadataDisableTimeoutOverride
   559  	}
   560  
   561  	if other.SleepDelay != nil {
   562  		dst.SleepDelay = other.SleepDelay
   563  	}
   564  
   565  	if other.DisableRestProtocolURICleaning != nil {
   566  		dst.DisableRestProtocolURICleaning = other.DisableRestProtocolURICleaning
   567  	}
   568  
   569  	if other.EnforceShouldRetryCheck != nil {
   570  		dst.EnforceShouldRetryCheck = other.EnforceShouldRetryCheck
   571  	}
   572  
   573  	if other.EnableEndpointDiscovery != nil {
   574  		dst.EnableEndpointDiscovery = other.EnableEndpointDiscovery
   575  	}
   576  
   577  	if other.DisableEndpointHostPrefix != nil {
   578  		dst.DisableEndpointHostPrefix = other.DisableEndpointHostPrefix
   579  	}
   580  
   581  	if other.STSRegionalEndpoint != endpoints.UnsetSTSEndpoint {
   582  		dst.STSRegionalEndpoint = other.STSRegionalEndpoint
   583  	}
   584  
   585  	if other.S3UsEast1RegionalEndpoint != endpoints.UnsetS3UsEast1Endpoint {
   586  		dst.S3UsEast1RegionalEndpoint = other.S3UsEast1RegionalEndpoint
   587  	}
   588  
   589  	if other.LowerCaseHeaderMaps != nil {
   590  		dst.LowerCaseHeaderMaps = other.LowerCaseHeaderMaps
   591  	}
   592  }
   593  
   594  // Copy will return a shallow copy of the Config object. If any additional
   595  // configurations are provided they will be merged into the new config returned.
   596  func (c *Config) Copy(cfgs ...*Config) *Config {
   597  	dst := &Config{}
   598  	dst.MergeIn(c)
   599  
   600  	for _, cfg := range cfgs {
   601  		dst.MergeIn(cfg)
   602  	}
   603  
   604  	return dst
   605  }