diff --git a/xmpp.go b/xmpp.go
index 3666d0a..2eff38c 100644
--- a/xmpp.go
+++ b/xmpp.go
@@ -545,6 +545,8 @@ type Chat struct {
Remote string
Type string
Text string
+ Subject string
+ Thread string
Roster Roster
Other []string
OtherElem []XMLElement
@@ -594,6 +596,8 @@ func (c *Client) Recv() (stanza interface{}, err error) {
Remote: v.From,
Type: v.Type,
Text: v.Body,
+ Subject: v.Subject,
+ Thread: v.Thread,
Other: v.OtherStrings(),
OtherElem: v.Other,
Stamp: stamp,
@@ -609,7 +613,7 @@ func (c *Client) Recv() (stanza interface{}, err error) {
return Presence{v.From, v.To, v.Type, v.Show, v.Status}, nil
case *clientIQ:
// TODO check more strictly
- if bytes.Equal(v.Query, []byte(``)) || bytes.Equal(v.Query, []byte(``)) {
+ if bytes.Equal(bytes.TrimSpace(v.Query), []byte(``)) || bytes.Equal(bytes.TrimSpace(v.Query), []byte(``)) {
err := c.SendResultPing(v.ID, v.From)
if err != nil {
return Chat{}, err
@@ -622,7 +626,15 @@ func (c *Client) Recv() (stanza interface{}, err error) {
// Send sends the message wrapped inside an XMPP message stanza body.
func (c *Client) Send(chat Chat) (n int, err error) {
- return fmt.Fprintf(c.conn, ""+"%s",
+ var subtext = ``
+ var thdtext = ``
+ if chat.Subject != `` {
+ subtext = `` + xmlEscape(chat.Subject) + ``
+ }
+ if chat.Thread != `` {
+ thdtext = `` + xmlEscape(chat.Thread) + ``
+ }
+ return fmt.Fprintf(c.conn, "" + subtext + "%s" + thdtext + "",
xmlEscape(chat.Remote), xmlEscape(chat.Type), xmlEscape(chat.Text))
}