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