anchor.diff:  	    throw({sipparseerror, Type, Header, 400, "Missing or invalid " ++ Name ++ ": header"})
       end.
   
  +%% part of sanity_check_contact/4
   sanity_check_uri(Type, Desc, URI, Header)  when is_record(URI, sipurl), URI#sipurl.host == none ->
       throw({sipparseerror, Type, Header, 400, "No host part in " ++ Desc ++ " URL"});
   sanity_check_uri(_Type, _Desc, URI, _Header) when is_record(URI, sipurl) ->
       ok.
   
  -check_supported_uri_scheme({unparseable, URIstr}, Header) ->
  +%%--------------------------------------------------------------------
  +%% Function: check_supported_uri_scheme(URI, Header)
  +%%           URI    = sipurl record() | {unparseable, URIstr}
  +%%           Header = keylist record()
  +%% Descrip.: Check if we supported the URI scheme of a request. If
  +%%           we didn't support the URI scheme, sipurl:parse(...) will
  +%%           have failed, and we just format the 416 error response.
  +%% Returns : true | throw({sipparseerror, ...})
  +%%--------------------------------------------------------------------
  +check_supported_uri_scheme({unparseable, URIstr}, Header) when is_record(Header, keylist) ->
       case string:chr(URIstr, $:) of
   	0 ->
   	    throw({sipparseerror, request, Header, 416, "Unsupported URI Scheme"});
  
positive.code: %%--------------------------------------------------------------------
  
  -export([
  	 safe_spawn_child/2,
  	 safe_spawn_child/3
  	]).
  
  
negative.code: %%           Origin = siporigin record()
  %% Descrip.: Create a textual representation of a request/response,
  %%           for use in logging.
  %% Returns : LogStr = string()
  %% Note    : draft-ietf-sipping-torture-tests-04.txt argues that a
  %%           proxy shouldn't fail processing a packet just because it
  %%           has a From: header using an URI scheme that it doesn't
  %%           understand - like http. Well, we do - here. The reason
  %%           for not just fixing this here is that there might be
  %%           other places where we expect the From: to be parsable by
  %%           our sipheader:from() - and this hasn't been a problem in
  %%           real life.
  %%--------------------------------------------------------------------
  make_logstr(Request, Origin) when is_record(Request, request), is_record(Origin, siporigin) ->
      {Method, URI, Header} = {Request#request.method, Request#request.uri, Request#request.header},
      {_, FromURI} = sipheader:from(Header),
      {_, ToURI} = sipheader:to(Header),
      ClientStr = origin2str(Origin),
      lists:flatten(io_lib:format("~s ~s [client=~s, from=<~s>, to=<~s>]",
  				[Method, sipurl:print(URI), ClientStr, url2str(FromURI), url2str(ToURI)]));
  make_logstr(Response, Origin) when is_record(Response, response), is_record(Origin, siporigin) ->
      Header = Response#response.header,
      {_, CSeqMethod} = sipheader:cseq(Header),
      {_, FromURI} = sipheader:from(Header),
      {_, ToURI} = sipheader:to(Header),
      ClientStr = origin2str(Origin),
      case keylist:fetch('warning', Header) of
  	[Warning] when is_list(Warning) ->
  	    lists:flatten(io_lib:format("~s [client=~s, from=<~s>, to=<~s>, warning=~p]",
  