transport.go raw

   1  package scw
   2  
   3  import (
   4  	"math/rand"
   5  	"net/http"
   6  	"net/http/httputil"
   7  	"sync/atomic"
   8  
   9  	"github.com/scaleway/scaleway-sdk-go/internal/auth"
  10  	"github.com/scaleway/scaleway-sdk-go/logger"
  11  )
  12  
  13  type requestLoggerTransport struct {
  14  	rt http.RoundTripper
  15  	// requestNumber auto increments on each do().
  16  	// This allows easy distinguishing of concurrently performed requests in log.
  17  	requestNumber uint32
  18  }
  19  
  20  func (l *requestLoggerTransport) RoundTrip(request *http.Request) (*http.Response, error) {
  21  	currentRequestNumber := atomic.AddUint32(&l.requestNumber, 1)
  22  	// Keep original headers (before anonymization)
  23  	originalHeaders := request.Header
  24  
  25  	// Get anonymized headers
  26  	request.Header = auth.AnonymizeHeaders(request.Header.Clone())
  27  
  28  	// Add a pseudo random request identifier, this can be used to identify request and response in large logs
  29  	requestIdentifier := rand.Uint32()
  30  
  31  	dump, err := httputil.DumpRequestOut(request, true)
  32  	if err != nil {
  33  		logger.Warningf("cannot dump outgoing request: %s", err)
  34  	} else {
  35  		var logString string
  36  		logString += "\n---------- Scaleway SDK REQUEST %d (%x) : ----------\n"
  37  		logString += "%s\n"
  38  		logString += "---------------------------------------------------------\n"
  39  
  40  		logger.Debugf(logString, currentRequestNumber, requestIdentifier, dump)
  41  	}
  42  
  43  	// Restore original headers before sending the request
  44  	request.Header = originalHeaders
  45  	response, requestError := l.rt.RoundTrip(request)
  46  	if requestError != nil {
  47  		_, isSdkError := requestError.(SdkError)
  48  		if !isSdkError {
  49  			return response, requestError
  50  		}
  51  	}
  52  
  53  	dump, err = httputil.DumpResponse(response, true)
  54  	if err != nil {
  55  		logger.Warningf("cannot dump ingoing response: %s", err)
  56  	} else {
  57  		var logString string
  58  		logString += "\n---------- Scaleway SDK RESPONSE %d (%x) : ----------\n"
  59  		logString += "%s\n"
  60  		logString += "----------------------------------------------------------\n"
  61  
  62  		logger.Debugf(logString, currentRequestNumber, requestIdentifier, dump)
  63  	}
  64  
  65  	return response, requestError
  66  }
  67