* Update Request Header Prefixes and Upgrade API Version to 0.6.0 - Changed all HTTP request header prefixes from `x-sls-` to `x-log-` to comply with the latest API specifications. - Adjusted header prefix validation in `signature.go` to support `x-log-` and `x-acs-`. - Replaced `x-sls-bodyrawsize` with `x-log-bodyrawsize` in multiple files (`log_project.go`, `request.go`, etc.). - Updated header fields for compression type and signing method (e.g., `x-sls-compresstype` to `x-log-compresstype`). - Modified authorization logic to replace `SLS` with `LOG`. * Refactor signature generation logic for improved readability and maintainability Split the signature generation logic into several independent functions, including header extraction, standardized header construction, and resource string generation. This modular design enhances code clarity, reduces redundant logic, and improves error handling mechanisms. Additionally, comments and code structure have been optimized to ensure easier extension and debugging. --------- Co-authored-by: 优胜 <zhushaofei.zsf@alibaba-inc.com>
63 lines
1.5 KiB
Go
Executable File
63 lines
1.5 KiB
Go
Executable File
package alils
|
|
|
|
import (
|
|
"bytes"
|
|
"crypto/md5"
|
|
"fmt"
|
|
"net/http"
|
|
)
|
|
|
|
// request sends a request to SLS.
|
|
func request(project *LogProject, method, uri string, headers map[string]string,
|
|
body []byte) (resp *http.Response, err error) {
|
|
|
|
// The caller should provide 'x-log-bodyrawsize' header
|
|
if _, ok := headers["x-log-bodyrawsize"]; !ok {
|
|
err = fmt.Errorf("can't find 'x-log-bodyrawsize' header")
|
|
return
|
|
}
|
|
|
|
// SLS public request headers
|
|
headers["Host"] = project.Name + "." + project.Endpoint
|
|
headers["Date"] = nowRFC1123()
|
|
headers["x-log-apiversion"] = version
|
|
headers["x-log-signaturemethod"] = signatureMethod
|
|
if body != nil {
|
|
bodyMD5 := fmt.Sprintf("%X", md5.Sum(body))
|
|
headers["Content-MD5"] = bodyMD5
|
|
|
|
if _, ok := headers["Content-Type"]; !ok {
|
|
err = fmt.Errorf("can't find 'Content-Type' header")
|
|
return
|
|
}
|
|
}
|
|
|
|
// Calc Authorization
|
|
// Authorization = "LOG <AccessKeyID>:<Signature>"
|
|
digest, err := signature(project, method, uri, headers)
|
|
if err != nil {
|
|
return
|
|
}
|
|
auth := fmt.Sprintf("LOG %v:%v", project.AccessKeyID, digest)
|
|
headers["Authorization"] = auth
|
|
|
|
// Initialize http request
|
|
reader := bytes.NewReader(body)
|
|
urlStr := fmt.Sprintf("http://%v.%v%v", project.Name, project.Endpoint, uri)
|
|
req, err := http.NewRequest(method, urlStr, reader)
|
|
if err != nil {
|
|
return
|
|
}
|
|
for k, v := range headers {
|
|
req.Header.Add(k, v)
|
|
}
|
|
|
|
// Get ready to do request
|
|
resp, err = http.DefaultClient.Do(req)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
return
|
|
}
|