Ответ XMPP от GAE на Google+ не работает - PullRequest
0 голосов
/ 04 декабря 2011

Я заметил ошибки в журнале 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}

Поскольку в первом сообщении нет тела, вызывающего parseMessage (), XMPPService выдает исключение. Кто-нибудь заметил эту проблему?

Теперь я ловлю исключение IllegalArgumentException и выбрасываю бессмысленные сообщения, но реальная проблема заключается в том, что ответ на действительное сообщение не возвращается обратно в клиент Google + , хотя прекрасно работает с Gmail, а также с моим клиентом Jabber в Linux.

Я подал выпуск 6467 .

1 Ответ

2 голосов
/ 05 декабря 2011

Я могу воспроизвести сбой, когда тело не установлено, и 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.Что ты делаешь по-другому?

...