in registry/storage/driver/middleware/googlecdn/middleware.go [54:164]
func newGoogleCDNStorageMiddleware(storageDriver driver.StorageDriver, options map[string]any) (driver.StorageDriver, error) {
// parse baseurl
base, ok := options["baseurl"]
if !ok {
return nil, fmt.Errorf("no baseurl provided")
}
baseURL, ok := base.(string)
if !ok {
return nil, fmt.Errorf("baseurl must be a string")
}
if !strings.Contains(baseURL, "://") {
baseURL = "https://" + baseURL
}
if !strings.HasSuffix(baseURL, "/") {
baseURL += "/"
}
if _, err := url.Parse(baseURL); err != nil {
return nil, fmt.Errorf("invalid baseurl: %v", err)
}
// parse privatekey
pk, ok := options["privatekey"]
if !ok {
return nil, fmt.Errorf("no privatekey provided")
}
keyName, ok := pk.(string)
if !ok {
return nil, fmt.Errorf("privatekey must be a string")
}
key, err := readKeyFile(keyName)
if err != nil {
return nil, fmt.Errorf("failed to read privatekey file: %s", err)
}
// parse keyname
v, ok := options["keyname"]
if !ok {
return nil, fmt.Errorf("no keyname provided")
}
pkName, ok := v.(string)
if !ok {
return nil, fmt.Errorf("keyname must be a string")
}
urlSigner := newURLSigner(pkName, key)
// parse duration
duration := defaultDuration
if d, ok := options["duration"]; ok {
switch d := d.(type) {
case time.Duration:
duration = d
case string:
dur, err := time.ParseDuration(d)
if err != nil {
return nil, fmt.Errorf("invalid duration: %s", err)
}
duration = dur
}
}
// parse updatefrequency
updateFrequency := defaultUpdateFrequency
if v, ok := options["updatefrequency"]; ok {
switch v := v.(type) {
case time.Duration:
updateFrequency = v
case string:
d, err := time.ParseDuration(v)
if err != nil {
return nil, fmt.Errorf("invalid updatefrequency: %s", err)
}
updateFrequency = d
}
}
// parse iprangesurl
ipRangesURL := defaultIPRangesURL
if v, ok := options["iprangesurl"]; ok {
s, ok := v.(string)
if !ok {
return nil, fmt.Errorf("iprangesurl must be a string")
}
ipRangesURL = s
}
// parse ipfilteredby
var googleIPs *googleIPs
if v, ok := options["ipfilteredby"]; ok {
ipFilteredBy, ok := v.(string)
if !ok {
return nil, fmt.Errorf("ipfilteredby must be a string")
}
switch strings.ToLower(strings.TrimSpace(ipFilteredBy)) {
case "", "none":
googleIPs = nil
case "gcp":
googleIPs = newGoogleIPs(ipRangesURL, updateFrequency)
default:
return nil, fmt.Errorf("ipfilteredby must be one of the following values: none|gcp")
}
}
return &googleCDNStorageMiddleware{
StorageDriver: storageDriver,
urlSigner: urlSigner,
baseURL: baseURL,
duration: duration,
googleIPs: googleIPs,
}, nil
}