emiago / sipgo

SIP library for writing fast SIP services in GO
BSD 2-Clause "Simplified" License
572 stars 77 forks source link

SIP Cancel request is not received by the intended client #160

Open p-akshay opened 18 hours ago

p-akshay commented 18 hours ago

I am working on a simple scenario where after call initiation Cacnel request is sent.

There are 2 client, UserA and UserB who are connected to the sip server. The SIP Server is based on sipgo whereas the clients are based on SIPjs.

Scenario: UserA calls UserB via SIP Server. Then UserA initiates the CANCEL Request. A similar CANCEL Request is required to be generated by SIP Server towards UserB.

In this case, the Cancel request is sent back to UserA instead of UserB.

Code snippet to generate Cancel Request: `cancelReq := sip.NewRequest(sip.CANCEL, outDlg.InviteRequest.Recipient) cancelReq.AppendHeader(sip.HeaderClone(outDlg.InviteRequest.Via())) // Cancel request must match invite TOP via and only have that Via cancelReq.AppendHeader(sip.HeaderClone(outDlg.InviteRequest.From())) cancelReq.AppendHeader(sip.HeaderClone(outDlg.InviteRequest.To())) cancelReq.AppendHeader(sip.HeaderClone(outDlg.InviteRequest.CallID()))

cancelReq.SetSource(outDlg.InviteRequest.Source()) cancelReq.SetDestination(outDlg.InviteRequest.Destination())`

Extra Observation: If I remove the line in the above code that copies the Via header, then UserB will correctly receive the Request. However, the client rejects the request because, according to RFC 3261, the Cancel must have the same Via as the original INVITE.

Please advise about the same. If you need more detailed traces, let me know, and I can provide them.

emiago commented 16 hours ago

Hi @p-akshay Thanks for reporting. Yes via must kept the same in order to match transaction. Now I am having a feeling that you are buiding some B2BUA but maybe you are sending request like proxy.

In diago (https://github.com/emiago/diago) (B2BUA) this is handled for you by just canceling context on INVITE. You only need to make sure that you are passing context from received dialog

p-akshay commented 10 hours ago

Hi @emiago ,

Ok...Thanks for the suggestion.

I am indeed working on a B2BUA kind of design. One question w.r.t. Diago library... will I be able to use the same and sipgo together? in my application dialog plays an important role but other sip events are also required. I was not sure via documentation if the diago allows for the handling of other sip events.

One more question...will the same fix be added in sipgo?

Thanks