@Override public ListenableFuture<WebSocketSession> doHandshake( WebSocketHandler handler, String uriTemplate, Object... uriVars) { Assert.notNull(uriTemplate, "uriTemplate must not be null"); URI uri = UriComponentsBuilder.fromUriString(uriTemplate).buildAndExpand(uriVars).encode().toUri(); return doHandshake(handler, null, uri); }
@Test public void connectSockJsInfoCached() throws Exception { setupInfoRequest(true); this.sockJsClient.doHandshake(handler, URL); this.sockJsClient.doHandshake(handler, URL); this.sockJsClient.doHandshake(handler, URL); verify(this.infoReceiver, times(1)).executeInfoRequest(any(), any()); }
@Test public void infoRequestFailure() throws Exception { TestClientHandler handler = new TestClientHandler(); this.testFilter.sendErrorMap.put("/info", 500); CountDownLatch latch = new CountDownLatch(1); initSockJsClient(createWebSocketTransport()); this.sockJsClient.doHandshake(handler, this.baseUrl + "/echo").addCallback( new ListenableFutureCallback<WebSocketSession>() { @Override public void onSuccess(WebSocketSession result) { } @Override public void onFailure(Throwable ex) { latch.countDown(); } } ); assertTrue(latch.await(5000, TimeUnit.MILLISECONDS)); }
private void testEcho(int messageCount, Transport transport, WebSocketHttpHeaders headers) throws Exception { List<TextMessage> messages = new ArrayList<>(); for (int i = 0; i < messageCount; i++) { messages.add(new TextMessage("m" + i)); } TestClientHandler handler = new TestClientHandler(); initSockJsClient(transport); URI url = new URI(this.baseUrl + "/echo"); WebSocketSession session = this.sockJsClient.doHandshake(handler, headers, url).get(); for (TextMessage message : messages) { session.sendMessage(message); } handler.awaitMessageCount(messageCount, 5000); for (TextMessage message : messages) { assertTrue("Message not received: " + message, handler.receivedMessages.remove(message)); } assertEquals("Remaining messages: " + handler.receivedMessages, 0, handler.receivedMessages.size()); session.close(); }
@Test public void fallbackAfterTransportFailure() throws Exception { this.testFilter.sendErrorMap.put("/websocket", 200); this.testFilter.sendErrorMap.put("/xhr_streaming", 500); TestClientHandler handler = new TestClientHandler(); initSockJsClient(createWebSocketTransport(), createXhrTransport()); WebSocketSession session = this.sockJsClient.doHandshake(handler, this.baseUrl + "/echo").get(); assertEquals("Fallback didn't occur", XhrClientSockJsSession.class, session.getClass()); TextMessage message = new TextMessage("message1"); session.sendMessage(message); handler.awaitMessage(message, 5000); }
@Test public void connectWebSocketDisabled() throws URISyntaxException { setupInfoRequest(false); this.sockJsClient.doHandshake(handler, URL); assertFalse(this.webSocketTransport.invoked()); assertTrue(this.xhrTransport.invoked()); assertTrue(this.xhrTransport.getRequest().getTransportUrl().toString().endsWith("xhr_streaming")); }
@Test(timeout = 5000) public void fallbackAfterConnectTimeout() throws Exception { TestClientHandler clientHandler = new TestClientHandler(); this.testFilter.sleepDelayMap.put("/xhr_streaming", 10000L); this.testFilter.sendErrorMap.put("/xhr_streaming", 503); initSockJsClient(createXhrTransport()); this.sockJsClient.setConnectTimeoutScheduler(this.wac.getBean(ThreadPoolTaskScheduler.class)); WebSocketSession clientSession = sockJsClient.doHandshake(clientHandler, this.baseUrl + "/echo").get(); assertEquals("Fallback didn't occur", XhrClientSockJsSession.class, clientSession.getClass()); TextMessage message = new TextMessage("message1"); clientSession.sendMessage(message); clientHandler.awaitMessage(message, 5000); clientSession.close(); }
@Test public void connectXhrStreamingDisabled() throws Exception { setupInfoRequest(false); this.xhrTransport.setStreamingDisabled(true); this.sockJsClient.doHandshake(handler, URL).addCallback(this.connectCallback); assertFalse(this.webSocketTransport.invoked()); assertTrue(this.xhrTransport.invoked()); assertTrue(this.xhrTransport.getRequest().getTransportUrl().toString().endsWith("xhr")); }
private void testReceiveOneMessage(Transport transport, WebSocketHttpHeaders headers) throws Exception { TestClientHandler clientHandler = new TestClientHandler(); initSockJsClient(transport); this.sockJsClient.doHandshake(clientHandler, headers, new URI(this.baseUrl + "/test")).get(); TestServerHandler serverHandler = this.wac.getBean(TestServerHandler.class); assertNotNull("afterConnectionEstablished should have been called", clientHandler.session); serverHandler.awaitSession(5000); TextMessage message = new TextMessage("message1"); serverHandler.session.sendMessage(message); clientHandler.awaitMessage(message, 5000); }
@Test public void connectSockJsInfo() throws Exception { setupInfoRequest(true); this.sockJsClient.doHandshake(handler, URL); verify(this.infoReceiver, times(1)).executeInfoRequest(any(), any()); }
@Test public void connectAndUseSubsetOfHandshakeHeadersForHttpRequests() throws Exception { ArgumentCaptor<HttpHeaders> headersCaptor = setupInfoRequest(false); this.xhrTransport.setStreamingDisabled(true); WebSocketHttpHeaders headers = new WebSocketHttpHeaders(); headers.set("foo", "bar"); headers.set("auth", "123"); this.sockJsClient.setHttpHeaderNames("auth"); this.sockJsClient.doHandshake(handler, headers, new URI(URL)).addCallback(this.connectCallback); assertEquals(1, headersCaptor.getValue().size()); assertEquals("123", headersCaptor.getValue().getFirst("auth")); assertEquals(1, this.xhrTransport.getRequest().getHttpRequestHeaders().size()); assertEquals("123", this.xhrTransport.getRequest().getHttpRequestHeaders().getFirst("auth")); }
@Test public void connectWebSocket() throws Exception { setupInfoRequest(true); this.sockJsClient.doHandshake(handler, URL).addCallback(this.connectCallback); assertTrue(this.webSocketTransport.invoked()); WebSocketSession session = mock(WebSocketSession.class); this.webSocketTransport.getConnectCallback().onSuccess(session); verify(this.connectCallback).onSuccess(session); verifyNoMoreInteractions(this.connectCallback); }
@Test public void connectWithHandshakeHeaders() throws Exception { ArgumentCaptor<HttpHeaders> headersCaptor = setupInfoRequest(false); this.xhrTransport.setStreamingDisabled(true); WebSocketHttpHeaders headers = new WebSocketHttpHeaders(); headers.set("foo", "bar"); headers.set("auth", "123"); this.sockJsClient.doHandshake(handler, headers, new URI(URL)).addCallback(this.connectCallback); HttpHeaders httpHeaders = headersCaptor.getValue(); assertEquals(2, httpHeaders.size()); assertEquals("bar", httpHeaders.getFirst("foo")); assertEquals("123", httpHeaders.getFirst("auth")); httpHeaders = this.xhrTransport.getRequest().getHttpRequestHeaders(); assertEquals(2, httpHeaders.size()); assertEquals("bar", httpHeaders.getFirst("foo")); assertEquals("123", httpHeaders.getFirst("auth")); }
@Test public void connectInfoRequestFailure() throws URISyntaxException { HttpServerErrorException exception = new HttpServerErrorException(HttpStatus.SERVICE_UNAVAILABLE); given(this.infoReceiver.executeInfoRequest(any(), any())).willThrow(exception); this.sockJsClient.doHandshake(handler, URL).addCallback(this.connectCallback); verify(this.connectCallback).onFailure(exception); assertFalse(this.webSocketTransport.invoked()); assertFalse(this.xhrTransport.invoked()); }
@Override public ListenableFuture<WebSocketSession> doHandshake( WebSocketHandler handler, String uriTemplate, Object... uriVars) { Assert.notNull(uriTemplate, "uriTemplate must not be null"); URI uri = UriComponentsBuilder.fromUriString(uriTemplate).buildAndExpand(uriVars).encode().toUri(); return doHandshake(handler, null, uri); }
@Override public ListenableFuture<WebSocketSession> doHandshake( WebSocketHandler handler, String uriTemplate, Object... uriVars) { Assert.notNull(uriTemplate, "uriTemplate must not be null"); URI uri = UriComponentsBuilder.fromUriString(uriTemplate).buildAndExpand(uriVars).encode().toUri(); return doHandshake(handler, null, uri); }
private WebSocketSession tryConnect(String serverUrl) throws ExecutionException, InterruptedException { log.debug("Connecting to " + serverUrl); StandardWebSocketClient standardWebSocketClient = new StandardWebSocketClient(); List<Transport> transports = new ArrayList<>(1); transports.add(new WebSocketTransport(standardWebSocketClient)); SockJsClient sockJsClient = new SockJsClient(transports); return sockJsClient .doHandshake(new ClientWebSocketHandler(), serverUrl + "cubaglevt-ws/handler") .get(); }