【发布时间】: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