private DefaultTransportRequest createRequest( SockJsUrlInfo urlInfo, @Nullable HttpHeaders headers, ServerInfo serverInfo) { List<DefaultTransportRequest> requests = new ArrayList<>(this.transports.size()); for (Transport transport : this.transports) { for (TransportType type : transport.getTransportTypes()) { if (serverInfo.isWebSocketEnabled() || !TransportType.WEBSOCKET.equals(type)) { requests.add(new DefaultTransportRequest(urlInfo, headers, getHttpRequestHeaders(headers), transport, type, getMessageCodec())); } } } if (CollectionUtils.isEmpty(requests)) { throw new IllegalStateException( "No transports: " + urlInfo + ", webSocketEnabled=" + serverInfo.isWebSocketEnabled()); } for (int i = 0; i < requests.size() - 1; i++) { DefaultTransportRequest request = requests.get(i); Principal user = getUser(); if (user != null) { request.setUser(user); } if (this.connectTimeoutScheduler != null) { request.setTimeoutValue(serverInfo.getRetransmissionTimeout()); request.setTimeoutScheduler(this.connectTimeoutScheduler); } request.setFallbackRequest(requests.get(i + 1)); } return requests.get(0); }
@Test public void fallbackAfterTimeout() throws Exception { TaskScheduler scheduler = mock(TaskScheduler.class); Runnable sessionCleanupTask = mock(Runnable.class); DefaultTransportRequest request1 = createTransportRequest(this.webSocketTransport, TransportType.WEBSOCKET); DefaultTransportRequest request2 = createTransportRequest(this.xhrTransport, TransportType.XHR_STREAMING); request1.setFallbackRequest(request2); request1.setTimeoutScheduler(scheduler); request1.addTimeoutTask(sessionCleanupTask); request1.connect(null, this.connectFuture); assertTrue(this.webSocketTransport.invoked()); assertFalse(this.xhrTransport.invoked()); // Get and invoke the scheduled timeout task ArgumentCaptor<Runnable> taskCaptor = ArgumentCaptor.forClass(Runnable.class); verify(scheduler).schedule(taskCaptor.capture(), any(Date.class)); verifyNoMoreInteractions(scheduler); taskCaptor.getValue().run(); assertTrue(this.xhrTransport.invoked()); verify(sessionCleanupTask).run(); }
@Test public void fallbackAfterTransportError() throws Exception { DefaultTransportRequest request1 = createTransportRequest(this.webSocketTransport, TransportType.WEBSOCKET); DefaultTransportRequest request2 = createTransportRequest(this.xhrTransport, TransportType.XHR_STREAMING); request1.setFallbackRequest(request2); request1.connect(null, this.connectFuture); // Transport error => fallback this.webSocketTransport.getConnectCallback().onFailure(new IOException("Fake exception 1")); assertFalse(this.connectFuture.isDone()); assertTrue(this.xhrTransport.invoked()); // Transport error => no more fallback this.xhrTransport.getConnectCallback().onFailure(new IOException("Fake exception 2")); assertTrue(this.connectFuture.isDone()); this.thrown.expect(ExecutionException.class); this.thrown.expectMessage("Fake exception 2"); this.connectFuture.get(); }
private DefaultTransportRequest createRequest( SockJsUrlInfo urlInfo, @Nullable HttpHeaders headers, ServerInfo serverInfo) { List<DefaultTransportRequest> requests = new ArrayList<>(this.transports.size()); for (Transport transport : this.transports) { for (TransportType type : transport.getTransportTypes()) { if (serverInfo.isWebSocketEnabled() || !TransportType.WEBSOCKET.equals(type)) { requests.add(new DefaultTransportRequest(urlInfo, headers, getHttpRequestHeaders(headers), transport, type, getMessageCodec())); } } } if (CollectionUtils.isEmpty(requests)) { throw new IllegalStateException( "No transports: " + urlInfo + ", webSocketEnabled=" + serverInfo.isWebSocketEnabled()); } for (int i = 0; i < requests.size() - 1; i++) { DefaultTransportRequest request = requests.get(i); Principal user = getUser(); if (user != null) { request.setUser(user); } if (this.connectTimeoutScheduler != null) { request.setTimeoutValue(serverInfo.getRetransmissionTimeout()); request.setTimeoutScheduler(this.connectTimeoutScheduler); } request.setFallbackRequest(requests.get(i + 1)); } return requests.get(0); }
private DefaultTransportRequest createRequest( SockJsUrlInfo urlInfo, @Nullable HttpHeaders headers, ServerInfo serverInfo) { List<DefaultTransportRequest> requests = new ArrayList<>(this.transports.size()); for (Transport transport : this.transports) { for (TransportType type : transport.getTransportTypes()) { if (serverInfo.isWebSocketEnabled() || !TransportType.WEBSOCKET.equals(type)) { requests.add(new DefaultTransportRequest(urlInfo, headers, getHttpRequestHeaders(headers), transport, type, getMessageCodec())); } } } if (CollectionUtils.isEmpty(requests)) { throw new IllegalStateException( "No transports: " + urlInfo + ", webSocketEnabled=" + serverInfo.isWebSocketEnabled()); } for (int i = 0; i < requests.size() - 1; i++) { DefaultTransportRequest request = requests.get(i); Principal user = getUser(); if (user != null) { request.setUser(user); } if (this.connectTimeoutScheduler != null) { request.setTimeoutValue(serverInfo.getRetransmissionTimeout()); request.setTimeoutScheduler(this.connectTimeoutScheduler); } request.setFallbackRequest(requests.get(i + 1)); } return requests.get(0); }