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 }