Xmpp ответ от Gae на Google+ не работает
-
27-10-2019 - |
Вопрос
Я заметил ошибки в моем журнале двигателя Google App во время анализа сообщений. Трассировка стека была бесполезной для диагностики проблемы, поэтому я написал маленькую самосвалую, вдохновленную реализацией 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}
Поскольку в первом сообщении нет тела, вызывая parsemessage () на Xmppservice, бросает исключение. Кто -нибудь заметил эту проблему?
Теперь я поймаю нелегаларгументацию и выбрасываю бессмысленные сообщения, но реальная проблема в том, что это Ответ на действительное сообщение не возвращается в Google+ Клиент, в то время как отлично работает с Gmail, а также с моим Jabber Client на Linux.
Я подал Выпуск 6467.
Решение
Я могу воспроизвести аварию, когда тело не установлено, а 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. Что ты делаешь по -другому?