From db433a760f998c8f03f903d82e2aaa4bde4cfed5 Mon Sep 17 00:00:00 2001 From: DanB Date: Sat, 15 Mar 2014 19:17:40 +0100 Subject: [PATCH] Adding search/replace regexp rules for FreeSWITCH extra fields --- cdrs/fscdr.go | 10 ++++++---- cdrs/fscdr_test.go | 20 ++++++++++++++++++-- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/cdrs/fscdr.go b/cdrs/fscdr.go index d2d91239a..811626251 100644 --- a/cdrs/fscdr.go +++ b/cdrs/fscdr.go @@ -116,10 +116,12 @@ func (fsCdr FSCdr) GetReqType() string { func (fsCdr FSCdr) GetExtraFields() map[string]string { extraFields := make(map[string]string, len(cfg.CDRSExtraFields)) for _, field := range cfg.CDRSExtraFields { - if extraValue, found := fsCdr.vars[field]; found { - extraFields[field] = extraValue - } else { - extraFields[field] = fsCdr.searchExtraField(field, fsCdr.body) + origFieldVal, foundInVars := fsCdr.vars[field.Id] + if !foundInVars { + origFieldVal = fsCdr.searchExtraField(field.Id, fsCdr.body) + } + if len(origFieldVal) != 0 { // Found a value, parse it + extraFields[field.Id] = field.ParseValue(origFieldVal) } } return extraFields diff --git a/cdrs/fscdr_test.go b/cdrs/fscdr_test.go index da2f6ba2d..0bdc6f12f 100644 --- a/cdrs/fscdr_test.go +++ b/cdrs/fscdr_test.go @@ -20,6 +20,7 @@ package cdrs import ( "reflect" + "regexp" "testing" "time" @@ -89,7 +90,7 @@ func TestCDRFields(t *testing.T) { if fsCdr.GetDuration() != 4000000000 { t.Error("Error parsing cdr: ", fsCdr) } - cfg.CDRSExtraFields = []string{"sip_user_agent", "read_codec", "write_codec"} + cfg.CDRSExtraFields = []*utils.RSRField{&utils.RSRField{Id: "sip_user_agent"}, &utils.RSRField{Id: "read_codec"}, &utils.RSRField{Id: "write_codec"}} extraFields := fsCdr.GetExtraFields() if len(extraFields) != 3 { t.Error("Error parsing extra fields: ", extraFields) @@ -150,7 +151,7 @@ func TestSearchExtraFieldLast(t *testing.T) { func TestSearchExtraField(t *testing.T) { fsCdr, _ := new(FSCdr).New(body) - cfg.CDRSExtraFields = []string{"caller_id_name"} + cfg.CDRSExtraFields = []*utils.RSRField{&utils.RSRField{Id: "caller_id_name"}} extraFields := fsCdr.GetExtraFields() if len(extraFields) != 1 || extraFields["caller_id_name"] != "dan" { t.Error("Error parsing extra fields: ", extraFields) @@ -164,3 +165,18 @@ func TestSearchExtraFieldInSlice(t *testing.T) { t.Error("Error finding extra field: ", value) } } + +func TestSearchReplaceInExtraFields(t *testing.T) { + cfg, _ = config.NewDefaultCGRConfig() + cfg.CDRSExtraFields = []*utils.RSRField{&utils.RSRField{Id: "read_codec"}, + &utils.RSRField{Id: "sip_user_agent", RSRule: &utils.ReSearchReplace{regexp.MustCompile(`([A-Za-z]*).+`), "$1"}}, + &utils.RSRField{Id: "write_codec"}} + fsCdr, _ := new(FSCdr).New(body) + extraFields := fsCdr.GetExtraFields() + if len(extraFields) != 3 { + t.Error("Error parsing extra fields: ", extraFields) + } + if extraFields["sip_user_agent"] != "Jitsi" { + t.Error("Error parsing extra fields: ", extraFields) + } +}