Files
pmomusic/soap/parseSoap.go

87 lines
1.7 KiB
Go
Raw Normal View History

2025-09-07 07:59:26 +02:00
package soap
import (
"bytes"
"encoding/xml"
"io"
"gargoton.petite-maison-orange.fr/eric/pmomusic/didl"
log "github.com/sirupsen/logrus"
)
type Envelope struct {
XMLName xml.Name `xml:"Envelope"`
Body Body `xml:"Body"`
}
type Body struct {
Content []byte `xml:",innerxml"` // <- capture tout le contenu du Body sous forme de XML brut
}
func prettyPrintXML(raw string) string {
var out bytes.Buffer
decoder := xml.NewDecoder(bytes.NewReader([]byte(raw)))
encoder := xml.NewEncoder(&out)
encoder.Indent("", " ") // définit l'indentation
for {
t, err := decoder.Token()
if err != nil {
break
}
if err := encoder.EncodeToken(t); err != nil {
break
}
}
encoder.Flush()
return out.String()
}
func ParseSOAPGeneric(body []byte) {
var env Envelope
if err := xml.Unmarshal(body, &env); err != nil {
log.Warnf("❌ Failed to unmarshal SOAP Envelope: %v", err)
return
}
decoder := xml.NewDecoder(bytes.NewReader(env.Body.Content))
var currentAction string
args := make(map[string]interface{})
for {
tok, err := decoder.Token()
if err != nil {
if err != io.EOF {
log.Warnf("❌ SOAP parse error: %v", err)
}
break
}
switch t := tok.(type) {
case xml.StartElement:
if currentAction == "" {
currentAction = t.Name.Local // nom de l'action
} else {
var value string
decoder.DecodeElement(&value, &t)
var ival interface{}
ival, err = didl.Parse(value)
if err == nil {
ival = ival.(*didl.DIDLLite).ToMarkdown()
} else {
ival = prettyPrintXML(value)
}
args[t.Name.Local] = ival
}
}
}
log.Infof("📡 SOAP Action: %s", currentAction)
for k, v := range args {
log.Infof(" %s = %v", k, v)
}
}