Skip to content

Commit

Permalink
allow users to extend DNS style buckets (#2057)
Browse files Browse the repository at this point in the history
this is to allow for custom extensions, since
we keep getting new requests to add new URLs
as default for bucket DNS style requests. This
is not scalable for this SDK, allowing a caller
specific function allows callers can write their
own function and provide us when they wish to use
path style or bucket DNS style.
  • Loading branch information
harshavardhana authored Feb 2, 2025
1 parent 86f1186 commit 79b6099
Showing 1 changed file with 37 additions and 1 deletion.
38 changes: 37 additions & 1 deletion api.go
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,9 @@ type Client struct {
// default to Auto.
lookup BucketLookupType

// lookupFn is a custom function to return URL lookup type supported by the server.
lookupFn func(u url.URL, bucketName string) BucketLookupType

// Factory for MD5 hash functions.
md5Hasher func() md5simd.Hasher
sha256Hasher func() md5simd.Hasher
Expand All @@ -117,6 +120,25 @@ type Options struct {
// function to perform region lookups appropriately.
CustomRegionViaURL func(u url.URL) string

// Provide a custom function that returns BucketLookupType based
// on the input URL, this is just like s3utils.IsVirtualHostSupported()
// function but allows users to provide their own implementation.
// Once this is set it overrides all settings for opts.BucketLookup
// if this function returns BucketLookupAuto then default detection
// via s3utils.IsVirtualHostSupported() is used, otherwise the
// function is expected to return appropriate value as expected for
// the URL the user wishes to honor.
//
// BucketName is passed additionally for the caller to ensure
// handle situations where `bucketNames` have multiple `.` separators
// in such case HTTPs certs will not work properly for *.<domain>
// wildcards, so you need to specifically handle these situations
// and not return bucket as part of DNS since those requests may fail.
//
// For better understanding look at s3utils.IsVirtualHostSupported()
// implementation.
BucketLookupViaURL func(u url.URL, bucketName string) BucketLookupType

// TrailingHeaders indicates server support of trailing headers.
// Only supported for v4 signatures.
TrailingHeaders bool
Expand Down Expand Up @@ -279,6 +301,7 @@ func privateNew(endpoint string, opts *Options) (*Client, error) {
// Sets bucket lookup style, whether server accepts DNS or Path lookup. Default is Auto - determined
// by the SDK. When Auto is specified, DNS lookup is used for Amazon/Google cloud endpoints and Path for all other endpoints.
clnt.lookup = opts.BucketLookup
clnt.lookupFn = opts.BucketLookupViaURL

// healthcheck is not initialized
clnt.healthStatus = unknown
Expand Down Expand Up @@ -1003,18 +1026,31 @@ func (c *Client) makeTargetURL(bucketName, objectName, bucketLocation string, is

// returns true if virtual hosted style requests are to be used.
func (c *Client) isVirtualHostStyleRequest(url url.URL, bucketName string) bool {
if c.lookupFn != nil {
lookup := c.lookupFn(url, bucketName)
switch lookup {
case BucketLookupDNS:
return true
case BucketLookupPath:
return false
}
// if its auto then we fallback to default detection.
return s3utils.IsVirtualHostSupported(url, bucketName)
}

if bucketName == "" {
return false
}

if c.lookup == BucketLookupDNS {
return true
}

if c.lookup == BucketLookupPath {
return false
}

// default to virtual only for Amazon/Google storage. In all other cases use
// default to virtual only for Amazon/Google storage. In all other cases use
// path style requests
return s3utils.IsVirtualHostSupported(url, bucketName)
}
Expand Down

0 comments on commit 79b6099

Please sign in to comment.