github.com/astaxie/beego@v1.12.3/logs/alils/request.go (about)

     1  package alils
     2  
     3  import (
     4  	"bytes"
     5  	"crypto/md5"
     6  	"fmt"
     7  	"net/http"
     8  )
     9  
    10  // request sends a request to SLS.
    11  func request(project *LogProject, method, uri string, headers map[string]string,
    12  	body []byte) (resp *http.Response, err error) {
    13  
    14  	// The caller should provide 'x-sls-bodyrawsize' header
    15  	if _, ok := headers["x-sls-bodyrawsize"]; !ok {
    16  		err = fmt.Errorf("Can't find 'x-sls-bodyrawsize' header")
    17  		return
    18  	}
    19  
    20  	// SLS public request headers
    21  	headers["Host"] = project.Name + "." + project.Endpoint
    22  	headers["Date"] = nowRFC1123()
    23  	headers["x-sls-apiversion"] = version
    24  	headers["x-sls-signaturemethod"] = signatureMethod
    25  	if body != nil {
    26  		bodyMD5 := fmt.Sprintf("%X", md5.Sum(body))
    27  		headers["Content-MD5"] = bodyMD5
    28  
    29  		if _, ok := headers["Content-Type"]; !ok {
    30  			err = fmt.Errorf("Can't find 'Content-Type' header")
    31  			return
    32  		}
    33  	}
    34  
    35  	// Calc Authorization
    36  	// Authorization = "SLS <AccessKeyID>:<Signature>"
    37  	digest, err := signature(project, method, uri, headers)
    38  	if err != nil {
    39  		return
    40  	}
    41  	auth := fmt.Sprintf("SLS %v:%v", project.AccessKeyID, digest)
    42  	headers["Authorization"] = auth
    43  
    44  	// Initialize http request
    45  	reader := bytes.NewReader(body)
    46  	urlStr := fmt.Sprintf("http://%v.%v%v", project.Name, project.Endpoint, uri)
    47  	req, err := http.NewRequest(method, urlStr, reader)
    48  	if err != nil {
    49  		return
    50  	}
    51  	for k, v := range headers {
    52  		req.Header.Add(k, v)
    53  	}
    54  
    55  	// Get ready to do request
    56  	resp, err = http.DefaultClient.Do(req)
    57  	if err != nil {
    58  		return
    59  	}
    60  
    61  	return
    62  }