code: public SipTransaction sendRequestWithTransaction(Request request, boolean viaProxy,
        Dialog dialog) {
      return sendRequestWithTransaction(request, viaProxy, dialog, null);
    }
docs: This basic method sends out a request message as part of a transaction. A test program should
  use this method when a response to a request is expected. The Request object passed in must be
  a fully formed Request with all required content, EXCEPT for the Via header branch parameter,
  which cannot be filled in until a client transaction is obtained. That happens in this method.
  If the Via branch value is set in the request parameter passed to this method, it is nulled out
  by this method so that a new client transaction can be created by the stack.
  
  This method returns when the request message has been sent out. The calling program must
  subsequently call the waitResponse() method to wait for the result (response, timeout, etc.).
  
  @param request The request to be sent out.
  @param viaProxy If true, send the message to the proxy. In this case a Route header is added by
  this method. Else send the message as is. In this case, for an INVITE request, a route
  header must have been added by the caller for the request routing to complete.
  @param dialog If not null, send the request via the given dialog. Else send it outside of any
  dialog.
  @return A SipTransaction object if the message was sent successfully, null otherwise. The
  calling program doesn't need to do anything with the returned SipTransaction other than
  pass it in to a subsequent call to waitResponse().