blob: dc4a57dccf0695456372ec20f1d76650c9c41721 [file] [log] [blame]
package cos
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net/http"
"os"
"time"
)
const REQUEST_CLIENT = "TENCENTCLOUD_API_REQUEST_CLIENT"
var ReqClient = "Terraform-latest"
func SetReqClient(name string) {
if name == "" {
return
}
ReqClient = name
}
type LogRoundTripper struct {
}
func (me *LogRoundTripper) RoundTrip(request *http.Request) (response *http.Response, errRet error) {
var inBytes, outBytes []byte
var start = time.Now()
defer func() { me.log(inBytes, outBytes, errRet, start) }()
bodyReader, errRet := request.GetBody()
if errRet != nil {
return
}
var headName = "X-TC-Action"
if envReqClient := os.Getenv(REQUEST_CLIENT); envReqClient != "" {
ReqClient = envReqClient
}
request.Header.Set("X-TC-RequestClient", ReqClient)
inBytes = []byte(fmt.Sprintf("%s, request: ", request.Header[headName]))
requestBody, errRet := ioutil.ReadAll(bodyReader)
if errRet != nil {
return
}
inBytes = append(inBytes, requestBody...)
headName = "X-TC-Region"
appendMessage := []byte(fmt.Sprintf(
", (host %+v, region:%+v)",
request.Header["Host"],
request.Header[headName],
))
inBytes = append(inBytes, appendMessage...)
response, errRet = http.DefaultTransport.RoundTrip(request)
if errRet != nil {
return
}
outBytes, errRet = ioutil.ReadAll(response.Body)
if errRet != nil {
return
}
response.Body = ioutil.NopCloser(bytes.NewBuffer(outBytes))
return
}
func (me *LogRoundTripper) log(in []byte, out []byte, err error, start time.Time) {
var buf bytes.Buffer
buf.WriteString("######")
tag := "[DEBUG]"
if err != nil {
tag = "[CRITICAL]"
}
buf.WriteString(tag)
if len(in) > 0 {
buf.WriteString("tencentcloud-sdk-go: ")
buf.Write(in)
}
if len(out) > 0 {
buf.WriteString("; response:")
err := json.Compact(&buf, out)
if err != nil {
out := bytes.Replace(out,
[]byte("\n"),
[]byte(""),
-1)
out = bytes.Replace(out,
[]byte(" "),
[]byte(""),
-1)
buf.Write(out)
}
}
if err != nil {
buf.WriteString("; error:")
buf.WriteString(err.Error())
}
costFormat := fmt.Sprintf(",cost %s", time.Since(start).String())
buf.WriteString(costFormat)
log.Println(buf.String())
}