proxy: add support for logging http request headers

This commit is contained in:
Caleb Doxsey 2023-07-24 12:55:34 -06:00
parent 86a2fc6807
commit 4d7140a8a2
3 changed files with 45 additions and 1 deletions

View file

@ -3,6 +3,7 @@ package log
import (
"errors"
"fmt"
"strings"
)
// An AccessLogField is a field in the access logs.
@ -42,6 +43,21 @@ func DefaultAccessLogFields() []AccessLogField {
}
}
const accessLogFieldHeaderPrefix = "header."
// AccessLogFieldForHeader returns an access log field for the given header name.
func AccessLogFieldForHeader(header string) AccessLogField {
return AccessLogField(accessLogFieldHeaderPrefix + header)
}
// IsForHeader returns true if the access log field is for a header.
func (field AccessLogField) IsForHeader() (headerName string, ok bool) {
if strings.HasPrefix(string(field), accessLogFieldHeaderPrefix) {
return string(field[len(accessLogFieldHeaderPrefix):]), true
}
return "", false
}
// ErrUnknownAccessLogField indicates that an access log field is unknown.
var ErrUnknownAccessLogField = errors.New("unknown access log field")
@ -62,6 +78,10 @@ var accessLogFieldLookup = map[AccessLogField]struct{}{
// Validate returns an error if the access log field is invalid.
func (field AccessLogField) Validate() error {
if _, ok := field.IsForHeader(); ok {
return nil
}
_, ok := accessLogFieldLookup[field]
if !ok {
return fmt.Errorf("%w: %s", ErrUnknownAccessLogField, field)