@@ -149,8 +149,9 @@ func isJSON(s []byte) bool {
149149func encode (key string , value interface {}, appid uint32 ) (avp * diam.AVP , err error ) {
150150 var avpcode int
151151 var subAVP * diam.AVP
152- //var dictAVP *dict.AVP
153152 var matched bool
153+ var foundAVP bool
154+
154155 vendoridInt := int (0 )
155156 dictAVP := & dict.AVP {Code : 0 , VendorID : 0 }
156157
@@ -180,14 +181,28 @@ func encode(key string, value interface{}, appid uint32) (avp *diam.AVP, err err
180181 if dictAVP , err = dict .Default .FindAVP (appid , key ); err != nil {
181182 return nil , err
182183 }
184+ foundAVP = true
183185 }
184186
185187 //2. handle value
186- //TODO, should be handle value according dictAVP found in dictionary
188+ //should be handle value according dictAVP found in dictionary
189+ //2020-08-20, Handle foundAVP
187190 switch value .(type ) {
188191 case float64 :
192+ if foundAVP {
193+ if avp := newAVP (dictAVP .Code , dictAVP .VendorID , value , dictAVP .Data .Type ); avp != nil {
194+ return avp , nil
195+ }
196+ return nil , errors .New ("Encode Error, Mismatch Type with defined in Dictionary" )
197+ }
189198 return diam .NewAVP (dictAVP .Code , 0 , dictAVP .VendorID , datatype .Unsigned32 (value .(float64 ))), nil
190199 case string :
200+ if foundAVP {
201+ if avp := newAVP (dictAVP .Code , dictAVP .VendorID , value , dictAVP .Data .Type ); avp != nil {
202+ return avp , nil
203+ }
204+ return nil , errors .New ("Encode Error, Mismatch Type with defined in Dictionary" )
205+ }
191206 return diam .NewAVP (dictAVP .Code , 0 , dictAVP .VendorID , datatype .UTF8String (value .(string ))), nil
192207 case map [string ]interface {}:
193208 grouped := & diam.GroupedAVP {
@@ -204,3 +219,43 @@ func encode(key string, value interface{}, appid uint32) (avp *diam.AVP, err err
204219 return nil , errors .New ("Unknown Data Type" )
205220 }
206221}
222+
223+ func newAVP (avpcode uint32 , vendorid uint32 , value interface {}, typeid datatype.TypeID ) * diam.AVP {
224+ switch typeid {
225+ case datatype .UnknownType :
226+ case datatype .AddressType :
227+ return diam .NewAVP (avpcode , 0 , vendorid , datatype .Address (value .(string )))
228+ case datatype .DiameterIdentityType :
229+ return diam .NewAVP (avpcode , 0 , vendorid , datatype .DiameterIdentity (value .(string )))
230+ case datatype .DiameterURIType :
231+ return diam .NewAVP (avpcode , 0 , vendorid , datatype .DiameterURI (value .(string )))
232+ case datatype .EnumeratedType :
233+ return diam .NewAVP (avpcode , 0 , vendorid , datatype .Enumerated (value .(float64 )))
234+ case datatype .Float32Type :
235+ return diam .NewAVP (avpcode , 0 , vendorid , datatype .Float32 (value .(float64 )))
236+ case datatype .Float64Type :
237+ return diam .NewAVP (avpcode , 0 , vendorid , datatype .Float64 (value .(float64 )))
238+ case datatype .GroupedType :
239+ case datatype .IPFilterRuleType :
240+ return diam .NewAVP (avpcode , 0 , vendorid , datatype .IPFilterRule (value .(string )))
241+ case datatype .IPv4Type :
242+ return diam .NewAVP (avpcode , 0 , vendorid , datatype .IPv4 (value .(string )))
243+ case datatype .Integer32Type :
244+ return diam .NewAVP (avpcode , 0 , vendorid , datatype .Integer32 (value .(float64 )))
245+ case datatype .Integer64Type :
246+ return diam .NewAVP (avpcode , 0 , vendorid , datatype .Integer64 (value .(float64 )))
247+ case datatype .OctetStringType :
248+ return diam .NewAVP (avpcode , 0 , vendorid , datatype .OctetString (value .(string )))
249+ case datatype .TimeType :
250+ if t , err := time .Parse (time .RFC3339 , value .(string )); err == nil {
251+ return diam .NewAVP (avpcode , 0 , vendorid , datatype .Time (t ))
252+ }
253+ case datatype .UTF8StringType :
254+ return diam .NewAVP (avpcode , 0 , vendorid , datatype .UTF8String (value .(string )))
255+ case datatype .Unsigned32Type :
256+ return diam .NewAVP (avpcode , 0 , vendorid , datatype .Unsigned32 (value .(float64 )))
257+ case datatype .Unsigned64Type :
258+ return diam .NewAVP (avpcode , 0 , vendorid , datatype .Unsigned64 (value .(float64 )))
259+ }
260+ return nil
261+ }
0 commit comments