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  }