gitlab-org--gitlab-foss/workhorse/internal/config/url_openers.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
}