Example #1
0
 protected ClientConnectionFactory newSslClientConnectionFactory(
     ClientConnectionFactory connectionFactory) {
   return new SslClientConnectionFactory(
       client.getSslContextFactory(),
       client.getByteBufferPool(),
       client.getExecutor(),
       connectionFactory);
 }
Example #2
0
 private void tunnelSucceeded() {
   try {
     // Replace the promise back with the original
     context.put(HttpClientTransport.HTTP_CONNECTION_PROMISE_CONTEXT_KEY, promise);
     HttpDestination destination =
         (HttpDestination) context.get(HttpClientTransport.HTTP_DESTINATION_CONTEXT_KEY);
     HttpClient client = destination.getHttpClient();
     ClientConnectionFactory sslConnectionFactory =
         new SslClientConnectionFactory(
             client.getSslContextFactory(),
             client.getByteBufferPool(),
             client.getExecutor(),
             connectionFactory);
     org.eclipse.jetty.io.Connection oldConnection = endPoint.getConnection();
     org.eclipse.jetty.io.Connection newConnection =
         sslConnectionFactory.newConnection(endPoint, context);
     Helper.replaceConnection(oldConnection, newConnection);
     LOG.debug("HTTP tunnel established: {} over {}", oldConnection, newConnection);
   } catch (Throwable x) {
     tunnelFailed(x);
   }
 }
Example #3
0
 private void tunnel() {
   try {
     HttpDestination destination =
         (HttpDestination) context.get(HttpClientTransport.HTTP_DESTINATION_CONTEXT_KEY);
     HttpClient client = destination.getHttpClient();
     ClientConnectionFactory connectionFactory = this.connectionFactory;
     if (destination.isSecure())
       connectionFactory =
           new SslClientConnectionFactory(
               client.getSslContextFactory(),
               client.getByteBufferPool(),
               client.getExecutor(),
               connectionFactory);
     org.eclipse.jetty.io.Connection newConnection =
         connectionFactory.newConnection(getEndPoint(), context);
     getEndPoint().upgrade(newConnection);
     if (LOG.isDebugEnabled())
       LOG.debug("SOCKS4 tunnel established: {} over {}", this, newConnection);
   } catch (Throwable x) {
     failed(x);
   }
 }
  private void testServerSendsConnectionClose(boolean chunked, String content) throws Exception {
    ServerSocket server = new ServerSocket(0);
    int port = server.getLocalPort();

    startClient();

    Request request = client.newRequest("localhost", port).scheme("https").path("/ctx/path");
    FutureResponseListener listener = new FutureResponseListener(request);
    request.send(listener);

    Socket socket = server.accept();
    SSLContext sslContext = client.getSslContextFactory().getSslContext();
    SSLSocket sslSocket =
        (SSLSocket) sslContext.getSocketFactory().createSocket(socket, "localhost", port, false);
    sslSocket.setUseClientMode(false);
    sslSocket.startHandshake();

    InputStream input = sslSocket.getInputStream();
    consumeRequest(input);

    OutputStream output = sslSocket.getOutputStream();
    String serverResponse = "" + "HTTP/1.1 200 OK\r\n" + "Connection: close\r\n";
    if (chunked) {
      serverResponse += "" + "Transfer-Encoding: chunked\r\n" + "\r\n";
      for (int i = 0; i < 2; ++i) {
        serverResponse += Integer.toHexString(content.length()) + "\r\n" + content + "\r\n";
      }
      serverResponse += "" + "0\r\n" + "\r\n";
    } else {
      serverResponse += "Content-Length: " + content.length() + "\r\n";
      serverResponse += "\r\n";
      serverResponse += content;
    }

    output.write(serverResponse.getBytes("UTF-8"));
    output.flush();

    switch (closeMode) {
      case NONE:
        {
          break;
        }
      case CLOSE:
        {
          sslSocket.close();
          break;
        }
      case ABRUPT:
        {
          socket.shutdownOutput();
          break;
        }
      default:
        {
          throw new IllegalStateException();
        }
    }

    ContentResponse response = listener.get(5, TimeUnit.SECONDS);
    Assert.assertEquals(HttpStatus.OK_200, response.getStatus());

    // Give some time to process the connection.
    Thread.sleep(1000);

    // Connection should have been removed from pool.
    HttpDestinationOverHTTP destination =
        (HttpDestinationOverHTTP) client.getDestination("http", "localhost", port);
    DuplexConnectionPool connectionPool = (DuplexConnectionPool) destination.getConnectionPool();
    Assert.assertEquals(0, connectionPool.getConnectionCount());
    Assert.assertEquals(0, connectionPool.getIdleConnectionCount());
    Assert.assertEquals(0, connectionPool.getActiveConnectionCount());
  }