package getter import ( "fmt" "net/url" "strings" ) // GCSDetector implements Detector to detect GCS URLs and turn // them into URLs that the GCSGetter can understand. type GCSDetector struct{} func (d *GCSDetector) Detect(src, _ string) (string, bool, error) { if len(src) == 0 { return "", false, nil } if strings.Contains(src, "googleapis.com/") { return d.detectHTTP(src) } return "", false, nil } func (d *GCSDetector) detectHTTP(src string) (string, bool, error) { parts := strings.Split(src, "/") if len(parts) < 5 { return "", false, fmt.Errorf( "URL is not a valid GCS URL") } version := parts[2] bucket := parts[3] object := strings.Join(parts[4:], "/") url, err := url.Parse(fmt.Sprintf("https://www.googleapis.com/storage/%s/%s/%s", version, bucket, object)) if err != nil { return "", false, fmt.Errorf("error parsing GCS URL: %s", err) } return "gcs::" + url.String(), true, nil }