diff --git a/agents/httpagent.go b/agents/httpagent.go index 856c5639b..5de44ac40 100644 --- a/agents/httpagent.go +++ b/agents/httpagent.go @@ -94,7 +94,7 @@ func (ha *HTTPAgent) ServeHTTP(w http.ResponseWriter, req *http.Request) { utils.HTTPAgent, err.Error())) return } - if err = encdr.encode(agReq.Reply); err != nil { + if err = encdr.Encode(agReq.Reply); err != nil { utils.Logger.Warning( fmt.Sprintf("<%s> error: %s encoding out %s", utils.HTTPAgent, err.Error(), utils.ToJSON(agReq.Reply))) diff --git a/agents/libhttpagent.go b/agents/libhttpagent.go index 0054f9987..76fbe9375 100644 --- a/agents/libhttpagent.go +++ b/agents/libhttpagent.go @@ -19,6 +19,7 @@ along with this program. If not, see package agents import ( + "encoding/xml" "fmt" "net/http" @@ -91,7 +92,7 @@ func (hU *httpUrlDP) AsNavigableMap([]*config.CfgCdrField) ( // httpAgentReplyEncoder will encode []*engine.NMElement // and write content to http writer type httpAgentReplyEncoder interface { - encode(*engine.NavigableMap) error + Encode(*engine.NavigableMap) error } // newHAReplyEncoder constructs a httpAgentReqDecoder based on encoder type @@ -100,5 +101,32 @@ func newHAReplyEncoder(encType string, switch encType { default: return nil, fmt.Errorf("unsupported encoder type <%s>", encType) + case utils.MetaXml: + return newHAXMLEncoder(w) } } + +func newHAXMLEncoder(w http.ResponseWriter) (xE httpAgentReplyEncoder, err error) { + return &haXMLEncoder{w: w}, nil +} + +type haXMLEncoder struct { + w http.ResponseWriter +} + +// Encode implements httpAgentReplyEncoder +func (xE *haXMLEncoder) Encode(nM *engine.NavigableMap) (err error) { + var xmlElmnts []*engine.XMLElement + if xmlElmnts, err = nM.AsXMLElements(); err != nil { + return + } + var xmlOut []byte + if xmlOut, err = xml.MarshalIndent(xmlElmnts, "", " "); err != nil { + return + } + if _, err = xE.w.Write([]byte(xml.Header)); err != nil { + return + } + _, err = xE.w.Write(xmlOut) + return +}