@Override public ListenableFuture<WebSocketSession> connect(TransportRequest request, WebSocketHandler handler) { SettableListenableFuture<WebSocketSession> connectFuture = new SettableListenableFuture<>(); XhrClientSockJsSession session = new XhrClientSockJsSession(request, handler, this, connectFuture); request.addTimeoutTask(session.getTimeoutTask()); URI receiveUrl = request.getTransportUrl(); if (logger.isDebugEnabled()) { logger.debug("Starting XHR " + (isXhrStreamingDisabled() ? "Polling" : "Streaming") + "session url=" + receiveUrl); } HttpHeaders handshakeHeaders = new HttpHeaders(); handshakeHeaders.putAll(request.getHandshakeHeaders()); connectInternal(request, handler, receiveUrl, handshakeHeaders, session, connectFuture); return connectFuture; }
public XhrClientSockJsSession(TransportRequest request, WebSocketHandler handler, XhrTransport transport, SettableListenableFuture<WebSocketSession> connectFuture) { super(request, handler, connectFuture); Assert.notNull(transport, "XhrTransport is required"); this.transport = transport; this.headers = request.getHttpRequestHeaders(); this.sendHeaders = new HttpHeaders(); this.sendHeaders.putAll(this.headers); this.sendHeaders.setContentType(MediaType.APPLICATION_JSON); this.sendUrl = request.getSockJsUrlInfo().getTransportUrl(TransportType.XHR_SEND); }
public SockJsMessageCodec getMessageCodec() { return this.request.getMessageCodec(); }
@Test public void connect() throws Exception { HttpHeaders handshakeHeaders = new HttpHeaders(); handshakeHeaders.setOrigin("foo"); TransportRequest request = mock(TransportRequest.class); given(request.getSockJsUrlInfo()).willReturn(new SockJsUrlInfo(new URI("http://example.com"))); given(request.getHandshakeHeaders()).willReturn(handshakeHeaders); given(request.getHttpRequestHeaders()).willReturn(new HttpHeaders()); TestXhrTransport transport = new TestXhrTransport(); WebSocketHandler handler = mock(WebSocketHandler.class); transport.connect(request, handler); ArgumentCaptor<Runnable> captor = ArgumentCaptor.forClass(Runnable.class); verify(request).getSockJsUrlInfo(); verify(request).addTimeoutTask(captor.capture()); verify(request).getTransportUrl(); verify(request).getHandshakeHeaders(); verify(request).getHttpRequestHeaders(); verifyNoMoreInteractions(request); assertEquals(1, transport.actualHandshakeHeaders.size()); assertEquals("foo", transport.actualHandshakeHeaders.getOrigin()); assertFalse(transport.actualSession.isDisconnected()); captor.getValue().run(); assertTrue(transport.actualSession.isDisconnected()); }
@Override protected void connectInternal(TransportRequest transportRequest, WebSocketHandler handler, URI url, HttpHeaders handshakeHeaders, XhrClientSockJsSession session, SettableListenableFuture<WebSocketSession> connectFuture) { HttpHeaders httpHeaders = transportRequest.getHttpRequestHeaders(); SockJsResponseListener listener = new SockJsResponseListener(url, httpHeaders, session, connectFuture); executeReceiveRequest(url, handshakeHeaders, listener); }
@Override public String getId() { return this.request.getSockJsUrlInfo().getSessionId(); }
@Override public HttpHeaders getHandshakeHeaders() { return this.request.getHandshakeHeaders(); }
@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")); }
@Override public Principal getPrincipal() { return this.request.getUser(); }
@Override public void completed(ClientConnection connection) { ClientRequest request = new ClientRequest().setMethod(Methods.POST).setPath(url.getPath()); HttpString headerName = HttpString.tryFromString(HttpHeaders.HOST); request.getRequestHeaders().add(headerName, url.getHost()); addHttpHeaders(request, headers); HttpHeaders httpHeaders = transportRequest.getHttpRequestHeaders(); connection.sendRequest(request, createReceiveCallback(transportRequest, url, httpHeaders, session, connectFuture)); }
@Override public URI getUri() { return this.request.getSockJsUrlInfo().getSockJsUrl(); }
@Override public HttpHeaders getHandshakeHeaders() { return this.request.getHandshakeHeaders(); }
@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")); }
@Override public Principal getPrincipal() { return this.request.getUser(); }
@Override public ListenableFuture<WebSocketSession> connect(TransportRequest request, WebSocketHandler handler) { final SettableListenableFuture<WebSocketSession> future = new SettableListenableFuture<>(); WebSocketClientSockJsSession session = new WebSocketClientSockJsSession(request, handler, future); handler = new ClientSockJsWebSocketHandler(session); request.addTimeoutTask(session.getTimeoutTask()); URI url = request.getTransportUrl(); WebSocketHttpHeaders headers = new WebSocketHttpHeaders(request.getHandshakeHeaders()); if (logger.isDebugEnabled()) { logger.debug("Starting WebSocket session on " + url); } this.webSocketClient.doHandshake(handler, headers, url).addCallback( new ListenableFutureCallback<WebSocketSession>() { @Override public void onSuccess(@Nullable WebSocketSession webSocketSession) { // WebSocket session ready, SockJS Session not yet } @Override public void onFailure(Throwable ex) { future.setException(ex); } }); return future; }
public XhrClientSockJsSession(TransportRequest request, WebSocketHandler handler, XhrTransport transport, SettableListenableFuture<WebSocketSession> connectFuture) { super(request, handler, connectFuture); Assert.notNull(transport, "XhrTransport is required"); this.transport = transport; this.headers = request.getHttpRequestHeaders(); this.sendHeaders = new HttpHeaders(); this.sendHeaders.putAll(this.headers); this.sendHeaders.setContentType(MediaType.APPLICATION_JSON); this.sendUrl = request.getSockJsUrlInfo().getTransportUrl(TransportType.XHR_SEND); }
HttpHeaders httpHeaders = transportRequest.getHttpRequestHeaders(); XhrRequestCallback requestCallback = new XhrRequestCallback(handshakeHeaders); XhrRequestCallback requestCallbackAfterHandshake = new XhrRequestCallback(httpHeaders);
@Override public String getId() { return this.request.getSockJsUrlInfo().getSessionId(); }
@Override public HttpHeaders getHandshakeHeaders() { return this.request.getHandshakeHeaders(); }
@Override public Principal getPrincipal() { return this.request.getUser(); }