@Override protected void doMessageReceived(HttpAcceptSession session, Object message) throws Exception { // this can happen if there is an error if (!(message instanceof WsMessage)) { return; } WsebSession wsebSession = getSession(session); WsMessage wsebMessage = (WsMessage) message; IoFilterChain filterChain = wsebSession.getTransportSession().getFilterChain(); switch (wsebMessage.getKind()) { case COMMAND: for (Command command : ((WsCommandMessage) wsebMessage).getCommands()) { if (command == Command.close()) { session.setWriteHeader(HEADER_CONTENT_LENGTH, "0"); session.close(false); filterChain.fireMessageReceived(new WsCloseMessage()); break; } else if (command == Command.reconnect()) { session.setWriteHeader(HEADER_CONTENT_LENGTH, "0"); session.close(false); break; } // no-op (0x00) - continue reading commands } break; default: filterChain.fireMessageReceived(wsebMessage); break; } }
@Override protected void doMessageReceived(HttpSession readSession, Object message) throws Exception { ResourceAddress readAddress = BridgeSession.REMOTE_ADDRESS.get(readSession); WsebSession wsebSession = sessionMap.get(readAddress); // handle parallel closure of WSE session during streaming read if (wsebSession == null) { if (logger.isDebugEnabled()) { logger.debug( String.format("Could not find WsebSession for read address:\n" + readAddress)); } return; } WsMessage wsebMessage = (WsMessage) message; IoBufferEx messageBytes = wsebMessage.getBytes(); IoFilterChain filterChain = wsebSession.getTransportSession().getFilterChain(); switch (wsebMessage.getKind()) { case COMMAND: for (Command command : ((WsCommandMessage) wsebMessage).getCommands()) { if (command == Command.reconnect()) { // received a RECONNECT command wsebSession.detachReader(readSession); // re-attach downstream for read final BridgeConnector bridgeConnector = bridgeServiceFactory.newBridgeConnector(readAddress); bridgeConnector.connect(readAddress, selectReadHandler(readAddress), null); break; } else if (command == Command.close()) { // Following should take care of sending CLOSE response and closing reader // (downstream) // Close case was not handled before 3.5.9 filterChain.fireMessageReceived(new WsCloseMessage()); break; } // no-op (0x00) - continue reading commands } break; default: filterChain.fireMessageReceived(wsebMessage); break; } }
private void read(S session) { IoSessionConfig config = session.getConfig(); int bufferSize = config.getReadBufferSize(); IoBuffer buf = IoBuffer.allocate(bufferSize); final boolean hasFragmentation = session.getTransportMetadata().hasFragmentation(); try { int readBytes = 0; int ret; try { if (hasFragmentation) { while ((ret = read(session, buf)) > 0) { readBytes += ret; if (!buf.hasRemaining()) { break; } } } else { ret = read(session, buf); if (ret > 0) { readBytes = ret; } } } finally { buf.flip(); } if (readBytes > 0) { IoFilterChain filterChain = session.getFilterChain(); filterChain.fireMessageReceived(buf); buf = null; if (hasFragmentation) { if (readBytes << 1 < config.getReadBufferSize()) { session.decreaseReadBufferSize(); } else if (readBytes == config.getReadBufferSize()) { session.increaseReadBufferSize(); } } } if (ret < 0) { scheduleRemove(session); } } catch (Throwable e) { if (e instanceof IOException) { if (!(e instanceof PortUnreachableException) || !AbstractDatagramSessionConfig.class.isAssignableFrom(config.getClass()) || ((AbstractDatagramSessionConfig) config).isCloseOnPortUnreachable()) { scheduleRemove(session); } } IoFilterChain filterChain = session.getFilterChain(); filterChain.fireExceptionCaught(e); } }