@Test
  public void echoXhrWithHeaders() throws Exception {
    AbstractXhrTransport xhrTransport = createXhrTransport();
    xhrTransport.setXhrStreamingDisabled(true);

    WebSocketHttpHeaders headers = new WebSocketHttpHeaders();
    headers.add("auth", "123");
    testEcho(10, xhrTransport, headers);

    for (Map.Entry<String, HttpHeaders> entry : this.testFilter.requests.entrySet()) {
      HttpHeaders httpHeaders = entry.getValue();
      assertEquals("No auth header for: " + entry.getKey(), "123", httpHeaders.getFirst("auth"));
    }
  }
  @Override
  public final ListenableFuture<WebSocketSession> doHandshake(
      WebSocketHandler webSocketHandler, WebSocketHttpHeaders headers, URI uri) {

    Assert.notNull(webSocketHandler, "webSocketHandler must not be null");
    assertUri(uri);

    if (logger.isDebugEnabled()) {
      logger.debug("Connecting to " + uri);
    }

    HttpHeaders headersToUse = new HttpHeaders();
    if (headers != null) {
      for (String header : headers.keySet()) {
        if (!specialHeaders.contains(header.toLowerCase())) {
          headersToUse.put(header, headers.get(header));
        }
      }
    }

    List<String> subProtocols =
        ((headers != null) && (headers.getSecWebSocketProtocol() != null))
            ? headers.getSecWebSocketProtocol()
            : Collections.<String>emptyList();

    List<WebSocketExtension> extensions =
        ((headers != null) && (headers.getSecWebSocketExtensions() != null))
            ? headers.getSecWebSocketExtensions()
            : Collections.<WebSocketExtension>emptyList();

    return doHandshakeInternal(
        webSocketHandler,
        headersToUse,
        uri,
        subProtocols,
        extensions,
        Collections.<String, Object>emptyMap());
  }