[Users] WeSIP b2bua problem

tele tele at plexia.com
Wed Mar 7 16:36:44 CET 2007


I've solve my stupid problem.

The problem was in my change of Call-ID that i need for my requirements.
In the code with problem i did the custom change after create the new
Request.

                SipServletRequest downstreamReq =
sf.createRequest(req,false);

                //Retrieve SipApplicationSession and SipSessions
                SipApplicationSession sas =
req.getSession().getApplicationSession();

                // change call-id
                String oldcid = downstreamReq.getCallId();
                downstreamReq.removeHeader("Call-ID");
                downstreamReq.addHeader("Call-ID","1111" + oldcid);

do my change before create the downstreamReq solve my problem.

:tele


On Mon, 2007-03-05 at 22:50 +0100, tele wrote:
> Hi gines,
> 
> You have been very clear! now i've understand the "dialog marking" but i 
> cannot get my b2bua test working.
> i'll add more debug to see why the BYE generated is incorrect in case of 
> hangup from the caller.
> 
> hem... another question:
> how can i get the Logger reference of the  Servlet for adding more debug?
> or i need to create a new logger with log4j and write log to a new file.
> 
> anyway attached there is the full source code for now.
> 
> thank you very much :)
> 
> regards,
> 
> :tele
> 
> 
> Ginés Gómez wrote:
> > Hi ,
> >
> > I understand. I'll try to explain myself clearer. Let's go back to 
> > your original code. This is extracted from the doInvite method. Here 
> > you save both call legs in the application session
> > .....
> >
> > //Save reference to SipSessions in the SipApplication
> > sas.setAttribute("upstreamLeg",upstreamLeg);
> > sas.setAttribute("downstreamLeg",downstreamLeg);
> > .....
> >
> > what I suggest is that you do the following (after saving in 
> > ApplicationSession)
> >
> > upstreamLeg.setAttribute("COUNTERPART_LEG",downstreamLeg);
> > downstreamLeg.setAttribute("COUNTERPART_LEG",upstreamLeg);
> >
> > this way, at any time, you can always get a reference to the 
> > counterpart dialog doing
> >
> > req.getSession().getAttribute("COUNTERPART_LEG");
> >
> > then, when receiving the BYE
> >
> >>> protected void doBye(SipServletRequest req) throws
> >>> ServletException,IOException{
> >>>
> >>>     //Answer positively
> >>>     request.createResponse(200,"Have a nice day").send();
> >>>
> >>>     //Mark my dialog as finished
> >>>     request.getSession().setAttribute("FINISHED","OK");
> >>>
> >>>     //Get the other leg and finish it in case it is not finished
> >>>
> >>>     //Note how useful is to have in both SipSessions (that is, both
> >>> legs) an attribute which refers the
> >>>     //other leg involved in the B2BUA transaction.
> >>>     SipSession counterPartLeg= (SipSession)
> >>> request.getSession.getAttribute("COUNTERPART_LEG");   
> >>>     if (counterPartLeg.getAttribute("FINISHED")==null){
> >>>     counterPartLeg.createRequest("BYE").send();
> >>>     }
> >>> }
> >
> > as you'll see what I do is sending BYE to the 'other' leg. I don't 
> > care wether I'm processing upstream or downstream because the 
> > COUNTERPART_LEG attribute in the SipSession will always return a 
> > reference to the counterpart SipSession. Since the processing (answer 
> > OK, send BYE the other leg) is simetrical regardless the BYE was 
> > received from the upstream or the downstream the method will work
> >
> > :-)
> >
> > Regards
> >
> > Gines
> >
> >
> >
> >
> >>    protected void doBye(SipServletRequest req) throws ServletException,
> >> IOException {
> >>         req.createResponse(200,"OK").send();
> >>         SipSession downstreamLeg =
> >> (SipSession)req.getSession().getApplicationSession().getAttribute("downstreamLeg"); 
> >>
> >>         SipServletRequest byeRequest =
> >> downstreamLeg.createRequest("BYE");
> >>         byeRequest.send();
> >>    }
> >>
> >> this works only when the BYE come from called.
> >>
> >> maybe i can get the Id of session of the current request arrived in
> >> doBye with getId() and do a check for the other id in the upstreamLeg
> >> and downstreamLeg then if equals to any of this, generate the BYE
> >> request in the other call-leg.
> >>
> >> pseudo code:
> >>
> >> String sessionId (SipSession)req.getSession().getId();
> >> SipSession upSession =
> >> (SipSession)req.getSession().getApplicationSession().getAttribute("upstreamLeg"); 
> >>
> >> SipSession downSession =
> >> (SipSession)req.getSession().getApplicationSession().getAttribute("downstreamLeg"); 
> >>
> >>
> >> if (sessionId == upSession.getId())
> >> {
> >>    // create and send BYE request in the upstreamLeg
> >>    ....
> >> } else {
> >>    // create and send BYE request in the downstreamLeg
> >>    ....
> >> };
> >>
> >>
> >> regards,
> >>
> >> :tele
> >>
> >>
> >> On Mon, 2007-03-05 at 15:27 +0100, Ginés Gómez wrote:
> >>> Anyway.... when doing B2BUA you tipically don't need to wait for
> >>> 200OK to generate BYE response. You can simply send a 200OK to any
> >>> incoming BYE request (since there is no SDP involved in the BYE
> >>> handshake) then finish the other leg.  The idea would be doing
> >>> something like this (not 100% real code, some pseudocode here)
> >>>
> >>>
> >>> protected void doBye(SipServletRequest req) throws
> >>> ServletException,IOException{
> >>>
> >>>     //Answer positively
> >>>     request.createResponse(200,"Have a nice day").send();
> >>>
> >>>     //Mark my dialog as finished
> >>>     request.getSession().setAttribute("FINISHED","OK");
> >>>
> >>>     //Get the other leg and finish it in case it is not finished
> >>>
> >>>     //Note how useful is to have in both SipSessions (that is, both
> >>> legs) an attribute which refers the
> >>>     //other leg involved in the B2BUA transaction.
> >>>     SipSession counterPartLeg= (SipSession)
> >>> request.getSession.getAttribute("COUNTERPART_LEG");   
> >>>     if (counterPartLeg.getAttribute("FINISHED")==null){
> >>>     counterPartLeg.createRequest("BYE").send();
> >>>     }
> >>> }
> >>>
> >>> Regards
> >>>
> >>> Gines
> >>>
> >>> El 05/03/2007, a las 14:36, tele escribió:
> >>>
> >>>> Hi Gines!
> >>>>
> >>>> It's almost clear to me how to do, this what i have done and it works.
> >>>>
> >>>> now i need last clarification how forward the 200 OK from BYE
> >>>> request, i
> >>>> cannot get it working.
> >>>> for forwarding the 200 ok from the BYE in the doBye request i save
> >>>> downstreamLeg.setAttribute("byereq", req) and then in the doResponse i
> >>>> get the bye request and create the response from it,
> >>>> something like this but i'm wrong.
> >>>>
> >>>> if (resp.getStatus() == 200 && resp.getMethod().equalsIgnoreCase
> >>>> ("BYE"))
> >>>> {
> >>>>                         SipServletRequest upstreamRequest =
> >>>> (SipServletRequest)upstreamLeg.getAttribute("byereq");
> >>>>                         SipServletResponse upstreamResponse =
> >>>> upstreamRequest.createResponse(resp.getStatus(),resp.getReasonPhrase
> >>>> ());
> >>>>                         //Copy the content from the downstream
> >>>> response
> >>>> to the upstream response
> >>>>                         if (resp.getContentType() != null) {
> >>>>
> >>>> upstreamResponse.setContent(resp.getRawContent(),
> >>>> resp.getContentType());
> >>>>                         }
> >>>>                         upstreamResponse.send();
> >>>> }
> >>>>
> >>>>
> >>>>
> >>>> this is what i have done for working ACK.
> >>>>
> >>>>
> >>>>   protected void doAck(SipServletRequest req) throws ServletException,
> >>>> IOException {
> >>>>         //Retrieve the upstream request to respond it
> >>>>         SipSession downstreamLeg =
> >>>> (SipSession)req.getSession().getApplicationSession().getAttribute
> >>>> ("downstreamLeg");
> >>>>         SipServletResponse downstreamResponse = (SipServletResponse)
> >>>> downstreamLeg.getAttribute("200ok");
> >>>>         SipServletRequest ackRequest = downstreamResponse.createAck();
> >>>>         //Copy the content from the downstream response to the
> >>>> upstream
> >>>> response
> >>>>         if (req.getContentType() != null) {
> >>>>                 ackRequest.setContent(req.getRawContent(),
> >>>> req.getContentType());
> >>>>         }
> >>>>         ackRequest.send();
> >>>>    }
> >>>>
> >>>>    protected void doBye(SipServletRequest req) throws
> >>>> ServletException,
> >>>> IOException {
> >>>>         SipSession downstreamLeg =
> >>>> (SipSession)req.getSession().getApplicationSession().getAttribute
> >>>> ("downstreamLeg");
> >>>>         SipServletRequest byeRequest =
> >>>> downstreamLeg.createRequest("BYE");
> >>>>         // Copy the content from the downstream response to the
> >>>> upstream
> >>>> response
> >>>>         if (req.getContentType() != null) {
> >>>>                 byeRequest.setContent(req.getRawContent(),
> >>>> req.getContentType());
> >>>>         }
> >>>>         byeRequest.send();
> >>>>    }
> >>>>
> >>>>    protected void doResponse(SipServletResponse resp) throws
> >>>> ServletException, IOException {
> >>>>
> >>>>                 if (resp.getStatus() == 200 &&
> >>>> resp.getMethod().equalsIgnoreCase("INVITE")) {
> >>>>                         SipSession downstreamLeg = (SipSession)
> >>>> resp.getSession().getApplicationSession().getAttribute
> >>>> ("downstreamLeg");
> >>>>                         downstreamLeg.setAttribute("200ok",resp);
> >>>>                 }
> >>>>
> >>>>                 //Retrieve the upstream request to respond it
> >>>>                 SipSession upstreamLeg =
> >>>> (SipSession)resp.getSession().getApplicationSession().getAttribute
> >>>> ("upstreamLeg");
> >>>>
> >>>> }
> >>>>
> >>>>     
> >>>>
> >>>>
> >>>> On Mon, 2007-03-05 at 00:29 +0100, Ginés Gómez wrote:
> >>>>> The problem is that you didn't implement the doACK method. Implement
> >>>>> it following a similar technique as the one used in doResponse. Save
> >>>>> the 200OK response in the downstream session so you can retrieve it
> >>>>> when the ACK arrives from the upstream then generate ACK using
> >>>>> response.createACK() and copy the content using getContentType/
> >>>>> setContentType geContent/setContent if required
> >>>>>
> >>>>>
> >>>>> Hope it helps
> >>>>>
> >>>>> Gines
> >>>>>
> >>>>>> Attached there is a .zip with all the log, trace and configuration.
> >>>>>>
> >>>>>> thanks for the support,
> >>>>>>
> >>>>>> :tele
> >>>>>> <wesip_test.zip>
> >>>>>> _______________________________________________
> >>>>>> Users mailing list
> >>>>>> Users at openser.org
> >>>>>> http://openser.org/cgi-bin/mailman/listinfo/users
> >>>>>
> >>>>
> >>>>
> >>>> _______________________________________________
> >>>> Users mailing list
> >>>> Users at openser.org
> >>>> http://openser.org/cgi-bin/mailman/listinfo/users
> >>>>
> >>>
> >>
> >>
> >> _______________________________________________
> >> Users mailing list
> >> Users at openser.org
> >> http://openser.org/cgi-bin/mailman/listinfo/users
> >>
> >
> 
> _______________________________________________
> Users mailing list
> Users at openser.org
> http://openser.org/cgi-bin/mailman/listinfo/users





More information about the sr-users mailing list