storage.go (43 lines of code) (raw):

// Copyright 2017 Google Inc. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package daisy import ( "fmt" "path" "regexp" "sync" ) var ( bucket = `([a-z0-9][-_.a-z0-9]*)` object = `(.+)` // Many of the Google Storage URLs are supported below. // It is preferred that customers specify their object using // its gs://<bucket>/<object> URL. bucketRegex = regexp.MustCompile(fmt.Sprintf(`^gs://%s/?$`, bucket)) gsRegex = regexp.MustCompile(fmt.Sprintf(`^gs://%s/%s$`, bucket, object)) // Check for the Google Storage URLs: // http://<bucket>.storage.googleapis.com/<object> // https://<bucket>.storage.googleapis.com/<object> gsHTTPRegex1 = regexp.MustCompile(fmt.Sprintf(`^http[s]?://%s\.storage\.googleapis\.com/%s$`, bucket, object)) // http://storage.cloud.google.com/<bucket>/<object> // https://storage.cloud.google.com/<bucket>/<object> gsHTTPRegex2 = regexp.MustCompile(fmt.Sprintf(`^http[s]?://storage\.cloud\.google\.com/%s/%s$`, bucket, object)) // Check for the other possible Google Storage URLs: // http://storage.googleapis.com/<bucket>/<object> // https://storage.googleapis.com/<bucket>/<object> // // The following are deprecated but checked: // http://commondatastorage.googleapis.com/<bucket>/<object> // https://commondatastorage.googleapis.com/<bucket>/<object> gsHTTPRegex3 = regexp.MustCompile(fmt.Sprintf(`^http[s]?://(?:commondata)?storage\.googleapis\.com/%s/%s$`, bucket, object)) gcsAPIBase = "https://storage.cloud.google.com" ) func getGCSAPIPath(p string) (string, DError) { b, o, e := splitGCSPath(p) if e != nil { return "", e } return fmt.Sprintf("%s/%s", gcsAPIBase, path.Join(b, o)), nil } func splitGCSPath(p string) (string, string, DError) { for _, rgx := range []*regexp.Regexp{gsRegex, gsHTTPRegex1, gsHTTPRegex2, gsHTTPRegex3} { matches := rgx.FindStringSubmatch(p) if matches != nil { return matches[1], matches[2], nil } } matches := bucketRegex.FindStringSubmatch(p) if matches != nil { return matches[1], "", nil } return "", "", Errf("%q is not a valid GCS path", p) } type validatedBkts struct { mx sync.Mutex bkts []string } var writableBkts validatedBkts var readableBkts validatedBkts