@Override
  public void updateState() {
    // Update the IO state if necessary
    if (getMessage() == null && getConnection().getInboundWay().isAvailable()) {
      setMessage(getMessages().peek());
    }

    super.updateState();
  }
  @Override
  public void onMessageCompleted(boolean endDetected) throws IOException {
    Response message = getMessage();

    if (message != null) {
      getMessages().remove(message);
      super.onMessageCompleted(endDetected);
    }
  }
  @Override
  public void onError(Status status) {
    for (Response rsp : getMessages()) {
      if (rsp != getMessage()) {
        getMessages().remove(rsp);
        getHelper().onOutboundError(status, rsp);
      }
    }

    super.onError(status);
  }
  @Override
  public void onTimeOut() {
    for (Response rsp : getMessages()) {
      if (rsp != getMessage()) {
        getMessages().remove(rsp);
        getHelper().onOutboundError(Status.CONNECTOR_ERROR_COMMUNICATION, rsp);
      }
    }

    super.onTimeOut();
  }
  @Override
  public void onHeadersCompleted() throws IOException {
    Response message = getMessage();

    if (message != null) {
      Request request = message.getRequest();

      if (request.isExpectingResponse()) {
        Queue<Response> inboundMessages =
            ((HttpClientInboundWay) getConnection().getInboundWay()).getMessages();
        inboundMessages.add(message);
        getConnection().getInboundWay().setMessageState(MessageState.START);
      }
    }

    super.onHeadersCompleted();
  }
 @Override
 public void clear() {
   super.clear();
   this.messages.clear();
 }