parent
e67fad06d3
commit
e651379964
|
@ -35,6 +35,7 @@ func GetExprEnv(ctx map[string]interface{}) map[string]interface{} {
|
||||||
var ExprLib = map[string]interface{}{
|
var ExprLib = map[string]interface{}{
|
||||||
"Atof": Atof,
|
"Atof": Atof,
|
||||||
"JsonExtract": JsonExtract,
|
"JsonExtract": JsonExtract,
|
||||||
|
"JsonExtractUnescape": JsonExtractUnescape,
|
||||||
"JsonExtractLib": JsonExtractLib,
|
"JsonExtractLib": JsonExtractLib,
|
||||||
"File": File,
|
"File": File,
|
||||||
"RegexpInFile": RegexpInFile,
|
"RegexpInFile": RegexpInFile,
|
||||||
|
|
|
@ -30,6 +30,25 @@ func JsonExtractLib(jsblob string, target ...string) string {
|
||||||
return strvalue
|
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 {
|
func JsonExtract(jsblob string, target string) string {
|
||||||
if !strings.HasPrefix(target, "[") {
|
if !strings.HasPrefix(target, "[") {
|
||||||
target = strings.Replace(target, "[", ".[", -1)
|
target = strings.Replace(target, "[", ".[", -1)
|
||||||
|
|
|
@ -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)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue