Make it possible to extract unknown iq payload, in field Any

This commit is contained in:
Mickael Remond 2019-06-24 12:15:29 +02:00 committed by Mickaël Rémond
parent 1542110f1b
commit def9629a0b
2 changed files with 24 additions and 2 deletions

10
iq.go
View File

@ -23,7 +23,8 @@ type IQ struct { // Info/Query
// request." // request."
Payload IQPayload `xml:",omitempty"` Payload IQPayload `xml:",omitempty"`
Error Err `xml:"error,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 { type IQPayload interface {
@ -114,7 +115,12 @@ func (iq *IQ) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
continue continue
} }
// TODO: If unknown decode as generic node // 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: case xml.EndElement:
if tt == start.End() { if tt == start.End() {
return nil return nil

View File

@ -153,3 +153,19 @@ func TestPayloadWithError(t *testing.T) {
t.Errorf("incorrect error value: '%s'", parsedIQ.Error.Reason) t.Errorf("incorrect error value: '%s'", parsedIQ.Error.Reason)
} }
} }
func TestUnknownPayload(t *testing.T) {
iq := `<iq type="get" to="service.localhost" id="1" >
<query xmlns="unknown:ns"/>
</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)
}
}