anchor.diff:      {Via#via.proto, Via#via.host, Via#via.port}.
   
   %%--------------------------------------------------------------------
  -%% Function:
  -%% Descrip.:
  -%% Returns :
  +%% Function: get_server_transaction_id(Request)
  +%%           Request = request record()
  +%% Descrip.: Turn a request into a transaction id, that can be stored
  +%%           in our transaction state database together with a
  +%%           reference to the process handling this request (server
  +%%           transaction handler) if this is a new transaction, or
  +%%           looked up in the database to find an existing handler if
  +%%           this is a resend of the same request or an ACK to a
  +%%           non-2xx response to INVITE. This is specified in RFC3261
  +%%           #17.2.3 (Matching Requests to Server Transactions).
  +%% Returns : Id = term() | is_2543_ack | error
   %%--------------------------------------------------------------------
   get_server_transaction_id(Request) ->
  +    %% We do a catch around this since it includes much parsing of the
  +    %% request, and parsing data received from the network is a fragile thing.
       case catch guarded_get_server_transaction_id(Request) of
   	{'EXIT', E} ->
   	    logger:log(error, "=ERROR REPORT==== from get_server_transaction_id(~p) :~n~p", [Request, E]),
  
positive.code: %% Descrip.: get call from header
  %% Returns : string()
  %%--------------------------------------------------------------------
  callid(Header) when is_record(Header, keylist) -> 
      [CallId] = keylist:fetch("Call-Id", Header),
      CallId.
  
  
negative.code:     Header = Response#response.header,
      TopVia = sipheader:topvia(Header),
      Branch = get_via_branch(TopVia),
      {_, CSeqMethod} = sipheader:cseq(Header),
      {Branch, CSeqMethod}.
  
  %%--------------------------------------------------------------------
  %% Function: get_server_transaction_ack_id_2543(Request)
  %%           Request = request record()
  %% Descrip.: When we receive an ACK that has no RFC3261 Via branch
  %%           parameter, we use this function to get an Id that we then
  %%           look up in our transaction state database to try and find
  %%           an existing server transaction that this ACK should be
  %%           delivered to. This is specified in RFC3261 #17.2.3
  %%           (Matching Requests to Server Transactions).
  %% Returns : Id = term() | error
  %% Note    : When using this function, you have to make sure the
  %%           To-tag of this ACK matches the To-tag of the response you
  %%           think this might be the ACK for!
  %%
  %% Note    : RFC3261 #17.2.3 relevant text :
  %%           The ACK request matches a transaction if the Request-
  %%           URI, From tag, Call-ID, CSeq number (not the method),
  %%	     and top Via header field match those of the INVITE
  %%           request which created the transaction, and the To tag of
  %%           the ACK matches the To tag of the response sent by the
  %%           server transaction.
  %%
  %% Note    : We are supposed to do the comparison of for example, the
  %%           URI, according to the matching rules for URIs but that
  %%           would require us to do a full table scan for every ACK.
  %%           XXX perhaps we should divide the Id into two parts - one
  %%           that is byte-by-byte and used as table index, and another
  %%           part for elements that require more exhaustive matching.
  %%--------------------------------------------------------------------
  get_server_transaction_ack_id_2543(Request) ->
      case catch guarded_get_server_transaction_ack_id_2543(Request) of
  	{'EXIT', E} ->
  	    logger:log(error, "=ERROR REPORT==== from get_server_transaction_ack_id_2543(~p) :~n~p", [Request, E]),
  