From def9629a0bcefa358cb3e3029fe24887b39aecdb Mon Sep 17 00:00:00 2001 From: Mickael Remond Date: Mon, 24 Jun 2019 12:15:29 +0200 Subject: [PATCH] Make it possible to extract unknown iq payload, in field Any --- iq.go | 10 ++++++++-- iq_test.go | 16 ++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/iq.go b/iq.go index 4597609..d04ab36 100644 --- a/iq.go +++ b/iq.go @@ -23,7 +23,8 @@ type IQ struct { // Info/Query // request." Payload IQPayload `xml:",omitempty"` Error Err `xml:"error,omitempty"` - RawXML string `xml:",innerxml"` + // Any is used to decode unknown payload as a generique structure + Any *Node `xml:",any"` } type IQPayload interface { @@ -114,7 +115,12 @@ func (iq *IQ) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { continue } // TODO: If unknown decode as generic node - return fmt.Errorf("unexpected element in iq: %s %s", tt.Name.Space, tt.Name.Local) + node := new(Node) + err = d.DecodeElement(node, &tt) + if err != nil { + return err + } + iq.Any = node case xml.EndElement: if tt == start.End() { return nil diff --git a/iq_test.go b/iq_test.go index 0a8aae6..df9b360 100644 --- a/iq_test.go +++ b/iq_test.go @@ -153,3 +153,19 @@ func TestPayloadWithError(t *testing.T) { t.Errorf("incorrect error value: '%s'", parsedIQ.Error.Reason) } } + +func TestUnknownPayload(t *testing.T) { + iq := ` + +` + parsedIQ := xmpp.IQ{} + err := xml.Unmarshal([]byte(iq), &parsedIQ) + if err != nil { + t.Errorf("Unmarshal error: %#v (%s)", err, iq) + return + } + + if parsedIQ.Any.XMLName.Space != "unknown:ns" { + t.Errorf("could not extract namespace: '%s'", parsedIQ.Any.XMLName.Space) + } +}