diff --git a/xmpp.go b/xmpp.go
index 9d257a4..a792e5a 100644
--- a/xmpp.go
+++ b/xmpp.go
@@ -562,10 +562,11 @@ type Presence struct {
}
type IQ struct {
- ID string
- From string
- To string
- Type string
+ ID string
+ From string
+ To string
+ Type string
+ Query []byte
}
// Recv waits to receive the next XMPP stanza.
@@ -599,7 +600,7 @@ func (c *Client) Recv() (stanza interface{}, err error) {
case *clientPresence:
return Presence{v.From, v.To, v.Type, v.Show, v.Status}, nil
case *clientIQ:
- return IQ{v.ID, v.From, v.To, v.Type}, nil
+ return IQ{ID: v.ID, From: v.From, To: v.To, Type: v.Type, Query: v.Query}, nil
}
}
}
@@ -747,6 +748,7 @@ type clientIQ struct { // info/query
ID string `xml:"id,attr"`
To string `xml:"to,attr"`
Type string `xml:"type,attr"` // error, get, result, set
+ Query []byte `xml:",innerxml"`
Error clientError
Bind bindBind
}
@@ -839,6 +841,7 @@ func next(p *xml.Decoder) (xml.Name, interface{}, error) {
if err = p.DecodeElement(nv, &se); err != nil {
return xml.Name{}, nil, err
}
+
return se.Name, nv, err
}
diff --git a/xmpp_discovery.go b/xmpp_discovery.go
deleted file mode 100644
index 5e753c1..0000000
--- a/xmpp_discovery.go
+++ /dev/null
@@ -1,12 +0,0 @@
-package xmpp
-
-import (
- "fmt"
-)
-
-const xmlIqGet = ""
-
-func (c *Client) Discovery() {
- cookie := getCookie()
- fmt.Fprintf(c.conn, xmlIqGet, xmlEscape(c.jid), xmlEscape(c.domain), cookie)
-}
diff --git a/xmpp_information_query.go b/xmpp_information_query.go
new file mode 100644
index 0000000..d89379a
--- /dev/null
+++ b/xmpp_information_query.go
@@ -0,0 +1,24 @@
+package xmpp
+
+import (
+ "fmt"
+ "strconv"
+)
+
+const IQTypeGet = "get"
+const IQTypeSet = "set"
+const IQTypeResult = "result"
+
+func (c *Client) Discovery() (string, error) {
+ const namespace = "http://jabber.org/protocol/disco#items"
+ // use getCookie for a pseudo random id.
+ reqID := strconv.FormatUint(uint64(getCookie()), 10)
+ return c.RawInformationQuery(c.jid, c.domain, reqID, IQTypeGet, namespace, "")
+}
+
+// RawInformationQuery sends an information query request to the server.
+func (c *Client) RawInformationQuery(from, to, id, iqType, requestNamespace, body string) (string, error) {
+ const xmlIQ = "%s"
+ _, err := fmt.Fprintf(c.conn, xmlIQ, xmlEscape(from), xmlEscape(to), id, iqType, requestNamespace, body)
+ return id, err
+}