in oss/signer/v1.go [83:163]
func (*SignerV1) calcStringToSign(date string, signingCtx *SigningContext) string {
/*
SignToString =
VERB + "\n"
+ Content-MD5 + "\n"
+ Content-Type + "\n"
+ Date + "\n"
+ CanonicalizedOSSHeaders
+ CanonicalizedResource
Signature = base64(hmac-sha1(AccessKeySecret, SignToString))
*/
request := signingCtx.Request
contentMd5 := request.Header.Get(contentMd5Header)
contentType := request.Header.Get(contentTypeHeader)
//CanonicalizedOSSHeaders
var headers []string
for k := range request.Header {
lowerCaseKey := strings.ToLower(k)
if strings.HasPrefix(lowerCaseKey, ossHeaderPreifx) {
headers = append(headers, lowerCaseKey)
}
}
sort.Strings(headers)
headerItems := make([]string, len(headers))
for i, k := range headers {
headerValues := make([]string, len(request.Header.Values(k)))
for i, v := range request.Header.Values(k) {
headerValues[i] = strings.TrimSpace(v)
}
headerItems[i] = k + ":" + strings.Join(headerValues, ",") + "\n"
}
canonicalizedOSSHeaders := strings.Join(headerItems, "")
//CanonicalizedResource
query := request.URL.Query()
var params []string
for k := range query {
if _, ok := requiredSignedParametersMap[k]; ok {
params = append(params, k)
} else if strings.HasPrefix(k, ossHeaderPreifx) {
params = append(params, k)
} else if isSubResource(signingCtx.SubResource, k) {
params = append(params, k)
}
}
sort.Strings(params)
paramItems := make([]string, len(params))
for i, k := range params {
v := query.Get(k)
if len(v) > 0 {
paramItems[i] = k + "=" + v
} else {
paramItems[i] = k
}
}
subResource := strings.Join(paramItems, "&")
canonicalizedResource := "/"
if signingCtx.Bucket != nil {
canonicalizedResource += *signingCtx.Bucket + "/"
}
if signingCtx.Key != nil {
canonicalizedResource += *signingCtx.Key
}
if subResource != "" {
canonicalizedResource += "?" + subResource
}
// string to Sign
stringToSign :=
request.Method + "\n" +
contentMd5 + "\n" +
contentType + "\n" +
date + "\n" +
canonicalizedOSSHeaders +
canonicalizedResource
//fmt.Printf("stringToSign:%s\n", stringToSign)
return stringToSign
}