@Override public final void close() throws IOException { close(CloseStatus.NORMAL); }
@Override public final void close(CloseStatus status) throws IOException { if (!isUserSetStatus(status)) { throw new IllegalArgumentException("Invalid close status: " + status); } if (logger.isDebugEnabled()) { logger.debug("Closing session with " + status + " in " + this); } closeInternal(status); }
protected void closeInternal(CloseStatus status) throws IOException { if (this.state == null) { logger.warn("Ignoring close since connect() was never invoked"); return; } if (isDisconnected()) { if (logger.isDebugEnabled()) { logger.debug("Ignoring close (already closing or closed): current state " + this.state); } return; } this.state = State.CLOSING; this.closeStatus = status; disconnect(status); }
public void handleFrame(String payload) { SockJsFrame frame = new SockJsFrame(payload); switch (frame.getType()) { case OPEN: handleOpenFrame(); break; case HEARTBEAT: if (logger.isTraceEnabled()) { logger.trace("Received heartbeat in " + this); } break; case MESSAGE: handleMessageFrame(frame); break; case CLOSE: handleCloseFrame(frame); } }
private void handleMessageFrame(SockJsFrame frame) { if (!isOpen()) { if (logger.isErrorEnabled()) { logger.error("Ignoring received message due to state " + this.state + " in " + this); if (frameData != null) { try { messages = getMessageCodec().decode(frameData); logger.error("Failed to decode data for SockJS \"message\" frame: " + frame + " in " + this, ex); silentClose(CloseStatus.BAD_DATA); return; if (isOpen()) { try { this.webSocketHandler.handleMessage(this, new TextMessage(message));
@Override public final void sendMessage(WebSocketMessage<?> message) throws IOException { if (!(message instanceof TextMessage)) { throw new IllegalArgumentException(this + " supports text messages only."); } if (this.state != State.OPEN) { throw new IllegalStateException(this + " is not open: current state " + this.state); } String payload = ((TextMessage) message).getPayload(); payload = getMessageCodec().encode(payload); payload = payload.substring(1); // the client-side doesn't need message framing (letter "a") TextMessage messageToSend = new TextMessage(payload); if (logger.isTraceEnabled()) { logger.trace("Sending message " + messageToSend + " in " + this); } sendInternal(messageToSend); }
private void handleCloseFrame(SockJsFrame frame) { CloseStatus closeStatus = CloseStatus.NO_STATUS_CODE; try { String frameData = frame.getFrameData(); if (frameData != null) { String[] data = getMessageCodec().decode(frameData); if (data != null && data.length == 2) { closeStatus = new CloseStatus(Integer.valueOf(data[0]), data[1]); } if (logger.isDebugEnabled()) { logger.debug("Processing SockJS close frame with " + closeStatus + " in " + this); } } } catch (IOException ex) { if (logger.isErrorEnabled()) { logger.error("Failed to decode data for " + frame + " in " + this, ex); } } silentClose(closeStatus); }
private void handleOpenFrame() { if (logger.isDebugEnabled()) { logger.debug("Processing SockJS open frame in " + this); } if (this.state == State.NEW) { this.state = State.OPEN; try { this.webSocketHandler.afterConnectionEstablished(this); this.connectFuture.set(this); } catch (Throwable ex) { if (logger.isErrorEnabled()) { logger.error("WebSocketHandler.afterConnectionEstablished threw exception in " + this, ex); } } } else { if (logger.isDebugEnabled()) { logger.debug("Open frame received in " + getId() + " but we're not connecting (current state " + this.state + "). The server might have been restarted and lost track of the session."); } silentClose(new CloseStatus(1006, "Server lost session")); } }
private void silentClose(CloseStatus status) { try { closeInternal(status); } catch (Throwable ex) { if (logger.isWarnEnabled()) { logger.warn("Failed to close " + this, ex); } } }
public void handleFrame(String payload) { SockJsFrame frame = new SockJsFrame(payload); switch (frame.getType()) { case OPEN: handleOpenFrame(); break; case HEARTBEAT: if (logger.isTraceEnabled()) { logger.trace("Received heartbeat in " + this); } break; case MESSAGE: handleMessageFrame(frame); break; case CLOSE: handleCloseFrame(frame); } }
private void handleMessageFrame(SockJsFrame frame) { if (!isOpen()) { if (logger.isErrorEnabled()) { logger.error("Ignoring received message due to state " + this.state + " in " + this); if (frameData != null) { try { messages = getMessageCodec().decode(frameData); logger.error("Failed to decode data for SockJS \"message\" frame: " + frame + " in " + this, ex); silentClose(CloseStatus.BAD_DATA); return; if (isOpen()) { try { this.webSocketHandler.handleMessage(this, new TextMessage(message));
@Override public final void sendMessage(WebSocketMessage<?> message) throws IOException { if (!(message instanceof TextMessage)) { throw new IllegalArgumentException(this + " supports text messages only."); } if (this.state != State.OPEN) { throw new IllegalStateException(this + " is not open: current state " + this.state); } String payload = ((TextMessage) message).getPayload(); payload = getMessageCodec().encode(payload); payload = payload.substring(1); // the client-side doesn't need message framing (letter "a") TextMessage messageToSend = new TextMessage(payload); if (logger.isTraceEnabled()) { logger.trace("Sending message " + messageToSend + " in " + this); } sendInternal(messageToSend); }
private void handleCloseFrame(SockJsFrame frame) { CloseStatus closeStatus = CloseStatus.NO_STATUS_CODE; try { String frameData = frame.getFrameData(); if (frameData != null) { String[] data = getMessageCodec().decode(frameData); if (data != null && data.length == 2) { closeStatus = new CloseStatus(Integer.valueOf(data[0]), data[1]); } if (logger.isDebugEnabled()) { logger.debug("Processing SockJS close frame with " + closeStatus + " in " + this); } } } catch (IOException ex) { if (logger.isErrorEnabled()) { logger.error("Failed to decode data for " + frame + " in " + this, ex); } } silentClose(closeStatus); }
private void handleOpenFrame() { if (logger.isDebugEnabled()) { logger.debug("Processing SockJS open frame in " + this); } if (this.state == State.NEW) { this.state = State.OPEN; try { this.webSocketHandler.afterConnectionEstablished(this); this.connectFuture.set(this); } catch (Throwable ex) { if (logger.isErrorEnabled()) { logger.error("WebSocketHandler.afterConnectionEstablished threw exception in " + this, ex); } } } else { if (logger.isDebugEnabled()) { logger.debug("Open frame received in " + getId() + " but we're not connecting (current state " + this.state + "). The server might have been restarted and lost track of the session."); } silentClose(new CloseStatus(1006, "Server lost session")); } }
@Override public void run() { try { closeInternal(new CloseStatus(2007, "Transport timed out")); } catch (Throwable ex) { if (logger.isWarnEnabled()) { logger.warn("Failed to close " + this + " after transport timeout", ex); } } } };
public void handleFrame(String payload) { SockJsFrame frame = new SockJsFrame(payload); switch (frame.getType()) { case OPEN: handleOpenFrame(); break; case HEARTBEAT: if (logger.isTraceEnabled()) { logger.trace("Received heartbeat in " + this); } break; case MESSAGE: handleMessageFrame(frame); break; case CLOSE: handleCloseFrame(frame); } }
private void handleMessageFrame(SockJsFrame frame) { if (!isOpen()) { if (logger.isErrorEnabled()) { logger.error("Ignoring received message due to state " + this.state + " in " + this); if (frameData != null) { try { messages = getMessageCodec().decode(frameData); logger.error("Failed to decode data for SockJS \"message\" frame: " + frame + " in " + this, ex); silentClose(CloseStatus.BAD_DATA); return; if (isOpen()) { try { this.webSocketHandler.handleMessage(this, new TextMessage(message));