func canonicalizedResource(url *url.URL) string { var res string // Strip any port declaration (443/80/8080/...) host := first(strings.SplitN(url.Host, ":", 2)) if strings.HasSuffix(host, ".amazonaws.com") { // Hostname bucket style, ignore (s3-eu-west.|s3.)amazonaws.com parts := strings.SplitN(host, ".", -1) if len(parts) > 3 { res = res + "/" + strings.Join(parts[:len(parts)-3], ".") } } else if len(host) > 0 { // CNAME bucket style res = res + "/" + host } else { // Bucket as root element in path already } // RawPath will include the bucket if not in the host res = res + strings.SplitN(url.RawPath, "?", 2)[0] // Include a sorted list of query parameters that have // special meaning to aws. These should stay decoded for // the canonical resource. var amz []string for key, values := range url.Query() { if amzQueryParams[key] { for _, value := range values { if value != "" { amz = append(amz, key+"="+value) } else { amz = append(amz, key) } } } } if len(amz) > 0 { sort.Strings(amz) res = res + "?" + strings.Join(amz, "&") } // All done. return res }