Audit request and response contents #1115
Unanswered
softexpert
asked this question in
Q&A
Replies: 1 comment
-
|
I went ahead and created a custom method to cover this need, but I think it would be optimal to have a native implementation instead - especially when storing big and streamed request and response bodies ... This is the call and the parameters used: utils.StoreRequestResponse(traceFileName, resp.StatusCode(), resp.ReceivedAt(), rq.RawRequest.Proto, rq.RawRequest.Method, rq.RawRequest.URL.String(), rq.RawRequest.Header, resp.Request.Body, resp.Header(), resp.String())This is the file writing method: func StoreRequestResponse(sfn string, httpCode int, rTime time.Time, proto string, method string, url string, reqHeader http.Header, req any, respHeader http.Header, resp any) (err error) {
f, er := os.OpenFile(sfn, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0664)
if er != nil {
return er
}
defer func() { _ = f.Close() }()
_, er = f.WriteString("====[REQUEST]=======================================================\n")
err = errors.Join(err, er)
_, er = fmt.Fprintf(f, "[%s] [%s] [%s]\n", method, url, proto)
err = errors.Join(err, er)
_, er = f.WriteString("----<HEADERS>-------------------------------------------------------\n")
err = errors.Join(err, er)
for k, v := range reqHeader {
_, er = fmt.Fprintf(f, "%s %q\n", k, strings.Join(v, ","))
err = errors.Join(err, er)
}
_, er = f.WriteString("\n----<BODY>----------------------------------------------------------\n")
err = errors.Join(err, er)
switch dt := req.(type) {
case string:
_, er = f.WriteString(dt)
err = errors.Join(err, er)
case []byte:
_, er = f.WriteString(string(dt))
err = errors.Join(err, er)
default:
_, er = f.WriteString(PlainPrintObject(dt))
err = errors.Join(err, er)
}
_, er = fmt.Fprintf(f, "\n\n====[RESPONSE]=====[%d]=====[%s]=================\n", httpCode, rTime.Format(time.RFC3339))
err = errors.Join(err, er)
_, er = f.WriteString("----<HEADERS>-------------------------------------------------------\n")
err = errors.Join(err, er)
for k, v := range respHeader {
_, er = fmt.Fprintf(f, "%s %q\n", k, strings.Join(v, ","))
err = errors.Join(err, er)
}
_, er = f.WriteString("\n----<BODY>----------------------------------------------------------\n")
err = errors.Join(err, er)
switch dt := resp.(type) {
case string:
_, er = f.WriteString(dt)
if er != nil {
err = errors.Join(er)
}
case []byte:
_, er = f.WriteString(string(dt))
if er != nil {
err = errors.Join(er)
}
default:
_, er = f.WriteString(PlainPrintObject(dt))
if er != nil {
err = errors.Join(er)
}
}
_, er = f.WriteString("\n====[END]===========================================================\n\n")
err = errors.Join(err, er)
return err
} |
Beta Was this translation helpful? Give feedback.
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
-
Hello,
For debugging purposes, sometimes the easiest approach is to store the request and the response into trace files.
Is it currently possible to output the following into the same file ?
Thank you in advance !
Beta Was this translation helpful? Give feedback.
All reactions