From 3309f398a74e48d48d0befb2efe48e7529885faf Mon Sep 17 00:00:00 2001 From: Blake Pettersson Date: Fri, 22 Sep 2023 12:53:52 +0200 Subject: [PATCH] feat: add debug http logging Add optional debug logging for dumping http requests and responses. Signed-off-by: Blake Pettersson --- pkg/target/http/logroundtripper.go | 37 ++++++++++++++++++++++++++++++ pkg/target/http/utils.go | 6 ++--- 2 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 pkg/target/http/logroundtripper.go diff --git a/pkg/target/http/logroundtripper.go b/pkg/target/http/logroundtripper.go new file mode 100644 index 00000000..5b89a400 --- /dev/null +++ b/pkg/target/http/logroundtripper.go @@ -0,0 +1,37 @@ +package http + +import ( + "fmt" + "go.uber.org/zap" + "net/http" + "net/http/httputil" +) + +func NewLoggingRoundTripper(roundTripper http.RoundTripper) http.RoundTripper { + return &logRoundTripper{roundTripper: roundTripper} +} + +type logRoundTripper struct { + roundTripper http.RoundTripper +} + +func (rt *logRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { + logger := zap.L() + if logger.Core().Enabled(zap.DebugLevel) { + if info, err := httputil.DumpRequest(req, true); err == nil { + logger.Debug(fmt.Sprintf("Sending request: %s", string(info))) + if err != nil { + return nil, err + } + } + } + resp, err := rt.roundTripper.RoundTrip(req) + if resp != nil { + if logger.Core().Enabled(zap.DebugLevel) { + if info, err := httputil.DumpResponse(resp, true); err == nil { + logger.Debug(fmt.Sprintf("Received response: %s", string(info))) + } + } + } + return resp, err +} diff --git a/pkg/target/http/utils.go b/pkg/target/http/utils.go index 26547091..1f8b52f7 100644 --- a/pkg/target/http/utils.go +++ b/pkg/target/http/utils.go @@ -5,8 +5,8 @@ import ( "crypto/tls" "crypto/x509" "encoding/json" - "io/ioutil" "net/http" + "os" "time" "go.uber.org/zap" @@ -86,11 +86,11 @@ func NewClient(certificatePath string, skipTLS bool) *http.Client { } client := &http.Client{ - Transport: transport, + Transport: NewLoggingRoundTripper(transport), } if certificatePath != "" { - caCert, err := ioutil.ReadFile(certificatePath) + caCert, err := os.ReadFile(certificatePath) if err != nil { zap.L().Error("failed to read certificate", zap.String("path", certificatePath)) return client