51 lines
1.2 KiB
Go
51 lines
1.2 KiB
Go
package config
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"net/url"
|
|
|
|
"gocloud.dev/blob"
|
|
"gocloud.dev/blob/azureblob"
|
|
)
|
|
|
|
// This code can be removed once https://github.com/google/go-cloud/pull/2851 is merged.
|
|
|
|
// URLOpener opens Azure URLs like "azblob://mybucket".
|
|
//
|
|
// The URL host is used as the bucket name.
|
|
//
|
|
// The following query options are supported:
|
|
// - domain: The domain name used to access the Azure Blob storage (e.g. blob.core.windows.net)
|
|
type azureURLOpener struct {
|
|
*azureblob.URLOpener
|
|
}
|
|
|
|
func (o *azureURLOpener) OpenBucketURL(ctx context.Context, u *url.URL) (*blob.Bucket, error) {
|
|
opts := new(azureblob.Options)
|
|
*opts = o.Options
|
|
|
|
err := setOptionsFromURLParams(u.Query(), opts)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return azureblob.OpenBucket(ctx, o.Pipeline, o.AccountName, u.Host, opts)
|
|
}
|
|
|
|
func setOptionsFromURLParams(q url.Values, opts *azureblob.Options) error {
|
|
for param, values := range q {
|
|
if len(values) > 1 {
|
|
return fmt.Errorf("multiple values of %v not allowed", param)
|
|
}
|
|
|
|
value := values[0]
|
|
switch param {
|
|
case "domain":
|
|
opts.StorageDomain = azureblob.StorageDomain(value)
|
|
default:
|
|
return fmt.Errorf("unknown query parameter %q", param)
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|