public static SockJsFrame messageFrame(SockJsMessageCodec codec, String... messages) { String encoded = codec.encode(messages); return new SockJsFrame(encoded); }
@Override protected SockJsFrameFormat getFrameFormat(ServerHttpRequest request) { return new DefaultSockJsFrameFormat("%s\n"); }
@Override public String format(SockJsFrame frame) { return String.format(this.format, preProcessContent(frame.getContent())); }
@Test public void messageArrayFrameEmpty() { SockJsFrame frame = new SockJsFrame("a"); assertEquals("a[]", frame.getContent()); assertEquals(SockJsFrameType.MESSAGE, frame.getType()); assertEquals("[]", frame.getFrameData()); frame = new SockJsFrame("a[]"); assertEquals("a[]", frame.getContent()); assertEquals(SockJsFrameType.MESSAGE, frame.getType()); assertEquals("[]", frame.getFrameData()); }
@Test public void messageArrayFrame() { SockJsFrame frame = SockJsFrame.messageFrame(new Jackson2SockJsMessageCodec(), "m1", "m2"); assertEquals("a[\"m1\",\"m2\"]", frame.getContent()); assertEquals(SockJsFrameType.MESSAGE, frame.getType()); assertEquals("[\"m1\",\"m2\"]", frame.getFrameData()); }
@Test public void openFrame() { SockJsFrame frame = SockJsFrame.openFrame(); assertEquals("o", frame.getContent()); assertEquals(SockJsFrameType.OPEN, frame.getType()); assertNull(frame.getFrameData()); }
@Test public void heartbeatFrame() { SockJsFrame frame = SockJsFrame.heartbeatFrame(); assertEquals("h", frame.getContent()); assertEquals(SockJsFrameType.HEARTBEAT, frame.getType()); assertNull(frame.getFrameData()); }
@Test public void closeFrame() { SockJsFrame frame = SockJsFrame.closeFrame(3000, "Go Away!"); assertEquals("c[3000,\"Go Away!\"]", frame.getContent()); assertEquals(SockJsFrameType.CLOSE, frame.getType()); assertEquals("[3000,\"Go Away!\"]", frame.getFrameData()); }
@Test public void handleFrameMessageWhenNotOpen() throws Exception { this.session.handleFrame(SockJsFrame.openFrame().getContent()); this.session.close(); reset(this.handler); this.session.handleFrame(SockJsFrame.messageFrame(CODEC, "foo", "bar").getContent()); verifyNoMoreInteractions(this.handler); }
/** * Return data contained in a SockJS "message" and "close" frames. Otherwise * for SockJS "open" and "close" frames, which do not contain data, return * {@code null}. */ @Nullable public String getFrameData() { if (getType() == SockJsFrameType.OPEN || getType() == SockJsFrameType.HEARTBEAT) { return null; } else { return getContent().substring(1); } }
@Override protected void handleRequestInternal(ServerHttpRequest request, ServerHttpResponse response, boolean initialRequest) throws IOException { if (initialRequest) { writeFrame(SockJsFrame.openFrame()); } else if (!getMessageCache().isEmpty()) { flushCache(); } else { scheduleHeartbeat(); } }
@Override public void sendMessageInternal(String message) throws SockJsTransportFailureException { // Open frame not sent yet? // If in the session initialization thread, then cache, otherwise wait. if (!this.openFrameSent) { synchronized (this.initSessionLock) { if (!this.openFrameSent) { this.initSessionCache.add(message); return; } } } cancelHeartbeat(); writeFrame(SockJsFrame.messageFrame(getMessageCodec(), message)); scheduleHeartbeat(); }
public static SockJsFrame closeFrame(int code, @Nullable String reason) { return new SockJsFrame("c[" + code + ",\"" + (reason != null ? reason : "") + "\"]"); }
protected void sendHeartbeat() throws SockJsTransportFailureException { synchronized (this.responseLock) { if (isActive() && !this.heartbeatDisabled) { writeFrame(SockJsFrame.heartbeatFrame()); scheduleHeartbeat(); } } }
@Override public boolean equals(Object other) { if (this == other) { return true; } if (!(other instanceof SockJsFrame)) { return false; } SockJsFrame otherFrame = (SockJsFrame) other; return (this.type.equals(otherFrame.type) && this.content.equals(otherFrame.content)); }
@Test public void closeFrameEmpty() { SockJsFrame frame = new SockJsFrame("c"); assertEquals("c[]", frame.getContent()); assertEquals(SockJsFrameType.CLOSE, frame.getType()); assertEquals("[]", frame.getFrameData()); frame = new SockJsFrame("c[]"); assertEquals("c[]", frame.getContent()); assertEquals(SockJsFrameType.CLOSE, frame.getType()); assertEquals("[]", frame.getFrameData()); }
@Override protected SockJsFrameFormat getFrameFormat(ServerHttpRequest request) { return new DefaultSockJsFrameFormat("%s\n"); }
@Override protected void handleRequestInternal(ServerHttpRequest request, ServerHttpResponse response, boolean initialRequest) throws IOException { byte[] prelude = getPrelude(request); response.getBody().write(prelude); response.flush(); if (initialRequest) { writeFrame(SockJsFrame.openFrame()); } flushCache(); }
@Override protected void flushCache() throws SockJsTransportFailureException { String[] messages = new String[getMessageCache().size()]; for (int i = 0; i < messages.length; i++) { messages[i] = getMessageCache().poll(); } SockJsMessageCodec messageCodec = getSockJsServiceConfig().getMessageCodec(); SockJsFrame frame = SockJsFrame.messageFrame(messageCodec, messages); writeFrame(frame); }
@Override protected SockJsFrameFormat getFrameFormat(ServerHttpRequest request) { return new DefaultSockJsFrameFormat("data: %s\r\n\r\n"); }