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