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  }