private void verifyIncomingMessage(TCConnection source, GenericNetworkMessage msg) {
    final Verifier verifier;
    synchronized (states) {
      if (!states.containsKey(source)) {
        states.put(source, new Verifier(msg.getClientNum()));
      }
      verifier = (Verifier) states.get(source);
      source.addListener(this);
    }

    verifier.putMessage(msg);
  }
  public void putMessage0(GenericNetworkMessage msg) throws IOException {
    final TCConnection source = msg.getSource();

    if (verify) {
      verifyIncomingMessage(source, msg);
    }

    // copy the message and send it right back to the client
    TCByteBuffer[] recvData = msg.getPayload();
    TCByteBufferOutputStream out = new TCByteBufferOutputStream();
    TCByteBufferInputStream in = new TCByteBufferInputStream(recvData);

    final int bytesCopied = CopyUtils.copy(in, out);
    Assert.assertEquals(bytesCopied, msg.getDataLength());

    GenericNetworkMessage send = new GenericNetworkMessage(source, out.toArray());
    Assert.assertEquals(msg.getDataLength(), send.getDataLength());
    send.setSequence(msg.getSequence());
    send.setClientNum(msg.getClientNum());

    if (verify) {
      compareData(msg.getEntireMessageData(), send.getEntireMessageData());
    }

    source.putMessage(send);
  }