Make the keys of the accessLog.fields.names map case-insensitive

This commit is contained in:
Roman Donchenko 2024-09-13 11:04:07 +03:00 committed by GitHub
parent be5c429825
commit 71d4b3b13c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 46 additions and 7 deletions

View file

@ -105,15 +105,28 @@ func NewHandler(config *types.AccessLog) (*Handler, error) {
Level: logrus.InfoLevel, Level: logrus.InfoLevel,
} }
// Transform headers names in config to a canonical form, to be used as is without further transformations. // Transform header names to a canonical form, to be used as is without further transformations,
if config.Fields != nil && config.Fields.Headers != nil && len(config.Fields.Headers.Names) > 0 { // and transform field names to lower case, to enable case-insensitive lookup.
fields := map[string]string{} if config.Fields != nil {
if len(config.Fields.Names) > 0 {
fields := map[string]string{}
for h, v := range config.Fields.Headers.Names { for h, v := range config.Fields.Names {
fields[textproto.CanonicalMIMEHeaderKey(h)] = v fields[strings.ToLower(h)] = v
}
config.Fields.Names = fields
} }
config.Fields.Headers.Names = fields if config.Fields.Headers != nil && len(config.Fields.Headers.Names) > 0 {
fields := map[string]string{}
for h, v := range config.Fields.Headers.Names {
fields[textproto.CanonicalMIMEHeaderKey(h)] = v
}
config.Fields.Headers.Names = fields
}
} }
logHandler := &Handler{ logHandler := &Handler{
@ -332,7 +345,7 @@ func (h *Handler) logTheRoundTrip(logDataTable *LogData) {
fields := logrus.Fields{} fields := logrus.Fields{}
for k, v := range logDataTable.Core { for k, v := range logDataTable.Core {
if h.config.Fields.Keep(k) { if h.config.Fields.Keep(strings.ToLower(k)) {
fields[k] = v fields[k] = v
} }
} }

View file

@ -462,6 +462,32 @@ func TestLoggerJSON(t *testing.T) {
RequestRefererHeader: assertString(testReferer), RequestRefererHeader: assertString(testReferer),
}, },
}, },
{
desc: "fields and headers with unconventional letter case",
config: &types.AccessLog{
FilePath: "",
Format: JSONFormat,
Fields: &types.AccessLogFields{
DefaultMode: "drop",
Names: map[string]string{
"rEqUeStHoSt": "keep",
},
Headers: &types.FieldHeaders{
DefaultMode: "drop",
Names: map[string]string{
"ReFeReR": "keep",
},
},
},
},
expected: map[string]func(t *testing.T, value interface{}){
RequestHost: assertString(testHostname),
"level": assertString("info"),
"msg": assertString(""),
"time": assertNotEmpty(),
RequestRefererHeader: assertString(testReferer),
},
},
} }
for _, test := range testCases { for _, test := range testCases {