}
private void forwardConnectionRequest(final UserData target, final Message connectionRequestFromSource,
final Socket controlConnectionToSource) throws Exception {
final Socket toTarget = target.getSocketToUser();
final Message connectionRequest = MessageStaticFactory.newSTUNMessageInstance(STUNMessageClass.REQUEST,
STUNMessageMethod.CONNECTION_REQUEST, connectionRequestFromSource.getHeader().getTransactionId());
connectionRequest.addAttribute(new HolePunchingAttribute());
connectionRequest.addAttribute(connectionRequestFromSource.getAttribute(Token.class));
// public endpoint
connectionRequest.addAttribute(this.createXorMappedAddressFromSocket(controlConnectionToSource,
connectionRequest.getHeader().getTransactionId()));
// private endpoint
connectionRequest.addAttribute(connectionRequestFromSource.getAttribute(XorMappedAddress.class));
logger.debug("Forwarding endpoints to target {}", toTarget.toString()); //$NON-NLS-1$
connectionRequest.writeTo(toTarget.getOutputStream());
}