< Previous by Date Date Index Next by Date >
< Previous in Thread Thread Index Next in Thread >

Re: [reSIProcate-users] tag accessor misbehaving


Ahhh - that is a bug I just found and fixed recently.  It's odd because the bug had been there since May 2011, and I just stumbled on it in the last month as well.

See commit #9367 : http://svn.resiprocate.org/viewsvn/resiprocate/main/resip/stack/NameAddr.cxx?r1=9366&r2=9367&diff_format=l
-fixed a nasty bug in NameAddr - where unknown parameters uri parameters on a 
 NameAddr/Uri with no angle brackets are treated as NameAddr parameters.  When this is
 done, the memory for these parameters was only a temporary Data object.

Look at changes in NameAddr::parse

Scott

On Sun, Mar 18, 2012 at 8:43 AM, Joegen Baclor <jbaclor@xxxxxxxxx> wrote:
Hi Scott,


I think I have accidentally come across a bug in the tag parser.  The original from-tag that isn't parsed correctly is

    tag=fromtag12345

If I change it to
   
    tag=tag12345

It is parsed correctly.  I think the string "from" is affecting the way parameters are parsed.


Joegen

---------------------

Here is the test code:

int main(int argc , char** argv)
{
  using namespace resip;

  Data buffer =
          "OPTIONS sip:homer@192.168.1.11:5060;transport=tcp SIP/2.0\r\n"
          "From: sip:homertest@192.168.1.10:5060;tag=fromtag12345\r\n"
          "To: sip:homer@192.168.1.11:5060;tag=totag6789\r\n"
          "Contact: sip:homertest@192.168.1.10:5060;transport=tcp\r\n"
          "Via: SIP/2.0/TCP 192.168.1.10:5060;branch=z9hG4bK1234\r\n"
          "CSeq: 1 OPTIONS\r\n"
          "User-Agent: sipXecs\r\n"
          "Call-ID: homertest12345\r\n\r\n";

  SipMessage* msg = SipMessage::make(buffer);

  std::string fromTag;
  std::string toTag;

  if (msg->exists(h_To))
    toTag = msg->const_header(h_To).exists(p_tag) ? msg->const_header(h_To).param(p_tag).c_str() : std::string();

  if (msg->exists(h_From))

    fromTag = msg->const_header(h_From).exists(p_tag) ? msg->const_header(h_From).param(p_tag).c_str() : std::string();

  std::cout << "From-tag: " << fromTag << " To-Tag: " << toTag;

  return 0;

}

On 03/17/2012 11:58 PM, Scott Godin wrote:
Some background info....

For a NameAddr header (ie. To/From/Contact, etc.).  It is possible to have parameters at different levels.  There are user parameters, uri parameters, and NameAddr/header parameters.  

Example:
<sip:user;phone-context=phonedomain.com@xxxxxxxxxx;user=phone>;q=1.0

In this example "phone-context" is a user parameter, "user=phone" is a uri parameter, and "q" is a NameAddr/header parameter.

Use of the angle brackets makes it explicit when differentiating between URI and NameAddr/header parameters.  When the angle brackets are not present resip will assume all known Uri parameters are Uri parameters (ie. ob, gr, lr, maddr, method, transport, etc. - see Uri.hxx), and any unknown parameters are treated as NameAddr/header parameters (see NameAddr::parse).   Note:  The treatment of parameters in the RFC3261 grammars are ambiguous when angle brackets are not used.

Given your example and my explanation above: From: sip:user@10.0.0.1:5060;tag=123  
tag is NOT a known URI parameter and thus should be accessible as you have described.  Is it possible the From header you are parsing was built by hand and not parsed off the wire: ie. fromHeader.uri().param(p_tag) = "123";  <- thus making the tag parameter a Uri parameter explicitly?

There is no reason the From and To header would parse differently.  

Perhaps you can post a simple test program that demonstrates this.  See stack/test/testSipMessage.cxx  line 1889 where there is a test case that demonstrates from tag parsing.

Scott

On Fri, Mar 16, 2012 at 2:10 AM, Joegen Baclor <jbaclor@xxxxxxxxx> wrote:
On 03/16/2012 08:25 AM, Joegen Baclor wrote:
If From or To is constructed without the angle brackets Example:  From: sip:user@10.0.0.1:5060;tag=123 the tag is not accessible via header(h_From).param(p_tag) accesor.  it returns empty.  Is this intentional?

joegen

Correction, I seem to only encounter this in From.  To header seems to treat tags correctly if there are no angle brackets enclosing the URI.

the code looks like this:

   ASSERT_COND(msg->exists(h_From));
   if (msg->exists(h_From))
   {
     fromUser = msg->const_header(h_From).uri().user().c_str();
     fromTag = msg->const_header(h_From).exists(p_tag) ? msg->const_header(h_From).param(p_tag).c_str() : std::string();
     ASSERT_STR_EQ(fromUser.c_str(), "homertest");
     ASSERT_STR_EQ(fromTag.c_str(), "fromtag12345");
   }

The from header looks like this:  From: sip:homertest@192.168.1.10:5060;tag=fromtag12345

Tag would be empty in this case.  If I put angle brackets, then tag is parsed correctly.

_______________________________________________
resiprocate-users mailing list
resiprocate-users@xxxxxxxxxxxxxxx
List Archive: http://list.resiprocate.org/archive/resiprocate-users/