Преглед изворни кода

add jsonExtractUnescape Helper (#962)

* add jsonExtractUnescape Helper
he2ss пре 3 година
родитељ
комит
e651379964
3 измењених фајлова са 68 додато и 8 уклоњено
  1. 9 8
      pkg/exprhelpers/exprlib.go
  2. 19 0
      pkg/exprhelpers/jsonextract.go
  3. 40 0
      pkg/exprhelpers/jsonextract_test.go

+ 9 - 8
pkg/exprhelpers/exprlib.go

@@ -33,14 +33,15 @@ func Upper(s string) string {
 
 func GetExprEnv(ctx map[string]interface{}) map[string]interface{} {
 	var ExprLib = map[string]interface{}{
-		"Atof":           Atof,
-		"JsonExtract":    JsonExtract,
-		"JsonExtractLib": JsonExtractLib,
-		"File":           File,
-		"RegexpInFile":   RegexpInFile,
-		"Upper":          Upper,
-		"IpInRange":      IpInRange,
-		"TimeNow":        TimeNow,
+		"Atof":                Atof,
+		"JsonExtract":         JsonExtract,
+		"JsonExtractUnescape": JsonExtractUnescape,
+		"JsonExtractLib":      JsonExtractLib,
+		"File":                File,
+		"RegexpInFile":        RegexpInFile,
+		"Upper":               Upper,
+		"IpInRange":           IpInRange,
+		"TimeNow":             TimeNow,
 	}
 	for k, v := range ctx {
 		ExprLib[k] = v

+ 19 - 0
pkg/exprhelpers/jsonextract.go

@@ -30,6 +30,25 @@ func JsonExtractLib(jsblob string, target ...string) string {
 	return strvalue
 }
 
+func JsonExtractUnescape(jsblob string, target ...string) string {
+	value, err := jsonparser.GetString(
+		jsonparser.StringToBytes(jsblob),
+		target...,
+	)
+
+	if err != nil {
+		if err == jsonparser.KeyPathNotFoundError {
+			log.Debugf("%+v doesn't exist", target)
+			return ""
+		}
+		log.Errorf("JsonExtractUnescape : %+v : %s", target, err)
+		return ""
+	}
+	log.Tracef("extract path %+v", target)
+	strvalue := string(value)
+	return strvalue
+}
+
 func JsonExtract(jsblob string, target string) string {
 	if !strings.HasPrefix(target, "[") {
 		target = strings.Replace(target, "[", ".[", -1)

+ 40 - 0
pkg/exprhelpers/jsonextract_test.go

@@ -47,3 +47,43 @@ func TestJsonExtract(t *testing.T) {
 	}
 
 }
+func TestJsonExtractUnescape(t *testing.T) {
+	if err := Init(); err != nil {
+		log.Fatalf(err.Error())
+	}
+
+	err := FileInit(TestFolder, "test_data_re.txt", "regex")
+	if err != nil {
+		log.Fatalf(err.Error())
+	}
+
+	tests := []struct {
+		name         string
+		jsonBlob     string
+		targetField  string
+		expectResult string
+	}{
+		{
+			name:         "basic json extract",
+			jsonBlob:     `{"log" : "\"GET /JBNwtQ6i.blt HTTP/1.1\" 200 13 \"-\" \"Craftbot\""}`,
+			targetField:  "log",
+			expectResult: "\"GET /JBNwtQ6i.blt HTTP/1.1\" 200 13 \"-\" \"Craftbot\"",
+		},
+		{
+			name:         "basic json extract with non existing field",
+			jsonBlob:     `{"test" : "1234"}`,
+			targetField:  "non_existing_field",
+			expectResult: "",
+		},
+	}
+
+	for _, test := range tests {
+		result := JsonExtractUnescape(test.jsonBlob, test.targetField)
+		isOk := assert.Equal(t, test.expectResult, result)
+		if !isOk {
+			t.Fatalf("test '%s' failed", test.name)
+		}
+		log.Printf("test '%s' : OK", test.name)
+	}
+
+}