From 27b0d6c6b160f610c1a00b439d3ad9161abf6bcf Mon Sep 17 00:00:00 2001 From: DanB Date: Wed, 6 Jan 2016 12:24:39 +0100 Subject: [PATCH] Diameter CCA field templates matching also in answer - fixes #348; field filters not anymore passing if the field id not found in message --- agents/libdmt.go | 7 +++++-- utils/rsrfield_test.go | 3 +++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/agents/libdmt.go b/agents/libdmt.go index 642a15024..429421fda 100644 --- a/agents/libdmt.go +++ b/agents/libdmt.go @@ -235,9 +235,9 @@ func passesFieldFilter(m *diam.Message, fieldFilter *utils.RSRField) (bool, int) if err != nil { return false, 0 } else if len(avps) == 0 { - return true, 0 + return false, 0 // No AVPs with field filter ID } - for avpIdx, avpVal := range avps { + for avpIdx, avpVal := range avps { // First match wins due to index if fieldFilter.FilterPasses(avpValAsString(avpVal)) { return true, avpIdx } @@ -620,6 +620,9 @@ func (self *CCA) AsDiameterMessage() *diam.Message { func (self *CCA) SetProcessorAVPs(reqProcessor *config.DARequestProcessor, maxUsage float64) error { for _, cfgFld := range reqProcessor.CCAFields { fmtOut, err := fieldOutVal(self.ccrMessage, cfgFld, maxUsage) + if err == ErrFilterNotPassing { // Field not in or filter not passing, try match in answer + fmtOut, err = fieldOutVal(self.diamMessage, cfgFld, maxUsage) + } if err != nil { if err == ErrFilterNotPassing { continue diff --git a/utils/rsrfield_test.go b/utils/rsrfield_test.go index 65841d0ee..1da60b703 100644 --- a/utils/rsrfield_test.go +++ b/utils/rsrfield_test.go @@ -265,6 +265,9 @@ func TestRSRFilterPass(t *testing.T) { if fltr.Pass("full_match1") { t.Error("Passing!") } + if fltr.Pass("") { + t.Error("Passing!") + } fltr, err = NewRSRFilter("^prefixMatch") // Prefix pass if err != nil { t.Error(err)