in datahub/restclient.go [237:276]
func (client *RestClient) buildSignature(header *http.Header, method, url string) {
builder := make([]string, 0, 5)
builder = append(builder, method)
builder = append(builder, header.Get(httpHeaderContentType))
builder = append(builder, header.Get(httpHeaderDate))
headersToSign := make(map[string][]string)
for k, v := range *header {
lower := strings.ToLower(k)
if strings.HasPrefix(lower, datahubHeadersPrefix) {
headersToSign[lower] = v
}
}
keys := make([]string, len(headersToSign))
for k := range headersToSign {
keys = append(keys, k)
}
sort.Strings(keys)
for _, k := range keys {
for _, v := range headersToSign[k] {
builder = append(builder, fmt.Sprintf("%s:%s", k, v))
}
}
builder = append(builder, url)
canonString := strings.Join(builder, "\n")
if log.IsLevelEnabled(log.DebugLevel) {
log.Debugf("canonString: %s, accesskey: %s", canonString, client.Account.GetAccountKey())
}
hash := hmac.New(sha1.New, []byte(client.Account.GetAccountKey()))
hash.Write([]byte(canonString))
crypto := hash.Sum(nil)
signature := base64.StdEncoding.EncodeToString(crypto)
authorization := fmt.Sprintf("DATAHUB %s:%s", client.Account.GetAccountId(), signature)
header.Add(httpHeaderAuthorization, authorization)
}