Skip to content

Commit d6de78a

Browse files
committed
fix: request logger
1 parent 5bc78c4 commit d6de78a

File tree

3 files changed

+98
-4
lines changed

3 files changed

+98
-4
lines changed

pkg/authz/requestlogger.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package authz
2+
3+
import (
4+
"net/http"
5+
"strings"
6+
)
7+
8+
func requestLogger(r *http.Request) string {
9+
var sb strings.Builder
10+
11+
sb.WriteString(r.Method)
12+
sb.WriteString(" ")
13+
sb.WriteString(r.URL.String())
14+
15+
var bodyBytes []byte
16+
if r.Body != nil {
17+
defer func() {
18+
_ = r.Body.Close()
19+
}()
20+
bodyBytes = make([]byte, r.ContentLength)
21+
_, err := r.Body.Read(bodyBytes)
22+
if err != nil {
23+
sb.WriteString("Body: <unknown>")
24+
} else {
25+
sb.WriteString(" Body: " + string(bodyBytes))
26+
}
27+
}
28+
29+
return sb.String()
30+
}

pkg/authz/requestlogger_test.go

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package authz
2+
3+
import (
4+
"io"
5+
"net/http"
6+
"strings"
7+
"testing"
8+
9+
"github.com/stretchr/testify/require"
10+
)
11+
12+
func TestRequestLogger(t *testing.T) {
13+
tests := []struct {
14+
name string
15+
method string
16+
url string
17+
body string
18+
expected string
19+
}{
20+
{
21+
name: "GET request without query or body",
22+
method: "GET",
23+
url: "https://kubernetes.default.svc/api/v1/pods",
24+
body: "",
25+
expected: "GET https://kubernetes.default.svc/api/v1/pods",
26+
},
27+
{
28+
name: "GET request with query parameters",
29+
method: "GET",
30+
url: "https://kubernetes.default.svc/api/v1/pods?labelSelector=app%3Dmyapp&limit=10",
31+
body: "",
32+
expected: "GET https://kubernetes.default.svc/api/v1/pods?labelSelector=app%3Dmyapp&limit=10",
33+
},
34+
{
35+
name: "POST request with body",
36+
method: "POST",
37+
url: "https://kubernetes.default.svc/api/v1/namespaces/default/pods",
38+
body: `{"apiVersion":"v1","kind":"Pod","metadata":{"name":"test"}}`,
39+
expected: `POST https://kubernetes.default.svc/api/v1/namespaces/default/pods Body: {"apiVersion":"v1","kind":"Pod","metadata":{"name":"test"}}`,
40+
},
41+
{
42+
name: "PUT request with query and body",
43+
method: "PUT",
44+
url: "https://kubernetes.default.svc/api/v1/namespaces/default/pods/test?dryRun=All",
45+
body: `{"metadata":{"labels":{"env":"prod"}}}`,
46+
expected: `PUT https://kubernetes.default.svc/api/v1/namespaces/default/pods/test?dryRun=All Body: {"metadata":{"labels":{"env":"prod"}}}`,
47+
},
48+
}
49+
50+
for _, tt := range tests {
51+
t.Run(tt.name, func(t *testing.T) {
52+
var bodyReader io.Reader
53+
if tt.body != "" {
54+
bodyReader = strings.NewReader(tt.body)
55+
}
56+
57+
req, err := http.NewRequest(tt.method, tt.url, bodyReader)
58+
require.NoError(t, err)
59+
60+
result := requestLogger(req)
61+
require.Equal(t, tt.expected, result)
62+
})
63+
}
64+
}

pkg/authz/responsefilterer.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ func (rf *StandardResponseFilterer) RunPreFilters(req *http.Request) error {
126126

127127
prefilterRule, err := singlePreFilterRule(rf.filteredRules)
128128
if err != nil {
129-
klog.FromContext(req.Context()).V(2).Error(err, "error getting single pre-filter rule", "request", req)
129+
klog.FromContext(req.Context()).V(2).Error(err, "error getting single pre-filter rule", "request", requestLogger(req))
130130
return fmt.Errorf("error getting single pre-filter rule: %w", err)
131131
}
132132

@@ -163,17 +163,17 @@ func (rf *StandardResponseFilterer) RunPreFilters(req *http.Request) error {
163163

164164
// Run LookupResources for the prefilter rule and write the results to the channel.
165165
go func() {
166-
klog.FromContext(req.Context()).V(3).Info("running pre-filter", "request", req, "filter", filter)
166+
klog.FromContext(req.Context()).V(3).Info("running pre-filter", "request", requestLogger(req), "filter", filter)
167167

168168
result, err := runLookupResources(req.Context(), rf.client, filter, rf.input)
169169
if err != nil {
170170
if status.Code(err) == codes.Canceled {
171-
klog.FromContext(req.Context()).V(3).Info("pre-filter canceled", "request", req)
171+
klog.FromContext(req.Context()).V(3).Info("pre-filter canceled", "request", requestLogger(req))
172172
rf.preFilterCompleted <- prefilterResult{err: err}
173173
return
174174
}
175175

176-
klog.FromContext(req.Context()).Error(err, "error running pre-filter", "request", req)
176+
klog.FromContext(req.Context()).Error(err, "error running pre-filter", "request", requestLogger(req))
177177
rf.preFilterCompleted <- prefilterResult{
178178
err: err,
179179
}

0 commit comments

Comments
 (0)