restcommmobicents-sip-servletssip-servlet

How to synchronize Servlet client transaction?


Hello I am currently using restcomm-sip-servlets-4.0.75-apache-tomcat-8.0.26. and I am having issues canceling an ongoing request from the http request thread. I noticed that this issue only appears to happen when I create a new request with an auth header like so :

    AuthInfo authInfo = sipFactory.createAuthInfo();
            authInfo.addAuthInfo(
                    response.getStatus(), 
                    realm,myauth,password); 


            SipServletRequest challengeRequest = response.getSession().createRequest(
                    response.getRequest().getMethod());
        (String)session.getAttribute("FirstPartyContent");
            if(session.getAttribute("FirstPartyContent") !=null){
                challengeRequest.setContent(session.getAttribute("FirstPartyContent"),(String) session.getAttribute("FirstPartyContentType"));
            }
            challengeRequest.addAuthHeader(response, authInfo);

            challengeRequest.getFrom().setDisplayName(auth.getDisplayName());

            session.removeAttribute("original");
            session.setAttribute("original", challengeRequest);
            challengeRequest.send(); 

When a request comes in via the http interface I look for the SipApplicationSession like so:

        SipSessionsUtil sipSessionsUtil = 
                (SipSessionsUtil) session.getServletContext().
                    getAttribute("javax.servlet.sip.SipSessionsUtil");
     logger.info("found servlet contxt for sipsession util");

     SipApplicationSession tobecancelledsess = sipSessionsUtil.getApplicationSessionById(sessionapplicationID); 

I then create a cancel request from the session request stored like so :

SipServletRequest req = (SipServletRequest)tobecancelledsess.getAttribute("original"); drequest = req.createCancel();

although the remote server responds a provisional with to-tag I get:

2017-04-28 16:26:04,470 DEBUG [SipServletMessageImpl] (http-bio-8443-exec-1) transaction null transactionId = null transactionType false 2017-04-28 16:26:04,470 DEBUG [SipServletMessageImpl] (http-bio-8443-exec-1) transaction null transactionId = null transactionType false java.lang.IllegalStateException: No client transaction found! null at org.mobicents.servlet.sip.message.SipServletRequestImpl.createCancel(SipServletRequestImpl.java:258) at org.example.servlet.sip.CallContainer.CancelSession(CallContainer.java:319) at org.example.servlet.sip.CallContainer.CheckCancel(CallContainer.java:274) at org.example.servlet.sip.SimpleWebServlet.doPut(SimpleWebServlet.java:360) at org.example.servlet.sip.SimpleWebServlet.service(SimpleWebServlet.java:149) at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) at org.mobicents.servlet.sip.startup.SipStandardContextValve.invoke(SipStandardContextValve.java:262) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:673) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:279) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:745)

I noticed that when I cancel the request from the servlet class I don't have this issue.


Solution

  • I found that setting a context attribute at the response like this solves my issue:

    if (resp.getStatus() == SipServletResponse.SC_RINGING){
                SipSession session = resp.getSession();
     resp.getSession().getServletContext().setAttribute("ringing",true);
    }
    

    I then grab the session context like this

    SipServletRequest req = (SipServletRequest)tobecancelledsess.getAttribute("original");
        Boolean ringed =  (Boolean ) tobecancelledsess.getServletContext().getAttribute("ringing");
        if(ringed == Boolean.True)
         drequest = req.createCancel();
    

    and eventually you need to send the cancel request with send();