in client.go [245:318]
func (p *aliMNSClient) Send(method Method, headers map[string]string, message interface{}, resource string) (*fasthttp.Response, error) {
var xmlContent []byte
var err error
if message == nil {
xmlContent = []byte{}
} else {
switch m := message.(type) {
case []byte:
{
xmlContent = m
}
default:
if bXml, e := xml.Marshal(message); e != nil {
err = ERR_MARSHAL_MESSAGE_FAILED.New(errors.Params{"err": e})
return nil, err
} else {
xmlContent = bXml
}
}
}
xmlMD5 := md5.Sum(xmlContent)
strMd5 := fmt.Sprintf("%x", xmlMD5)
if headers == nil {
headers = make(map[string]string)
}
headers[MQ_VERSION] = version
headers[CONTENT_TYPE] = "application/xml"
headers[CONTENT_MD5] = base64.StdEncoding.EncodeToString([]byte(strMd5))
headers[DATE] = time.Now().UTC().Format(http.TimeFormat)
credential, err := p.credential.GetCredential()
if err != nil {
return nil, err
}
if credential.SecurityToken != nil && *credential.SecurityToken != "" {
headers[SECURITY_TOKEN] = *credential.SecurityToken
}
signature, err := getSignature(method, headers, fmt.Sprintf("/%s", resource), *credential.AccessKeySecret)
if err != nil {
return nil, ERR_GENERAL_AUTH_HEADER_FAILED.New(errors.Params{"err": err})
}
headers[AUTHORIZATION] = fmt.Sprintf("MNS %s:%s", *credential.AccessKeyId, signature)
var buffer bytes.Buffer
buffer.WriteString(p.url.String())
buffer.WriteString("/")
buffer.WriteString(resource)
url := buffer.String()
req := fasthttp.AcquireRequest()
req.SetRequestURI(url)
req.Header.SetMethod(string(method))
req.SetBody(xmlContent)
for header, value := range headers {
req.Header.Set(header, value)
}
resp := fasthttp.AcquireResponse()
if err = p.client.Do(req, resp); err != nil {
err = ERR_SEND_REQUEST_FAILED.New(errors.Params{"err": err})
return nil, err
}
return resp, nil
}