versatica / JsSIP

JsSIP, the JavaScript SIP library
https://jssip.net
Other
2.4k stars 739 forks source link

refer of 2 incoming call failed #817

Open michelepra opened 1 year ago

michelepra commented 1 year ago

When jssip build "Refer-to" header not considering rfc3515 (SIP) Refer Method

A REFER request MAY be placed outside the scope of a dialog created with an INVITE. REFER creates a dialog, and MAY be Record-Routed, hence MUST contain a single Contact header field value. REFERs occurring inside an existing dialog MUST follow the Route/Record- Route logic of that dialog.

RFC 3261 12.1.1. and RFC 3261 12.1.2. say how take "local tag" and "remote tag" for dialog and this is correctly implemented

The behaviour of this rfc mismatch is that refer of 2 incoming call failed (eg. in asterisk server)

Solution is to change "Refer-to" builder from

  if (options.replaces)
    {
      replaces = options.replaces._request.call_id;
      replaces += `;to-tag=${options.replaces._to_tag}`;
      replaces += `;from-tag=${options.replaces._from_tag}`;

      replaces = encodeURIComponent(replaces);
    }

to

   if (options.replaces)
    {
      if (options.replaces._dialog) 
      {
        replaces = options.replaces._dialog.id.call_id;
        replaces += `;to-tag=${options.replaces._dialog.id.remote_tag}`;
        replaces += `;from-tag=${options.replaces._dialog.id.local_tag}`;
      } else {
        replaces = options.replaces._request.call_id;
        replaces += `;to-tag=${options.replaces._to_tag}`;
        replaces += `;from-tag=${options.replaces._from_tag}`;
      }

      replaces = encodeURIComponent(replaces);
    }
Karakoukie commented 4 months ago

Hi We got the same issue and this fix solved the problem. Why this is not patched yet ? is there any problems with this fix ?

jmillan commented 1 month ago

@michelepra or @Karakoukie , are you willing to submit a PR?