【问题标题】:XMPP reply from GAE to Google+ doesn't work从 GAE 到 Google+ 的 XMPP 回复不起作用
【发布时间】:2011-12-04 10:41:33
【问题描述】:

我在解析消息时注意到我的 Google App Engine 日志中有错误。堆栈跟踪对诊断问题没有帮助,所以我写了一个小消息转储器,灵感来自 Google 的 InboundMessageParser 实现。

public class ChatRequestParser extends HttpRequestParser {

    public static Map<String, String> parseMessage(HttpServletRequest request)
    throws IOException {
        try {
            Map<String, String> message = new HashMap<String, String>();
            MimeMultipart multipart = parseMultipartRequest(request);
            int parts = multipart.getCount();
            for (int i = 0; i < parts; i++) {
                BodyPart part = multipart.getBodyPart(i);
                String fieldName = getFieldName(part);
                String fieldValue = getTextContent(part);
                message.put(fieldName, fieldValue);
            }
            return message;
        } catch (MessagingException ex) {
            throw new IOException("Could not parse incoming request.", ex);
        }
    }

}

我发现 Google+ 为每条消息发送两条消息,其中只有一条包含正文(Gmail Talk 客户端只发送一条消息)。

这是第一条消息,没有正文:

{to=xxx@appspot.com, stanza=<message to="xxx@appspot.com" type="chat"
from="yyy@gmail.com/TalkGadgetD9F45A83" xmlns="jabber:client">
<cha:composing xmlns:cha="http://jabber.org/protocol/chatstates"/>
<nos:x value="disabled" xmlns:nos="google:nosave"/>
<arc:record otr="false" xmlns:arc="http://jabber.org/protocol/archive"/>
</message>, from=yyy@gmail.com/TalkGadgetD9F45A83}

第二个是(我的有效负载是许多星号,邮件已更改):

{to=xxx@appspot.com, body=**********************************, 
stanza=<message to="xxx@appspot.com" type="chat" 
id="7279D79D0.17809585028724073_:sl" from="yyy@gmail.com/TalkGadgetD9F45A83"
xmlns="jabber:client"><body>**********************************</body>
<cha:active xmlns:cha="http://jabber.org/protocol/chatstates"/>
<nos:x value="disabled" xmlns:nos="google:nosave"/><arc:record otr="false"
xmlns:arc="http://jabber.org/protocol/archive"/></message>,
from=yyy@gmail.com/TalkGadgetD9F45A83}

由于第一条消息没有正文,因此在 XMPPService 上调用 parseMessage() 会引发异常。有没有人注意到这个问题?

现在我正在捕获 IllegalArgumentException 并丢弃无意义的消息,但真正的问题是,对有效消息的回复没有返回到 Google+ 客户端,而与 Gmail 和还有我在 Linux 上的 Jabber 客户端。

我已提交issue 6467

【问题讨论】:

  • 现在正在调查这个问题——感谢您报告并添加外部问题。我已将其标记为“已开始”。将在此处和问题跟踪器上更新。

标签: java google-app-engine xmpp google-plus


【解决方案1】:

当没有设置正文并调用 parseMessage 时,我可以重现崩溃,我正在修复它。感谢您找到它!

但是,我无法重现“发送回复不起作用”的错误。我有这样的代码:

  XMPPService xmpp = XMPPServiceFactory.getXMPPService();
  Message message = xmpp.parseMessage(req);
  Message reply = new MessageBuilder().withFromJid(message.getRecipientJids()[0])
    .withRecipientJids(message.getFromJid())
    .withBody("Back at you!")
    .build();
  xmpp.sendMessage(reply);

我在 Google+ 和 Gmail 中都收到了回复。你有什么不一样的地方?

【讨论】:

  • 我有.withMessageType(MessageType.NORMAL),如果我删除它,Google+ 会收到邮件——(默认应该是CHAT)。
  • 请注意:即使不设置 FromJid,它也可以工作。如果我离开 withFromJid() 会很糟糕吗?是否保证我的应用程序将成为第一个接收者Jid?否则,我怎样才能找出正确的 fromJid?
  • 在解析出来的消息中,保证你的应用会是第一个接收者JID。忽略它是可以的,但如果用户订阅了“foo@yourappid.appspotchat.com”但您从“yourappid@appspot.com”(来自 JID 的默认值)回复,则行为不正确。现在正在调查 MessageType.NORMAL 错误——感谢您的澄清!
  • 很高兴知道,现在我对 message.getRecipientJids()[0] 感觉好多了,谢谢。
猜你喜欢
  • 2016-02-02
  • 2013-01-14
  • 2013-07-21
  • 2012-10-24
  • 2012-03-05
  • 1970-01-01
  • 2011-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多