diff --git a/agents/agentreq_test.go b/agents/agentreq_test.go index 7f1a9c03d..a22e02bea 100644 --- a/agents/agentreq_test.go +++ b/agents/agentreq_test.go @@ -1691,6 +1691,34 @@ func TestAgReqSetFieldsIp2Hex(t *testing.T) { } } +func TestAgReqSetFieldsString2Hex(t *testing.T) { + cfg, _ := config.NewDefaultCGRConfig() + data := engine.NewInternalDB(nil, nil, true, cfg.DataDbCfg().Items) + dm := engine.NewDataManager(data, config.CgrConfig().CacheCfg(), nil) + filterS := engine.NewFilterS(cfg, nil, dm) + agReq := NewAgentRequest(nil, nil, nil, nil, nil, nil, "cgrates.org", "", filterS, nil, nil) + agReq.CGRRequest.Set(&utils.FullPath{Path: "CustomField", PathItems: utils.PathItems{{Field: "CustomField"}}}, utils.NewNMData(string([]byte{0x94, 0x71, 0x02, 0x31, 0x01, 0x59}))) + + tplFlds := []*config.FCTemplate{ + {Tag: "CustomField", + Path: utils.MetaTmp + utils.NestingSep + "CustomField", Type: utils.MetaVariable, + Value: config.NewRSRParsersMustCompile("~*cgreq.CustomField{*string2hex}", utils.INFIELD_SEP)}, + } + for _, v := range tplFlds { + v.ComputePath() + } + eMp := utils.NavigableMap2{} + eMp.Set(utils.PathItems{{Field: "CustomField"}}, &utils.NMSlice{ + &config.NMItem{Data: "0x947102310159", Path: []string{"CustomField"}, + Config: tplFlds[0]}}) + + if err := agReq.SetFields(tplFlds); err != nil { + t.Error(err) + } else if !reflect.DeepEqual(agReq.tmp, eMp) { + t.Errorf("expecting: %+v,\n received: %+v", eMp, agReq.tmp) + } +} + func TestAgReqSetFieldsWithRemove(t *testing.T) { cfg, _ := config.NewDefaultCGRConfig() data := engine.NewInternalDB(nil, nil, true, cfg.DataDbCfg().Items) diff --git a/packages/debian/changelog b/packages/debian/changelog index 6cd59c55d..e549385ec 100644 --- a/packages/debian/changelog +++ b/packages/debian/changelog @@ -11,7 +11,7 @@ cgrates (0.11.0~dev) UNRELEASED; urgency=medium * [DiameterAgent] Using String function from diam.Message instead of ToJSON for request String method * [DiameterAgent] Updated 3gp_vendor dictionary - * [Templates] Added new dataconvertor: *ip2hex + * [Templates] Added new dataconverter: *ip2hex * [AgentS] Added support for *group type and correctly overwrite the values in case of *variable * [ERs] Correctly populate ConcurrentRequest from config @@ -82,6 +82,7 @@ cgrates (0.11.0~dev) UNRELEASED; urgency=medium * [SessionS] Added *chargers flag to ProcessEvent to proccess the events from ChargerS with other subsystems * [SessionS] Updated the ids handling in flags by adding *ids as a new flag * [SessionS] Added *derived_reply sub flag to ProcessEvent to specify if a subsystem needs to process the events from ChargerS + * [Templates] Added new dataconverter: *string2hex -- DanB Wed, 19 Feb 2020 13:25:52 +0200 diff --git a/utils/consts.go b/utils/consts.go index 83c892f96..0c46def0f 100755 --- a/utils/consts.go +++ b/utils/consts.go @@ -667,6 +667,7 @@ const ( MetaLibPhoneNumber = "*libphonenumber" MetaTimeString = "*time_string" MetaIP2Hex = "*ip2hex" + MetaString2Hex = "*string2hex" MetaSIPURIMethod = "*sipuri_method" MetaSIPURIHost = "*sipuri_host" MetaSIPURIUser = "*sipuri_user" diff --git a/utils/dataconverter.go b/utils/dataconverter.go index 29abdb234..cd163f5ff 100644 --- a/utils/dataconverter.go +++ b/utils/dataconverter.go @@ -76,6 +76,8 @@ func NewDataConverter(params string) (conv DataConverter, err error) { return NewDurationConverter("") case params == MetaIP2Hex: return new(IP2HexConverter), nil + case params == MetaString2Hex: + return new(String2HexConverter), nil case params == MetaSIPURIHost: return new(SIPURIHostConverter), nil case params == MetaSIPURIUser: @@ -358,3 +360,17 @@ func (tS *TimeStringConverter) Convert(in interface{}) ( } return tm.Format(tS.Layout), nil } + +// String2HexConverter will transform the string to hex +type String2HexConverter struct{} + +// Convert implements DataConverter interface +func (*String2HexConverter) Convert(in interface{}) (o interface{}, err error) { + var out string + if out = hex.EncodeToString([]byte(IfaceAsString(in))); len(out) == 0 { + o = out + return + } + o = "0x" + out + return +} diff --git a/utils/dataconverter_test.go b/utils/dataconverter_test.go index 05a45477a..4cd5eaab0 100644 --- a/utils/dataconverter_test.go +++ b/utils/dataconverter_test.go @@ -142,6 +142,14 @@ func TestNewDataConverter(t *testing.T) { if _, err := NewDataConverter("unsupported"); err == nil || err.Error() != "unsupported converter definition: " { } + hex, err := NewDataConverter(MetaString2Hex) + if err != nil { + t.Error(err) + } + exp := new(String2HexConverter) + if !reflect.DeepEqual(hex, exp) { + t.Errorf("Expected %+v received: %+v", exp, hex) + } } func TestNewDataConverterMustCompile(t *testing.T) { @@ -789,4 +797,36 @@ func TestNewTimeStringConverter(t *testing.T) { } else if rcv.(string) != exp { t.Errorf("Expecting: %+v, received: %+v", exp, rcv) } +func TestStringHexConvertor(t *testing.T) { + hx := new(String2HexConverter) + val := "127.0.0.1" + expected := "0x3132372e302e302e31" + if rpl, err := hx.Convert(val); err != nil { + t.Error(err) + } else if !reflect.DeepEqual(expected, rpl) { + t.Errorf("expecting: %+v, received: %+v", expected, rpl) + } + + val3 := []byte("127.0.0.1") + if rpl, err := hx.Convert(val3); err != nil { + t.Error(err) + } else if !reflect.DeepEqual(expected, rpl) { + t.Errorf("expecting: %+v, received: %+v", expected, rpl) + } + + val = "" + expected = "" + if rpl, err := hx.Convert(val); err != nil { + t.Error(err) + } else if !reflect.DeepEqual(expected, rpl) { + t.Errorf("expecting: %+v, received: %+v", expected, rpl) + } + + val3 = []byte{0x94, 0x71, 0x02, 0x31, 0x01, 0x59} + expected = "0x947102310159" + if rpl, err := hx.Convert(val3); err != nil { + t.Error(err) + } else if !reflect.DeepEqual(expected, rpl) { + t.Errorf("expecting: %+v, received: %+v", expected, rpl) + } }