/** * Parse the received packets and notify the corresponding connection. * * @param event the BOSH client response which includes the received packet. */ public void responseReceived(BOSHMessageEvent event) { AbstractBody body = event.getBody(); if (body != null) { try { if (connection.sessionID == null) { connection.sessionID = body.getAttribute(BodyQName.create(BOSHConnection.BOSH_URI, "sid")); } if (connection.authID == null) { connection.authID = body.getAttribute(BodyQName.create(BOSHConnection.BOSH_URI, "authid")); } final XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser(); parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true); parser.setInput(new StringReader(body.toXML())); int eventType = parser.getEventType(); do { eventType = parser.next(); if (eventType == XmlPullParser.START_TAG) { if (parser.getName().equals("body")) { // ignore the container root element } else if (parser.getName().equals("message")) { connection.processPacket(PacketParserUtils.parseMessage(parser)); } else if (parser.getName().equals("iq")) { connection.processPacket(PacketParserUtils.parseIQ(parser, connection)); } else if (parser.getName().equals("presence")) { connection.processPacket(PacketParserUtils.parsePresence(parser)); } else if (parser.getName().equals("challenge")) { // The server is challenging the SASL authentication // made by the client final String challengeData = parser.nextText(); connection.getSASLAuthentication() .challengeReceived(challengeData); connection.processPacket(new Challenge( challengeData)); } else if (parser.getName().equals("success")) { connection.send(ComposableBody.builder() .setNamespaceDefinition("xmpp", BOSHConnection.XMPP_BOSH_NS) .setAttribute( BodyQName.createWithPrefix(BOSHConnection.XMPP_BOSH_NS, "restart", "xmpp"), "true") .setAttribute( BodyQName.create(BOSHConnection.BOSH_URI, "to"), connection.getServiceName()) .build()); connection.getSASLAuthentication().authenticated(); connection.processPacket(new Success(parser.nextText())); } else if (parser.getName().equals("features")) { parseFeatures(parser); } else if (parser.getName().equals("failure")) { if ("urn:ietf:params:xml:ns:xmpp-sasl".equals(parser.getNamespace(null))) { final Failure failure = PacketParserUtils.parseSASLFailure(parser); connection.getSASLAuthentication().authenticationFailed(); connection.processPacket(failure); } } else if (parser.getName().equals("error")) { throw new XMPPException(PacketParserUtils.parseStreamError(parser)); } } } while (eventType != XmlPullParser.END_DOCUMENT); } catch (Exception e) { if (connection.isConnected()) { connection.notifyConnectionError(e); } } } }
private void parseChallenge(Element doc) throws IOException { String challengeData = doc.getText(); processPacket(new Challenge(doc)); connection.getSASLAuthentication().challengeReceived(challengeData); }