// ToDo: Add websocket support func (self *CdrServer) replicateCdr(cdr *CDR) error { for _, rplCfg := range self.cgrCfg.CDRSCdrReplication { passesFilters := true for _, cdfFltr := range rplCfg.CdrFilter { if !cdfFltr.FilterPasses(cdr.FieldAsString(cdfFltr)) { passesFilters = false break } } if !passesFilters { // Not passes filters, ignore this replication continue } var body interface{} var content = "" switch rplCfg.Transport { case utils.META_HTTP_POST: content = utils.CONTENT_FORM body = cdr.AsHttpForm() case utils.META_HTTP_JSON: content = utils.CONTENT_JSON jsn, err := json.Marshal(cdr) if err != nil { return err } body = jsn } var errChan chan error if rplCfg.Synchronous { errChan = make(chan error) } go func(body interface{}, rplCfg *config.CdrReplicationCfg, content string, errChan chan error) { fallbackPath := path.Join( self.cgrCfg.HttpFailedDir, rplCfg.FallbackFileName()) _, _, err := utils.HttpPoster( rplCfg.Address, self.cgrCfg.HttpSkipTlsVerify, body, content, rplCfg.Attempts, fallbackPath, false) // ToDo: Review caching here after we are sure that the connection leak is gone if err != nil { utils.Logger.Err(fmt.Sprintf( "<CDRReplicator> Replicating CDR: %+v, got error: %s", cdr, err.Error())) if rplCfg.Synchronous { errChan <- err } } if rplCfg.Synchronous { errChan <- nil } }(body, rplCfg, content, errChan) if rplCfg.Synchronous { // Synchronize here <-errChan } } return nil }
// Does not block for posts, no error reports func callUrlAsync(ub *Account, sq *StatsQueueTriggered, a *Action, acs Actions) error { var o interface{} if ub != nil { o = ub } if sq != nil { o = sq } cfg := config.CgrConfig() fallbackPath := path.Join(cfg.HttpFailedDir, fmt.Sprintf("act_%s_%s_%s.json", a.ActionType, a.ExtraParameters, utils.GenUUID())) go utils.HttpPoster(a.ExtraParameters, cfg.HttpSkipTlsVerify, o, utils.CONTENT_JSON, 3, fallbackPath) return nil }
// ToDo: Add websocket support func (self *CdrServer) replicateCdr(cdr *StoredCdr) error { for _, rplCfg := range self.cgrCfg.CDRSCdrReplication { passesFilters := true for _, cdfFltr := range rplCfg.CdrFilter { if fltrPass, _ := cdr.PassesFieldFilter(cdfFltr); !fltrPass { passesFilters = false break } } if !passesFilters { // Not passes filters, ignore this replication continue } var body interface{} var content = "" switch rplCfg.Transport { case utils.META_HTTP_POST: content = utils.CONTENT_FORM body = cdr.AsHttpForm() case utils.META_HTTP_TEXT: content = utils.CONTENT_TEXT body = cdr case utils.META_HTTP_JSON: content = utils.CONTENT_JSON body = cdr } errChan := make(chan error) go func(body interface{}, rplCfg *config.CdrReplicationCfg, content string, errChan chan error) { fallbackPath := path.Join( self.cgrCfg.HttpFailedDir, rplCfg.GetFallbackFileName()) _, err := utils.HttpPoster( rplCfg.Server, self.cgrCfg.HttpSkipTlsVerify, body, content, rplCfg.Attempts, fallbackPath) if err != nil { utils.Logger.Err(fmt.Sprintf( "<CDRReplicator> Replicating CDR: %+v, got error: %s", cdr, err.Error())) errChan <- err } errChan <- nil }(body, rplCfg, content, errChan) if rplCfg.Synchronous { // Synchronize here <-errChan } } return nil }
func callUrl(ub *Account, sq *StatsQueueTriggered, a *Action, acs Actions) error { var o interface{} if ub != nil { o = ub } if sq != nil { o = sq } jsn, err := json.Marshal(o) if err != nil { return err } cfg := config.CgrConfig() fallbackPath := path.Join(cfg.HttpFailedDir, fmt.Sprintf("act_%s_%s_%s.json", a.ActionType, a.ExtraParameters, utils.GenUUID())) _, _, err = utils.HttpPoster(a.ExtraParameters, cfg.HttpSkipTlsVerify, jsn, utils.CONTENT_JSON, config.CgrConfig().HttpPosterAttempts, fallbackPath, false) return err }