private void authenticate(final HttpMethod method) {
   try {
     if (this.conn.isProxied() && !this.conn.isSecure()) {
       authenticateProxy(method);
     }
     authenticateHost(method);
   } catch (AuthenticationException e) {
     LOG.error(e.getMessage(), e);
   }
 }
  /**
   * Executes a ConnectMethod to establish a tunneled connection.
   *
   * @return <code>true</code> if the connect was successful
   * @throws IOException
   * @throws HttpException
   */
  private boolean executeConnect() throws IOException, HttpException {

    this.connectMethod = new ConnectMethod(this.hostConfiguration);
    this.connectMethod.getParams().setDefaults(this.hostConfiguration.getParams());

    int code;
    for (; ; ) {
      if (!this.conn.isOpen()) {
        this.conn.open();
      }
      if (this.params.isAuthenticationPreemptive() || this.state.isAuthenticationPreemptive()) {
        LOG.debug("Preemptively sending default basic credentials");
        this.connectMethod.getProxyAuthState().setPreemptive();
        this.connectMethod.getProxyAuthState().setAuthAttempted(true);
      }
      try {
        authenticateProxy(this.connectMethod);
      } catch (AuthenticationException e) {
        LOG.error(e.getMessage(), e);
      }
      applyConnectionParams(this.connectMethod);
      this.connectMethod.execute(state, this.conn);
      code = this.connectMethod.getStatusCode();
      boolean retry = false;
      AuthState authstate = this.connectMethod.getProxyAuthState();
      authstate.setAuthRequested(code == HttpStatus.SC_PROXY_AUTHENTICATION_REQUIRED);
      if (authstate.isAuthRequested()) {
        if (processAuthenticationResponse(this.connectMethod)) {
          retry = true;
        }
      }
      if (!retry) {
        break;
      }
      if (this.connectMethod.getResponseBodyAsStream() != null) {
        this.connectMethod.getResponseBodyAsStream().close();
      }
    }
    if ((code >= 200) && (code < 300)) {
      this.conn.tunnelCreated();
      // Drop the connect method, as it is no longer needed
      this.connectMethod = null;
      return true;
    } else {
      this.conn.close();
      return false;
    }
  }