github.com/graywolf-at-work-2/terraform-vendor@v1.4.5/internal/backend/remote-state/cos/transport.go (about)

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