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