mirror of
https://github.com/cgrates/cgrates.git
synced 2026-02-16 13:49:53 +05:00
Diameter improved filter selector, writeOnConn method
This commit is contained in:
@@ -86,14 +86,16 @@ func (da *DiameterAgent) handleMessage(c diam.Conn, m *diam.Message) {
|
||||
if err != nil {
|
||||
utils.Logger.Err(fmt.Sprintf("<%s> decoding app: %d, err: %s",
|
||||
utils.DiameterAgent, m.Header.ApplicationID, err.Error()))
|
||||
writeOnConn(c, m.Answer(diam.NoCommonApplication))
|
||||
return
|
||||
}
|
||||
dCmd, err := m.Dictionary().FindCommand(
|
||||
m.Header.ApplicationID,
|
||||
m.Header.CommandCode)
|
||||
if err != nil {
|
||||
utils.Logger.Err(fmt.Sprintf("<%s> decoding app: %d, command %d, err: %s",
|
||||
utils.Logger.Warning(fmt.Sprintf("<%s> decoding app: %d, command %d, err: %s",
|
||||
utils.DiameterAgent, m.Header.ApplicationID, m.Header.CommandCode, err.Error()))
|
||||
writeOnConn(c, m.Answer(diam.CommandUnsupported))
|
||||
return
|
||||
}
|
||||
reqVars := map[string]interface{}{
|
||||
@@ -122,11 +124,13 @@ func (da *DiameterAgent) handleMessage(c diam.Conn, m *diam.Message) {
|
||||
utils.Logger.Warning(
|
||||
fmt.Sprintf("<%s> error: %s processing message: %s",
|
||||
utils.DiameterAgent, err.Error(), m))
|
||||
return // FixMe with returning some error on HTTP level
|
||||
writeOnConn(c, m.Answer(diam.UnableToDeliver))
|
||||
return
|
||||
} else if !processed {
|
||||
utils.Logger.Warning(
|
||||
fmt.Sprintf("<%s> no request processor enabled, ignoring message %s from %s",
|
||||
utils.DiameterAgent, m, c.RemoteAddr()))
|
||||
writeOnConn(c, m.Answer(diam.UnableToDeliver))
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
@@ -109,6 +109,14 @@ func diamAVPAsIface(dAVP *diam.AVP) (val interface{}, err error) {
|
||||
}
|
||||
}
|
||||
|
||||
// writeOnConn writes the message on connection, logs failures
|
||||
func writeOnConn(c diam.Conn, m *diam.Message) {
|
||||
if _, err := m.WriteTo(c); err != nil {
|
||||
utils.Logger.Warning(fmt.Sprintf("<%s> failed writing message to %s, err: %s, msg: %s",
|
||||
utils.DiameterAgent, c.RemoteAddr(), err.Error(), m))
|
||||
}
|
||||
}
|
||||
|
||||
// newDADataProvider constructs a DataProvider for a diameter message
|
||||
func newDADataProvider(m *diam.Message) config.DataProvider {
|
||||
return &diameterDP{m: m, cache: config.NewNavigableMap(nil)}
|
||||
@@ -176,8 +184,8 @@ func (dP *diameterDP) FieldAsInterface(fldPath []string) (data interface{}, err
|
||||
slectedIdx := 0 // by default we select AVP[0]
|
||||
if slctrStr != "" {
|
||||
if slectedIdx, err = strconv.Atoi(slctrStr); err != nil { // not int, compile it as RSRParser
|
||||
selIndxs := make(map[int][]struct{}) // use it to find intersection of all matched filters
|
||||
slctrStrs := strings.Split(slctrStr, "|")
|
||||
selIndxs := make(map[int]int) // use it to find intersection of all matched filters
|
||||
slctrStrs := strings.Split(slctrStr, utils.PipeSep)
|
||||
for _, slctrStr := range slctrStrs {
|
||||
slctr, err := config.NewRSRParser(slctrStr, true)
|
||||
if err != nil {
|
||||
@@ -199,15 +207,15 @@ func (dP *diameterDP) FieldAsInterface(fldPath []string) (data interface{}, err
|
||||
}
|
||||
continue // filter not passing, not really error
|
||||
} else {
|
||||
selIndxs[k] = append(selIndxs[k], struct{}{}) // filter passing, index it
|
||||
selIndxs[k+1] += 1 // filter passing, index it with one higher to cover 0
|
||||
}
|
||||
}
|
||||
}
|
||||
var oneMatches bool
|
||||
for idx, matches := range selIndxs {
|
||||
if len(matches) == len(slctrStrs) { // all filters in selection matching
|
||||
for k, matches := range selIndxs {
|
||||
if matches == len(slctrStrs) { // all filters in selection matching
|
||||
oneMatches = true
|
||||
slectedIdx = idx
|
||||
slectedIdx = k - 1 // decrease it to reflect real index
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user