Openfire closes stream when client sends a <presence type="probe"/>

I know that it is somewhat undefined behavior of what a server is suppose to do when a client sends it a message is somewhat excessive. From looking at the error logs, it would appear the stream closing is simply because it is a case which isn’t handled:

2008.07.14 10:57:31 [org.jivesoftware.openfire.PresenceRouter.handle(PresenceRouter.java:194)] Could not route packet
java.lang.NullPointerException
     at org.jivesoftware.openfire.spi.RoutingTableImpl.routePacket(RoutingTableImpl.java:208)
     at org.jivesoftware.openfire.PresenceRouter.handle(PresenceRouter.java:179)
     at org.jivesoftware.openfire.PresenceRouter.route(PresenceRouter.java:70)
     at org.jivesoftware.openfire.spi.PacketRouterImpl.route(PacketRouterImpl.java:76)
     at org.jivesoftware.openfire.net.StanzaHandler.processPresence(StanzaHandler.java:329)
     at org.jivesoftware.openfire.net.ClientStanzaHandler.processPresence(ClientStanzaHandler.java:85)
     at org.jivesoftware.openfire.net.StanzaHandler.process(StanzaHandler.java:253)
     at org.jivesoftware.openfire.net.StanzaHandler.process(StanzaHandler.java:175)
     at org.jivesoftware.openfire.nio.ConnectionHandler.messageReceived(ConnectionHandler.java:133)
     at org.apache.mina.common.support.AbstractIoFilterChain$TailFilter.messageReceived(AbstractIoFilterChain.java:570)
     at org.apache.mina.common.support.AbstractIoFilterChain.callNextMessageReceived(AbstractIoFilterChain.java:299)
     at org.apache.mina.common.support.AbstractIoFilterChain.access$1100(AbstractIoFilterChain.java:53)
     at org.apache.mina.common.support.AbstractIoFilterChain$EntryImpl$1.messageReceived(AbstractIoFilterChain.java:648)
     at org.apache.mina.common.IoFilterAdapter.messageReceived(IoFilterAdapter.java:80)
     at org.apache.mina.common.support.AbstractIoFilterChain.callNextMessageReceived(AbstractIoFilterChain.java:299)
     at org.apache.mina.common.support.AbstractIoFilterChain.access$1100(AbstractIoFilterChain.java:53)
     at org.apache.mina.common.support.AbstractIoFilterChain$EntryImpl$1.messageReceived(AbstractIoFilterChain.java:648)
     at org.apache.mina.filter.codec.support.SimpleProtocolDecoderOutput.flush(SimpleProtocolDecoderOutput.java:58)
     at org.apache.mina.filter.codec.ProtocolCodecFilter.messageReceived(ProtocolCodecFilter.java:185)
     at org.apache.mina.common.support.AbstractIoFilterChain.callNextMessageReceived(AbstractIoFilterChain.java:299)
     at org.apache.mina.common.support.AbstractIoFilterChain.access$1100(AbstractIoFilterChain.java:53)
     at org.apache.mina.common.support.AbstractIoFilterChain$EntryImpl$1.messageReceived(AbstractIoFilterChain.java:648)
     at org.apache.mina.filter.executor.ExecutorFilter.processEvent(ExecutorFilter.java:239)
     at org.apache.mina.filter.executor.ExecutorFilter$ProcessEventsRunnable.run(ExecutorFilter.java:283)
     at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650)
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675)
     at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:51)
     at java.lang.Thread.run(Thread.java:613)

I would recommend simply dropping the presence packet stanza if it is not to be handled, as it is not technically out-of-spec enough to warrant killing the stream.