in server/pkg/cloud/aws/session/builder.go [114:178]
func FromURL(u string) (*Options, error) {
// Parse input as URL
input, err := url.Parse(u)
if err != nil {
return nil, fmt.Errorf("unable to build session from url")
}
// Extract path and object key
bucketName, objectKey := filepath.Split(input.Path)
if bucketName == "" {
return nil, fmt.Errorf("bucketName is mandatory")
}
if objectKey == "" {
return nil, fmt.Errorf("objectKey is mandatory")
}
q := input.Query()
// Unescape strings
accessKeyID, err := url.QueryUnescape(q.Get("access-key-id"))
if err != nil {
return nil, fmt.Errorf("accessKeyID value is invalid: %w", err)
}
profile, err := url.QueryUnescape(q.Get("profile"))
if err != nil {
return nil, fmt.Errorf("profile value is invalid: %w", err)
}
region, err := url.QueryUnescape(q.Get("region"))
if err != nil {
return nil, fmt.Errorf("region value is invalid: %w", err)
}
secretAccessKey, err := url.QueryUnescape(q.Get("secret-access-key"))
if err != nil {
return nil, fmt.Errorf("secret-access-key value is invalid: %w", err)
}
sessionToken, err := url.QueryUnescape(q.Get("session-token"))
if err != nil {
return nil, fmt.Errorf("session-token value is invalid: %w", err)
}
const trueStringValue = "true"
// Assemble options
opts := &Options{
Endpoint: input.Host,
BucketName: strings.TrimSuffix(strings.TrimPrefix(bucketName, "/"), "/"),
ObjectKey: objectKey,
// Query params
AccessKeyID: accessKeyID,
DisableSSL: q.Get("disable-ssl") == trueStringValue,
EnvAuthentication: q.Get("env-authentication") == trueStringValue,
IgnoreConfigCreds: q.Get("ignore-config-creds") == trueStringValue,
IgnoreEC2RoleCreds: q.Get("ignore-ec2role-creds") == trueStringValue,
IgnoreEnvCreds: q.Get("ignore-env-creds") == trueStringValue,
Profile: profile,
Region: region,
S3ForcePathStyle: q.Get("s3-force-path-style") == trueStringValue,
SecretAccessKey: secretAccessKey,
SessionToken: sessionToken,
UseAccelerateEndpoint: q.Get("s3-use-accelerate-endpoint") == trueStringValue,
}
// Delegate to builder
return opts, nil
}