Make the keys of the accessLog.fields.names
map case-insensitive
This commit is contained in:
parent
be5c429825
commit
71d4b3b13c
2 changed files with 46 additions and 7 deletions
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Reference in a new issue