diff --git a/assets/components/LogViewer/ComplexLogItem.vue b/assets/components/LogViewer/ComplexLogItem.vue index 65e1785e..5b7b6fd7 100644 --- a/assets/components/LogViewer/ComplexLogItem.vue +++ b/assets/components/LogViewer/ComplexLogItem.vue @@ -5,9 +5,13 @@
  • {{ name }}= <null> - + + [ + + {{ JSON.stringify(item) }} + , ] +
  • all values are hidden
  • diff --git a/internal/support/web/escape.go b/internal/support/web/escape.go index f37daf5b..63559cfe 100644 --- a/internal/support/web/escape.go +++ b/internal/support/web/escape.go @@ -15,7 +15,6 @@ import ( var urlMarkerRegex = regexp.MustCompile(URLMarkerStart + "(.*?)" + URLMarkerEnd) func EscapeHTMLValues(logEvent *container.LogEvent) { - // Mark URLs before HTML escaping MarkURLs(logEvent) switch value := logEvent.Message.(type) { @@ -43,7 +42,6 @@ func escapeAndProcessMarkers(value string) string { value = html.EscapeString(value) value = strings.ReplaceAll(value, MarkerStart, "") value = strings.ReplaceAll(value, MarkerEnd, "") - // Process URL markers value = urlMarkerRegex.ReplaceAllString(value, "$1") return value } @@ -61,6 +59,11 @@ func escapeAnyMap(orderedMap *orderedmap.OrderedMap[string, any]) { escapeMapStringInterface(value) case map[string]string: escapeStringMapString(value) + case []interface{}: + escapeSlice(value) + orderedMap.Set(pair.Key, value) + default: + log.Warn().Type("type", value).Msg("unknown logEvent type") } } } @@ -80,6 +83,8 @@ func escapeMapStringInterface(value map[string]interface{}) { escapeMapStringInterface(val) case map[string]string: escapeStringMapString(val) + case []interface{}: + escapeSlice(val) } } } @@ -89,3 +94,22 @@ func escapeStringMapString(value map[string]string) { value[key] = escapeAndProcessMarkers(val) } } + +func escapeSlice(slice []interface{}) { + for i, val := range slice { + switch val := val.(type) { + case string: + slice[i] = escapeAndProcessMarkers(val) + case *orderedmap.OrderedMap[string, any]: + escapeAnyMap(val) + case *orderedmap.OrderedMap[string, string]: + escapeStringMap(val) + case map[string]interface{}: + escapeMapStringInterface(val) + case map[string]string: + escapeStringMapString(val) + case []interface{}: + escapeSlice(val) + } + } +}