Skip to content

Commit

Permalink
caddyhttp: Log request body bytes read (#5461)
Browse files Browse the repository at this point in the history
  • Loading branch information
francislavoie authored Mar 27, 2023
1 parent 1aef807 commit 2b3046d
Showing 1 changed file with 32 additions and 0 deletions.
32 changes: 32 additions & 0 deletions modules/caddyhttp/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import (
"crypto/tls"
"encoding/json"
"fmt"
"io"
"net"
"net/http"
"net/netip"
Expand Down Expand Up @@ -259,6 +260,14 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
wrec := NewResponseRecorder(w, nil, nil)
w = wrec

// wrap the request body in a LengthReader
// so we can track the number of bytes read from it
var bodyReader *lengthReader
if r.Body != nil {
bodyReader = &lengthReader{Source: r.Body}
r.Body = bodyReader
}

// capture the original version of the request
accLog := s.accessLogger.With(loggableReq)

Expand All @@ -285,7 +294,13 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {

userID, _ := repl.GetString("http.auth.user.id")

reqBodyLength := 0
if bodyReader != nil {
reqBodyLength = bodyReader.Length
}

log("handled request",
zap.Int("bytes_read", reqBodyLength),
zap.String("user_id", userID),
zap.Duration("duration", duration),
zap.Int("size", wrec.Size()),
Expand Down Expand Up @@ -826,6 +841,23 @@ func cloneURL(from, to *url.URL) {
}
}

// lengthReader is an io.ReadCloser that keeps track of the
// number of bytes read from the request body.
type lengthReader struct {
Source io.ReadCloser
Length int
}

func (r *lengthReader) Read(b []byte) (int, error) {
n, err := r.Source.Read(b)
r.Length += n
return n, err
}

func (r *lengthReader) Close() error {
return r.Source.Close()
}

// Context keys for HTTP request context values.
const (
// For referencing the server instance
Expand Down

0 comments on commit 2b3046d

Please sign in to comment.