log client IPs
continuous-integration/drone/push Build is failing Details

This commit is contained in:
tjpcc 2023-10-10 09:11:16 -06:00
parent aa15254e73
commit d467d04479
1 changed files with 14 additions and 3 deletions

View File

@ -6,6 +6,7 @@ import (
"encoding/hex"
"errors"
"io"
"net"
"time"
"tildegit.org/tjp/sliderule/internal/types"
@ -15,9 +16,15 @@ func LogRequests(logger Logger) types.Middleware {
return func(inner types.Handler) types.Handler {
return types.HandlerFunc(func(ctx context.Context, request *types.Request) *types.Response {
start := time.Now()
var clientip string
if request.RemoteAddr != nil {
clientip, _, _ = net.SplitHostPort(request.RemoteAddr.String())
}
response := inner.Handle(ctx, request)
if response != nil {
response.Body = loggingBody(logger, request, response, start)
response.Body = loggingBody(logger, request, response, start, clientip)
} else {
end := time.Now()
params := []any{
@ -26,6 +33,7 @@ func LogRequests(logger Logger) types.Middleware {
"dur", end.Sub(start),
"url", request.URL,
"status", "(not found)",
"clientip", clientip,
}
if fingerprint, ok := clientFingerprint(request); ok {
params = append(params, "client_ident", fingerprint)
@ -52,7 +60,8 @@ type loggedResponseBody struct {
response *types.Response
body io.Reader
start time.Time
start time.Time
clientip string
written int
logger Logger
@ -66,6 +75,7 @@ func (lr *loggedResponseBody) log() {
"dur", end.Sub(lr.start),
"url", lr.request.URL,
"status", lr.response.Status,
"clientip", lr.clientip,
"bodylen", lr.written,
}
if fingerprint, ok := clientFingerprint(lr.request); ok {
@ -111,7 +121,7 @@ func (lwtr loggedWriteToResponseBody) WriteTo(dst io.Writer) (int64, error) {
return n, err
}
func loggingBody(logger Logger, request *types.Request, response *types.Response, start time.Time) io.Reader {
func loggingBody(logger Logger, request *types.Request, response *types.Response, start time.Time, clientip string) io.Reader {
body := &loggedResponseBody{
request: request,
response: response,
@ -119,6 +129,7 @@ func loggingBody(logger Logger, request *types.Request, response *types.Response
start: start,
written: 0,
logger: logger,
clientip: clientip,
}
if _, ok := response.Body.(io.WriterTo); ok {