github.com/terramate-io/tf@v0.0.0-20230830114523-fce866b4dfcd/backend/remote-state/cos/transport.go (about) 1 // Copyright (c) HashiCorp, Inc. 2 // SPDX-License-Identifier: MPL-2.0 3 4 package cos 5 6 import ( 7 "bytes" 8 "encoding/json" 9 "fmt" 10 "io/ioutil" 11 "log" 12 "net/http" 13 "os" 14 "time" 15 ) 16 17 const REQUEST_CLIENT = "TENCENTCLOUD_API_REQUEST_CLIENT" 18 19 var ReqClient = "Terraform-latest" 20 21 func SetReqClient(name string) { 22 if name == "" { 23 return 24 } 25 ReqClient = name 26 } 27 28 type LogRoundTripper struct { 29 } 30 31 func (me *LogRoundTripper) RoundTrip(request *http.Request) (response *http.Response, errRet error) { 32 33 var inBytes, outBytes []byte 34 35 var start = time.Now() 36 37 defer func() { me.log(inBytes, outBytes, errRet, start) }() 38 39 bodyReader, errRet := request.GetBody() 40 if errRet != nil { 41 return 42 } 43 var headName = "X-TC-Action" 44 45 if envReqClient := os.Getenv(REQUEST_CLIENT); envReqClient != "" { 46 ReqClient = envReqClient 47 } 48 49 request.Header.Set("X-TC-RequestClient", ReqClient) 50 inBytes = []byte(fmt.Sprintf("%s, request: ", request.Header[headName])) 51 requestBody, errRet := ioutil.ReadAll(bodyReader) 52 if errRet != nil { 53 return 54 } 55 inBytes = append(inBytes, requestBody...) 56 57 headName = "X-TC-Region" 58 appendMessage := []byte(fmt.Sprintf( 59 ", (host %+v, region:%+v)", 60 request.Header["Host"], 61 request.Header[headName], 62 )) 63 64 inBytes = append(inBytes, appendMessage...) 65 66 response, errRet = http.DefaultTransport.RoundTrip(request) 67 if errRet != nil { 68 return 69 } 70 outBytes, errRet = ioutil.ReadAll(response.Body) 71 if errRet != nil { 72 return 73 } 74 response.Body = ioutil.NopCloser(bytes.NewBuffer(outBytes)) 75 return 76 } 77 78 func (me *LogRoundTripper) log(in []byte, out []byte, err error, start time.Time) { 79 var buf bytes.Buffer 80 buf.WriteString("######") 81 tag := "[DEBUG]" 82 if err != nil { 83 tag = "[CRITICAL]" 84 } 85 buf.WriteString(tag) 86 if len(in) > 0 { 87 buf.WriteString("tencentcloud-sdk-go: ") 88 buf.Write(in) 89 } 90 if len(out) > 0 { 91 buf.WriteString("; response:") 92 err := json.Compact(&buf, out) 93 if err != nil { 94 out := bytes.Replace(out, 95 []byte("\n"), 96 []byte(""), 97 -1) 98 out = bytes.Replace(out, 99 []byte(" "), 100 []byte(""), 101 -1) 102 buf.Write(out) 103 } 104 } 105 106 if err != nil { 107 buf.WriteString("; error:") 108 buf.WriteString(err.Error()) 109 } 110 111 costFormat := fmt.Sprintf(",cost %s", time.Since(start).String()) 112 buf.WriteString(costFormat) 113 114 log.Println(buf.String()) 115 }