/**
   * Test for when encountering a "Transfer-Encoding: chunked" on a Upgrade Response header.
   *
   * <ul>
   *   <li><a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=393075">Eclipse Jetty Bug
   *       #393075</a>
   *   <li><a href="https://issues.apache.org/bugzilla/show_bug.cgi?id=54067">Apache Tomcat Bug
   *       #54067</a>
   * </ul>
   *
   * @throws Exception on test failure
   */
  @Test
  public void testTomcat7_0_32_WithTransferEncoding() throws Exception {
    BlockheadServer server = new BlockheadServer();
    WebSocketClient client = new WebSocketClient();

    try {
      final int bufferSize = 512;

      server.start();

      // Setup Client Factory
      client.start();

      // Create End User WebSocket Class
      LatchedSocket websocket = new LatchedSocket();

      // Open connection
      URI wsURI = server.getWsUri();
      client.connect(websocket, wsURI);

      // Accept incoming connection
      IBlockheadServerConnection socket = server.accept();
      socket.setSoTimeout(2000); // timeout

      // Issue upgrade
      // Add the extra problematic header that triggers bug found in jetty-io
      socket.addResponseHeader("Transfer-Encoding", "chunked");
      socket.upgrade();

      // Wait for proper upgrade
      Assert.assertTrue(
          "Timed out waiting for Client side WebSocket open event",
          websocket.openLatch.await(1, TimeUnit.SECONDS));

      // Have server write frame.
      byte payload[] = new byte[bufferSize / 2];
      Arrays.fill(payload, (byte) 'x');
      ByteBuffer serverFrame = BufferUtil.allocate(bufferSize);
      BufferUtil.flipToFill(serverFrame);
      serverFrame.put((byte) (0x80 | 0x01)); // FIN + TEXT
      serverFrame.put((byte) 0x7E); // No MASK and 2 bytes length
      serverFrame.put((byte) (payload.length >> 8)); // first length byte
      serverFrame.put((byte) (payload.length & 0xFF)); // second length byte
      serverFrame.put(payload);
      BufferUtil.flipToFlush(serverFrame, 0);
      socket.write(serverFrame);
      socket.flush();

      Assert.assertTrue(websocket.dataLatch.await(1000, TimeUnit.SECONDS));
    } finally {
      client.stop();
      server.stop();
    }
  }
Example #2
0
 @Before
 public void startClient() throws Exception {
   client = new WebSocketClient();
   client.getPolicy().setIdleTimeout(60000);
   client.start();
 }